<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
<title>wiki.soucy.cc</title>
<id>tag:wiki.soucy.cc,0000-00-00:/</id>
<link href="https://wiki.soucy.cc//index.xml" rel="self" type="application/atom+xml" />
<link href="https://wiki.soucy.cc//index.html" rel="alternate" type="text/html" />
<link href="https://creativecommons.org/licenses/by/2.5/ca/deed.fr" rel="license" />
<updated>2026-07-06T10:29:01Z</updated>
<author>
<name>Hugo Soucy</name>
<email>hugo@soucy.cc</email>
<uri>https://hugo.soucy.cc/#</uri>
</author>
<entry>
<title>ImageMagick</title>
<id>tag:wiki.soucy.cc,2026-07-06:/imagemagick.html</id>
<link href="https://wiki.soucy.cc//imagemagick.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-07-06T10:08:32Z</published>
<updated>2026-07-06T10:13:12Z</updated>
<content type="html">
&lt;h1&gt;ImageMagick&lt;/h1&gt;
&lt;h2&gt;Dither&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;convert my-image.png -dither FloydSteinberg -colors 8 my-image-dthr.png
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>makefile</title>
<id>tag:wiki.soucy.cc,2026-03-10:/makefile.html</id>
<link href="https://wiki.soucy.cc//makefile.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-10T11:58:22Z</published>
<updated>2026-07-06T10:24:28Z</updated>
<content type="html">
&lt;h1&gt;Makefile&lt;/h1&gt;
&lt;p&gt;Voici par exemple, le Makefile que j&#039;utilise ici:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Makefile of wiki.soucy.cc
# &amp;lt;https://man.openbsd.org/make&amp;gt;
.POSIX:
SHELL := /bin/sh
all: build deploy
add:
satelito exec add
css:
./assets/css/css.sh
assets: css
build: assets
satelito make --export
deploy:
./bin/deploy
serve:
python3 -m http.server 8080 -d ./public_html/
watch:
find ./assets/css/ | entr -c -d ./assets/css/css.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je m&#039;en sers pour exécuter des tâches répétitives liés à un projet de
site web statique. Mais les Makefile sont habituellement pour gérer
des dépendances et compiler.&lt;/p&gt;
&lt;h2&gt;Sources / Ressources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sanctum.geek.nz/unix-as-ide-building/&quot;&gt;https://blog.sanctum.geek.nz/unix-as-ide-building/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://grafikart.fr/tutoriels/makefile-953&quot;&gt;https://grafikart.fr/tutoriels/makefile-953&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learnxinyminutes.com/fr/make/&quot;&gt;https://learnxinyminutes.com/fr/make/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html&quot;&gt;https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nullprogram.com/blog/2017/08/20/&quot;&gt;https://nullprogram.com/blog/2017/08/20/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://makefiletutorial.com/&quot;&gt;https://makefiletutorial.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://spin.atomicobject.com/makefiles-vs-package-json-scripts/&quot;&gt;https://spin.atomicobject.com/makefiles-vs-package-json-scripts/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>wimm</title>
<id>tag:wiki.soucy.cc,2026-03-07:/wimm.html</id>
<link href="https://wiki.soucy.cc//wimm.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-07T13:49:27Z</published>
<updated>2026-03-08T10:40:06Z</updated>
<content type="html">
&lt;h1&gt;wimm &amp;ndash; web image manager&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://codeberg.org/hs0ucy/wimm&quot;&gt;wimm&lt;/a&gt; est une application Tcl que
j&#039;ai écrite pour me faciliter la vie avec les images destinées au
Web. Pour l&#039;instant elle fait trois choses correspondant à ces trois
commandes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;optimize&lt;/strong&gt;: dans une arborescence, trouver toutes les images
aux formats &lt;em&gt;png&lt;/em&gt;, &lt;em&gt;jpeg&lt;/em&gt;, &lt;em&gt;gif&lt;/em&gt;, &lt;em&gt;svg&lt;/em&gt;, et les compresser avec des
librairies comme &lt;em&gt;pngquant&lt;/em&gt;, &lt;em&gt;jpegtran&lt;/em&gt;, &lt;em&gt;gifsicle&lt;/em&gt;, &lt;em&gt;svgo&lt;/em&gt;, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;resize&lt;/strong&gt;: redimensionner des images selon des valeurs donnés
en arguments dans une liste Tcl.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sprite&lt;/strong&gt;: convertir des fichers SVG en symboles, puis les exporter en un sprite SVG.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Les nom des images doivent être transmis par &lt;em&gt;stdin&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo monimage.png | wimm optimize
find images/ | wimm optimize
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour chaque image, le traitement sera affiché dans le terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find . | wimm optimize
pngquant OK
¤ -------------------------------------------------- ¤
¤ my-panda.png (pngquant) :
¤ -&amp;gt; [Before] 85.4677734375 | [After] 44.248046875 = -50%
¤ -------------------------------------------------- ¤
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Une version de l&#039;image compressée est créé avec le suffixe &lt;em&gt;-wimm&lt;/em&gt; (ex.:
&lt;em&gt;my-panda-wimm.png&lt;/em&gt;). L&#039;originale demeure intacte.&lt;/p&gt;
&lt;p&gt;En option, un suffixe personnalisé peut-être appliqué:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find assets/images/ | wimm optimize --suffix &quot;-optim&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour la commande &lt;em&gt;resize&lt;/em&gt;, il suffit de mettre les valeurs de la
redimension entre guillemets double et séparé par un espace:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find test/last-litre-of-petrol.jpeg | wimm resize &quot;520 760&quot;
¤ ----------------------------------------------------------------------------- ¤
¤ -&amp;gt; /home/hs0ucy/.hs0ucy/Code/wimm/test/last-litre-of-petrol-520w-wimm.jpeg
¤ ----------------------------------------------------------------------------- ¤
¤ ----------------------------------------------------------------------------- ¤
¤ -&amp;gt; /home/hs0ucy/.hs0ucy/Code/wimm/test/last-litre-of-petrol-760w-wimm.jpeg
¤ ----------------------------------------------------------------------------- ¤
Usage: &amp;lt;img srcset=&quot;last-litre-of-petrol-520w-wimm.jpeg 520w, last-litre-of-petrol-760w-wimm.jpeg 760w&quot; ... /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;wimm sprite&lt;/em&gt; va trouver tous les SVG, les convertir en element
&lt;code&gt;&amp;lt;symbol/&amp;gt;&lt;/code&gt;, et les combinés dans un seul fichier.&lt;/p&gt;
&lt;p&gt;Le résultat s&#039;affichera dans le terminal et une copie sera créé
(&lt;em&gt;/tmp/svg-sprite-wimm.svg&lt;/em&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find test/ | wimm sprite
&amp;lt;svg height=&quot;0&quot; width=&quot;0&quot; id=&quot;spriteSVG&quot; aria-hidden=&quot;true&quot; style=&quot;position:absolute&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&amp;gt;
&amp;lt;symbol id=&quot;symbol-arrows-horizontal&quot; width=&quot;24&quot; height=&quot;24&quot; fill=&quot;none&quot;&amp;gt;
&amp;lt;path xmlns=&quot;http://www.w3.org/2000/svg&quot; fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M15 9V7H17V9H15ZM17 15V13H13V11H17V9H19V11L21 11V13L19 13V15H17ZM17 15V17H15V15H17ZM11 11V13H7V15H5V13L3 13V11L5 11V9L7 9V11H11ZM7 15H9V17H7V15ZM9 7V9H7V7H9Z&quot; fill=&quot;black&quot;/&amp;gt;
&amp;lt;/symbol&amp;gt;
&amp;lt;symbol id=&quot;symbol-arrows-vertical&quot; width=&quot;24&quot; height=&quot;24&quot; fill=&quot;none&quot;&amp;gt;
&amp;lt;path xmlns=&quot;http://www.w3.org/2000/svg&quot; fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M11 11H13V7H15V9H17V7H15V5H13V3H11V5H9V7H7V9H9V7H11V11ZM11 13H13V17H15V19H13V21H11V19H9V17H11V13ZM9 17V15H7V17H9ZM15 17V15H17V17H15Z&quot; fill=&quot;black&quot;/&amp;gt;
&amp;lt;/symbol&amp;gt;
&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>offlineimap</title>
<id>tag:wiki.soucy.cc,2026-03-05:/offlineimap.html</id>
<link href="https://wiki.soucy.cc//offlineimap.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-05T09:32:30Z</published>
<updated>2026-03-05T10:35:26Z</updated>
<content type="html">
&lt;h1&gt;OfflineIMAP&lt;/h1&gt;
&lt;p&gt; OfflineIMAP permet de synchroniser des boîtes courriel (distantes)
avec une structure de répertoire de type Maildir (local).&lt;/p&gt;
&lt;p&gt; La configuration doit se trouver dans le fichier &lt;code&gt;~/.offlineimaprc&lt;/code&gt;,
et peut contenir plusieurs boîtes courriel. Chaque bloc de
configuration commence par un terme à l&#039;intérieur de crochets. Les
paramètres généraux à toutes les comptes sont sous
&lt;code&gt;[general]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt; Ensuite, sont ajoutés les informations spécifique à chaque boîte
qu&#039;on veut synchroniser. D&#039;abord, on déclare le compte, puis ensuite
les informations locales et distantes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[general]
ui = ttyui
accounts = hscc,lemorse,plutocrash
autorefresh = 5
pythonfile = ~/.offlineimap.py
#################
# HUGO@SOUCY.CC #
#################
[Account hscc]
localrepository = hscc-local
remoterepository = hscc-remote
[Repository hscc-local]
type = Maildir
localfolders = ~/.Mail/hscc
[Repository hscc-remote]
type = IMAP
remotehost = imap.mailserv.tld
remoteuser = hscc
realdelete = yes
sslcacertfile = /etc/ssl/cert.pem
maxconnections = 3
folderfilter = lambda folder: folder in [ &#039;INBOX.Sent&#039;, &#039;INBOX&#039;, &#039;INBOX.Drafts&#039; ]
remotepasseval = get_pass_hscc()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La fonction &lt;code&gt;get_pass_hscc()&lt;/code&gt; du paramètre &lt;code&gt;remotepasseval&lt;/code&gt; permet de
déchiffrer le mot de passe qui est protégé par une &lt;a href=&quot;gnupg.html&quot;&gt;clé
gpg&lt;/a&gt;. Cette fonction se trouve dans le fichier python qui
est déclarer dans le bloc &lt;code&gt;[general]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.offlineimap.py&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#! /usr/bin/env python
from subprocess import check_output
def get_pass_hscc():
return check_output(&quot;gpg -dq ~/.passwd_hscc.gpg&quot;, shell=True).rstrip(b&quot;\n&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour lancer la synchro on exécuter simplement la commande
&lt;code&gt;offlineimap&lt;/code&gt;. Si on veut l&#039;automatiser à une certaine fréquence, on
crée une tâche de type &lt;em&gt;cron&lt;/em&gt; avec &lt;code&gt;crontab -e&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Par exemple, au cinq minutes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*/5 * * * * /usr/local/bin/offlineimap
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>entr</title>
<id>tag:wiki.soucy.cc,2026-03-04:/entr.html</id>
<link href="https://wiki.soucy.cc//entr.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-04T11:22:00Z</published>
<updated>2026-03-04T12:33:34Z</updated>
<content type="html">
&lt;h1&gt;entr&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;entr&lt;/em&gt; permet d&#039;exécuter des commandes lorsque des changements au
système de fichiers sont détectés.&lt;/p&gt;
&lt;p&gt;Personnellement, je l&#039;utilise beaucoup pour concaténer et compresser à
la volée les fichiers CSS ou JavaScript:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find . -type f -name &quot;*.css&quot; | entr -c -d ./css.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ou tout reconstruire si un changement est détecté dans les fichiers
d&#039;un projet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ag -l | entr make
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>gnupg</title>
<id>tag:wiki.soucy.cc,2026-03-03:/gnupg.html</id>
<link href="https://wiki.soucy.cc//gnupg.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-03T10:54:47Z</published>
<updated>2026-03-04T12:33:00Z</updated>
<content type="html">
&lt;h1&gt;gnupg&lt;/h1&gt;
&lt;p&gt;gpg est la partie OpenPGP de GNU Privacy Guard (GnuPG). Il s&#039;agit d&#039;un
outil permettant de fournir des services de chiffrement et de
signature numériques à l&#039;aide de la norme OpenPGP.&lt;/p&gt;
&lt;p&gt;Voir s&#039;il y a déjà des clés existantes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --list-keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Créer une nouvelle clé:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --full-generate-key
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Afficher votre clé public:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --armor --export &amp;lt;key-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si une adresse courriel est associé à votre clé, vous pouvez la
sélectionner via cette valeur. Par exemple, au lieu de l&#039;afficher dans
le terminal (stdout), j&#039;écris ma clé public dans une fichier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --armor --export hugo@soucy.cc &amp;gt; hs0ucy.pubkey
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Héberger sa clé public sur un serveur comme &lt;a href=&quot;https://keys.openpgp.org/&quot;&gt;keys.openpgp.org&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --keyserver hkps://keys.openpgp.org --send-keys &amp;lt;key-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite vous recevrez une courriel de confirmation afin d&#039;associer
votre courriel à la clé que vous venez d&#039;exporter.&lt;/p&gt;
&lt;p&gt;Déchiffrer un fichier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --no-tty -q -r &amp;lt;key-id&amp;gt; -d ~/.passwd.gpg &amp;gt; mdp.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chiffrer un fichier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg -q -r &amp;lt;key-id&amp;gt; -e ~/test.txt
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>newsboat</title>
<id>tag:wiki.soucy.cc,2026-03-02:/newsboat.html</id>
<link href="https://wiki.soucy.cc//newsboat.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-02T10:53:46Z</published>
<updated>2026-03-03T10:03:00Z</updated>
<content type="html">
&lt;h1&gt;newsboat&lt;/h1&gt;
&lt;p&gt;Lecteur de fils RSS/Atom pour le termial.&lt;/p&gt;
&lt;p&gt;Par défaut les adresses doivent êtres dans le fichier
&lt;code&gt;~/.newsboat/urls&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://feeds.bbci.co.uk/news/rss.xml                            &quot;~BBC News&quot;
http://www.aljazeera.com/xml/rss/all.xml                        &quot;~Al Jazeera&quot;
http://www.courrierinternational.com/feed/all/rss.xml           &quot;~Courrier international&quot;
http://www.independent.co.uk/rss                                &quot;~The Independent&quot;
http://www.lactualite.com/feed/                                 &quot;~L&#039;actualité&quot;
http://www.spiegel.de/international/index.rss                   &quot;~Der Spiegel&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On peut charger des fichiers alternatifs avec l&#039;option
&lt;code&gt;--url-file&lt;/code&gt;. Ici, un exemple d&#039;alias dans &lt;code&gt;~/.kshrc&lt;/code&gt; pour avoir
différent types de fils:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# aliases
alias blogroll=&#039;newsboat -r --url-file=&quot;$HOME/.newsboat/blogroll&quot;&#039;
alias newsroll=&#039;newsboat -r --url-file=&quot;$HOME/.newsboat/newsroll&quot;&#039;
alias techroll=&#039;newsboat -r --url-file=&quot;$HOME/.newsboat/techroll&quot;&#039;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Exporter ses urls vers un fichier OMPL:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;newsboat -u ~/.newsboat/newsroll --export-to-opml &amp;gt; newsroll.opml
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>msmtp</title>
<id>tag:wiki.soucy.cc,2026-03-02:/msmtp.html</id>
<link href="https://wiki.soucy.cc//msmtp.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-02T10:38:54Z</published>
<updated>2026-03-05T10:20:07Z</updated>
<content type="html">
&lt;h1&gt;msmtp&lt;/h1&gt;
&lt;p&gt;Un client pour le protocole SMTP.&lt;/p&gt;
&lt;p&gt;Exemple de configuration &lt;code&gt;~/.msmtprc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/cert.pem
logfile        ~/.msmtp.log
# hscc
account        hscc
host           smtp.mailserv.tld
port           587
from           hugo@soucy.cc
user           hscc
passwordeval   gpg --no-tty -q -d ~/.passwd_hscc.gpg
# Set a default account
account default : hscc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Faire un test en ligne de commande:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Bonjour le John!&quot; | msmtp -a hscc john@doe.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si tout c&#039;est bien passé, &lt;a href=&quot;&amp;#109;&amp;#x61;&amp;#x69;&amp;#x6c;&amp;#x74;&amp;#111;&amp;#58;&amp;#106;&amp;#111;&amp;#104;&amp;#x6e;&amp;#64;&amp;#x64;&amp;#111;&amp;#x65;&amp;#x2e;&amp;#x63;&amp;#111;&amp;#109;&quot;&gt;&amp;#106;&amp;#x6f;&amp;#104;&amp;#110;&amp;#64;&amp;#x64;&amp;#x6f;&amp;#x65;&amp;#46;&amp;#99;&amp;#111;&amp;#109;&lt;/a&gt; a reçu le message «Bonjour le
John!» de la par de l&#039;adresse associée au compte &lt;em&gt;hscc&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Utilisation pour envoi de courriel via emacs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; Send function:
(setq send-mail-function &#039;message-send-mail-with-sendmail
sendmail-program &quot;/usr/local/bin/msmtp&quot;
mail-specify-envelope-from t
message-sendmail-envelope-from &#039;header
mail-envelope-from &#039;header
message-send-mail-function &#039;message-send-mail-with-sendmail
)
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>lowdown</title>
<id>tag:wiki.soucy.cc,2026-03-02:/lowdown.html</id>
<link href="https://wiki.soucy.cc//lowdown.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-02T10:30:39Z</published>
<updated>2026-07-06T10:03:10Z</updated>
<content type="html">
&lt;h1&gt;lowdown&lt;/h1&gt;
&lt;p&gt;Un convertisseur de markdown vers différent formats.&lt;/p&gt;
&lt;p&gt;Convertir du markdown en gemtext:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lowdown content/about.md -tgemini
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Convertir du markdown en HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lowdown content/about.md -thtml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voici un exemple plus complet où lowdown est combiné à d&#039;autres
applications POSIX shell (sort, head, grep, cat) pour créer un
générateur de site minimaliste à partir de fichiers markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
# md2w3.sh
#
# Conventions:
# - Les noms des fichiers markdown doivent êtres préfixés avec une date au format YYYY-MM-DD-nom-de-la-page.md
# - Dans ces fichiers le titre de premier niveau doit être sur la première ligne
# Créer feed.md et effacer son contenu à chaque exécution
touch feed.md &amp;amp; echo &quot;&quot; &amp;gt; feed.md
find . -type f -name &quot;*.md&quot; ! -name &quot;index.md&quot; ! -name &quot;feed.md&quot; | sort -r | while read -r mdfile; do
# Chemin du fichier sans l&#039;extension .md
bname=&quot;$(basename &quot;$mdfile&quot; .md)&quot;
# Extraire la date du nom du fichier
date=&quot;$(echo &quot;$bname&quot; | grep -Eo &#039;[0-9]{4}-[0-9]{2}-[0-9]{2}&#039;)&quot;
# Extraire le titre du fichier
title=&quot;$(cat &amp;lt; &quot;$mdfile&quot; | head -n 1 | grep -Eo &#039;[^#{1}\s].+&#039;)&quot;
# URL du fichier HTML
url=&quot;$bname.html&quot;
# Entrée du site au format markdown
entry=&quot;* $date [$title]($url)&quot;
# Créer la page HTML correspondante
lowdown -s &quot;$mdfile&quot; -o &quot;$url&quot; -thtml -M title=&quot;$title - monsiteweb.com&quot;
echo &quot;$entry&quot; &amp;gt;&amp;gt; feed.md
done
# Créer l&#039;index en y incluant feed.md
cat &amp;lt;&amp;lt;EOF | lowdown -s - -o &quot;index.html&quot; -thtml -M title=&quot;Mon site web - monsiteweb.com&quot;
# Un site web
$(cat feed.md)
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Le flag &lt;code&gt;-s&lt;/code&gt; signifie &lt;em&gt;standalone&lt;/em&gt; et permet de générer une page
HTML complète (html&gt;head+body);&lt;/li&gt;
&lt;li&gt;le tiret seul &lt;code&gt;-&lt;/code&gt;, indique que le markdown sera passé par &lt;em&gt;stdin&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;le paramètre &lt;code&gt;-M&lt;/code&gt; permet l&#039;ajout de métadonnées, tel que la balise
&lt;em&gt;title&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;de la même façon, vous pourriez ajouter une feuille de styles:
&lt;code&gt;lowdown -s - -o &quot;index.html&quot; -thtml -M title=&quot;Mon site web -
monsiteweb.com&quot; -M css=&quot;styles.css&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sinon, une autre manière de personnaliser le HTML généré, est de
modifier les templates par défaut de lowdown. Il sagit de copier
l&#039;original et d&#039;indiquer l&#039;alternative avec le paramètre &lt;code&gt;--template&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Les originaux se trouvent, selon de votre système d&#039;exploitation, à
quelque part comme ici: &lt;code&gt;/usr/local/share/lowdown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous copiez le template à modifier dans l&#039;arborescence de votre
projet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp /usr/local/share/lowdown/html/default.html ~/Applications/md2web/index.tpl.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Après avoir procédé aux changements, vous l&#039;utilisez comme ceci:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lowdown -s - -o &quot;index.html&quot; -thtml --template index.tpl.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour plus de détails, visiter le site officiel de &lt;em&gt;lowdown&lt;/em&gt;: &lt;a href=&quot;https://kristaps.bsd.lv/lowdown/&quot;&gt;https://kristaps.bsd.lv/lowdown/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sinon, j&#039;ai aussi créé &lt;a href=&quot;https://codeberg.org/hs0ucy/md2w3&quot;&gt;un dépôt git sur
codeberg&lt;/a&gt; avec un script plus
complet et parfaitement utilisable pour créer rapidement un blogue
statique.&lt;/p&gt;
</content>
</entry>
<entry>
<title>feh</title>
<id>tag:wiki.soucy.cc,2026-03-02:/feh.html</id>
<link href="https://wiki.soucy.cc//feh.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-02T10:17:52Z</published>
<updated>2026-03-02T10:51:56Z</updated>
<content type="html">
&lt;h1&gt;feh&lt;/h1&gt;
&lt;p&gt;Visionneuse d&#039;images via le terminal.&lt;/p&gt;
&lt;p&gt;Exemple pour le fichier &lt;code&gt;~/.xsession&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# random wallpapers on load
exec $(feh --randomize --bg-fill /home/hs0ucy/Images/oldcomp_*) &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>Mon laptop</title>
<id>tag:wiki.soucy.cc,2026-03-01:/mon-laptop.html</id>
<link href="https://wiki.soucy.cc//mon-laptop.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2026-03-01T13:27:25Z</published>
<updated>2026-03-05T10:55:46Z</updated>
<content type="html">
&lt;h1&gt;Mon laptop&lt;/h1&gt;
&lt;p&gt;Voici &lt;a href=&quot;https://codeberg.org/hs0ucy/dotfiles/src/branch/main/install.sh&quot;&gt;les paquets que
j&#039;installe&lt;/a&gt;
habituellement sur mon laptop OpenBSD:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aspell&lt;/li&gt;
&lt;li&gt;cmus&lt;/li&gt;
&lt;li&gt;emacs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;entr.html&quot;&gt;entr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;feh.html&quot;&gt;feh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ffmpeg&lt;/li&gt;
&lt;li&gt;firefox-esr&lt;/li&gt;
&lt;li&gt;gajim&lt;/li&gt;
&lt;li&gt;gifsicle&lt;/li&gt;
&lt;li&gt;gimp&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;gnupg.html&quot;&gt;gnupg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;inkscape&lt;/li&gt;
&lt;li&gt;iridium&lt;/li&gt;
&lt;li&gt;ispell&lt;/li&gt;
&lt;li&gt;keepassxc&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;lowdown.html&quot;&gt;lowdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;lua&lt;/li&gt;
&lt;li&gt;luarocks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;msmtp.html&quot;&gt;msmtp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;newsboat.html&quot;&gt;newsboat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;offlineimap.html&quot;&gt;offlineimap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;php&lt;/li&gt;
&lt;li&gt;pngquant&lt;/li&gt;
&lt;li&gt;rsync&lt;/li&gt;
&lt;li&gt;scour&lt;/li&gt;
&lt;li&gt;scrot&lt;/li&gt;
&lt;li&gt;shellcheck&lt;/li&gt;
&lt;li&gt;spectrwm&lt;/li&gt;
&lt;li&gt;speech-dispatcher&lt;/li&gt;
&lt;li&gt;tcl&lt;/li&gt;
&lt;li&gt;tcllib&lt;/li&gt;
&lt;li&gt;tor-browser&lt;/li&gt;
&lt;li&gt;the_silver_searcher&lt;/li&gt;
&lt;li&gt;tuba&lt;/li&gt;
&lt;li&gt;unzip&lt;/li&gt;
&lt;li&gt;vlc&lt;/li&gt;
&lt;li&gt;w3m&lt;/li&gt;
&lt;li&gt;wapiti&lt;/li&gt;
&lt;li&gt;whatweb&lt;/li&gt;
&lt;li&gt;yt-dlp&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Vdirsyncer</title>
<id>tag:wiki.soucy.cc,2025-03-06:/vdirsyncer-pour-synchroniser-caldav-carddav-sur-votre-poste.html</id>
<link href="https://wiki.soucy.cc//vdirsyncer-pour-synchroniser-caldav-carddav-sur-votre-poste.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2025-03-06T12:54:08Z</published>
<updated>2026-02-08T18:07:59Z</updated>
<content type="html">
&lt;h1&gt;Vdirsyncer pour synchroniser CalDAV et CardDAV sur votre ordinateur&lt;/h1&gt;
&lt;p&gt;Si comme moi, vous avez un serveur comme Baïkal pour gérer vos
contacts et vos agendas, vous vous demandez peut-être comment les
synchroniser sur votre ordinateur sans utiliser une application comme
Thunderbird ou Évolution&amp;hellip;&lt;/p&gt;
&lt;p&gt;Eh bien, récemment, j&#039;ai découvert
&lt;a href=&quot;http://vdirsyncer.pimutils.org/&quot;&gt;Vdirsyncer&lt;/a&gt;. Une application en
ligne de commande, qui sert justement à ça. C&#039;est l&#039;équivalent CardDAV
/ CalDAV de ce qu&#039;est OfflineIMAP ou Isync pour les boîtes courriels.&lt;/p&gt;
&lt;p&gt;Vdirsyncer se connecte à une source distante pour importer, puis
synchroniser les données en local. Les événement de votre calendrier
sont par exemple, importés au format standard &lt;strong&gt;iCalendar&lt;/strong&gt;
(.ics). Tandis que les contacts sont des fichiers &lt;strong&gt;vCard&lt;/strong&gt;
(.vcf). D&#039;autres formats sont aussi disponibles.&lt;/p&gt;
&lt;p&gt;Si vous avez un téléphone Android, vous connaissez peut-être
&lt;a href=&quot;https://www.davx5.com/&quot;&gt;DAVx5&lt;/a&gt;, qui fait à peu près la même chose.&lt;/p&gt;
&lt;p&gt;Des paquets d&#039;installation sont disponibles pour les principales
distributions GNU/Linux, ainsi que pour Mac OS, NetBSD, etc. Sinon,
installer directement avec les gestionnaires de paquets pour python
pipx ou pip.&lt;/p&gt;
&lt;p&gt;Pour moi, c&#039;est sous OpenBSD avec &lt;code&gt;pkg_add&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;doas pkg_add -v vdirsyncer
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Exemple de configuration&lt;/h2&gt;
&lt;p&gt;D&#039;abord dans votre &lt;code&gt;$HOME&lt;/code&gt;, il faut créer le répertoire et fichier de
configuration de vdirsyncer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir .vdirsyncer/ &amp;amp;&amp;amp; touch .vdirsyncer/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis les répertoires qui acueilleront les fichiers iCalendar et vCard:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p .calendars/nomducalendrier/
mkdir -p .contacts/nomducarnet/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Bloc CalDAV&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[general]
status_path = &quot;~/.vdirsyncer/status/&quot;
# -------
# CALDDAV
# -------
[pair my_calendar]
a = &quot;my_calendar_local&quot;
b = &quot;my_calendar_remote&quot;
collections = [&quot;from a&quot;, &quot;from b&quot;]
[storage my_calendar_local]
type = &quot;filesystem&quot;
path = &quot;~/.calendars/&quot;
fileext = &quot;.ics&quot;
[storage my_calendar_remote]
type = &quot;caldav&quot;
auth = &quot;digest&quot;
url = &quot;https://monserveur.com/baikal/dav.php/calendars/mon_id/nom_du_calendrier/&quot;
username = &quot;mon_id&quot;
password.fetch = [&quot;command&quot;, &quot;~/get-mdp-dav&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans la section &lt;code&gt;[general]&lt;/code&gt;, il faut ajouter la propriétée
&lt;code&gt;status_path&lt;/code&gt;. Le dossier &lt;code&gt;status&lt;/code&gt; contient des fichiers qui serviront
aux métadonnées de synchronisation. Vous n&#039;avez pas besoin de le
créer, l&#039;application s&#039;en charge.&lt;/p&gt;
&lt;p&gt;La section &lt;code&gt;[pair ...]&lt;/code&gt; elle, décrit certaines relations ou
comportement qui serviront à la découvrabilité et la synchronisation.&lt;/p&gt;
&lt;p&gt;Ensuite les deux autres sections sont pour les paramètres des stockages
local et distant.&lt;/p&gt;
&lt;p&gt;Pour Baikal je devais renseigner la propriété optionnelle &lt;code&gt;auth&lt;/code&gt;, dans
votre cas cela ne sera peut-être pas nécessaire. À vérifier.&lt;/p&gt;
&lt;p&gt;Et finalement, plutôt que mettre le mot de passe en claire dans le
fichier de configuration, j&#039;utilise &lt;code&gt;password.fetch&lt;/code&gt;, pour exécuter un
script shell qui va récupérer mon mot de passe stocker quelque part
sur ma machine:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;password.fetch = [&quot;command&quot;, &quot;~/get-mdp-dav&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Une fois que votre configuration vous semble au point, il vous reste à
la tester en lançant la commande &lt;code&gt;discover&lt;/code&gt;, comme ceci:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vdirsyncer discover
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et si par bonheur vous n&#039;avez aucune erreur, alors il est temps de
synchroniser vos données:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vdirsyncer sync
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Bloc CardDAV&lt;/h3&gt;
&lt;p&gt;Bon, pour les carnets d&#039;adresses c&#039;est sensiblement la même chose. Il
vous suffit de mettre les bons identifiants et les bons chemins:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# -------
# CARDDAV
# -------
[pair my_contacts]
a = &quot;my_contacts_local&quot;
b = &quot;my_contacts_remote&quot;
collections = [&quot;from a&quot;, &quot;from b&quot;]
metadata = [&quot;hs&quot;]
[storage my_contacts_local]
type = &quot;filesystem&quot;
path = &quot;~/.contacts/&quot;
fileext = &quot;.vcf&quot;
[storage my_contacts_remote]
type = &quot;carddav&quot;
auth = &quot;digest&quot;
url = &quot;https://monserveur.com/baikal/dav.php/addressbooks/mon_id/moncarnet/&quot;
username = &quot;mon_id&quot;
password.fetch = [&quot;command&quot;, &quot;~/get-mdp-dav&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comme tout à l&#039;heure, vous devenez lancer un &lt;code&gt;vdirsyncer discover&lt;/code&gt; et
un &lt;code&gt;vdirsyncer sync&lt;/code&gt;, lorsque votre configuration est au point.&lt;/p&gt;
&lt;h3&gt;Synchroniser à l&#039;heure&lt;/h3&gt;
&lt;p&gt;À l&#039;aide d&#039;une &lt;a href=&quot;https://cron.help/examples&quot;&gt;cron job&lt;/a&gt; (&lt;code&gt;crontab
-e&lt;/code&gt;), vous pouvez lancer la synchronisation à la fréquence que vous le
souhaitez. Pour moi, c&#039;est à l&#039;heure pile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 * * * * /usr/local/bin/vdirsyncer sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notez que le chemin vers la commande peut différer selon le système
d&#039;exploitation.&lt;/p&gt;
&lt;h3&gt;Ma configuration complète&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[general]
status_path = &quot;~/.vdirsyncer/status/&quot;
# -------
# CALDDAV
# -------
[pair my_calendar]
a = &quot;my_calendar_local&quot;
b = &quot;my_calendar_remote&quot;
collections = [&quot;from a&quot;, &quot;from b&quot;]
[storage my_calendar_local]
type = &quot;filesystem&quot;
path = &quot;~/.calendars/&quot;
fileext = &quot;.ics&quot;
[storage my_calendar_remote]
type = &quot;caldav&quot;
auth = &quot;digest&quot;
url = &quot;https://monserveur.com/baikal/dav.php/calendars/mon_id/nom_du_calendrier/&quot;
username = &quot;mon_id&quot;
password.fetch = [&quot;command&quot;, &quot;~/get-mdp-dav&quot;]
# -------
# CARDDAV
# -------
[pair my_contacts]
a = &quot;my_contacts_local&quot;
b = &quot;my_contacts_remote&quot;
collections = [&quot;from a&quot;, &quot;from b&quot;]
metadata = [&quot;hs&quot;]
[storage my_contacts_local]
type = &quot;filesystem&quot;
path = &quot;~/.contacts/&quot;
fileext = &quot;.vcf&quot;
[storage my_contacts_remote]
type = &quot;carddav&quot;
auth = &quot;digest&quot;
url = &quot;https://monserveur.com/baikal/dav.php/addressbooks/mon_id/moncarnet/&quot;
username = &quot;mon_id&quot;
password.fetch = [&quot;command&quot;, &quot;~/get-mdp-dav&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;L&#039;utilisation&lt;/h2&gt;
&lt;p&gt;Une fois que tout se synchronise bien entre votre serveur et votre
ordinateur personnel, il ne vous reste plus qu&#039;à vous
amusez. Remarquez, votre utilisation de vdirsyncer peut tout
simplement se limiter au fait d&#039;avoir des copies locales de
sauvegardes de votre calendrier et de cotre carnet d&#039;adresses. Sinon,
toute application pouvant tirer profit des formats iCalendar ou vCard,
peut en principe interagir avec votre nouvelle installation.&lt;/p&gt;
&lt;p&gt;Mais histoire de rester dans le domaine de la ligne commande, je peux
vous en proposer deux qui sont souvent associés au nom de vdirsyncer&amp;hellip;&lt;/p&gt;
&lt;h3&gt;Khal&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/khal-16.png&quot; alt=&quot;Vue en mode calendrier du logiciel Khal&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lostpackets.de/khal/&quot;&gt;Khal&lt;/a&gt; peut lire et écrire des
événements/calendriers dans les dossiers synchronisés par
vdirsyncer. Il a aussi un mode interactif qui permet de parcourir et
d&#039;éditer à la fois.&lt;/p&gt;
&lt;p&gt;Pour avoir la liste des commandes et options consulter le site web ou
l&#039;aide (&lt;code&gt;khal --help&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Et la configuration de base est plutôt simple, et doit être placée
dans &lt;code&gt;$HOME/.config/khal/config&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[calendars]
[[hs_calendar_local]]
path = ~/.calendars/*
type = discover
[[hs_contacts_local]]
path = ~/.contacts/*
type = discover
[locale]
timeformat = %H:%M
dateformat = %Y-%m-%d
longdateformat = %Y-%m-%d
datetimeformat = %Y-%m-%d %H:%M
longdatetimeformat = %Y-%m-%d %H:%M
[default]
default_calendar = default
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Khard&lt;/h3&gt;
&lt;p&gt;Bon vous l&#039;aurez deviné, &lt;a href=&quot;https://khard.readthedocs.io/&quot;&gt;Khard&lt;/a&gt; est un
gestionnaire de carnet d&#039;adresses. À l&#039;instar de Khard, il permet de
lister et d&#039;éditer. Sa configuration est dans la même veine que ce que
nous avons vu jusqu&#039;à maintenant:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[addressbooks]
[[default]]
path = ~/.contacts/default/
[general]
debug = no
default_action = list
editor = emacsclient, -r, -a, emacs,
merge_editor = vimdiff
[contact table]
display = first_name
group_by_addressbook = no
reverse = no
show_nicknames = no
show_uids = yes
show_kinds = no
sort = last_name
localize_dates = yes
preferred_phone_number_type = pref, cell, home
preferred_email_address_type = pref, work, home
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Je ne suis pas encore un utilisateur de longue date, mais je suis
enthousiaste par la découverte de vdirsyncer. Tout simplement parce
que je cherchais ce genre d&#039;outil depuis un certain
temps. L&#039;utilisation de formats simples et standardisés est un gros
plus lorsqu&#039;on veut interagir avec ses données sous plusieurs
plateformes et applications.&lt;/p&gt;
&lt;p&gt;Sinon je suis un utilisateur d&#039;Emacs, entre autres pour lire et
rédiger mes courriels (mu4e) et tenir des todo lists (org-mode). Et
j&#039;ai découvert deux extensions pour cet environnement, qui interfacent
Khal et Khard&amp;hellip; Ce qui fera peut-être l&#039;objet d&#039;une suite à ce
billet.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Liste de CMS et de SSG</title>
<id>tag:wiki.soucy.cc,2025-02-14:/liste-cms-ssg.html</id>
<link href="https://wiki.soucy.cc//liste-cms-ssg.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2025-02-14T11:13:11Z</published>
<updated>2026-01-14T20:31:58Z</updated>
<content type="html">
&lt;h1&gt;Liste de CMS et de SSG&lt;/h1&gt;
&lt;p&gt;&lt;small&gt;&lt;i&gt;*Ceux que j&#039;ai déjà essayés&lt;/i&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;h2&gt;CMS sans BD (flat file)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTMLy &lt;a href=&quot;https://www.htmly.com/&quot;&gt;https://www.htmly.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pico &lt;a href=&quot;https://picocms.org/&quot;&gt;https://picocms.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bludit* &lt;a href=&quot;https://www.bludit.com/&quot;&gt;https://www.bludit.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Grav* &lt;a href=&quot;https://getgrav.org/&quot;&gt;https://getgrav.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kirby* &lt;a href=&quot;https://getkirby.com/&quot;&gt;https://getkirby.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lichen &lt;a href=&quot;https://codeberg.org/stringbone/lichen&quot;&gt;https://codeberg.org/stringbone/lichen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Portabloc &lt;a href=&quot;https://portabloc.xyz/2023/10/whats-portabloc-cms&quot;&gt;https://portabloc.xyz/2023/10/whats-portabloc-cms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HamsterCMS &lt;a href=&quot;http://old.net.eu.org/&quot;&gt;http://old.net.eu.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Distributi &lt;a href=&quot;https://vvvvvvaria.org/%7Edecentral1se/distribusi/&quot;&gt;https://vvvvvvaria.org/%7Edecentral1se/distribusi/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Blot &lt;a href=&quot;https://blot.im/&quot;&gt;https://blot.im/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PluXML* &lt;a href=&quot;https://pluxml.org/&quot;&gt;https://pluxml.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;SSG&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A List of Static Site Generators &lt;a href=&quot;https://jamstack.org/generators/&quot;&gt;https://jamstack.org/generators/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make a static site with find(1), grep(1), and lowdown or Markdown.pl &lt;a href=&quot;https://romanzolotarev.com/ssg.html&quot;&gt;https://romanzolotarev.com/ssg.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;shellCMS &lt;a href=&quot;https://bkhome.org/shellcms/&quot;&gt;https://bkhome.org/shellcms/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Satelito* &lt;a href=&quot;https://codeberg.org/hs0ucy/Satelito&quot;&gt;https://codeberg.org/hs0ucy/Satelito&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Mémento Unix</title>
<id>tag:wiki.soucy.cc,2024-02-17:/unix-ref.html</id>
<link href="https://wiki.soucy.cc//unix-ref.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2024-02-17T17:55:29Z</published>
<updated>2026-02-08T15:05:43Z</updated>
<content type="html">
&lt;h1&gt;Mémento Unix&lt;/h1&gt;
&lt;p&gt;Voici un petit &lt;strong&gt;aide-mémoire&lt;/strong&gt; pour les nouveaux
arrivants sur &lt;a href=&quot;/mots-cles.html#unix&quot;&gt;Unix&lt;/a&gt;, ainsi que
pour les autres, comme moi, qui parfois oublient.&lt;/p&gt;
&lt;details id=&quot;toc&quot; open=&quot;&quot;&gt;
&lt;summary&gt;Sur cette page&lt;/summary&gt;
&lt;ol role=&quot;list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#shortcuts&quot;&gt;Raccourcis clavier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#fileDirCmd&quot;&gt;Commandes pour fichier et répertoire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sysInfo&quot;&gt;Information système&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#psMan&quot;&gt;Gestion des processus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#permMan&quot;&gt;Gestion des permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ssh&quot;&gt;SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#compression&quot;&gt;Compression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#network&quot;&gt;Réseau&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id=&quot;shortcuts&quot;&gt;Raccourcis clavier&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;c&lt;/kbd&gt;&lt;/dt&gt;
&lt;dd&gt;Arrêter la commande en cours.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;z&lt;/kbd&gt;&lt;/dt&gt;
&lt;dd&gt;Suspendre la commande en cours; pour la reprendre utiliser &lt;code&gt;fg&lt;/code&gt; au
premier plan ou &lt;code&gt;bg&lt;/code&gt; à l&#039;arrière-plan.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;d&lt;/kbd&gt;&lt;/dt&gt;
&lt;dd&gt;Se déconnecter de la session en cours, similaire à &lt;code&gt;exit&lt;/code&gt; (quitter).&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;r&lt;/kbd&gt;&lt;/dt&gt;
&lt;dd&gt;Rechercher dans les commandes tapées précédemment.&lt;/dd&gt;
&lt;dd&gt;La recherche est faite à l&#039;intérieur de l&#039;historique de votre
shell, qui se trouve dans un fichier comme &lt;i&gt;.bash_history&lt;/i&gt; ou &lt;i&gt;.ksh_history&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;fileDirCmd&quot;&gt;Commandes pour fichier et répertoire&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ls&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Lister les fichiers et les répertoire.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ls -al&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Liste en vue détaillée incluant les fichiers cachés.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cd&lt;/strong&gt; undossier/&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Naviguer dans l&#039;arborescence des répertoires.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cd&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Aller à notre répertoire utilisateur.&lt;/dd&gt;&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;pwd&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Montrer le chemin du répertoire courant.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;mkdir&lt;/strong&gt; musique&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Créer le répertoire &lt;i&gt;musique&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;mkdir -p&lt;/strong&gt; {musique,peinture,literature}&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Créer une série de répertoires d&#039;une seule commande.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;rm&lt;/strong&gt; todo.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Supprimer &lt;i&gt;todo.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;rm -r&lt;/strong&gt; musique&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Supprimer le répertoire &lt;i&gt;musique&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;rm -f&lt;/strong&gt; important.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Forcer la suppression du fichier &lt;i&gt;important.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;rm -rf&lt;/strong&gt; jeux/&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Forcer la suppression du répertoire &lt;i&gt;jeux/&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cp&lt;/strong&gt; fichierA fichierB&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Faire une copie du &lt;i&gt;ficherA&lt;/i&gt; qui s&#039;appelle &lt;i&gt;fichierB&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cp -r&lt;/strong&gt; dossierA/ dossierB/&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Copier le &lt;i&gt;dossierA/&lt;/i&gt; dans &lt;i&gt;dossierB/&lt;/i&gt;; si ce dernier
n&#039;existe pas il est alors créé.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;mv&lt;/strong&gt; abc.txt xyz.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Renommer ou déplacer &lt;i&gt;abc.txt&lt;/i&gt; vers &lt;i&gt;xyz.txt&lt;/i&gt;, si &lt;i&gt;xyz.txt&lt;/i&gt; existe
comme répertoire, &lt;i&gt;abc.txt&lt;/i&gt; sera déplacé dans &lt;i&gt;xyz.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ln -s&lt;/strong&gt; abc.txt lien-abc.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Crée un lien symbolique nommé &lt;i&gt;lien-abc.txt&lt;/i&gt; vers le
fichier &lt;i&gt;abc.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;touch&lt;/strong&gt; index.html&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Créer ou mettre à jour &lt;i&gt;index.html&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cat &gt;&lt;/strong&gt; new.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Écrire le contenu de stdin (entrée standard) dans &lt;i&gt;new.txt&lt;/i&gt; en écrasant ce qui s&#039;y trouve déjà.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cat&lt;/strong&gt; a.txt b.txt c.txt &gt; abc.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Concaténer &lt;i&gt;a.txt b.txt c.txt&lt;/i&gt; dans &lt;i&gt;abc.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cat &gt;&gt;&lt;/strong&gt; list.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Écrire le contenu de stdin (entrée standard) en l&#039;ajoutant à la fin de &lt;i&gt;list.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cat&lt;/strong&gt; list.txt &gt;&gt; todos.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Ajouter &lt;i&gt;list.txt&lt;/i&gt; à la fin de &lt;i&gt;todos.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;more&lt;/strong&gt; index.html&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher le contenu du fichier &lt;i&gt;index.html&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;head&lt;/strong&gt; data.csv&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher les 10 premières lignes de &lt;i&gt;data.csv&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tail&lt;/strong&gt; /var/log/authlog&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher les 10 dernières lignes de &lt;i&gt;/var/log/authlog&lt;/i&gt;.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tail -f&lt;/strong&gt; /var/log/authlog&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher en temps réel les 10 dernières lignes de &lt;i&gt;/var/log/authlog&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;find&lt;/strong&gt; .&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Trouver tous les fichiers récursivement à partir d&#039;où on se
trouve.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;find&lt;/strong&gt; /abc/xyz/ -maxdepth 1&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Trouver tous les fichiers du répertoire &lt;i&gt;/abc/xyz/&lt;/i&gt; qui
sont du premier niveau.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;find&lt;/strong&gt; /var/www/public_html/ -type d -empty -delete&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Trouver et supprimer tous les dossiers vides dans &lt;i&gt;/var/www/public_html/.&lt;/i&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;find&lt;/strong&gt; content/ -name \*.html -type f&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Trouver tous les fichiers se terminant par &lt;i&gt;.html&lt;/i&gt; dans &lt;i&gt;content/&lt;/i&gt;.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;find&lt;/strong&gt; content/ -mindepth 2 -name index.md -exec dirname {} \;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Trouver tous les fichiers &lt;i&gt;index.md&lt;/i&gt; à partir du deuxième niveau de répertoire, et sur chacun d&#039;eux, exécuter la commande &lt;i&gt;dirname&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tr&lt;/strong&gt; &#039;,&#039; &#039;\t&#039; &lt; unix-data-science.csv &gt; unix-data-science.tsv&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Remplacer les virgules par des tabulations.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;wc -l&lt;/strong&gt; unix-data-science.tsv&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Compter le nombre de ligne dans le fichier &lt;i&gt;unix-data-science.tsv&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;sysInfo&quot;&gt;Information système&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;date&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Affiche la date et l&#039;heure.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;date&lt;/strong&gt; +&quot;%Y-%m-%d %T&quot;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher une version formatée de la date et de l&#039;heure.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cal&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Montre le calendrier du mois courant.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cal july&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Montre le calendrier de juillet de l&#039;année courante.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;cal 1976&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Montre tout le calendrier de 1976.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;uptime&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Affiche la durée de fonctionnement du système.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;who&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Affiche les utilisateurs connectés.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;w&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Affiche les utilisateurs connectés et ce qu&#039;ils font.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;whoami&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;L&#039;utilisateur sous lequel on est connecté.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;finger&lt;/strong&gt; joe&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Affiche de l&#039;info à propos de l&#039;utilisateur &lt;i&gt;joe&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;uname -a&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Voir les informantion sur le système.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;man&lt;/strong&gt; nomduprogramme&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Affiche le manuel d&#039;utilisation d&#039;un programme.&lt;/dd&gt;
&lt;dd&gt;S&#039;il n&#039;y a pas d&#039;entrée essayer &lt;code&gt;nomduprogramme -h&lt;/code&gt; ou &lt;code&gt;nomduprogramme --help&lt;/code&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;df&lt;/strong&gt; -h&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Voir les niveaux d&#039;utilisation des partitions/disques.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;du&lt;/strong&gt; -h&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher les statistiques d&#039;utilisation du disque.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;whereis&lt;/strong&gt; app&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Localiser une application.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;which&lt;/strong&gt; app&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Localiser un (ou plusieurs) fichier(s) programme(s) dans le
chemin d&#039;accès.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;psMan&quot;&gt;Gestion des processus&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ps&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher les processus courants en activité.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;top&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Afficher tous les processus en cours.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;kill&lt;/strong&gt; pid&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Tuer un processus selon son pid (process ID).&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;pkill&lt;/strong&gt; nomduprocessus&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Tuer un processus selon son nom.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;bg&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Lister les tâches arrêtées ou en arrière-plan.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;fg&lt;/strong&gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Ramène la tâche la plus récente à l&#039;avant-plan.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;fg&lt;/strong&gt; %n&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Ramène la tâche %n à l&#039;avant-plan.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;z&lt;/kbd&gt;&lt;/dt&gt;
&lt;dd&gt;Arrête la commande en cours et la reprendre avec &lt;code&gt;fg&lt;/code&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;permMan&quot;&gt;Gestion des permissions&lt;/h2&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;chmod&lt;/strong&gt; octal file&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Changer les permissions sur les fichiers en octal et les
appliquées différemment selon l&#039;utilisateur, le groupe ou pour
tous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 - read (r) (lire)&lt;/li&gt;
&lt;li&gt;2 - write (w) (écrire)&lt;/li&gt;
&lt;li&gt;1 - execute (x) (exécuter)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;chmod 777&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Lire, écrire, exécuter pour tous (4+2+1=7).&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;chmod 755&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Lire, écrire, exécuter pour le propriétaire du fichier
(4+2+1=7);
lire et exécuter pour le groupe et les autres (4+1=5).&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Pour davantage d&#039;options, voir &lt;code&gt;man chmod&lt;/code&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;ssh&quot;&gt;SSH&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ssh&lt;/strong&gt; joe@jdoe.tld&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Connexion à &lt;i&gt;jdoe.tld&lt;/i&gt; avec l&#039;utilisateur &lt;i&gt;joe&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ssh -p&lt;/strong&gt; 222 joe@jdoe.tld&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Se connecter à l&#039;hôte par le port &lt;i&gt;222&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h3&gt;Fichier de configuration SSH&lt;/h3&gt;
&lt;p&gt;Quand les connexions SSH sont récurrentes, on peut enregistrer
leurs paramètres dans le fichier &lt;code&gt;~/.ssh/config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En voici un exemple:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Host johndoe_com
HostName 192.168.0.100
User johnd
Port 4242
PasswordAuthentication no
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive no
ServerAliveInterval 60
ServerAliveCountMax 10
ControlPersist 4h
ControlMaster auto
VerifyHostKeyDNS yes
AddKeysToAgent yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et puis pour se connecter on lance SSH avec l&#039;&lt;i&gt;host&lt;/i&gt; de la
configuration: &lt;code&gt;ssh johndoe_com&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Avec rsync&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env sh
# Deploy http://johndoe.cc/
rsync -arvuz -O public_html/ johndoe_com:/var/www/htdocs/johndoe.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;compression&quot;&gt;Compression&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tar cf&lt;/strong&gt; fichiers.tar fichierA.txt fichierB.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Créer un &lt;i&gt;tar&lt;/i&gt; nommé &lt;i&gt;fichiers.tar&lt;/i&gt;, contenant &lt;i&gt;fichierA.txt&lt;/i&gt; &lt;i&gt;fichierB.txt&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tar xf&lt;/strong&gt; file.tar&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Extraire les fichiers de fichiers.tar.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tar czf&lt;/strong&gt; fichiers.tar.gz fichierA.txt fichierB.txt&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Créer un &lt;i&gt;tar&lt;/i&gt; avec un compression &lt;i&gt;Gzip&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;tar xzf&lt;/strong&gt; fichiers.tar.gz&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Extraire un &lt;i&gt;tar&lt;/i&gt; utilisant &lt;i&gt;Gzip&lt;/i&gt;.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;network&quot;&gt;Réseau&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;ping&lt;/strong&gt; hostname&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;i&gt;ping&lt;/i&gt; l&#039;hôte et retourne les informantions relatives à ce dernier.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;whois&lt;/strong&gt; lemor.se&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Retourne les infos &lt;i&gt;whois&lt;/i&gt; à propos d&#039;un nom de domaine.&lt;/dd&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;dt&gt;&lt;code&gt;&lt;strong&gt;dig&lt;/strong&gt; lemor.se&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Retourne les infos &lt;abbr&gt;DNS&lt;/abbr&gt; à propos d&#039;un nom de domaine.&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;xdg-utils&quot;&gt;xdg-utils&lt;/h2&gt;
&lt;dl&gt;
&lt;div&gt;
&lt;dt&gt;...&lt;/dt&gt;
&lt;dd&gt;...&lt;/dd&gt;
&lt;/div&gt;
&lt;/dl&gt;
</content>
</entry>
<entry>
<title>xterm</title>
<id>tag:wiki.soucy.cc,2024-02-17:/xterm.html</id>
<link href="https://wiki.soucy.cc//xterm.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2024-02-17T13:38:17Z</published>
<updated>2026-01-14T20:30:28Z</updated>
<content type="html">
&lt;h1&gt;xterm&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;./xterm-neofetch.png&quot; alt=&quot;Terminal xterm affichant le résultat de la commande neofetch&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;~/.Xresources&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;[...]
! Dracula Xresources palette
*.foreground: #F8F8F2
*.background: #282A36
*.color0:     #000000
*.color8:     #4D4D4D
*.color1:     #FF5555
*.color9:     #FF6E67
*.color2:     #50FA7B
*.color10:    #5AF78E
*.color3:     #F1FA8C
*.color11:    #F4F99D
*.color4:     #BD93F9
*.color12:    #CAA9FA
*.color5:     #FF79C6
*.color13:    #FF92D0
*.color6:     #8BE9FD
*.color14:    #9AEDFE
*.color7:     #BFBFBF
*.color15:    #E6E6E6
[...]
!!! Xterm
XTerm*eightBitInput: false
XTerm*loginShell: true
XTerm*scrollBar: false
XTerm*saveLines: 2000
XTerm*faceName: xft:Terminus:pixelsize=14
XTerm*internalBorder: 10
XTerm*locale: true
XTerm*pointerMode: 2
XTerm*allowTitleOps: true
XTerm*termName: xterm-256color
XTerm*selectToClipboard: true
xterm*VT100.Translations: #override \
Ctrl Shift &amp;lt;Key&amp;gt;V:    insert-selection(CLIPBOARD) \n\
Ctrl Shift &amp;lt;Key&amp;gt;C:    copy-selection(CLIPBOARD)
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title>Accessibilité web</title>
<id>tag:wiki.soucy.cc,2023-03-24:/a11y.html</id>
<link href="https://wiki.soucy.cc//a11y.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2023-03-24T14:10:23Z</published>
<updated>2026-01-14T20:11:27Z</updated>
<content type="html">
&lt;h1&gt;Accessibilité web&lt;/h1&gt;
&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;L&#039;accessibilité signifie que le contenu web tend à être
&lt;em&gt;universellement&lt;/em&gt; &lt;strong&gt;perceptible&lt;/strong&gt;, &lt;strong&gt;utilisable&lt;/strong&gt;, &lt;strong&gt;compréhensible&lt;/strong&gt;,
et ce, peu importe nos limitations physiologiques, cognitives ou même
technologiques.&lt;/p&gt;
&lt;h2&gt;Suivre le fil&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adrianroselli.com/&quot;&gt;Adrian Roselli&lt;/a&gt; [&lt;a href=&quot;https://adrianroselli.com/feed&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://brucelawson.co.uk/&quot;&gt;Bruce Lawson&lt;/a&gt; [&lt;a href=&quot;https://brucelawson.co.uk/feed/&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitala11y.com/&quot;&gt;Digital A11Y&lt;/a&gt; [&lt;a href=&quot;https://www.digitala11y.com/feed/&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labo.raamm.org/&quot;&gt;Laboratoire de promotion de l&#039;accessibilité&lt;/a&gt; [&lt;a href=&quot;https://labo.raamm.org/feed/&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://laurakalbag.com/&quot;&gt;Laura Kalbag&lt;/a&gt; [&lt;a href=&quot;https://laurakalbag.com/posts/index.xml&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tink.uk/&quot;&gt;Léonie Watson&lt;/a&gt; [&lt;a href=&quot;https://tink.uk/feed.xml&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sarasoueidan.com/&quot;&gt;Sara Soueidan&lt;/a&gt; [&lt;a href=&quot;https://www.sarasoueidan.com/blog/index.xml/&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://html5accessibility.com/&quot;&gt;Steve Faulkner&lt;/a&gt; [&lt;a href=&quot;https://html5accessibility.com/stuff/feed/&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tetralogical.com/&quot;&gt;TetraLogical&lt;/a&gt; [&lt;a href=&quot;https://tetralogical.com/feed.xml&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.a11yproject.com/&quot;&gt;The A11Y project&lt;/a&gt; [&lt;a href=&quot;https://www.a11yproject.com/feed/feed.xml&quot;&gt;RSS&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/&quot;&gt;WebAIM&lt;/a&gt; &lt;a href=&quot;https://webaim.org/blog/feed&quot;&gt;[RSS]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Suivre le guide&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.accessibility-developer-guide.com/&quot;&gt;Welcome to the Accessibility Developer Guide!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labo.raamm.org/formation/&quot;&gt;Formation du Laboratoire de promotion de l&#039;accessibilité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inclusivedesignprinciples.org/fr/&quot;&gt;Principes de Conception Inclusive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://evilmartians.com/chronicles/accessible-design-from-the-get-go&quot;&gt;A guide to designing accessible, WCAG-compliant focus indicators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/WCAG20-TECHS/G201.html&quot;&gt;G201: Giving users advanced warning when opening a new window&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/techniques/keyboard&quot;&gt;Keyboard Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Suivre le rythme&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://yewtu.be/watch?v=OUDV1gqs9GA&quot;&gt;How A Screen Reader User Surfs The Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alistapart.com/article/accessibility-for-vestibular/&quot;&gt;Accessibility for Vestibular Disorders: How My Temporary Disability Changed My Perspective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.interaction-design.org/literature/article/learn-to-create-accessible-websites-with-the-principles-of-universal-design&quot;&gt;Learn to Create Accessible Websites with the Principles of Universal Design &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.un.org/development/desa/disabilities/resources/factsheet-on-persons-with-disabilities.html&quot;&gt;Factsheet on Persons with Disabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scribe.rip/wcag-3-0-what-you-need-to-know-about-the-future-of-accessibility-standards-2e1f6374f2c7&quot;&gt;WCAG 3.0: What you need to know about the future of accessibility standards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alistapart.com/article/designing-inclusive-content-models/&quot;&gt;Designing Inclusive Content Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://invidious.privacydev.net/playlist?list=PLn7dsvRdQEfHjluJsuzNto9PFhAsG3Hwb&quot;&gt;Inclusive Design 24&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiveness-of-simple-html/&quot;&gt;The unreasonable effectiveness of simple HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://evilmartians.com/chronicles/accessible-design-from-the-get-go&quot;&gt;Accessible design from the get-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tetralogical.com/blog/2023/02/10/foundations-wai-aria/&quot;&gt;Foundations: introduction to WAI-ARIA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jakearchibald.com/2021/great-alt-text/&quot;&gt;Writing great alt text: Emotion matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://24ways.org/2016/what-the-heck-is-inclusive-design/&quot;&gt;What the Heck Is Inclusive Design?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Suivre la voix&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://techblog.wikimedia.org/2020/07/02/an-orca-screen-reader-tutorial/&quot;&gt;An Orca screen reader tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://odilia.app/&quot;&gt;Odilia is a new screen reader for the Linux desktop.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Outils&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Heydon/inclusive-design-checklist&quot;&gt;Inclusive Web Design Checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wave.webaim.org/&quot;&gt;WAVE Web Accessibility Evaluation Tools&lt;/a&gt;
*&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- WAI-ARIA --&gt;
&lt;!-- -------- --&gt;
&lt;!-- ARIA est là pour enrichir le HTML sémantique, surtout lors --&gt;
&lt;!-- d&#039;interactions. --&gt;
&lt;!-- Cela consiste en une collection d&#039;attributs HTML qui permettent de --&gt;
&lt;!-- préciser ou définir un role, un état, ou une propriété. --&gt;
</content>
</entry>
<entry>
<title>Mémento expressions régulières</title>
<id>tag:wiki.soucy.cc,2023-03-19:/regex.html</id>
<link href="https://wiki.soucy.cc//regex.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2023-03-19T13:54:58Z</published>
<updated>2025-09-01T22:44:33Z</updated>
<content type="html">
&lt;h1&gt;Mémento expressions régulières&lt;/h1&gt;
&lt;p&gt;Sous &lt;a href=&quot;/mots-cles.html#unix&quot;&gt;Unix&lt;/a&gt;, grep, sed, et &lt;a href=&quot;/awk.html&quot;&gt;awk&lt;/a&gt; utilisent
les expressions régulières. Tout comme d&#039;ailleurs, la très grande
majorité des langages de programmation ou des éditeurs texte.&lt;/p&gt;
&lt;details id=&quot;toc&quot; open=&quot;&quot;&gt;
&lt;summary&gt;Sur cette page&lt;/summary&gt;
&lt;ol role=&quot;list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#period&quot;&gt;Le point: &lt;code&gt;.&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sqBrackets&quot;&gt;Crochets: &lt;code&gt;[xyz]&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sqBracketsEx&quot;&gt;Crochets avec exclusion: &lt;code&gt;[^xyz]&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sqBracketsRange&quot;&gt;Crochets avec plage: &lt;code&gt;[a-z]&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#asterisk&quot;&gt;Astérisque: &lt;code&gt;*&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#symbAdd&quot;&gt;Symbole d&#039;addition: &lt;code&gt;+&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#questMark&quot;&gt;Point d&#039;interrogation: &lt;code&gt;?&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#curlyBraces&quot;&gt;Accolades: &lt;code&gt;{}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#parenthesis&quot;&gt;Parenthèses: &lt;code&gt;()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#parenthesisNoCap&quot;&gt;Parenthèses sans capture: &lt;code&gt;(?: )&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#parenthesisPipe&quot;&gt;Parenthèses avec &lt;i&gt;pipe&lt;/i&gt;: &lt;code&gt;(abc|xyz)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#escapeChar&quot;&gt;Caractère d&#039;échappement: &lt;code&gt;\&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#getDate&quot;&gt;Extraire une date de type &lt;i&gt;AAAA-MM-JJ&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#getTitle&quot;&gt;Extraire un titre de type &lt;em&gt;markdown&lt;/em&gt; ou &lt;em&gt;gemtext&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#getDomain&quot;&gt;Extraire le domaine d&#039;une adresse courriel&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2&gt;Motifs de base&lt;/h2&gt;
&lt;h3 id=&quot;period&quot;&gt;Le point: &lt;code&gt;.&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Il permet de sélectionner n&#039;importe quel caractère: lettres,
chiffres, ponctuations, les espaces... tout.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ . /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;
&lt;mark&gt;A&lt;/mark&gt;&lt;mark&gt;B&lt;/mark&gt;&lt;mark&gt;C&lt;/mark&gt;&lt;mark&gt;D&lt;/mark&gt;&lt;mark&gt;&amp;nbsp;&lt;/mark&gt;&lt;mark&gt;1&lt;/mark&gt;&lt;mark&gt;2&lt;/mark&gt;&lt;mark&gt;3&lt;/mark&gt;&lt;mark&gt;4&lt;/mark&gt;&lt;mark&gt;&amp;nbsp;&lt;/mark&gt;&lt;mark&gt;!&lt;/mark&gt;&lt;mark&gt;@&lt;/mark&gt;&lt;mark&gt;#&lt;/mark&gt;&lt;mark&gt;$&lt;/mark&gt;
&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;sqBrackets&quot;&gt;Crochets: &lt;code&gt;[xyz]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Si on cherche une chaîne de caractères avec des lettres qui
divergent, on utilise les crochets.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ foi[sex] /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;fois&lt;/mark&gt;, &lt;mark&gt;foie&lt;/mark&gt;, foil, &lt;mark&gt;foix&lt;/mark&gt;&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;sqBracketsEx&quot;&gt;Crochets avec exclusion: &lt;code&gt;[^xyz]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Inversement, si je voulais plutôt exclure les mots commençant par &lt;b&gt;foi&lt;/b&gt; mais
ce terminant pas &lt;b&gt;s&lt;/b&gt;, &lt;b&gt;e&lt;/b&gt; ou &lt;b&gt;x&lt;/b&gt;, j&#039;utliserais l&#039;accent circonflexe comme
premier caractère suivant le crochet de gauche.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ foi[^sex] /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;fois, foie, &lt;mark&gt;foil&lt;/mark&gt;, foix&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;sqBracketsRange&quot;&gt;Crochets avec plage: &lt;code&gt;[a-z]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Pour capturer une séquence de caractères dans une chaîne on utilise
le trait d&#039;union (range expression).&lt;/p&gt;
&lt;p&gt;Cette expression tient compte de la casse.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ [m-q] /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;abcdefghijkl&lt;mark&gt;mnopq&lt;/mark&gt;rstuvwxyz&lt;/samp&gt;
&lt;/p&gt;
&lt;p&gt;C&#039;est idem avec les chiffres...&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ [5-7] /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;01234&lt;mark&gt;567&lt;/mark&gt;8998&lt;mark&gt;765&lt;/mark&gt;43210&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;asterisk&quot;&gt;Astérisque: &lt;code&gt;*&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Le caractère précédent l&#039;astérisque peut être absent ou présent de
multiple fois.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ cré* /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;cr&lt;/mark&gt;evées &lt;mark&gt;créé&lt;/mark&gt;es&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;symbAdd&quot;&gt;Symbole d&#039;addition: &lt;code&gt;+&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Dans ce cas-ci, nous voulons indiquer que le caractère précédent le &lt;code&gt;+&lt;/code&gt; est
présent une fois ou possiblement plus.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ cré+ /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;crevées &lt;mark&gt;créé&lt;/mark&gt;es&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;questMark&quot;&gt;Point d&#039;interrogation: &lt;code&gt;?&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Un caractère est rendu facultatif s&#039;il est suivi par un point
d&#039;interrogation.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ Cou?lombe /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;Coulombe&lt;/mark&gt; ou &lt;mark&gt;Colombe&lt;/mark&gt;&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;curlyBraces&quot;&gt;Accolades: &lt;code&gt;{}&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Préciser par &lt;var&gt;n&lt;/var&gt; le nombre de fois qu&#039;un caractère peut
être répété.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ Bo{3}uh /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;Booouh&lt;/mark&gt; Booooouh!&lt;/samp&gt;
&lt;/p&gt;
&lt;p&gt;On peut aussi définir un nombre minimal de répétition en ajoutant
une virgule à la suite de &lt;var&gt;n&lt;/var&gt;.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ Bo{3,}uh /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;Booouh&lt;/mark&gt; &lt;mark&gt;Booooouh&lt;/mark&gt;!&lt;/samp&gt;
&lt;/p&gt;
&lt;p&gt;Pour déterminer une fourchette, il suffit d&#039;ajouter, suivant la
virgule, une valeur qui correspond à la limite recherchée.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ Bo{1,3}uh /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;Bouh&lt;/mark&gt; &lt;mark&gt;Boouh&lt;/mark&gt; &lt;mark&gt;Booouh&lt;/mark&gt; Booooouh!&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;parenthesis&quot;&gt;Parenthèses: &lt;code&gt;()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Les parenthèses sont utilisées pour grouper des expressions.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ (blabla) /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;Bla, bla, &lt;mark&gt;blabla&lt;/mark&gt;, &lt;mark&gt;blabla&lt;/mark&gt;...&lt;/samp&gt;
&lt;/p&gt;
&lt;p&gt;Un groupe peut être référencé par une barre oblique inversé suivie
d&#039;un chiffre: &lt;code&gt;\&lt;var&gt;n&lt;/var&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ (bla) \1, (blabla), \2 /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
Ici deux groupes se retrouvent référencés...
&lt;/p&gt;
&lt;p&gt;
&lt;samp&gt;&lt;mark&gt;bla bla, blabla, blabla&lt;/mark&gt;&lt;/samp&gt;
&lt;/p&gt;
&lt;h3 id=&quot;parenthesisNoCap&quot;&gt;Parenthèses sans capture: &lt;code&gt;(?: )&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Ignorer un groupe parmis d&#039;autres.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ (?:bla) (blabla) \1 /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;bla &lt;mark&gt;bla &lt;/mark&gt;&lt;mark&gt;blabla&lt;/mark&gt;&lt;mark&gt; blabla&lt;/mark&gt;&lt;/samp&gt;
&lt;/p&gt;
&lt;h3 id=&quot;parenthesisPipe&quot;&gt;Parenthèses avec &lt;i&gt;pipe&lt;/i&gt;: &lt;code&gt;(abc|xyz)&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Choisir par alternance parmi plusieurs expressions.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ (châ|ra|gâ)teau|camion /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;Au &lt;mark&gt;château&lt;/mark&gt; il glace le &lt;mark&gt;gâteau&lt;/mark&gt; à
l&#039;aide d&#039;un &lt;mark&gt;rateau&lt;/mark&gt;... Et au loin, un &lt;mark&gt;camion&lt;/mark&gt;.&lt;/samp&gt;
&lt;/p&gt;
&lt;h3 id=&quot;escapeChar&quot;&gt;Caractère d&#039;échappement: &lt;code&gt;\&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Pour inclure des caractères qui sont d&#039;abord réservés à la
conception aux expressions régulières il faut les précéder du
caractère d&#039;échappement.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ (\*|\.) /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;Sélectionner un astérisque&lt;mark&gt;*&lt;/mark&gt; et trois points&lt;mark&gt;...&lt;/mark&gt;&lt;/samp&gt;
&lt;/p&gt;
&lt;hr/&gt;
&lt;h2&gt;Quelques exemples pouvant être utiles&lt;/h2&gt;
&lt;h3 id=&quot;getDate&quot;&gt;Extraire une date de type &lt;i&gt;AAAA-MM-JJ&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;Ici nous avons trois fichiers classés du plus récent au moins
récent et nous voulons extraire les dates qui se trouvent au début des
noms...&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ ([0-9]{4})(-)([0-9]{2})(-)([0-9]{2}) /g&lt;/code&gt;
&lt;/pre&gt;
&lt;ol reversed=&quot;&quot;&gt;
&lt;li&gt;&lt;samp&gt;&lt;mark&gt;2024-03-12&lt;/mark&gt;-nam-euismod-tellus-id-erat.md&lt;/samp&gt;&lt;/li&gt;
&lt;li&gt;&lt;samp&gt;&lt;mark&gt;2024-02-21&lt;/mark&gt;-sed-id-ligula-quis-est-convallis-tempor.md&lt;/samp&gt;&lt;/li&gt;
&lt;li&gt;&lt;samp&gt;&lt;mark&gt;2024-01-05&lt;/mark&gt;-Mauris-ac-felis-vel-velit-tristique-imperdiet.md&lt;/samp&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h3 id=&quot;getTitle&quot;&gt;Extraire un titre de type &lt;em&gt;markdown&lt;/em&gt; ou &lt;em&gt;gemtext&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Récupérer les titres sans les caractères &lt;code&gt;#&lt;/code&gt; et l&#039;espace
précédant le premier mot.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/ [^#{1,6}\s].+ /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;# &lt;mark&gt;Nullam eu ante vel est convallis dignissim&lt;/mark&gt;&lt;/samp&gt;&lt;br/&gt;
&lt;samp&gt;## &lt;mark&gt;Aliquam erat volutpat&lt;/mark&gt;&lt;/samp&gt;&lt;br/&gt;
&lt;samp&gt;### &lt;mark&gt;Cras placerat accumsan nulla&lt;/mark&gt;&lt;/samp&gt;
&lt;/p&gt;
&lt;h3 id=&quot;getDomain&quot;&gt;Extraire le domaine d&#039;une adresse courriel&lt;/h3&gt;
&lt;pre&gt;
&lt;code&gt;/ (?&lt;=@)(.*)$ /g&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;samp&gt;Vous pouvez me joindre à l&#039;adresse suivante: hs0ucy@&lt;mark&gt;soucy.cc&lt;/mark&gt;.&lt;/samp&gt;
&lt;/p&gt;
</content>
</entry>
<entry>
<title>awk</title>
<id>tag:wiki.soucy.cc,2023-03-17:/awk.html</id>
<link href="https://wiki.soucy.cc//awk.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2023-03-17T09:41:48Z</published>
<updated>2026-03-04T16:08:41Z</updated>
<content type="html">
&lt;h1&gt;Survoler awk&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;awk&lt;/strong&gt; est un langage de programmation pour manipuler du texte. Il est
souvent employer pour extraire et formater des données. Il est presque
toujours présent par défaut sur les systèmes d&#039;exploitation de type
Unix.&lt;/p&gt;
&lt;h2&gt;Les bases&lt;/h2&gt;
&lt;p&gt;Nos commandes peuvent être directement dans le terminal ou sinon dans
un fichier avec l&#039;extension &lt;code&gt;.awk&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;awk &#039;mes_instructions_awk&#039; données-a.csv données-b.csv
awk -f instructions.awk données-c.csv données-d.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Règle et action &lt;/h3&gt;
&lt;p&gt;Un programme awk consiste en un ensemble de pair de règles et
d&#039;actions. Il peut y avoir autant de ces pairs que nous en avons
besoin.&lt;/p&gt;
&lt;p&gt;Chaque pair sera éxécutée indépendamment des autres, et si une ligne
correspond à plus d&#039;une règle, elle aura plus d&#039;une action
correspondante.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;une règle { une action }
une autre règle { une autre action }
3e règle { 3e action }
... Etc.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le point virgule est utilisé pour séparer des commandes qui seraient
sur une même ligne:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;une règle { une action }; une autre règle { une autre action }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il existe des règles spécifiques comme &lt;code&gt;BEGIN&lt;/code&gt; et &lt;code&gt;END&lt;/code&gt; pour des
actions à faire au début et à la fin du traitement.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BEGIN { ... }
END { ... }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Avec données&lt;/h2&gt;
&lt;p&gt;Pour les besoins de notre exploration, je suis aller piger dans &lt;a href=&quot;https://www.stlevis.ca/stlevis/donnees-ouvertes&quot;&gt;les
données ouvertes de la Société de transport de
Lévis&lt;/a&gt; (STL). Nous
allons utiliser les donneées sur les trajets que j&#039;ai reproduis dans
ce fichier: &lt;a href=&quot;/awk-data-sample.txt&quot;&gt;awk-data-sample.txt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;awk possède des &lt;a href=&quot;https://www.gnu.org/software/gawk/manual/gawk.html#Built_002din-Variables&quot;&gt;variables
prédéfinies&lt;/a&gt;
et &lt;code&gt;NR&lt;/code&gt; est une de celles-là. Elle nous retourne le nombre de lignes
lues jusqu&#039;à présent.
e
Nous pouvons nous en servir pour regarder les dix premières lignes de
notre fichier de données:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;awk &#039;NR &amp;lt;= 10&#039; awk-data-sample.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quand les commandes ne spécifient pas d&#039;action, &lt;code&gt;print&lt;/code&gt; est choisie
implicitement; ce qui nous retourne ceci:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;﻿route_id,service_id,trip_id,trip_headsign,trip_short_name,direction_id,block_id,shape_id,wheelchair_accessible
11A,2,344166,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344167,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344168,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344169,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344170,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344171,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344172,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344173,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344174,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ici nous voyons les en-têtes sur la première ligne, puis ensuite les
entrées elles-mêmes, sur les ligne suivantes. Et nous constatons que
les données sont séparées par des virgules.&lt;/p&gt;
&lt;p&gt;Pour avoir accès aux données seulement il nous faut ignorer la
première ligne qui contient les en-têtes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;awk &#039;NR &amp;gt; 1&#039; awk-data-sample.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Le séparateur &lt;/h3&gt;
&lt;p&gt;Par défaut, awk considère l&#039;espace comme séparateur. Nous pouvons en
paramètrer un autre avec l&#039;étiquette &lt;code&gt;-F&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;awk -F &#039;,&#039; &#039;NR &amp;lt;= 10 { print $1 }&#039; awk-data-sample.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La commande ci-dessus, permet d&#039;utiliser la virgule comme séparateur
et nous affiche le premier champ des dix premières lignes&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;﻿route_id
11A
11A
11A
11A
11A
11A
11A
11A
11A
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Sources / Ressources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learnxinyminutes.com/docs/fr-fr/awk-fr/&quot;&gt;https://learnxinyminutes.com/docs/fr-fr/awk-fr/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ferd.ca/awk-in-20-minutes.html&quot;&gt;https://ferd.ca/awk-in-20-minutes.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/gawk/manual/gawk.html&quot;&gt;https://www.gnu.org/software/gawk/manual/gawk.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gregable.com/2010/09/why-you-should-know-just-little-awk.html&quot;&gt;https://gregable.com/2010/09/why-you-should-know-just-little-awk.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>CSS et Unix</title>
<id>tag:wiki.soucy.cc,2022-03-24:/webdev-unix/css.html</id>
<link href="https://wiki.soucy.cc//webdev-unix/css.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2022-03-24T15:10:22Z</published>
<updated>2026-01-14T21:05:28Z</updated>
<content type="html">
&lt;h1&gt;CSS et Unix&lt;/h1&gt;
&lt;h2&gt;Regrouper plusieurs feuilles de styles ensemble sous Unix&lt;/h2&gt;
&lt;p&gt;À des fins de performance, cela peut-être une bonne idée de regrouper
nos feuilles de styles pour réduire le nombre de requêtes HTTP.&lt;/p&gt;
&lt;p&gt;Si avec HTTP 1.1, c&#039;était bien vue de ne servir qu&#039;un seul fichier
CSS. Avec HTTP 2, il est conseillé de découper ses feuilles en
plusieurs ballots hiérarchisés, plutôt qu&#039;en un seul gros bloc de
code.&lt;/p&gt;
&lt;p&gt;À ce sujet, voir le banc d&#039;essai de Harry Roberts: &lt;a href=&quot;https://csswizardry.com/2018/11/css-and-network-performance/&quot;&gt;CSS and Network
Performance&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Règle &lt;code&gt;@import&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;La règle CSS &lt;code&gt;@import&lt;/code&gt;, n&#039;est pas conseillé en production pour
justement une question de performance.&lt;/p&gt;
&lt;p&gt;Alors quelle autre option nous reste-t-il si on veut découper nos
styles sans passer par un préprocesseur?&lt;/p&gt;
&lt;h3&gt;Utilitaire &lt;code&gt;cat&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Pour concaténer des fichiers ensemble sous Unix il faut utiliser
l&#039;utilitaire &lt;code&gt;cat&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat - concatenate and print files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Avec peu de fichiers CSS, on peut simplement faire:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat a.css b.css c.css d.css e.css f.css &amp;gt; styles.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En voulant être plus concis cela serait:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat *.css &amp;gt; styles.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mais en CSS l&#039;ordre des déclarations est important. Nous ne voudrions
pas neutraliser ou déclasser certains styles.&lt;/p&gt;
&lt;p&gt;Dans les utilitaires du shell il y a un flux entrant (standard input ou
stdin) et un flux sortant (standard output ou stdout). La lecture se
fait par le &lt;strong&gt;stdin&lt;/strong&gt; et l&#039;écriture par le &lt;strong&gt;stdout&lt;/strong&gt;. Il y a aussi un flux
sortant pour les erreurs (standard error ou stderr).&lt;/p&gt;
&lt;p&gt;Il est toutefois possible détourner ces flux. Comme par exemple avec
&lt;code&gt;&amp;lt;&lt;/code&gt; ou &lt;code&gt;&amp;gt;&lt;/code&gt; en appliquant des redirections vers un fichier, comme dans
mon exemple ci-haut, avec l&#039;utilitaire &lt;code&gt;cat&lt;/code&gt;, où l&#039;on redirige la
sortie vers le fichier &lt;code&gt;styles.css&lt;/code&gt;. Sans cette redirection le
résultat s&#039;afficherait dans le terminal avec &lt;code&gt;stdout&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La redirection d&#039;entrée utilise le symbole &lt;code&gt;&amp;lt;&lt;/code&gt;. Cela permet d&#039;indiquer
qu&#039;un fichier sera passé en &lt;em&gt;stdin&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Concaténer une liste de CSS avec &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt; et &lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Maintenant nous allons utilser une boucle de type &lt;code&gt;while&lt;/code&gt;, combiné
avec l&#039;utilitaire &lt;code&gt;read&lt;/code&gt;, pour concaténer un groupe de fichiers CSS.&lt;/p&gt;
&lt;p&gt;Notre liste se trouve dans un fichier nommé &lt;code&gt;global-styles.txt&lt;/code&gt;. Nous
y avons inscrit une feuille de style par ligne:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;global/tokens/typography.css
global/tokens/colors.css
global/tokens/grid.css
global/base.css
global/a11y.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite, notre script sera dans un autre fichier que nous appellerons
&lt;code&gt;css.sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
while read -r line; do
[ -n &quot;$line&quot; ] &amp;amp;&amp;amp; cat &quot;./$line&quot;
done &amp;lt; global-styles.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Attention, il est important de s&#039;assurer que ce fichier soit
exécutable (&lt;code&gt;chmod u+x css.sh&lt;/code&gt;), avant de lancer la commande:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./css.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si tout s&#039;est bien passé, on constate que le contenu de toutes les
feuilles que nous avons listées s&#039;affichent dans le terminal.&lt;/p&gt;
&lt;p&gt;Dans ce script, la valeur de chaque ligne est assignée à la variable
&lt;code&gt;line&lt;/code&gt;. Puis &lt;code&gt;[ -n &quot;$line&quot; ]&lt;/code&gt;, teste si la chaîne de caractère
retournée par &lt;code&gt;$line&lt;/code&gt; n&#039;est pas &lt;code&gt;null&lt;/code&gt; avant de d&#039;exécuter &lt;code&gt;cat&lt;/code&gt;. Et
finalement, notre liste est dirigée dans la boucle avec &lt;code&gt;&amp;lt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;L&#039;étape suivante serait de rediriger &lt;code&gt;stdout&lt;/code&gt; vers un fichier CSS avec
&lt;code&gt;&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
while read -r line; do
[ -n &quot;$line&quot; ] &amp;amp;&amp;amp; cat &quot;./$line&quot;
done &amp;lt; global-styles.txt &amp;gt; global.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On pourrait aussi ne pas vouloir de fichier &lt;code&gt;.txt&lt;/code&gt; et lister
directement dans le script les fichier à concaténer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
while read -r line; do
[ -n &quot;$line&quot; ] &amp;amp;&amp;amp; cat &quot;./$line&quot;
done &amp;lt;&amp;lt;EOF
global/tokens/typography.css
global/tokens/colors.css
global/tokens/grid.css
global/base.css
global/a11y.css
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ici &lt;code&gt;EOF&lt;/code&gt; est une commande qui permet de faire une entrée
multiligne. Donc toutes les lignes qui se trouve entre &lt;code&gt;&amp;lt;&amp;lt;EOF&lt;/code&gt; et
&lt;code&gt;EOF&lt;/code&gt; est passé à &lt;code&gt;stdin&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Minifier une feuille de style avec &lt;code&gt;tr&lt;/code&gt; pour réduire son poid&lt;/h2&gt;
&lt;p&gt;L&#039;utilitaire &lt;code&gt;tr&lt;/code&gt; sert à &lt;em&gt;traduire&lt;/em&gt; ou éliminer des caractères. Il va
permettre de retirer les sauts de ligne et les retours dans notre CSS,
pour ramener toutes les règles sur une seule ligne. Le poid du fichier
sera donc un peu moindre:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat global.css | tr -d &#039;\n\r&#039; &amp;gt; &quot;$global.min.css&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le caractère &lt;code&gt;|&lt;/code&gt;, que l&#039;on appelle &lt;em&gt;pipe&lt;/em&gt;, sert à lier deux processus
en prenant le flux de sortie du premier, pour en faire le flux
d&#039;entrée du second.&lt;/p&gt;
&lt;p&gt;Nous pourrions aussi retirer les &lt;em&gt;tabs&lt;/em&gt; avec &lt;code&gt;tr -d &#039;\t&#039;&lt;/code&gt;, et les
espaces multiples avec &lt;code&gt;tr -s &#039; &#039; &#039; &#039;&lt;/code&gt;. Cependant je ne conseillerais
pas de supprimer les espaces simples avec &lt;code&gt;tr&lt;/code&gt;, et ce, parce que des
fonctions CSS comme &lt;code&gt;calc()&lt;/code&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/calc#notes&quot;&gt;nécessitent des espaces entre certains
opérateurs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour ma part, j&#039;ai développé en &lt;a href=&quot;/mots-cles.html#lua&quot;&gt;lua&lt;/a&gt;, &lt;a href=&quot;https://codeberg.org/hs0ucy/cssmin&quot; title=&quot;cssmin is a CLI
utility to removes line breaks, comments and spaces around symbols in
a CSS file&quot;&gt;mon propre petit
utilitaire&lt;/a&gt; pour contourner ce genre particularités. Ceci dit,
dépendamment de la taille total de votre fichier CSS, les gains sont
assez négligeables.&lt;/p&gt;
&lt;p&gt;Voyons maintenant à quoi ressemble notre minification avec ces deux
commandes &lt;code&gt;tr&lt;/code&gt; supplémentaires&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat global.css | tr -d &#039;\n\r&#039; | tr -d &#039;\t&#039; | tr -s &#039; &#039; &#039; &#039; &amp;gt; &quot;$global.min.css&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Retirer les commemtaires avec &lt;code&gt;sed&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Malgré que, ce ne soit pas la façon la plus optimale de minifier, cela
permet de faire des gains de plusieurs kilo-octets.&lt;/p&gt;
&lt;p&gt;Mais les blocs de commentaires demeurent, et &lt;code&gt;sed&lt;/code&gt; pourrait sans doute
les retirer pour nous:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat global.css | tr -d &#039;\n\r&#039; | tr -d &#039;\t&#039; | tr -s &#039; &#039; &#039; &#039; | sed -r &#039;:a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba&#039;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Rendu ici, nous pouvons rassembler la concaténation et minification:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
while read -r line; do
[ -n &quot;$line&quot; ] &amp;amp;&amp;amp; cat &quot;./$line&quot;
done &amp;lt;&amp;lt;EOF | tr -d &#039;\n\r&#039; | tr -d &#039;\t&#039; | tr -s &#039; &#039; &#039; &#039; | sed -r &#039;:a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba&#039; &amp;gt; &quot;global.min.css&quot;
global/tokens/typography.css
global/tokens/colors.css
global/tokens/grid.css
global/base.css
global/a11y.css
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pas si mal hein? Sans rien installer d&#039;externe sur notre poste de
travail, nous sommes en mesure de concaténer et réduire la taille des
fichiers CSS, avec à peine, quelques lignes de &lt;a href=&quot;https://shellhaters.org/&quot;&gt;POSIX
shell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et, contrairement à de la configuration de modules NodeJS, ce que nous
apprenons ici, peut nous servir dans d&#039;autres contextes qui, n&#039;ont
rien à voir avec le développement web.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le fichier &lt;a href=&quot;https://codeberg.org/hs0ucy/hscc/src/branch/main/src/css/css.sh&quot;&gt;css.sh&lt;/a&gt; que j&#039;utilise ici.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Post-scriptum&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://eradman.com/entrproject/&quot;&gt;entr&lt;/a&gt;, est un utilitaire qui permet
d&#039;exécuter des commandes quand des fichiers sont modifiés.&lt;/p&gt;
&lt;p&gt;Ce qui en fait l&#039;outil parfait pour mettre à jour automatiquement les
changements portés à nos feuilles de styles:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find . | entr -d ./css.sh
&lt;/code&gt;&lt;/pre&gt;
</content>
</entry>
<entry>
<title> Le climat et le Web: Réduire de 80% le poids des pages</title>
<id>tag:wiki.soucy.cc,2021-11-29:/liposuccion-web.html</id>
<link href="https://wiki.soucy.cc//liposuccion-web.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2021-11-29T21:03:34Z</published>
<updated>2026-02-13T15:45:36Z</updated>
<content type="html">
&lt;h1&gt;Le climat et le Web: Réduire de 80% le poids des pages&lt;/h1&gt;
&lt;p&gt;L&#039;accord de Paris (COP21) a eu lieu en 2015. Cette année-là, le poids
moyen d&#039;une page web tournait autour de 2,3 Mo. Aujourd&#039;hui ça
ressemble davantage à 6,0 Mo.&lt;/p&gt;
&lt;p&gt;Même si ces mesures ne sont pas complètement représentatives, elles
illustrent tout de même une tendance que nous observons empiriquement
tous les jours: énormément de sites web souffrent de
&lt;a href=&quot;/surpoid-de-lauto-et-web.html&quot;&gt;surpoids&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour contenir le réchauffement à 1.5°C par rapport aux températures de
l&#039;époque pré-industrielle, le GIEC nous dit, qu&#039;idéalement, il faut
réduire nos émissions d&#039;environ de 80%.&lt;/p&gt;
&lt;p&gt;Alors comment l&#039;industrie du web peut faire sa part? Tout simplement
en se donnant une mesure étalon à ne pas dépasser. Un budget par page
en kilo-octet (Ko).&lt;/p&gt;
&lt;p&gt;Pour des raisons évidentes, nous ne pouvons pas nous servir d&#039;une
mesure pré-industrielle. Je suggère donc de prendre celle de 2015 que
j&#039;invoquais au début, et d&#039;en retirer le 80% proposé par le GIEC
(2300 Ko &amp;ndash; 80%) &amp;hellip; Cela nous donne un poids type de 460 Ko par page.&lt;/p&gt;
&lt;p&gt;Évidemment, en bas de cela, ça serait encore mieux, ou aller jusqu&#039;à
&lt;a href=&quot;https://512kb.club/&quot;&gt;512 Ko&lt;/a&gt;, aurait tout de même tout un impact et
ferait une vraie différence.&lt;/p&gt;
&lt;p&gt;Nous pourrions ne pas nous donner de limite et héberger nos sites chez
des hébergeurs dont l&#039;électricité est produite avec des énergies
renouvelables. Mais, cette croissance infinie demande toujours plus
de ressources au niveau du matériel et nous conduit à l&#039;obsolescence
programmée.&lt;/p&gt;
&lt;p&gt;Et selon les statistiques, le principal impact négatif d&#039;un objet sur
l&#039;environnement, vient des processus d&#039;extraction et de production.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Je ne me fais pas d&#039;illusion sur le niveau d&#039;engagement de l&#039;industrie du
numérique pour contrer les bouleversements écologiques. C&#039;est un milieu
où l&#039;on glorifie la complexité et le solutionnisme technologique avant
l&#039;éthique.&lt;/p&gt;
&lt;p&gt;Toutefois, je crois qu&#039;un certain leadership de la part des
concepteurs et des clients pourraient faire tourner le vent dans la
bonne direction.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://almanac.httparchive.org/en/2020/page-weight&quot;&gt;https://almanac.httparchive.org/en/2020/page-weight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fr.wikipedia.org/wiki/Accord_de_Paris_sur_le_climat&quot;&gt;https://fr.wikipedia.org/wiki/Accord_de_Paris_sur_le_climat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ledevoir.com/societe/environnement/538613/rapport-du-giec-en-suivi&quot;&gt;https://www.ledevoir.com/societe/environnement/538613/rapport-du-giec-en-suivi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Minification CSS avec Lua</title>
<id>tag:wiki.soucy.cc,2021-11-26:/minification-css-avec-lua.html</id>
<link href="https://wiki.soucy.cc//minification-css-avec-lua.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2021-11-26T09:21:21Z</published>
<updated>2026-01-14T20:31:43Z</updated>
<content type="html">
&lt;h1&gt;Minification CSS avec Lua&lt;/h1&gt;
&lt;p&gt;La semaine passée, je me suis lancé dans la confection d&#039;un petit
script &lt;strong&gt;lua&lt;/strong&gt; pour &lt;strong&gt;minifier le CSS&lt;/strong&gt;, que j&#039;ai simplement nommé
&lt;a href=&quot;https://codeberg.org/hs0ucy/cssmin&quot;&gt;cssmin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il n&#039;y pas de dépendance. Tout ce que vous avez besoin c&#039;est de lua
(&gt;= 5.1).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cssmin&lt;/strong&gt; consiste donc à:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;supprimer les saut de lignes;&lt;/li&gt;
&lt;li&gt;retirer les espaces autour des caratères suivants: &lt;code&gt;:&lt;/code&gt;, &lt;code&gt;;&lt;/code&gt;, &lt;code&gt;,&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;{&lt;/code&gt;, &lt;code&gt;}&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;et finalement effacer les commentaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je n&#039;ai cependant pas retiré les espaces autour des caractères &lt;code&gt;+&lt;/code&gt; et
&lt;code&gt;-&lt;/code&gt;, puisque que dans la fonction &lt;code&gt;calc()&lt;/code&gt;, il doit y avoir ces
espaces entre les valeurs et les opérateurs d&#039;addition et de
soustraction, sinon les calculs ne fonctionnent pas.&lt;/p&gt;
&lt;p&gt;Éventuellement, je préciserai ma condition pour viser tout ce qui se
trouve en-dehors de cette fonction.&lt;/p&gt;
&lt;p&gt;Vous pouvez consulter le code ici:
&lt;a href=&quot;https://codeberg.org/hs0ucy/cssmin&quot;&gt;https://codeberg.org/hs0ucy/cssmin&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Comment l&#039;utiliser?&lt;/h2&gt;
&lt;p&gt;D&#039;abord récupérer &lt;strong&gt;cssmin&lt;/strong&gt; avec git:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://codeberg.org/hs0ucy/cssmin.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il faut ensuite passer un fichier CSS en argument. Le résultat
s&#039;affichera dans le terminal (stdout):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./cssmin ../monprojetweb/css/styles.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour rediriger le contenu dans un fichier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./cssmin ../monprojetweb/css/styles.css &amp;gt; ../monprojetweb/css/styles.min.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si vous êtes sous GNU/Linux ou BSD, vous pouvez déposer &lt;strong&gt;cssmin&lt;/strong&gt;
dans &lt;code&gt;$HOME/.local/bin/&lt;/code&gt;, afin de rendre la commande globale dans
votre environnment.&lt;/p&gt;
&lt;h2&gt;Automatiser la minification&lt;/h2&gt;
&lt;p&gt;Pour automatiser l&#039;exécution de &lt;strong&gt;cssmin&lt;/strong&gt;, il suffit d&#039;utiliser
&lt;a href=&quot;https://eradman.com/entrproject/&quot;&gt;entr&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo styles.css | entr -s &#039;cssmin styles.css &amp;gt; styles.min.css&#039;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Donc si &lt;code&gt;styles.css&lt;/code&gt; est modifié, la commande qui suit &lt;code&gt;entr -s&lt;/code&gt; sera
exécutée.&lt;/p&gt;
&lt;h2&gt;Et pour le JavaScript?&lt;/h2&gt;
&lt;p&gt;Il y a &lt;a href=&quot;https://github.com/douglascrockford/JSMin&quot;&gt;JSMin&lt;/a&gt; par &lt;a href=&quot;https://www.crockford.com/&quot;&gt;Douglas
Crockford&lt;/a&gt;, le père du format JSON. C&#039;est
une application autonome écrite en &lt;strong&gt;C&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C&#039;est d&#039;ailleurs JSMin qui m&#039;a donné l&#039;envie d&#039;écrire &lt;strong&gt;cssmin&lt;/strong&gt;.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Mémento Emacs</title>
<id>tag:wiki.soucy.cc,2021-05-06:/emacs-memento.html</id>
<link href="https://wiki.soucy.cc//emacs-memento.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2021-05-06T19:12:02Z</published>
<updated>2026-01-14T20:32:11Z</updated>
<content type="html">
&lt;h1&gt;Mémento Emacs&lt;/h1&gt;
&lt;details open=&quot;&quot;&gt;
&lt;summary&gt;Sur cette page&lt;/summary&gt;
&lt;ol role=&quot;list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#getHelp&quot;&gt;Obtenir de l&#039;aide dans Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cancelRepeat&quot;&gt;Annuler ou répéter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#moving&quot;&gt;Déplacement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#buffers&quot;&gt;Buffers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#delete&quot;&gt;Effacer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#selecting&quot;&gt;Sélectionner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cutCopyPaste&quot;&gt;Couper/Copier/Coller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#findReplace&quot;&gt;Chercher/Remplacer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#changeCase&quot;&gt;Changements de casse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#permutations&quot;&gt;Permutations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#shell&quot;&gt;Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#completion&quot;&gt;Complétion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#html&quot;&gt;HTML (Mode SGML)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#dired&quot;&gt;Gestion fichier/dossier (dired)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rectangles&quot;&gt;Rectangles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#macros&quot;&gt;Macros&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2&gt;Raccourcis clavier&lt;/h2&gt;
&lt;p&gt;Dans le monde de Emacs la touche &lt;em&gt;commande&lt;/em&gt; est représenté par &lt;kbd&gt;C-&lt;/kbd&gt;,
ce qui sur votre clavier, correspond par défaut à &lt;kbd&gt;Ctrl&lt;/kbd&gt;. Sinon &lt;kbd&gt;M-&lt;/kbd&gt; représente la touche &lt;em&gt;méta&lt;/em&gt;, qui est habituellement associer à &lt;kbd&gt;Alt&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;Donc &lt;kbd&gt;C-k&lt;/kbd&gt; est semblable à &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;k&lt;/kbd&gt;. Mais
si il y a des combinaisons qui ne vous plaisent pas vous pouvez les
modifier, car [presque] tout est personnalisable (voir &lt;a href=&quot;/txt/emacs/2015/06/emacs-101-la-configuration.html&quot;&gt;Emacs 101 – la configuration&lt;/a&gt;).&lt;/p&gt;
&lt;section&gt;
&lt;h3 id=&quot;getHelp&quot;&gt;Obtenir de l&#039;aide dans Emacs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Tutorial Emacs:&lt;/span&gt; &lt;kbd&gt;F1&lt;/kbd&gt;, &lt;kbd&gt;t&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Documentation:&lt;/span&gt; &lt;kbd&gt;F1&lt;/kbd&gt;, &lt;kbd&gt;r&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Description d&#039;une commande:&lt;/span&gt; &lt;kbd&gt;F1&lt;/kbd&gt;, &lt;kbd&gt;k&lt;/kbd&gt; ou &lt;kbd&gt;C-h&lt;/kbd&gt;, &lt;kbd&gt;k&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Description d&#039;une fonction:&lt;/span&gt; &lt;kbd&gt;F1&lt;/kbd&gt;, &lt;kbd&gt;f&lt;/kbd&gt; ou &lt;kbd&gt;C-h&lt;/kbd&gt;, &lt;kbd&gt;f&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;code&gt;Apropos&lt;/code&gt;, chercher de l&#039;info par regEx:&lt;/span&gt; &lt;kbd&gt;F1&lt;/kbd&gt;, &lt;kbd&gt;a&lt;/kbd&gt; ou &lt;kbd&gt;C-h&lt;/kbd&gt;, &lt;kbd&gt;a&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;cancelRepeat&quot;&gt;Annuler ou répéter&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Annule commande en cours:&lt;/span&gt; &lt;kbd&gt;C-g&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Annuler la dernière commande (undo):&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;u&lt;/kbd&gt; ou &lt;kbd&gt;C-/&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Répéter une commande:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;z&lt;/kbd&gt; (Ensuite seulement &lt;kbd&gt;z&lt;/kbd&gt; pour répéter à nouveau.).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;p&gt;Pour ma part, j&#039;ai installé le paquet &lt;a href=&quot;https://www.emacswiki.org/emacs/UndoTree&quot; rel=&quot;external&quot;&gt;undo-tree&lt;/a&gt;. Puis j&#039;ai assigné &lt;kbd&gt;C-z&lt;/kbd&gt; à la commande &lt;code&gt;(undo-tree-undo &amp;optional ARG)&lt;/code&gt;, et &lt;kbd&gt;C-S-z&lt;/kbd&gt; à la commande &lt;code&gt;(undo-tree-redo &amp;optional ARG)&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;moving&quot;&gt;Déplacement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Déplacement à travers les mots &amp;amp; les paragraphes:&lt;/span&gt; &lt;kbd&gt;C-[flèches]&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Ligne suivante:&lt;/span&gt; &lt;kbd&gt;C-n&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Ligne précédente:&lt;/span&gt; &lt;kbd&gt;C-p&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Début d&#039;une ligne:&lt;/span&gt; &lt;kbd&gt;C-a&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Début d&#039;une ligne indentée:&lt;/span&gt; &lt;kbd&gt;M-m&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Fin d&#039;une ligne:&lt;/span&gt; &lt;kbd&gt;C-e&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mot suivant:&lt;/span&gt; &lt;kbd&gt;M-f&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mot précédent:&lt;/span&gt; &lt;kbd&gt;M-b&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Phrase précédente:&lt;/span&gt; &lt;kbd&gt;M-a&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Phrase suivante:&lt;/span&gt; &lt;kbd&gt;M-e&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Écran précédent:&lt;/span&gt; &lt;kbd&gt;M-v&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Écran suivant:&lt;/span&gt; &lt;kbd&gt;C-v&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Début du buffer:&lt;/span&gt; &lt;kbd&gt;M-&amp;lt;&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Fin du buffer:&lt;/span&gt; &lt;kbd&gt;M-&amp;gt;&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;buffers&quot;&gt;Buffers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Quitter emacs:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-c&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Ouvrir ou créer un fichier:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-f&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sauvegarder le buffer courant:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-s&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sauvegarder tous les buffers ouverts:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;s&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Enregistrer-sous:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-w&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Voir la liste des buffers:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-b&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Aller à la ligne X:&lt;/span&gt; &lt;kbd&gt;M-g&lt;/kbd&gt;, &lt;kbd&gt;g&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Fermer un buffer:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;k&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Insérer le contenu d&#039;un autre fichier dans un buffer:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;i&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;delete&quot;&gt;Effacer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Efface le mot suivant:&lt;/span&gt; &lt;kbd&gt;M-d&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Efface le mot précédant:&lt;/span&gt; &lt;kbd&gt;M-Backspace&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;selecting&quot;&gt;Sélectionner&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Indiquer le début (point) d&#039;une sélection (mark):&lt;/span&gt; &lt;kbd&gt;C-Spacebar&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sélectionner tout le paragraphe:&lt;/span&gt; &lt;kbd&gt;M-h&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sélectionner tout le buffer:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;h&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sélectionner une fonction:&lt;/span&gt; &lt;kbd&gt;C-M-h&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Modifier une sélection:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-x&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut faire des actions spécifiques à une région qui est
marquée. Ex.: Des undo, des trouver/remplacer, des recherches, etc.&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;cutCopyPaste&quot;&gt;Couper/Copier/Coller&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Couper:&lt;/span&gt; &lt;kbd&gt;C-w&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Copier:&lt;/span&gt; &lt;kbd&gt;M-w&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Coller:&lt;/span&gt; &lt;kbd&gt;C-y&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Couper une ligne:&lt;/span&gt; &lt;kbd&gt;C-k&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Couper une phrase (vers l&#039;avant):&lt;/span&gt; &lt;kbd&gt;M-k&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Couper une phrase (vers l&#039;arrière):&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;&amp;lt;DEL&amp;gt;&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;findReplace&quot;&gt;Chercher/Remplacer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Recherche vers la fin du fichier:&lt;/span&gt; &lt;kbd&gt;C-s&lt;/kbd&gt; (répéter la commande pour l&#039;occurrence suivante).&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Recherche vers le début du fichier:&lt;/span&gt; &lt;kbd&gt;C-r&lt;/kbd&gt; (répéter la commande pour l&#039;occurrence précédente).&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Remplacer:&lt;/span&gt; &lt;kbd&gt;M-%&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;y&lt;/kbd&gt; pour remplacer la correspondance en cours;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;n&lt;/kbd&gt; pour aller à la prohcaine correspondance sans remplacer;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;q&lt;/kbd&gt; pour sortir du processus de remplacement courant;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;.&lt;/kbd&gt; pour remplacer la correspondance en cours puis quitter le processus;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;!&lt;/kbd&gt; pour tout remplacer sans aucune autre question.&lt;/li&gt;
&lt;li&gt;Chercher dans les fichiers: &lt;kbd&gt;M-x&lt;/kbd&gt; &lt;code&gt;rgrep&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;changeCase&quot;&gt;Changements de casse&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Premier caractère en majuscule:&lt;/span&gt; &lt;kbd&gt;M-c&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mot en majuscule:&lt;/span&gt; &lt;kbd&gt;M-u&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mot en minuscule:&lt;/span&gt; &lt;kbd&gt;M-l&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;permutations&quot;&gt;Permutations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Intervertir deux lettres:&lt;/span&gt; &lt;kbd&gt;C-t&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Intervertir deux mots:&lt;/span&gt; &lt;kbd&gt;M-t&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Intervertir deux lignes:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-t&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Déplacer un caractère vers l&#039;avant (&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Transpose.html&quot;&gt;transpose&lt;/a&gt;):&lt;/span&gt; &lt;kbd&gt;C-t&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Remplacer un caractère par un saut de ligne:&lt;/span&gt; &lt;kbd&gt;M-x&lt;/kbd&gt; &lt;code&gt;replace-string&lt;/code&gt; &lt;kbd&gt;RET&lt;/kbd&gt; &lt;code&gt;remplacermoi&lt;/code&gt; &lt;kbd&gt;RET&lt;/kbd&gt; &lt;kbd&gt;C-q&lt;/kbd&gt; &lt;kbd&gt;C-j&lt;/kbd&gt;.
&lt;p&gt;
&lt;kbd&gt;C-q&lt;/kbd&gt; est pour &lt;code&gt;quoted-insert&lt;/code&gt;,
&lt;kbd&gt;C-j&lt;/kbd&gt; est pour une saut de ligne.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;shell&quot;&gt;Shell&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Lancer un commande du shell:&lt;/span&gt; &lt;kbd&gt;M-!&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Démarrer un terminal shell:&lt;/span&gt; &lt;kbd&gt;M-x&lt;/kbd&gt; &lt;code&gt;shell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Démarrer un &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_mono/eshell.html&quot;&gt;eshell&lt;/a&gt;:&lt;/span&gt; &lt;kbd&gt;M-x&lt;/kbd&gt; &lt;code&gt;eshell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Lancer plus d&#039;un eshell: &lt;kbd&gt;C-u&lt;/kbd&gt; &lt;kbd&gt;M-x&lt;/kbd&gt; &lt;code&gt;shell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Sortir d&#039;un shell: &lt;code&gt;exit&lt;/code&gt; &lt;kbd&gt;Enter&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;completion&quot;&gt;Complétion&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Autocomplétion d&#039;un mot se trouvant déjà dans le buffer: &lt;kbd&gt;M-/&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;html&quot;&gt;HTML (Mode SGML)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Effacer une balise en laissant intacte le contenu:&lt;/span&gt; &lt;kbd&gt;C-c&lt;/kbd&gt;, &lt;kbd&gt;Backspace&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Créer une balise:&lt;/span&gt; &lt;kbd&gt;C-c&lt;/kbd&gt;, &lt;kbd&gt;C-o&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Compléter une balise:&lt;/span&gt; &lt;kbd&gt;C-c&lt;/kbd&gt;, &lt;kbd&gt;C-e&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Aller à la fin d&#039;un balise:&lt;/span&gt; &lt;kbd&gt;C-c&lt;/kbd&gt;, &lt;kbd&gt;C-f&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Aller au début d&#039;un balise:&lt;/span&gt; &lt;kbd&gt;C-c&lt;/kbd&gt;, &lt;kbd&gt;C-b&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;dired&quot;&gt;Gestion fichier/dossier (dired)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ouvrir un dossier &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;d&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Monter d&#039;un niveau &lt;kbd&gt;^&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Copier &lt;kbd&gt;C&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Renommer &lt;kbd&gt;R&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Effacer &lt;kbd&gt;D&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Créer un nouveau dossier &lt;kbd&gt;, &lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Rafraichir un dossier &lt;kbd&gt;g&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Archiver/Désarchiver avec Gzip &lt;kbd&gt;Z&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html&quot;&gt;Pour en savoir plus sur Dired&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;rectangles&quot;&gt;Rectangles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Remplacer/ajouter du texte sur plusieurs lignes:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;r&lt;/kbd&gt;, &lt;kbd&gt;t&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Insérer des espaces sur plusieurs lignes:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;r&lt;/kbd&gt;, &lt;kbd&gt;o&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html&quot;&gt;Pour en savoir plus sur les Rectangles&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h3 id=&quot;macros&quot;&gt;Macros&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Démarrer l&#039;enregistrement d&#039;un macro:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;(&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Stopper l&#039;enregistrement d&#039;un macro:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;)&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Exécuter le dernier macro enregistré:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;e&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Assigner un nom de commande à un macro:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-k&lt;/kbd&gt;, &lt;kbd&gt;n&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Assigner un raccourci clavier à un macro:&lt;/span&gt; &lt;kbd&gt;C-x&lt;/kbd&gt;, &lt;kbd&gt;C-k&lt;/kbd&gt;, &lt;kbd&gt;b&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html&quot;&gt;En savoir plus sur les Macros&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</content>
</entry>
<entry>
<title>Le Web, l'inclusion et la performance</title>
<id>tag:wiki.soucy.cc,2021-03-21:/web-inclusion-et-performance.html</id>
<link href="https://wiki.soucy.cc//web-inclusion-et-performance.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2021-03-21T13:59:17Z</published>
<updated>2026-01-14T21:40:49Z</updated>
<content type="html">
&lt;h1&gt;Le Web l&#039;inclusion et la performance&lt;/h1&gt;
&lt;p&gt;Dans son billet
&lt;a href=&quot;http://viznut.fi/texts-en/permacomputing.html&quot;&gt;Permacomputing&lt;/a&gt;,
Viznut fait un parallèlle entre l&#039;informatique et la permaculture, et
comment les principes de cette dernière, pourraient être appliqués au
numérique.&lt;/p&gt;
&lt;p&gt;Au début du texte, il souligne que les ordinateurs arrivent à être
plus lents malgré le fait qu&#039;ils sont toujours plus rapides.&lt;/p&gt;
&lt;p&gt;Il fait bien sûr allusion aux applications qui monopolisent
continuellement plus de ressources pour [supposément] répondre aux
besoins des utilisateurs. Le gain de puissance apporté par le matériel
(hardware), en vient à être gobé par le grand l&#039;appétit du logiciel.&lt;/p&gt;
&lt;p&gt;Dans le domaine du développement web c&#039;est encore plus vrai! Les sites
web ont pris du [sur]poids. Nous sommes une des rares industrie qui
fait fi trop souvent de l&#039;efficacité énergétique. Peut-être parce que
son coût est externalisé vers les gens qui utilisent nos produits.&lt;/p&gt;
&lt;p&gt;Pour moi, il y a un lien à faire avec l&#039;&lt;strong&gt;accessibilité web&lt;/strong&gt;. Parce
que plutôt que de tendre vers un conception universelle des sites et
des applications qui, inclurait le plus large spectre de contextes
technologiques et humains, nous choisissons l&#039;exclusion et le
gaspillage.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Stagit pour exposer ses dépôts git sur le Web</title>
<id>tag:wiki.soucy.cc,2020-12-19:/stagit.html</id>
<link href="https://wiki.soucy.cc//stagit.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2020-12-19T13:33:39Z</published>
<updated>2026-01-14T20:56:03Z</updated>
<content type="html">
&lt;h1&gt;Stagit pour exposer ses dépôts git sur le Web&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://codemadness.org/git/stagit/log.html&quot;&gt;Stagit&lt;/a&gt; est une application, écrite en &lt;em&gt;C&lt;/em&gt;, qui crée des pages HTML
statiques pour vos répertoires git auto-hébergés. C&#039;est une
alternative sobre à &lt;em&gt;gitweb&lt;/em&gt; ou à &lt;em&gt;cgit&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ce printemps, j&#039;ai aussi écrit un autre tutoriel pour ceux qui veulent
justement &lt;a href=&quot;https://h.soucy.cc/txt/2020/04/autoheberger-ses-depots-git.html&quot;&gt;auto-héberger leurs dépôts git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/stagit-soucycc.png&quot; alt=&quot;L&#039;interface stagit du site soucy.cc&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mes exemples sont sous OpenBSD, mais cela peut s&#039;appliquer facilement
à n&#039;importe quel environment unix&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Prérequis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Être en mesure de vous connnecter à distance sur votre serveur par
SSH.&lt;/li&gt;
&lt;li&gt;Un dépôt git doit exister sur votre serveur.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Se connecter au serveur par SSH et installer stagit&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh utilisateur@addr.ip.tld&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkg_add -v stagit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous n&#039;avez pas de paquet pour stagit sur la distribution unix de
votre serveur web, vous pouvez récupérer le code sur le site officiel
&lt;a href=&quot;https://codemadness.org/git/stagit/&quot;&gt;https://codemadness.org/git/stagit/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Après l&#039;installation, deux applications se retrouvent normalement dans
votre répertoire &lt;code&gt;/usr/local/bin&lt;/code&gt;. En tapant &lt;code&gt;ls -la
/usr/local/bin/stagit*&lt;/code&gt;, vous pouvez vérifier si c&#039;est bien le cas:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rwxr-xr-x  1 root  bin  44604 May  9  2020 /usr/local/bin/stagit
-rwxr-xr-x  1 root  bin  20460 May  9  2020 /usr/local/bin/stagit-index
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si stagit ne se trouve pas à cet endroit, vous pouvez le chercher avec
la commande &lt;code&gt;whereis stagit&lt;/code&gt;. Au cas où cette commande ne retourne
rien, cela veut probablement dire que l&#039;installation ne s&#039;est pas bien
passée.&lt;/p&gt;
&lt;h2&gt;Comment stagit fonctionne?&lt;/h2&gt;
&lt;p&gt;Stagit fabrique un site web à l&#039;endroit où vous vous trouvez, à partir
du dépôt git que vous lui indiquez:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stagit /home/git/monprojet.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce qui va produire quelque chose qui va ressembler à ça:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rw-r--r--   1 git     www   34963 Dec 19 09:50 atom.xml
drwxr-xr-x   2 git     www    3584 Dec 19 09:50 commit
drwxr-xr-x   8 git     www     512 Dec 18 16:19 file
-rw-r--r--   1 git     www  141243 Dec 19 09:50 files.html
-rw-r--r--   1 git     www   16256 Dec 19 09:50 log.html
lrwxr-xr-x   1 git     www      11 Dec 19 09:50 logo.png -&amp;gt; ../logo.png
-rw-r--r--   1 git     www    1197 Dec 19 09:50 refs.html
lrwxr-xr-x   1 git     www      12 Dec 19 09:50 style.css -&amp;gt; ../style.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour plus de détails, consultez la &lt;em&gt;man page&lt;/em&gt;, en tapant &lt;code&gt;man stagit&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;À quoi sert &lt;code&gt;stagit-index&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Comme c&#039;est indiqué dans son nom, stagit-index va créer un page
d&#039;index avec tous les dépôts que vous allez lui soumettre:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stagit-index /home/git/depot-0.git /home/git/depot-1.git /home/git/depot-2.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le code HTML de cet index s&#039;affichera directement dans la console
(stdout). Pour l&#039;écrire dans un fichier &lt;code&gt;index.html&lt;/code&gt;, vous devez le
préciser dans votre commande:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stagit-index /home/git/abc.git /home/git/xyz.git &amp;gt; index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://soucy.cc/git&quot;&gt;&lt;img src=&quot;/stagit-index-soucycc.png&quot; alt=&quot;L&#039;interface stagit-index du site soucy.cc&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Automatiser le tout avec git et un script de &lt;code&gt;post-receive&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Évidemment, nous ne voulons pas devoir lancer ces commandes à chaque
commit que nous poussons vers notre serveur distant. Nous allons donc
écrire un script qui automatisera tout ça.&lt;/p&gt;
&lt;h3&gt;Crochet à la rescousse&lt;/h3&gt;
&lt;p&gt;Dans votre dépôt git distant, aller dans le répertoire &lt;strong&gt;hooks&lt;/strong&gt;. Là
nous pouvons créer des scripts qui s&#039;exécuterons à différents moments
d&#039;une action. Le nôtre devra se lancer à la suite d&#039;une réception d&#039;un
&lt;code&gt;git push&lt;/code&gt;. Pour plus de détails sur les &lt;em&gt;githooks&lt;/em&gt;, référez vous à la
documentation officiel: &lt;a href=&quot;https://git-scm.com/docs/githooks&quot;&gt;https://git-scm.com/docs/githooks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Copiez un des scripts présent et renommez-le &lt;em&gt;post-receive&lt;/em&gt; puis
ouvrez-le avec nano ou un autre éditeur texte de votre choix:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp post-receive-email.sample post-receive &amp;amp;&amp;amp; nano post-receive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Effacez tout ce qui se trouve dans le fichier et copiez ce qui se
trouve ci-dessous:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh -e
# Les chemins doivent être absolues.
# L&#039;emplacement du dépôt git.
gitdir=&quot;/home/git/votre-depot-git.git&quot;
# L&#039;emplacement du site.
dstdir=&quot;/var/www/votre-site-web.com/git&quot;
# Créer les pages HTML.
mkdir -p &quot;$dstdir/hscc&quot;
(cd &quot;$dstdir/hscc&quot; &amp;amp;&amp;amp; stagit &quot;$gitdir&quot;)
# L&#039;emplacement de tous les dépôts.
gitall=&quot;/home/git&quot;
# Créer l&#039;index
stagit-index &quot;${gitall}/&quot;*/ &amp;gt; &quot;${dstdir}/index.html&quot;
# Créer des liens symboliques pour les styles et le logo.
(cd &quot;$dstdir/hscc&quot; &amp;amp;&amp;amp; ln -sf ../style.css style.css &amp;amp;&amp;amp; ln -sf ../logo.png logo.png)
echo &quot;post-receive is done&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sauvegardez et sortez. Pour tester votre script:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./post-receive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite, allez à l&#039;emplacement supposé du site, pour voir si les
fichiers ont bien été créé. Si tout fonctionne comme prévu, à partir
de maintenant, lorque vous poursserez vos changements vers votre dépôt
git, votre site stagit sera mis à jour automatiquement.&lt;/p&gt;
&lt;p&gt;Si vous avez les questions n&#039;hésitez pas à commniquer avec moi! Merci&lt;/p&gt;
</content>
</entry>
<entry>
<title>Surpoids de l'auto et celui du Web</title>
<id>tag:wiki.soucy.cc,2020-08-10:/surpoid-de-lauto-et-web.html</id>
<link href="https://wiki.soucy.cc//surpoid-de-lauto-et-web.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2020-08-10T12:04:00Z</published>
<updated>2026-02-13T15:38:30Z</updated>
<content type="html">
&lt;h1&gt;Surpoids de l&#039;auto et celui du Web&lt;/h1&gt;
&lt;p&gt;Il y a certainement un parallèle à faire entre l&#039;industrie du Web et
l&#039;industrie automobile.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;En près de vingt ans, la masse moyenne d’un véhicule de promenade
(automobile et camion léger) a augmenté de 18 %, selon un calcul de
notre Bureau d’enquête fait à partir des nouvelles données de la
Société de l’assurance automobile du Québec (SAAQ).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Même si les #autos sont de plus en plus éco-énergétiques, le fait
qu&#039;ils s&#039;alourdissent, vient annuler cette économie!&lt;/p&gt;
&lt;p&gt;Il en va de même pour les sites Web que nous concevons, nous avons de
plus en plus de solutions pour augmenter leur #performance, mais nous
les produisons toujours plus lourds! Notamment à cause de la
démultiplication des images (souvent inutiles) toujours plus grandes
et toujours plus nombreuses.&lt;/p&gt;
&lt;p&gt;Nous ne faisons certainement pas parti de la solution, et honte à nous
pour cela! &amp;#128584;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://www.tvanouvelles.ca/2020/08/10/de-plus-en-plus-lourds-et-de-moins-en-moins-economiques-1&quot;&gt;De plus en plus lourds et de moins en moins économiques&lt;/a&gt;.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Auto-héberger ses dépôts git</title>
<id>tag:wiki.soucy.cc,2020-04-05:/autoheberger-ses-depots-git.html</id>
<link href="https://wiki.soucy.cc//autoheberger-ses-depots-git.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2020-04-05T14:07:37Z</published>
<updated>2026-01-14T20:32:38Z</updated>
<content type="html">
&lt;h1&gt;Auto-héberger ses dépôts git&lt;/h1&gt;
&lt;p&gt;J&#039;ai un serveur dans mon sous-sol, où j&#039;héberge le site web que vous
consulter en ce moment. Et dans cette foulée d&#039;indépendance numérique,
j&#039;ai donc décidé d&#039;héberger également mes dépôts git.&lt;/p&gt;
&lt;p&gt;En ce moment, pour mes projets, j&#039;utilise soit Github, Gitlab ou
Notabug. L&#039;idée est donc de continuer à envoyer mes dépôts git vers
ces services tout en utilisant mon propre serveur pour héberger code
source de mes projets.&lt;/p&gt;
&lt;p&gt;Sans faire des miroirs, je peux pousser mes commits vers plusieurs
dépôts distant en même temps en ajoutant un deuxième répertoire
distant: &lt;code&gt;git remote set-url --add --push origin
git@soucy.cc:soucy.cc.git&lt;/code&gt;. &lt;a href=&quot;https://h.soucy.cc/note/2018/11/plusieurs-remote-origin-avec-git.html&quot;&gt;Voir la note au sujet de l&#039;option
&lt;code&gt;pushurl&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mes exemples sont sous OpenBSD, mais cela peut s&#039;appliquer facilement
à n&#039;importe quel environment unix.&lt;/p&gt;
&lt;h2&gt;Se connecter au serveur par SSH et installer git&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh utilisateur@addr.ip.tld&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkg_add -v git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Créer un utilisateur qui acceuillera les dépôts git dans son &lt;code&gt;$HOME&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir /home/git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user add git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Autoriser votre utilisateur a se connecter par SSH au répertoire &lt;code&gt;/home/git&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Par exemple si vous vous connectez avec &lt;code&gt;root&lt;/code&gt; sur votre serveur
maison ou sur votre VPS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir -m 700 /home/git/.ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cp /root/.ssh/authorized_keys /home/git/.ssh/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chown -R git:git /home/git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Créer le dépôt distant et faire son premier commit&lt;/h2&gt;
&lt;p&gt;Maintenant depuis votre répertoire local (sur votre ordinateur) où se
trouve votre code, créez le dépôt distant  de type &lt;code&gt;bare&lt;/code&gt; par SSH:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh git@addr.ip.tld git init --bare soucy.cc.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote add origin git@addr.ip.tld:soucy.cc.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote set-url --add --push origin git@addr.ip.tld:soucy.cc.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m &quot;Mon premier commit vers mon dépôt auto-hébrgé&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push origin master&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilà qui est fait. Vous pourriez aussi exposer votre code dans des
pages HTML avec &lt;a href=&quot;/2020/tx/stagit.html&quot;&gt;stagit&lt;/a&gt; ou &lt;strong&gt;cgit&lt;/strong&gt;.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Un raccourcisseur d'URL maison avec RewriteMap</title>
<id>tag:wiki.soucy.cc,2018-02-28:/un-raccourcisseur-d-url-pour-site-statique.html</id>
<link href="https://wiki.soucy.cc//un-raccourcisseur-d-url-pour-site-statique.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2018-02-28T11:03:46Z</published>
<updated>2026-01-14T20:30:46Z</updated>
<content type="html">
&lt;h1&gt;Proposer des URLs courts sur son site statique&lt;/h1&gt;
&lt;p&gt;Pour un raccourcisseur d&#039;URL maison vous avez besoin d&#039;à peu près 3
choses:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Une liste de vos liens qui pourra être traversée par une
boucle. Notez que l&#039;ordre de cette liste doit être immuable; ceux
ajoutés a posteriori le seront à la suite des autres.&lt;/li&gt;
&lt;li&gt;Une fonction qui convertie les nombres naturels (positif et sans
décimal) en chaîne de caractère.&lt;/li&gt;
&lt;li&gt;Un accès au fichier de configuration de votre serveur HTTP; car
malheuresement la solution que je propose ne peut pas être
accomplie à travers un fichier de type &lt;code&gt;.htaccess&lt;/code&gt;. &lt;em&gt;Accès&lt;/em&gt; peut
vouloir dire par vous ou par l&#039;administrateur de votre serveur, si
celui-ci est ouvert à vous aider.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Traverser la liste de vos liens&lt;/h2&gt;
&lt;p&gt;Il faut que l&#039;emsemble des URLs que vous voulez raccourcir soient
disponibles sous la forme d&#039;un &lt;em&gt;array&lt;/em&gt;. Comme je l&#039;écrivais plus haut,
dans ce &lt;em&gt;array&lt;/em&gt;, l&#039;ordre doit être immuable, puisque que ce sera le
nombre qui, correspond à la position de chaque entrée qui servira à
créer la chaîne de caractère courte.&lt;/p&gt;
&lt;p&gt;Pour ma part, je stock mes URLs dans un fichier JSON qui, contient un
objet dont les clés sont les URLs longs et les valeurs sont les
chaînes raccourcies.&lt;/p&gt;
&lt;p&gt;Ce JSON est créé lorsque je lance le générateur de site statique pour
la première fois. Ensuite, je vérifie son existence et une nouvelle
entrée est faite si la clée n&#039;est pas déjà présente dans le JSON en
question.&lt;/p&gt;
&lt;p&gt;Moi j&#039;ai choisi JSON, mais évidemment, cela pourrait être fait avec un
autre format de donnée, comme par exemple SQLite. Sinon, voilà à quoi
ressemble ma fonction en lua :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function link.makeshorts()
local links = {}
local links_db = Ferron.site.path .. Ferron.site.siteconfig.paths.data .. &quot;/shortlinks.json&quot;
-- If `links_db` dosen&#039;t exists create it
if path.isfile(links_db) == false then
local counter = 0
fileutils.pushfilecontent(links_db, &quot;&quot;)
for k, v in tableutils.sortdescendingpairs(Ferron.site.pagestable) do
if v.rellink ~= &quot;&quot; then
counter = counter + 1
links[v.rellink] = fileutils.shorturlencode(counter)
end
end
else
links = json.decode(fileutils.pullfilecontent(links_db))
for k, v in tableutils.sortdescendingpairs(Ferron.site.pagestable) do
if v.rellink ~= &quot;&quot; and links[v.rellink] == nil then
links[v.rellink] = fileutils.shorturlencode(tableutils.length(links) + 1)
end
end
end
return fileutils.pushfilecontent(links_db, json.encode(links, {indent = true}))
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Convertir les nombres en chaîne de caractère&lt;/h2&gt;
&lt;p&gt;Dans le bloc de code qui précède, c&#039;est la fonction
&lt;code&gt;fileutils.shorturlencode()&lt;/code&gt; qui transforme l&#039;identifiant numérique de
la position de chaque entrée, en courte chaîne de caractère. C&#039;est ce
que l&#039;on appelle
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Bijection&quot;&gt;une application bijective&lt;/a&gt;.
J&#039;ai créé une version en lua pour mon générateur de site statique, en
me basant sur la version JavaScript que l&#039;on retrouve sur GitHub dans
le répertoire
&lt;a href=&quot;https://github.com/delight-im/ShortURL&quot;&gt;ShortURL&lt;/a&gt;. D&#039;ailleurs, j&#039;ai
ajouté ma contribution à la douzaine de langage déjà présent.&lt;/p&gt;
&lt;h2&gt;Appliquer les redirection avec &lt;code&gt;RewriteMap&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Une fois que les adresses de vos pages sont associées à des URLs
courts, il faut les exporter dans un fichier text qui sera utilisé par
la directive
&lt;a href=&quot;http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#RewriteMap&quot;&gt;&lt;code&gt;RewitreMap&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Voici à quoi cela doit ressembler :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## shortlinksmap.txt -- rewriting map
L /note/2017/06/sesame-street-lgbt-pride.html
Q /note/2017/05/twitter-partage-vos-donnees-personnelles.html
23 /note/2017/03/animista-css-animations-on-demand.html
2L /note/2016/08/quoi-ce-n-est-pas-des-femmes-grenouilles.html
M /note/2017/06/petite-contribution-bash-au-task-runner-manuel.html
n /note/2017/12/openbsd-mise-a-jour-reussie.html
4 /note/2018/01/premier-pullrequest-lua-accepte.html
C /note/2017/09/lesbricodeurs-replyto-status-909427743573577728.html
2Q /note/2016/08/snowden-pardon-petition-on-facebook.html
P /note/2017/06/le-velo-cest-dangereux.html
2H /note/2016/09/internet-3-0-peut-on-reprendre-le-controle-des-geants.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis dans votre fichier de configuration de votre site ajouter les
directives suivantes. Selon votre version d&#039;Apache il peut y avoir
quelques variantes; SVP référez-vous à &lt;a href=&quot;https://searx.me/?q=RewriteMap&amp;amp;categories=general&amp;amp;language=en-CA&quot;&gt;la
documentation&lt;/a&gt;
pour plus de détails.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## /etc/apache2/sites-available/h.soucy.cc.conf
RewriteEngine On
RewriteMap shortlinksmap &quot;txt:/var/www/h.soucy.cc/shortlinksmap.txt&quot;
RewriteCond ${shortlinksmap:$1|Unknown} !Unknown
RewriteRule &quot;^/(.*)$&quot; &quot;${shortlinksmap:$1}&quot; [R,L]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je suppose qu&#039;il existe le même genre de mécanisme pour Nginx ou
Lighttpd.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;À propos des enjeux autour des URLs courts&lt;/h2&gt;
&lt;p&gt;Les URLs courts sont souvent visibles sur les réseaux sociaux, tel que
Twitter, pour faciliter le partage de lien dans un contexte où le
message de l&#039;auteur est limité en caractère; historiquement 140 et
maintenant 280 pour les &lt;em&gt;tweets&lt;/em&gt;. Le service le plus connu est sans
doute &lt;strong&gt;bit.ly&lt;/strong&gt;. Sinon on voit également beaucoup celui de
l&#039;omniprésent Google, dont le nom de domaine est &lt;strong&gt;goo.gl&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L&#039;utilisation d&#039;un service de raccourcissement fragilise la périnnité
des URLs dans nos contenus; puisque si le service en question cesse
ses activités du jour au lendemain, tous les liens qu&#039;il redirigait se
retrouvent dès lors inutilisables. De plus, que se passerait-il si un
service était pirater ou racheter par quelqu&#039;un avec de mauvaises
intentions qui, pourrait réaiguiller tous les URLs vers des
destinations peu reluisantes ?!&lt;/p&gt;
&lt;p&gt;Dans une optique de durabilité et de robustesse il vaut toujours mieux
gérer soi-même ses données. Si vous utilisez un CMS comme &lt;strong&gt;Drupal&lt;/strong&gt;
ou &lt;strong&gt;Wordpress&lt;/strong&gt; vous avez sans doute accès à des extensions qui vous
permettent de mettre en place votre propre raccourcisseur. Et c&#039;est
probablement le cas également de générateurs de site statique bien
établis comme &lt;strong&gt;Jekyll&lt;/strong&gt; ou &lt;strong&gt;Octopress&lt;/strong&gt;.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Aide-mémoire OpenBSD</title>
<id>tag:wiki.soucy.cc,2017-11-23:/aide-memoire-openbsd.html</id>
<link href="https://wiki.soucy.cc//aide-memoire-openbsd.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2017-11-23T21:03:10Z</published>
<updated>2026-01-14T20:32:55Z</updated>
<content type="html">
&lt;h1&gt;Aide-mémoire OpenBSD&lt;/h1&gt;
&lt;p&gt;Notes personnelles à propos de l&#039;utilisation
d&#039;&lt;a href=&quot;https://www.openbsd.org/&quot;&gt;OpenBSD&lt;/a&gt; comme systhème d&#039;exploitation
sur mon ordinateur personnel.&lt;/p&gt;
&lt;h2&gt;Maintenance du systhème&lt;/h2&gt;
&lt;h3&gt;Mises à jour&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;pkg_add&lt;/code&gt; : ajouter ou mettre à jour des paquets (ports)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pkg_add -v nomdupaquet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkg_add -uiv nomdupaquet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://openports.pl&quot;&gt;openports.pl&lt;/a&gt; est un des endroits pour trouver
des paquets OpenBSD.&lt;/p&gt;
&lt;h3&gt;Nettoyage de OpenBSD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pkg_check&lt;/code&gt; : Donner de l&#039;information sur l&#039;état des paquets installés.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkg_delete -a&lt;/code&gt; : Supprimer les dépendances rendues inutiles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;syspatch&lt;/code&gt; : mettre à jour le systhème&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;syspatch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Réseau sans fils&lt;/h2&gt;
&lt;h3&gt;Ajout d&#039;une connexion WiFi&lt;/h3&gt;
&lt;p&gt;Dans le fichier &lt;code&gt;/etc/hostname.iwn0&lt;/code&gt; ajouter une ligne par
connexion. Par exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dhcp nwid &quot;MonReseauWiFi&quot; wpakey monsupermotdepass&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mais comment se connecter à un hotspot ou un point d&#039;accès sans mot de
passe ?&lt;/strong&gt; Simplement en ajoutant l&#039;option &lt;code&gt;-wpa&lt;/code&gt;, comme dans l&#039;exemple
ci-dessous :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dhcp nwid &quot;ZAP - Centre Ferland&quot; -wpa&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si il existe plus d&#039;une connexion, toutes les commenter sauf celle qui
correspond à la connexion WiFi désirée. Ensuite redémarrer l&#039;interface
avec &lt;code&gt;netstart&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sh /etc/netstart iwn0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour trouver les points d&#039;accès disponibles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ifconfig iwn0 scan&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://ports.su/security/wpa_supplicant&quot;&gt;wpa_supplicant&lt;/a&gt; pourrait
être une alternative pour gérer la connexion entre des points d&#039;accès
multiple.&lt;/p&gt;
&lt;h2&gt;Disques et partitions&lt;/h2&gt;
&lt;p&gt;Voir l&#039;utilisation des disques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;df -h&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Réseau&lt;/h2&gt;
&lt;p&gt;Obtenir un tableau des ports qui sont écoutés par le serveur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;netstat -tnl -f inet&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour savoir quel service écoute quel port:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /etc/services&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Polices de caractère&lt;/h2&gt;
&lt;h3&gt;Emojis&lt;/h3&gt;
&lt;p&gt;Installer le paquet openmoji:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pkg_add -v openmoji&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puis créer un lien symbolique dans &lt;code&gt;/etc/fonts/conf.d/&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ln -s /usr/local/share/openmoji/90-openmoji-aliases.conf /etc/fonts/conf.d/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Emacs 101 - la configuration</title>
<id>tag:wiki.soucy.cc,2015-06-30:/emacs-101-la-configuration.html</id>
<link href="https://wiki.soucy.cc//emacs-101-la-configuration.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2015-06-30T12:22:16Z</published>
<updated>2026-01-14T22:46:26Z</updated>
<content type="html">
&lt;h1&gt;Emacs 101 &amp;ndash; la configuration&lt;/h1&gt;
&lt;p&gt;Un apsect essentiel et extrèmement puissant
d&#039;&lt;a href=&quot;http://www.gnu.org/software/emacs&quot;&gt;Emacs&lt;/a&gt;, est sa capacité à être
personnalisé et à être étendu en fonctionnalité. La configuration et
l&#039;ajout de nouvelles fonctions se fait avec un langage de
programmation qui s&#039;appelle le &lt;strong&gt;Emacs lisp&lt;/strong&gt; ou &lt;strong&gt;elisp&lt;/strong&gt;. Les
fichiers écris en elisp se termine par l&#039;extension &lt;code&gt;.el&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Au démarrage, Emacs vérifie si il existe des fichiers elisp qui lui
indiquerait des particularités d&#039;initialisation dont il doit tenir
compte. Pour se faire il va chercher si un des fichiers suivants
existent à la racine du répertoire utilisateur : &lt;code&gt;~/.emacs&lt;/code&gt;,
&lt;code&gt;~/.emacs.el&lt;/code&gt;, ou &lt;code&gt;~/.emacs.d/init.el&lt;/code&gt;. C&#039;est dans ce fichier que l&#039;on
doit indiquer au programme nos préférences d&#039;utilisation.&lt;/p&gt;
&lt;p&gt;Vous pouvez choisir la forme de fichier de configuration qui vous
plaira, mais la dernière forme est considérée comme faisant partie des
bonnes pratiques, car elle permet de regrouper en un seul répertoire
tous les fichiers nécessaires à la personnalisation d&#039;Emacs.
D&#039;ailleurs le répertoire &lt;code&gt;.emacs.d&lt;/code&gt; est généré par défaut, donc il ne
vous reste plus qu&#039;à y ajouter votre fichier &lt;code&gt;init.el&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Création du fichier &lt;code&gt;init.el&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Tout d&#039;abord, rappelons que &lt;code&gt;C-&lt;/code&gt; correspond à la touche &lt;code&gt;Ctrl&lt;/code&gt; et que
&lt;code&gt;M-&lt;/code&gt; correspond à la touche &lt;code&gt;Alt&lt;/code&gt;. Donc &lt;code&gt;C-k&lt;/code&gt; est semblable à &lt;code&gt;Ctrl +
k&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nous allons maintenant créer le fichier &lt;code&gt;init.el&lt;/code&gt; qui nous permettra
de personnaliser Emacs à votre convenance :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ouvrir Emacs.&lt;/li&gt;
&lt;li&gt;Exécuter la commande &lt;code&gt;C-x C-f&lt;/code&gt; (ouvrir ou créer un fichier).&lt;/li&gt;
&lt;li&gt;Le pointeur est déplacer vers le minibuffer, où il est indiqué
&amp;ldquo;Find file: ~/&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Écrivez alors &lt;code&gt;.emacs.d/init.el&lt;/code&gt; puis tapez sur &lt;code&gt;Entrée&lt;/code&gt;. Si vous
vous êtes trompé ou que vous ne comprenez pas ce qui se passe,
faîtes &lt;code&gt;C-g&lt;/code&gt; pour sortir du minibuffer et recommencez.&lt;/li&gt;
&lt;li&gt;Si tout c&#039;est bien passé, vous avez basculé vers un nouveau fichier
vierge et le pointeur n&#039;est plus dans le minibuffer.&lt;/li&gt;
&lt;li&gt;Faîtes &lt;code&gt;C-x C-s&lt;/code&gt; pour enregistrer &lt;code&gt;init.el&lt;/code&gt; sur le disque.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dès lors nous sommes en mesure de commencer notre personnalisation de
Emacs.&lt;/p&gt;
&lt;h2&gt;Nos premières modifications&lt;/h2&gt;
&lt;p&gt;En démarrant Emacs vous avez peut-être remarqué que le programme
s&#039;ouvrait avec une page de bienvenue et que la marge ne contenait pas
de numéros de ligne. Nous allons donc changer ces deux paramètres pour
commencer; car vous l&#039;avourez, c&#039;est bien pratique des numéros de
ligne lorqu&#039;on écrit du code et la page de bienvenue n&#039;est pas très
jolie ;)&lt;/p&gt;
&lt;h3&gt;Ajouter les numéros de ligne &lt;/h3&gt;
&lt;p&gt;Pour ajouter des numéros dans la marge, ajoutez les deux lignes de
code suivantes à votre fichier &lt;code&gt;init.el&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; Add line numbers
(global-linum-mode 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La première ligne est simplement un commentaire pour indiquer quel est
le rôle de la ligne suivante. D&#039;ailleurs je vous conseille de toujours
commenter ce que vous faîtes dans votre fichier de configuration
personnel; il sera alors plus facile de vous y retrouver au fil du
temps.&lt;/p&gt;
&lt;p&gt;La deuxième ligne, vous l&#039;aurez deviné, est une instruction qui
indique à Emacs d&#039;afficher les numéros de ligne dans la marge.&lt;/p&gt;
&lt;p&gt;Pour voir les changements immédiatement, tapez &lt;code&gt;M-x load-file&lt;/code&gt;, puis
faîtes &lt;code&gt;Entrée&lt;/code&gt;. Cette commande réexécutera votre fichier
&lt;code&gt;init.el&lt;/code&gt;. Sinon vous devez redémarrer le programme pour que la
nouvelle instruction soit effective.&lt;/p&gt;
&lt;h4&gt;Surligner la ligne courante &lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;;; Highlight Current Line
(global-hl-line-mode +1)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Retirer la barre de défilement (scroll) &lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;;; Disable scroll bars
(scroll-bar-mode -1)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changer la page d&#039;accueil &lt;/h3&gt;
&lt;p&gt;Pour remplacer l&#039;écran de démarrage par un autre buffer, il faut d&#039;abord
désactiver la valeur par défaut et ensuite indiquer avec quoi nous
voulons le remplacer :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; Remove splash screen on startup
(setq inhibit-splash-screen t)
;; Have dired open instead
(dired &quot;~/&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous les aurez reconnus, la première et la troisième ligne sont des
commentaires qui annonces ce que nous allons modifier et/ou ajouter.&lt;/p&gt;
&lt;p&gt;La deuxième ligne elle, change la valeur par défaut de la variable
&lt;code&gt;inhibit-splash-screen&lt;/code&gt; à &lt;code&gt;t&lt;/code&gt; (&lt;code&gt;vrai&lt;/code&gt; en elisp) qui par défaut est à
&lt;code&gt;nil&lt;/code&gt; (&lt;code&gt;nul&lt;/code&gt; en elisp). Le nom de cette variable se traduirait par
«empêcher l&#039;écran de démarrage».&lt;/p&gt;
&lt;p&gt;Avec la quatrième ligne nous indiquons à Emacs d&#039;ouvrir le répertoire
utilisateur (&lt;code&gt;~/&lt;/code&gt;) dans le gestionnaire de fichier (dired). Vous
pouvez ainsi ouvrir le dossier de votre choix ou vous pourriez ouvrir
directement un fichier avec la fonction &lt;code&gt;find-file&lt;/code&gt; au lieu de la
fonction &lt;code&gt;dired&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; Remove splash screen on startup
(setq inhibit-splash-screen t)
;; Have a file instead
(find-file &quot;~/.bashrc&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Installer des extensions avec le gestionnaire de paquet&lt;/h2&gt;
&lt;p&gt;Depuis la version 24 un gestionnaire de paquets est inclu par
défaut. Le but de ce gestionnaire est de faciliter l&#039;intallation,
l&#039;utilisation et la mise à jour d&#039;extensions, de thèmes, de mode pour
Emacs.&lt;/p&gt;
&lt;p&gt;Pour afficher le gestionnaire de paquets vous devez taper la commande
&lt;code&gt;M-x package-list&lt;/code&gt;, puis faire &lt;code&gt;Entrée&lt;/code&gt;. Le buffer &lt;code&gt;*Packages*&lt;/code&gt;
s&#039;ouvrira; celui-ci est un tableau contenant l&#039;archive par défaut qui
porte le nom de &lt;abbr title=&quot;Emacs Lisp Package
Archive&quot;&gt;ELPA&lt;/abbr&gt;. Pour avoir la description complète d&#039;un paquet
déplacez le curseur vis-à-vis celui-ci, puis appuyez sur
&lt;code&gt;Entrée&lt;/code&gt;. Pour marquer un paquet à installer faîtes &lt;code&gt;i&lt;/code&gt;; pour
compléter l&#039;installation ou tout autre action appuyez sur la touche
&lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Ajouter des archives &lt;/h3&gt;
&lt;p&gt;ELPA, c&#039;est bien, mais il ne contient pas tout ce qui pourrait nous
intéresser. Donc pour étendre l&#039;offre des paquets il faut ajouter des
archives à notre gestionnaire! Et MELPA et Marmalade sont deux des
archives les plus fréquenter et fréquentables du moment.&lt;/p&gt;
&lt;p&gt;Ce qui nous ramène donc à notre fichier &lt;code&gt;init.el&lt;/code&gt; &amp;hellip; À la fin de
celui-ci coller le bloc de code suivant :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(when (&amp;gt;= emacs-major-version 24)
(require &#039;package)
(package-initialize)
(add-to-list &#039;package-archives &#039;(&quot;melpa-stable&quot; . &quot;http://melpa-stable.milkbox.net/packages/&quot;) t)
(add-to-list &#039;package-archives &#039;(&quot;marmalade&quot; . &quot;https://marmalade-repo.org/packages/&quot;))
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;D&#039;abord avec &lt;code&gt;when&lt;/code&gt; nous vérifions que la version de Emacs est bien
supérieur ou égal à la version 24. Ensuite nous importons le
gestionnaire de paquets avec &lt;code&gt;require&lt;/code&gt;, puis nous initialisons
celui-ci. Dès lors nous pouvons ajouter des archives supplémentaires
avec &lt;code&gt;add-to-list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Encore une fois, pour voir les changements immédiatement nous devons
tapez &lt;code&gt;M-x load-file&lt;/code&gt;, puis faire &lt;code&gt;Entrée&lt;/code&gt;. Pour vérifier que les
nouvelles archives sont bien chargées dans le gestionnaire de paquets
il suffit de l&#039;ouvrir (&lt;code&gt;M-x package-list&lt;/code&gt;) et de regarder sous la
colonne &lt;em&gt;Archive&lt;/em&gt; si il y a les termes &lt;em&gt;melpa-stable&lt;/em&gt; et &lt;em&gt;marmalade&lt;/em&gt;
qui apparaissent çà et là. Sinon il faut redémarrer Emacs et
revérifier à nouveau.&lt;/p&gt;
&lt;p&gt;Vous remarquerez que la liste des paquets s&#039;est grandement apprécié de
plusieurs dizaines d&#039;items supplémentaires.&lt;/p&gt;
&lt;h3&gt;Mofication du thème : décore ta vie ! &lt;/h3&gt;
&lt;p&gt;La dernière configuration que nous ferons aujourd&#039;hui en est une de la
plus haute importance : la mofification du thème graphique de Emacs !
D&#039;autant plus que, maintenant grâce aux archives &lt;em&gt;MELPA&lt;/em&gt; et
&lt;em&gt;Marmalade&lt;/em&gt;, nous avons accès à moulte nouveaux thèmes.&lt;/p&gt;
&lt;p&gt;Vous pouvez parcourir &lt;em&gt;Packages&lt;/em&gt; à la recherche de thèmes; pour se
faire vous pouvez utiliser &lt;em&gt;I-search&lt;/em&gt; (&lt;code&gt;C-s&lt;/code&gt;) avec le mot clé
&lt;strong&gt;theme&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Une fois votre theme télécharger vous pouvez l&#039;utiliser avec la
commande &lt;code&gt;M-x load-theme&lt;/code&gt;. Le mini-buffer vous demandera alors le nom
du thème à charger. Si vous ne vous en souvenez plus appuyez sur la
touche &lt;code&gt;Tab&lt;/code&gt; pour obtenir la liste des options disponibles.&lt;/p&gt;
&lt;p&gt;Pour charger votre nouveau thème au démarage de Emacs il suffit de
lancer la fonction &lt;code&gt;load-theme&lt;/code&gt; dans votre fichier de configuration
&lt;code&gt;init.el&lt;/code&gt;. Disons que le thème installer par le gestionnaire de paquet
est &lt;strong&gt;cyberpunk&lt;/strong&gt;, vous indiquerez donc ceci :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; Theme
(load-theme &#039;cyberpunk t)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si ne voulez pas y aller à l&#039;aveugle en installant et chargeant un par
un les thèmes qui se trouvent dans &lt;em&gt;Packages&lt;/em&gt;, vous pouvez aller sur
le site web &lt;a href=&quot;https://emacsthemes.com/&quot;&gt;Emacs Themes&lt;/a&gt; pour magasiner
votre thème. C&#039;est normalement indiquer si votre choix est disponible
dans MELPA ou un autre archive.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Dans le prochain billet je parlerai du comment configurer GNU Emacs
pour faire du dévloppement web.&lt;/p&gt;
&lt;p&gt;Autre billet de cette série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/emacs-101-l-introduction.html&quot;&gt;Emacs 101 &amp;ndash; l&#039;introduction&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Emacs 101 - l'introduction</title>
<id>tag:wiki.soucy.cc,2015-06-28:/emacs-101-l-introduction.html</id>
<link href="https://wiki.soucy.cc//emacs-101-l-introduction.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2015-06-28T19:12:02Z</published>
<updated>2026-01-14T22:44:52Z</updated>
<content type="html">
&lt;h1&gt;Emacs 101 &amp;ndash; l&#039;introduction&lt;/h1&gt;
&lt;p&gt;Apprendre &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt; peut être perçu
comme quelque chose de difficile. Pour ma part, je ne considère pas
cela comme difficile, non. Mais cela demande certainement du temps.&lt;/p&gt;
&lt;p&gt;Premièrement, il faut du temps pour découvrir cet envrionnement et
apprendre les concepts qui le compose. Il faut aussi du temps pour
connaître par coeur les commandes de base. Notre tête et nos doigts
doivent s&#039;y habituer pour sortir du joug de la souris. Car c&#039;est bien
cela l&#039;avantage de maîtriser son éditeur texte : gagner en
productivité.&lt;/p&gt;
&lt;p&gt;Et passer moins de temps à faire des aller-retours entre la souris et
le clavier apporte définitivement un gain en productivité.&lt;/p&gt;
&lt;p&gt;Comme par exemple, si je veux sélectionner un paragraphe, le couper et
le coller à fin du document. Je peux utiliser le clavier et la souris
&amp;hellip; ou seulement la souris. Toutefois avec Emacs je ferais la série de
commandes suivantes (&lt;code&gt;C-&lt;/code&gt; correspond à la touche &lt;code&gt;Ctrl&lt;/code&gt; et &lt;code&gt;M-&lt;/code&gt;
correspond à la touche &lt;code&gt;Alt&lt;/code&gt;) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;M-a&lt;/code&gt;, pour placer mon curseur au début au paragraphe;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-k&lt;/code&gt;, pour couper une paragraphe vers l&#039;avant (l&#039;inverse serait
&lt;code&gt;C-x &amp;lt;DEL&amp;gt;&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-&amp;gt;&lt;/code&gt;, pour me rendre à la fin du document;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-y&lt;/code&gt;, pour finalement coller le paragraphe.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dans les premiers temps ce type de séquence vous paraîtra beaucoup
moins efficace que vos anciennes habitudes, mais si vous persévérez
dans l&#039;apprentissage d&#039;Emacs, après quelques semaines vous exécuterez
ce genre de tâche avec rapidité et fluidité.&lt;/p&gt;
&lt;p&gt;Selon-moi le meilleur moyen d&#039;apprendre les commandes de base, est de suivre le
tutoriel officiel qui est directement intégrer dans Emacs. Pour y
accéder, tapez &lt;code&gt;M-x&lt;/code&gt;, puis entrez la commande
&lt;code&gt;help-with-tutorial-spec-language&lt;/code&gt;; un choix de langue vous sera
offert.&lt;/p&gt;
&lt;p&gt;Ce tutoriel interactif vous apprendra les bases pour atteindre le
bonheur et le confort dans votre nouvel éditeur texte préféré :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Démarrer et fermer Emacs.&lt;/li&gt;
&lt;li&gt;Les commandes de bases pour vous déplacer dans le texte et l&#039;éditer.&lt;/li&gt;
&lt;li&gt;Ouvrir et sauvegarder des fichiers.&lt;/li&gt;
&lt;li&gt;Les concepts qui composent Emacs : windows, frames, files, buffers, etc.&lt;/li&gt;
&lt;li&gt;Invoquer des fonctions avec la commande &lt;code&gt;M-x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Buffers, windows et frames&lt;/h2&gt;
&lt;p&gt;Avant d&#039;enter dans les commandes de déplacement et d&#039;édition, je crois
qu&#039;il faut d&#039;abord que je vous explique ce qu&#039;est un &lt;strong&gt;buffer&lt;/strong&gt;, une
&lt;strong&gt;window&lt;/strong&gt; et un &lt;strong&gt;frame&lt;/strong&gt;. Ces concepts sont parfois un peu déroutant
pour le nouveau venu dans Emacs &amp;hellip;&lt;/p&gt;
&lt;h3&gt;Buffers &lt;/h3&gt;
&lt;p&gt;Premièrement, on peut avoir plusieurs buffers ouverts en même
temps. Habituellement un buffer représente le contenu d&#039;un fichier,
mais il peut être aussi de l&#039;information en provenance de
l&#039;application, comme par exemple le buffer &lt;em&gt;Messages&lt;/em&gt;, toujours
présent à l&#039;ouverture d&#039;Emacs.&lt;/p&gt;
&lt;p&gt;Les buffers sont visibles travers les fenêtres (windows). Pour passer
à un autre buffer et l&#039;afficher dans la fenêtre courante vous devez
faire la commande &lt;code&gt;C-x b&lt;/code&gt;. Cela a pour conséquence de déplacer le
curseur vers le &lt;strong&gt;minibuffer&lt;/strong&gt; et d&#039;afficher un message qui ressemble
à &amp;ldquo;Switch to buffer (default &lt;em&gt;scratch&lt;/em&gt;)&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;À partir de là, vous pouvez taper le nom du buffer vers lequel vous
voulez basculer. Pour afficher la liste de ceux qui sont ouverts
appuyez sur la touche &lt;code&gt;Tab&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour quitter le minibuffer, annuler la commande en cours et retourner
le curseur dans le buffer faîtes &lt;code&gt;C-g&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il est aussi possible de lister directement tous les buffers qui sont
actifs en tapant &lt;code&gt;C-x C-b&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Windows et frames &lt;/h3&gt;
&lt;p&gt;Dans Emacs une fenêtre (window) n&#039;est pas une fenêtre comme on
l&#039;entend dans un contexte de système d&#039;exploitation; dans ce cas on
parlerait plutôt d&#039;un cadre (frame). La fenêtre est une vue sur un
buffer, et il est possible d&#039;avoir plusieurs fenêtres dans un seul
cadre, ce qui permet d&#039;afficher de multiple buffers en même temps.&lt;/p&gt;
&lt;p&gt;Bien sûr il y des commandes pour créer ou supprimer des fenêtres, se
déplacer dans chacune d&#039;elle,
&lt;a href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Window.html&quot;&gt;modifier leur taille, etc&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nouvelle fenêtre horizontale : &lt;code&gt;C-x 2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Nouvelle fenêtre verticale : &lt;code&gt;C-x 3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fermer toutes les fenêtres sauf la fenêtre courante : &lt;code&gt;C-x 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fermer la fenêtre courante : &lt;code&gt;C-x 0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Naviguer d&#039;une fenêtre à l&#039;autre : &lt;code&gt;C-x o&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous voulez un nouveau cadre et non une nouvelle fenêtre, la
commande est &lt;code&gt;C-x 5 2&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Minibuffer &lt;/h3&gt;
&lt;p&gt;Le &lt;strong&gt;minibuffer&lt;/strong&gt; quant à lui est l&#039;espace, sous la barre de status,
où vous interagissez avec Emacs : entrer une commande, donner un
valeur à un argument, recevoir de l&#039;info, etc. Dans le minibuffer vous
avez accès aux mêmes fonctionnalités que dans n&#039;importe quel buffer.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Rappel : Pour quitter le minibuffer, annuler la commande en cours et
retourner le curseur dans le buffer faîtes &lt;code&gt;C-g&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Les commandes de base&lt;/h2&gt;
&lt;p&gt;Voici une liste des commandes que vous devez maîtriser pour être
efficace dans Emacs. Il est aussi intéressant de savoir que, plusieurs
commandes Emacs de base fonctionneront dans n&#039;importe quel terminal
Linux ou BSD. Donc en les apprenant, vous devenez également un
meilleur utilisateur UNIX.&lt;/p&gt;
&lt;p&gt;D&#039;abord, rappelons que &lt;code&gt;C-&lt;/code&gt; correspond à la touche &lt;code&gt;Ctrl&lt;/code&gt; et que &lt;code&gt;M-&lt;/code&gt;
correspond à la touche &lt;code&gt;Alt&lt;/code&gt;. Donc &lt;code&gt;C-k&lt;/code&gt; est semblable à &lt;code&gt;Ctrl + k&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Ouvrir, créer, sauvegarder et fermer des buffers &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ouvir ou créer un fichier : &lt;code&gt;C-x C-f&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sauvegarder le buffer courant : &lt;code&gt;C-x C-s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sauvegarder tous les buffers ouverts : &lt;code&gt;C-x s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enregistrer-sous : &lt;code&gt;C-x C-w&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fermer un buffer : &lt;code&gt;C-x k&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Se déplacer dans un buffer &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Caratère suivant : &lt;code&gt;C-f&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Caratère précédent : &lt;code&gt;C-b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ligne suivante : &lt;code&gt;C-n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ligne précédente : &lt;code&gt;C-p&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Début d&#039;une ligne : &lt;code&gt;C-a&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Début d&#039;une ligne indentée : &lt;code&gt;M-m&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fin d&#039;une ligne : &lt;code&gt;C-e&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mot suivant : &lt;code&gt;M-f&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mot précédent : &lt;code&gt;M-b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Phrase précédente : &lt;code&gt;M-a&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Phrase suivante : &lt;code&gt;M-e&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Page précédente : &lt;code&gt;M-v&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Page suivante : &lt;code&gt;C-v&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Début du buffer : &lt;code&gt;M-&amp;lt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fin du buffer : &lt;code&gt;M-&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Aller à une ligne en particulier : &lt;code&gt;M-g g&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Chercher / Remplacer &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Recherche vers la fin du fichier : &lt;code&gt;C-s&lt;/code&gt; (répéter la commande pour
l&#039;occurrence suivante).&lt;/li&gt;
&lt;li&gt;Recherche vers le début du fichier : &lt;code&gt;C-r&lt;/code&gt; (répéter la commande pour
l&#039;occurrence précédente).&lt;/li&gt;
&lt;li&gt;Remplacer : &lt;code&gt;M-%&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;y&lt;/code&gt; pour remplacer la correspondance en cours;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt; pour aller à la prohcaine correspondance sans remplacer;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt; pour sortir du processus de remplacement courant;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt; pour remplacer la correspondance en cours puis quitter le
processus;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!&lt;/code&gt; pour tout remplacer sans aucune autre question.&lt;/li&gt;
&lt;li&gt;Chercher dans plusieurs fichiers : &lt;code&gt;M-x rgrep&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Effacer &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Effacer le mot suivant : &lt;code&gt;M-d&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Effacer le mot précédant : &lt;code&gt;M-Backspace&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sélectionner &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Indiquer le début (point) d&#039;une sélection (mark) : &lt;code&gt;C-Spacebar&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sélectionner tout le paragraphe : &lt;code&gt;M-h&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sélectionner tout le buffer : &lt;code&gt;C-x h&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sélectionner une fonction : &lt;code&gt;C-M-h&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Modifier une sélection : &lt;code&gt;C-x C-x&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notez que l&#039;on peut faire des actions spécifiques à une région qui est
marquée. Ex.: Des undo, des trouver/remplacer, des recherches, etc.&lt;/p&gt;
&lt;h3&gt;Couper / Copier / Coller &lt;/h3&gt;
&lt;p&gt;Dans le jargon Emacs les termes couper et coller sont remplacé par
&amp;ldquo;kill&amp;rdquo; et &amp;ldquo;yank&amp;rdquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Couper : &lt;code&gt;C-w&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copier : &lt;code&gt;M-w&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Coller : &lt;code&gt;C-y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Couper une ligne : &lt;code&gt;C-k&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Couper une phrase (vers l&#039;avant) : &lt;code&gt;M-k&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Couper une phrase (vers l&#039;arrière) : &lt;code&gt;C-x &amp;lt;DEL&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Couper une région : &lt;code&gt;C-w&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Emacs garde en mémoire tout ce qui a été couper et copier et lorsque
vous collez vous avez accès à cet historique. Pour cela il suffit de
coller une première fois avec &lt;code&gt;C-y&lt;/code&gt;, puis ensuite faire &lt;code&gt;M-y&lt;/code&gt; pour
coller l&#039;item de l&#039;historique suivant. Cette &amp;ldquo;mémoire&amp;rdquo; se nomme &lt;strong&gt;kill
ring&lt;/strong&gt;. Cette fonctionnalité est une particularité très puissante et
très utile de Emacs.&lt;/p&gt;
&lt;h3&gt;Undo &lt;/h3&gt;
&lt;p&gt;Il y a trois combinaisons possibles pour invoquer la fonction undo &amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Undo : &lt;code&gt;C-x u&lt;/code&gt; ou &lt;code&gt;C-/&lt;/code&gt; ou &lt;code&gt;C-_&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À la base Emacs n&#039;offre pas de fonction &amp;ldquo;redo&amp;rdquo; je crois. Mais il y a
une extension qui s&#039;appelle &lt;strong&gt;undo-tree&lt;/strong&gt; qui étend les
fonctionnalités de base à ce niveau.&lt;/p&gt;
&lt;h3&gt;Changements de casse &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Premier caractère en majuscule : &lt;code&gt;M-c&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mot en majuscule : &lt;code&gt;M-u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mot en minuscule : &lt;code&gt;M-l&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Permutations &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Intervertir deux lettres : &lt;code&gt;C-t&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Intervertir deux mots : &lt;code&gt;M-t&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Intervertir deux lignes : &lt;code&gt;C-x C-t&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Auto-Complétion &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Auto-complétion d&#039;un mot se trouvant déjà dans un buffer : &lt;code&gt;M-/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Aide &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Tutorial Emacs : &lt;code&gt;F1 t&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Documentation : &lt;code&gt;F1 r&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Description d&#039;une commande : &lt;code&gt;F1 k&lt;/code&gt; ou &lt;code&gt;C-h k&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Description d&#039;une fonction : &lt;code&gt;F1 f&lt;/code&gt; ou &lt;code&gt;C-h f&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion à cette introduction&lt;/h2&gt;
&lt;p&gt;Vous vous doûtez bien qu&#039;il s&#039;agit ici que d&#039;un survol très sommaire
des commandes et des fonctionnalités d&#039;Emacs. D&#039;autres billets
viendront complétés celui-ci, en choisissant d&#039;explorer des aspects
plus précis.&lt;/p&gt;
&lt;p&gt;Ceci dit, j&#039;espère que vous allez essayer et aimer Emacs. Au départ,
je vous suggère d&#039;expérimenter et appliquer les notions que vous avez
apprisent dans des fichiers de configuration ou sur des projets
personnels, avant d&#039;en faire votre éditeur de tous les jours &amp;hellip; Si
vous percévérez vous ne pourrez plus vous en passer.&lt;/p&gt;
&lt;p&gt;Lire la suite de ce billet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/emacs-101-la-configuration.html&quot;&gt;Emacs 101 &amp;ndash; la configuration&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Emacs, l'obsession du moment</title>
<id>tag:wiki.soucy.cc,2013-06-17:/emacs-lobsession-du-moment.html</id>
<link href="https://wiki.soucy.cc//emacs-lobsession-du-moment.html" hreflang="fr" rel="alternate" type="text/html" />
<published>2013-06-17T08:38:24Z</published>
<updated>2026-01-14T22:49:28Z</updated>
<content type="html">
&lt;p&gt;J’ai utilisé Netbeans pendant au moins 6 ans. Cet IDE faisait à peu
près tout ce dont j’avais besoin et le faisait généralement très
bien. Mais il était aussi muni de fonctionnalités (la plupart tournant
autour du langage Java) qui était complètement inutiles à un
intégrateur Web. J’utilise à peu près toujours les mêmes technologies:
HTML, CSS, JavaScript, Git, SSH/SCP. Donc c’était du genre bazooka
pour tuer une mouche.&lt;/p&gt;
&lt;p&gt;Deuxièmement je n’ai pas un ordinateur ultra puissant pour faire
tourner ce genre de logiciel au quart de tour. Les IDEs ça pèse
rarement une plume; quoique qu’avec les années Netbeans a fait
énormément de progrès coté performance.&lt;/p&gt;
&lt;p&gt;Et troisièmement, je voulais surtout apprendre un éditeur que l’on
peut utiliser à travers un Terminal. À ce carrefour, le choix se fait
très souvent entre deux supposés ennemis: &lt;strong&gt;Vim&lt;/strong&gt; et &lt;strong&gt;Emacs&lt;/strong&gt;. Je ne
veux pas ici entrer dans cette rivalité, mais j’ai choisi Emacs car,
dans Vim le principe des modes me rebutait un peu.&lt;/p&gt;
&lt;!-- Capture d&#039;écran de Emacs --&gt;
&lt;p&gt;Rendu là c’est surtout une question de goût et de point de
vue. L’antagonisme de type Microsoft vs Apple, ou Beatles vs Stones
est très souvent puéril. Il vaut mieux apprécier et respecter les
qualités de chacun. Dans le cas de Vi[m], je crois que c’est très
important d’en connaître au moins les bases, puisqu’on le retrouve par
défaut dans tout les environnements de type UNIX; ce qui n’est pas le
cas d’Emacs. Alors quand vous devez éditer un fichier de configuration
sur un serveur étranger, connaître Vim (ou Nano) peut vous sauvez la
vie. ;)&lt;/p&gt;
&lt;p&gt;Chose sûr, que ça soit Emacs ou Vim, il faut généralement pas mal de
temps pour maîtriser ces deux logiciels. Pour ma part, cela fait un
peu moins de six mois que j’utilise Emacs tous les jours et tous les
jours je découvre de nouvelles choses à son sujet. Je dirais que je
maîtrise relativement bien la plupart des raccourcis de bases, mais je
ne peux pas me qualifier encore d’utilisateur avancé.&lt;/p&gt;
&lt;h2&gt;En amour avec&lt;/h2&gt;
&lt;p&gt;À mon avis il est très facile de tomber en amour avec Emacs. Tout
simplement parce que ce logiciel peut faire des choses tellement cool
avec n’importe quel document de type textuel. Si bien qu’on ne veut
plus le quitter, on veut tout faire dans Emacs: Programmer, rédiger
des textes, gérer ses courriels, lire ses fils RSS, faire sa liste
d’épicerie, organiser et parcourir ses fichiers, gérer son emploi du
temps et plus encore… Et le pire, c’est que tout ça c’est possible!&lt;/p&gt;
&lt;p&gt;Une des plus grandes forces d’Emacs c’est justement son haut degré de
personnalisation et d’extensibilité. Le langage Emacs Lisp est ce qui
permet à l’utilisateur de mettre Emacs à sa main. Mais rassurez vous,
vous n’avez pas besoin de savoir programmer en ELisp pour y arriver,
car le Web est rempli d’exemples et de snippets qui vous permettront
d’apprécier toute la puissance d’Emacs!&lt;/p&gt;
&lt;p&gt;Voici d’ailleurs quelques ressources qui vous permettrons de
progresser rapidement dans votre usage d’Emacs:
&lt;a href=&quot;https://www.emacswiki.org/&quot;&gt;EmacsWiki&lt;/a&gt;, &lt;s&gt;Hack Emacs&lt;/s&gt;,
&lt;a href=&quot;http://ergoemacs.org/&quot;&gt;ErgoEmacs&lt;/a&gt;, &lt;a href=&quot;https://emacsredux.com/&quot;&gt;Emacs
Redux&lt;/a&gt;,
&lt;a href=&quot;https://emacs-fu.blogspot.com/&quot;&gt;emacs-fu&lt;/a&gt; et bien sûr &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/&quot;&gt;la
documentation
officiel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;De mon coté je maintiens &lt;s&gt;sur GitHub&lt;/s&gt; &lt;a href=&quot;/emacs-memento.html&quot;&gt;un
aide-mémoire&lt;/a&gt;
où j’inscris les raccourcis clavier qui me sont utiles.&lt;/p&gt;
&lt;p&gt;Si vous venez à être tenté par l’aventure Emacs, la première fois que
vous le lancerez, vous le trouverez peut-être un peu dégarni (il n’y a
même pas de marge pour numéroter les lignes). Certaines personnes
pourraient voir ça comme un défaut. Pour ma part je trouve que c’est
une bonne chose, car le débutant plonge tête première dans le logiciel
et en comprend mieux les rouages. Mais qu’à cela ne tienne, la
dynamique communauté d’Emacs a développé des kits de départ pour
permettre une introduction plus en douceur. Les plus connus sont
&lt;a href=&quot;https://github.com/technomancy/emacs-starter-kit&quot;&gt;Emacs Starter Kit&lt;/a&gt;
et &lt;a href=&quot;https://github.com/bbatsov/prelude&quot;&gt;Emacs Prelude&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En terminant, je vous conseille de jeter un œil sur la série de
screencast &lt;a href=&quot;http://emacsrocks.com/&quot;&gt;Emacs Rocks&lt;/a&gt; animée par &lt;strong&gt;Magnar
Sveen&lt;/strong&gt;, où ce dernier présente avec des exemples concrets la toute
puissance d’Emacs! D’ailleurs voici le premier épisode&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/embed/O0UgY-DmFbU&quot;&gt;http://www.youtube.com/embed/O0UgY-DmFbU&lt;/a&gt;&lt;/p&gt;
</content>
</entry>
<entry>
<title>Contenus classés par mots clés</title>
<id>tag:wiki.soucy.cc,0000-00-00:/mots-cles.html</id>
<link href="https://wiki.soucy.cc//mots-cles.html" hreflang="fr" rel="alternate" type="text/html" />
<published>0000-00-00T14:32:00Z</published>
<updated>2025-09-01T22:44:33Z</updated>
<content type="html">
&lt;h1&gt;Contenus classés par mots clés &lt;/h1&gt;
</content>
</entry>
</feed>
