guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/02: talks: Add JRES 2022 tutorial.


From: Tobias Geerinckx-Rice
Subject: 01/02: talks: Add JRES 2022 tutorial.
Date: Wed, 22 Jun 2022 12:45:58 -0400 (EDT)

nckx pushed a commit to branch master
in repository maintenance.

commit 298f1d5f5305b9c0c8f1de0c7c8d3c8d28ac90bc
Author: zimoun <zimon.toutoune@gmail.com>
AuthorDate: Mon Jun 20 05:51:32 2022 +0200

    talks: Add JRES 2022 tutorial.
    
    * talks/jres-2022: New directory.
    
    Signed-off-by: Tobias Geerinckx-Rice <me@tobias.gr>
---
 talks/jres-2022/.gitlab-ci.yml                     |   52 +
 talks/jres-2022/README                             |  110 +
 talks/jres-2022/demo/commands.txt                  |  119 +
 .../jres-2022/demo/mp4/01-getting-started-1-2.txt  |    4 +
 talks/jres-2022/demo/mp4/02-getting-started-3.txt  |    6 +
 talks/jres-2022/demo/mp4/03-getting-started-4.txt  |    5 +
 talks/jres-2022/demo/mp4/04-getting-started-5.txt  |    5 +
 talks/jres-2022/demo/mp4/05-getting-started-6.txt  |    5 +
 talks/jres-2022/demo/mp4/06-profile.txt            |    9 +
 talks/jres-2022/demo/mp4/07-generations.txt        |    8 +
 talks/jres-2022/demo/mp4/08-multi-profiles-1.txt   |    7 +
 talks/jres-2022/demo/mp4/09-shell-ipython.txt      |   14 +
 talks/jres-2022/demo/mp4/do-chapters.py            |   73 +
 talks/jres-2022/demo/mp4/videos.txt                |    9 +
 talks/jres-2022/do-all.sh                          |    4 +
 talks/jres-2022/do-clean.sh                        |    6 +
 talks/jres-2022/do-pres.sh                         |    8 +
 talks/jres-2022/do-supp.sh                         |   16 +
 talks/jres-2022/src/channels.scm                   |    6 +
 talks/jres-2022/src/contenu.tex                    | 2413 ++++++++++++++++++++
 talks/jres-2022/src/example/config-vm-1.scm        |   22 +
 talks/jres-2022/src/example/config-vm-2.scm        |   13 +
 talks/jres-2022/src/example/mock-define-python.scm |    9 +
 talks/jres-2022/src/example/some-python-bis.scm    |   11 +
 .../src/example/some-python-with-gcc7.scm          |   13 +
 talks/jres-2022/src/example/some-python.scm        |    6 +
 talks/jres-2022/src/header.tex                     |   86 +
 talks/jres-2022/src/listings-scheme.tex            |   97 +
 talks/jres-2022/src/manifest.scm                   |   26 +
 talks/jres-2022/src/presentation.tex               |   70 +
 talks/jres-2022/src/static/Guix-white.pdf          |  Bin 0 -> 8483 bytes
 talks/jres-2022/src/static/LOGO-JRES-2022.png      |  Bin 0 -> 18956 bytes
 talks/jres-2022/src/static/cafe-guix.png           |  Bin 0 -> 17311 bytes
 talks/jres-2022/src/static/forest-symlinks.pdf     |  Bin 0 -> 16418 bytes
 talks/jres-2022/src/static/graph-python.png        |  Bin 0 -> 479843 bytes
 .../src/static/guixhpc-logo-transparent-white.pdf  |  Bin 0 -> 8808 bytes
 talks/jres-2022/src/static/u-paris.png             |  Bin 0 -> 7104 bytes
 talks/jres-2022/src/supplement.tex                 |  281 +++
 .../jres-2022/src/support-notes-additionnelles.tex |   58 +
 .../support-notes-additionnelles.20220519.pdf      |  Bin 0 -> 3948392 bytes
 talks/jres-2022/talk.20220519.pdf                  |  Bin 0 -> 1077431 bytes
 41 files changed, 3571 insertions(+)

diff --git a/talks/jres-2022/.gitlab-ci.yml b/talks/jres-2022/.gitlab-ci.yml
new file mode 100644
index 0000000..6d7f55c
--- /dev/null
+++ b/talks/jres-2022/.gitlab-ci.yml
@@ -0,0 +1,52 @@
+stages:
+  - tex2pdf
+  - deploy
+
+pdf:
+  image:
+    name: zimoun/jres
+  stage: tex2pdf
+  script:
+    - mkdir public && cd src
+    - rubber --pdf presentation.tex
+    - rubber --pdf support-notes-additionnelles.tex
+    - mv *.pdf ../public/
+  artifacts:
+    paths:
+      - public
+  only:
+    - main
+
+pages:
+  image:
+    name: zimoun/jres
+  stage: deploy
+  script:
+    - |
+      cat > public/index.html <<EOF
+      <?xml version="1.0" encoding="utf-8"?>
+      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+      <html xmlns="http://www.w3.org/1999/xhtml"; lang="en" xml:lang="en">
+      <head>
+      <title>Reproductibilité des environnements logiciels avec GNU 
Guix</title>
+      <meta name="author" content="Simon Tournier" />
+      </head>
+      <body>
+      <div id="content" class="content">
+      <h1 class="title">Reproductibilité des environnements logiciels avec GNU 
Guix</h1>
+      <ul class="org-ul">
+      <li><a href="presentation.pdf">presentation.pdf</a></li>
+      <li><a 
href="support-notes-additionnelles.pdf">support-notes-additionnelles.pdf</a></li>
+      </ul>
+      </div>
+        <p>Simon Tournier</p>
+        <p>JRES 2022 - Marseille</p>
+      </body>
+      </html>
+      EOF
+  artifacts:
+    paths:
+      - public
+  only:
+    - main
diff --git a/talks/jres-2022/README b/talks/jres-2022/README
new file mode 100644
index 0000000..2785cb2
--- /dev/null
+++ b/talks/jres-2022/README
@@ -0,0 +1,110 @@
+# -*- mode:org -*-
+
+Original Git repo: https://gitlab.com/zimoun/jres22-tuto-guix
+SWH archive: 
https://archive.softwareheritage.org/swh:1:rev:8a378f2f833dd28ea71d38e7fc45bac10fe122d5
+
+Visible: https://zimoun.gitlab.io/jres22-tuto-guix/
+Web archive: 
https://web.archive.org/web/20220520150253/https://zimoun.gitlab.io/jres22-tuto-guix/
+
+This repository contains the all material to run the tutorial about Guix
+presented at [[https://www.jres.org/][JRES 2022]].  The language of the 
conference is French, thus this
+material is initially written in French.
+
+The version of the presentation for the D-day is tagged 'pres-d-day'
+corresponnding to commit 6ff987583173ab5a0bc65708f8bf2482c7390eb0.
+
+* Get PDF from source
+
+#+begin_src bash
+  cd src
+  guix time-machine -C channels.scm \
+       -- shell -C -m manifest.scm  \
+       -- rubber --pdf presentation.tex
+#+end_src
+
+* Record Gif
+
+#+begin_src bash
+  export PS1="\[\033[0;34m\]alice@laptop:\w$ \[\033[0;30m\] "
+
+  if [ -n "$GUIX_ENVIRONMENT" ]; then
+      export PS1="\[\033[0;34m\]alice@laptop:\w\[\033[0;30m\] [env]$ "
+  fi
+
+#+end_src
+
+#+begin_src bash
+  # Fix <https://issues.guix.gnu.org/51202#3>
+  # addition of: gtk+ gsettings-desktop-schemas
+  guix time-machine -C channels.scm                                \
+       -- shell peek ffmpeg         gtk+ gsettings-desktop-schemas \
+       -- peek
+#+end_src
+
+* Capture Video
+
+#+begin_src bash
+  guix time-machine -C channels.scm   \
+       -- shell obs                   \
+       -- obs
+#+end_src
+
+** Resolution (screen from desktop)
+  - 1920x1080 Base
+  - 1920x1080 Output
+  - Downscale filter: Bicubic (sharpened scaling, 16 samples)x
+  - Common FPS values 60
+
+** Recording / Streaming
+  - 2500 Kbps / audio bitrate 160
+  - Medium file size
+  - mp4
+  - x264
+
+* Chapters
+
+#+begin_src bash
+  guix time-machine -C channels.scm   \
+       -- shell ffmpeg python-minimal
+#+end_src
+
+
+Be careful, the Python help is a quick too simplistic script.
+
+#+begin_src bash
+  ffmpeg -i INPUT.mp4 -f ffmetadata META.txt
+  python3 do-chapters.py CHAPS.txt
+  cat META.txt CHAPS.txt.meta > CHAPS.meta
+  ffmpeg -i INPUT.mp4 -i CHAPS.meta -map_metadata 1 -codec copy OUTPUT.mp4
+#+end_src
+
+For each video, end with a title at video length time.
+
+* Merge videos
+
+#+begin_src bash
+  guix time-machine -C channels.scm   \
+       -- shell ffmpeg python-minimal
+#+end_src
+
+
+The file =videos.txt= contains the list of videos
+
+#+begin_src text
+  file 'test.mp4'
+  file 'test2.mp4'
+#+end_src
+
+#+begin_src bash
+  ffmpeg -f concat -safe 0 -i videos.txt -c copy demos.mp4
+#+end_src
+
+#+begin_src bash
+  ffmpeg -i INPUT.mp4 -f ffmetadata META.txt
+  python3 do-chapters.py CHAPS.txt CHAPS2.txt
+  cat META.txt merged.meta > video.meta
+  ffmpeg -i video.mp4 -i video.meta -map_metadata 1 -codec copy 
video_chapters.mp4
+#+end_src
+
+The Python script =do-chapters.py= reads, at the finest, seconds when it would
+require a finer scale.  Especially, see =08-multi-profiles-1.txt=.
diff --git a/talks/jres-2022/demo/commands.txt 
b/talks/jres-2022/demo/commands.txt
new file mode 100644
index 0000000..a2f06a7
--- /dev/null
+++ b/talks/jres-2022/demo/commands.txt
@@ -0,0 +1,119 @@
+# -*- mode:org -*-
+
+* 01
+
+guix search dynamically-typed programming language
+guix show python
+
+* 02
+
+which python3
+python3
+guix install python
+guix package --search-paths
+
+which python3
+
+GUIX_PROFILE=/home/alice/.guix-profile
+. $GUIX_PROFILE/etc/profile
+which python3
+python3
+>> import this
+
+* 03
+
+guix insall python-ipython python-numpy
+guix package --search-paths
+which python3
+python3
+import numpy as np
+x = np.linspace(0,1,20)
+which ipython
+ipython
+import numpy as np
+x = np.linspace(0,1,20)
+
+* 04
+
+which ipython
+guix remove python-ipython
+which ipython
+ipython
+
+* 05
+
+guix install python-matplotlib python-scipy
+guix package --search-paths
+python3 plot.py
+
+* 06
+
+env | grep ^PATH
+GUIX_PROFILE=$HOME/.guix-profile
+cat $GUIX_PROFILE/etc/profile
+guix package --search-paths
+guix package --search-paths=prefix
+guix package --search-paths=suffix
+. GUIX_PROFILE/etc/profile # == eval $(guix package --search-paths=prefix)
+clear
+
+ls $GUIX_PROFILE
+guix install tree
+clear
+
+tree -L 1 $GUIX_PROFILE
+
+* 07
+
+guix package --list-generations
+CLICK
+
+which tree
+guix package --roll-back
+which tree
+tree
+
+guix package --list-generations
+CLICK
+
+which ipython
+guix package --switch-generations=2
+ipython
+guix package --list-generations
+
+guix package --switch-generation=5
+ipython
+
+* 08
+
+guix install python-ipython --profile=outils
+guix package --search-paths --profile=outils
+env | grep ^PATH
+eval $(guix package --search-paths=suffix --profile-outils)
+env | grep ^PATH
+CLICK
+which ipython
+tree -L 1 outils
+ls -l
+
+* 09
+
+ls -d */
+cd project-foo && ls
+python3 some-fun.py
+guix shell --manifest=some-python-pkgs.scm
+python3 some-fun.py
+^D
+guix shell -m some-python-pkgs.scm --pure
+ls
+cd ../project-bar
+^D
+guix shell -m some-python-pkgs.scm --container
+ls
+cd ../project-bar
+python3 some-fun.py
+^D
+guix shell -m some-python-pkgs.scm --container python-ipython
+ipython
+^D
+python3 some-fun.py
diff --git a/talks/jres-2022/demo/mp4/01-getting-started-1-2.txt 
b/talks/jres-2022/demo/mp4/01-getting-started-1-2.txt
new file mode 100644
index 0000000..2ffb66a
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/01-getting-started-1-2.txt
@@ -0,0 +1,4 @@
+00:00 -
+00:05 guix search
+00:32 guix show
+00:36 done 01
diff --git a/talks/jres-2022/demo/mp4/02-getting-started-3.txt 
b/talks/jres-2022/demo/mp4/02-getting-started-3.txt
new file mode 100644
index 0000000..7706020
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/02-getting-started-3.txt
@@ -0,0 +1,6 @@
+00:00 -
+00:22 guix install python
+00:38 guix package --search-paths #1
+00:57 GUIX_PROFILE
+01:10 python3 (from Guix)
+01:22 done 02
diff --git a/talks/jres-2022/demo/mp4/03-getting-started-4.txt 
b/talks/jres-2022/demo/mp4/03-getting-started-4.txt
new file mode 100644
index 0000000..366ff4f
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/03-getting-started-4.txt
@@ -0,0 +1,5 @@
+00:00 -
+00:12 guix install python-ipython python-numpy
+02:10 guix package --search-paths #2
+02:15 python3 with numpy
+03:14 done 03
diff --git a/talks/jres-2022/demo/mp4/04-getting-started-5.txt 
b/talks/jres-2022/demo/mp4/04-getting-started-5.txt
new file mode 100644
index 0000000..8a0e0b8
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/04-getting-started-5.txt
@@ -0,0 +1,5 @@
+00:00 -
+00:06 ipython
+00:13 guix remove python-ipython
+00:24 ipython (removed)
+00:30 done 04
diff --git a/talks/jres-2022/demo/mp4/05-getting-started-6.txt 
b/talks/jres-2022/demo/mp4/05-getting-started-6.txt
new file mode 100644
index 0000000..bb4dbee
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/05-getting-started-6.txt
@@ -0,0 +1,5 @@
+00:00 -
+00:12 guix install python-matplotlib python-scipy
+02:04 guix package --search-paths #3
+02:11 python3 plot.py
+02:18 done 05
diff --git a/talks/jres-2022/demo/mp4/06-profile.txt 
b/talks/jres-2022/demo/mp4/06-profile.txt
new file mode 100644
index 0000000..1994571
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/06-profile.txt
@@ -0,0 +1,9 @@
+00:00 -
+00:24 cat $GUIX_PROFILE
+00:34 breath
+00:42 guix package --search-paths=prefix
+00:47 guix package --search-paths=suffix
+01:11 eval $(guix package --search-paths=prefix)
+01:21 ls $GUIX_PROFILE
+01:35 tree $GUIX_PROFILE
+01:38 done 06
diff --git a/talks/jres-2022/demo/mp4/07-generations.txt 
b/talks/jres-2022/demo/mp4/07-generations.txt
new file mode 100644
index 0000000..eff2daf
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/07-generations.txt
@@ -0,0 +1,8 @@
+00:00 -
+00:07 guix package --list-generations     #1
+00:20 guix package --roll-back
+00:31 guix package --list-generations (4) #2
+00:54 guix package --switch-generation=2
+01:10 guix package --list-generations (2) #3
+01:20 guix package --switch-generation=5
+01:31 done 07
diff --git a/talks/jres-2022/demo/mp4/08-multi-profiles-1.txt 
b/talks/jres-2022/demo/mp4/08-multi-profiles-1.txt
new file mode 100644
index 0000000..0479e88
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/08-multi-profiles-1.txt
@@ -0,0 +1,7 @@
+00:00 -
+00:13 guix install --profile
+00:26 guix package --search-paths --profile
+00:54 eval $(guix package --search-paths=suffix --profile)
+01:23 tree profile
+01:27 ls -l profile
+01:29 done 08
diff --git a/talks/jres-2022/demo/mp4/09-shell-ipython.txt 
b/talks/jres-2022/demo/mp4/09-shell-ipython.txt
new file mode 100644
index 0000000..9846760
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/09-shell-ipython.txt
@@ -0,0 +1,14 @@
+00:00 -
+00:05 ls -d
+00:17 python3 some-fun.py (fail)
+00:29 guix shell --manifest
+00:37 python3 some-fun.py (success)
+00:41 guix shell --pure
+00:54 exit pure shell
+00:59 guix shell --container
+01:20 exit containerized shell
+01:26 guix shell python-ipython
+01:36 ipython in container
+01:47 exit
+01:55 python3 some-fun.py (fail again)
+01:59 done 09
diff --git a/talks/jres-2022/demo/mp4/do-chapters.py 
b/talks/jres-2022/demo/mp4/do-chapters.py
new file mode 100644
index 0000000..9a6a73b
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/do-chapters.py
@@ -0,0 +1,73 @@
+#!/bin/env python3
+
+import re
+
+def read_chapters(filename):
+    print("Read chapters from {}...".format(filename), sep=" ", end="")
+
+    with open(filename, 'r') as f:
+        chapters = list()
+        for line in f:
+            try:
+                x = re.match(r"(\d{2}):(\d{2}) (.*)", line)
+            except:
+                print("Error: excepted format 'XY:uv The title'")
+                return
+
+            mins = int(x.group(1))
+            secs = int(x.group(2))
+            title = x.group(3)
+
+            minutes = mins
+            seconds = secs + (minutes * 60)
+            timestamp = (seconds * 1000)
+            chap = {
+                "title": title,
+                "time": timestamp
+            }
+            chapters.append(chap)
+
+    print("done.")
+    return chapters
+
+
+def generate_meta(chapters, offset=0):
+    print("Generate meta...", sep=" ", end="")
+
+    text = ""
+    for i in range(len(chapters)-1): # Require unnecessary mm:ss Stop
+        chap = chapters[i]
+        title = chap['title']
+        start = chap['time'] + offset
+        end = chapters[i+1]['time']-1 + offset
+        text += f"""
+[CHAPTER]
+TIMEBASE=1/1000
+START={start}
+END={end}
+title={title}
+"""
+
+    print("done.")
+    return text, end
+
+if __name__ == "__main__":
+    import sys
+    try:
+        offset = 0
+        for i, filename in enumerate(sys.argv[1:]):
+            chapters= read_chapters(filename)
+            text, offset = generate_meta(chapters, offset)
+            if len(sys.argv) > 2:
+                out, perm = "merged.meta", 'a'
+                if i == 0:
+                    with open(out, 'w') as f:
+                        f.write('')
+            else:
+                out, perm = filename + '.meta', 'w'
+            with open(out, perm) as f:
+                f.write(text)
+            print("Wrote {}".format(out))
+    except:
+        print("Error.")
+        sys.exit(1)
diff --git a/talks/jres-2022/demo/mp4/videos.txt 
b/talks/jres-2022/demo/mp4/videos.txt
new file mode 100644
index 0000000..521a4e8
--- /dev/null
+++ b/talks/jres-2022/demo/mp4/videos.txt
@@ -0,0 +1,9 @@
+file '01-getting-started-1-2_raw.mp4'
+file '02-getting-started-3_raw.mp4'
+file '03-getting-started-4_raw.mp4'
+file '04-getting-started-5_raw.mp4'
+file '05-getting-started-6_raw.mp4'
+file '06-profile_raw.mp4'
+file '07-generations_raw.mp4'
+file '08-multi-profiles-1_raw.mp4'
+file '09-shell-ipython_raw.mp4'
diff --git a/talks/jres-2022/do-all.sh b/talks/jres-2022/do-all.sh
new file mode 100755
index 0000000..96a9d51
--- /dev/null
+++ b/talks/jres-2022/do-all.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+./do-pres.sh
+./do-supp.sh
diff --git a/talks/jres-2022/do-clean.sh b/talks/jres-2022/do-clean.sh
new file mode 100755
index 0000000..5121cbb
--- /dev/null
+++ b/talks/jres-2022/do-clean.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+for ext in vrb aux log nav out snm toc;
+do
+    find src/ -name "*.${ext}" -type f -print -exec rm {} \;
+done
diff --git a/talks/jres-2022/do-pres.sh b/talks/jres-2022/do-pres.sh
new file mode 100755
index 0000000..2e01d14
--- /dev/null
+++ b/talks/jres-2022/do-pres.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+here=$(pwd)
+cd src
+guix time-machine -C channels.scm \
+       -- shell -C -m manifest.scm  \
+       -- rubber --pdf presentation.tex
+cd $here
diff --git a/talks/jres-2022/do-supp.sh b/talks/jres-2022/do-supp.sh
new file mode 100755
index 0000000..08dacef
--- /dev/null
+++ b/talks/jres-2022/do-supp.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+here=$(pwd)
+cd src
+if [ -f presentation.snm ]
+then
+    guix time-machine -C channels.scm \
+         -- shell -C -m manifest.scm  \
+         -- rubber --pdf support-notes-additionnelles.tex
+fi
+cd $here
+
+if [ ! -f src/presentation.snm ]
+then
+    ./do-all.sh
+fi
diff --git a/talks/jres-2022/src/channels.scm b/talks/jres-2022/src/channels.scm
new file mode 100644
index 0000000..7df15c6
--- /dev/null
+++ b/talks/jres-2022/src/channels.scm
@@ -0,0 +1,6 @@
+(list (channel
+        (name 'guix)
+        (url "https://git.savannah.gnu.org/git/guix.git";)
+        (branch "master")
+        (commit
+          "791069737c8c51582cc021438dae32eb0fb7b8e0")))
diff --git a/talks/jres-2022/src/contenu.tex b/talks/jres-2022/src/contenu.tex
new file mode 100644
index 0000000..c95066a
--- /dev/null
+++ b/talks/jres-2022/src/contenu.tex
@@ -0,0 +1,2413 @@
+\mode*        %Follow up of Beamer configuration when using ignorenonframetext.
+
+\begin{abstract}
+  Ce document s'attache à montrer quelques fonctionnalités de l'outil 
\href{https://guix.gnu.org}{GNU Guix}.
+  Il correspond à un tutoriel court d'une durée de 1 heure, cependant les
+  informations données ici peuvent prendre plus de temps.
+\end{abstract}
+
+\indent
+
+GNU Guix est un gestionnaire de paquets transactionnel et déclaratif.  Il
+implémente une discipline de gestion de paquet fonctionnelle.  Autrement dit,
+le processus de construction et d’installation des paquets est vu comme une
+fonction dans le sens mathématique du terme : cette fonction a des entrées
+(comme des scripts de construction, un compilateur, des bibliothèques ou
+dépendances) et renvoie une construction (comme un programme compilé).  En
+tant que fonction pure, son résultat ne dépend que de ses entrées ; par
+exemple, il ne peut pas faire référence à des logiciels ou des scripts qui
+n’ont pas été explicitement passés en entrée.  Par conséquent, une fonction de
+construction produit toujours le même résultat quand on lui donne le même
+ensemble d’entrée.  Les constructions sont dites reproductibles.
+
+\indent
+
+Basé sur ces fondations, Guix est un gestionnaire d'environnements logiciels :
+il peut utiliser les paquets qu’il connaît pour créer des environnements sous
+différentes formes, temporaires ou «~permanentes~».  Un environnement
+(collection de paquets) peut être déclaré par un manifeste pour générer un «
+profil~», chaque profil ayant son propre historique permettant de revenir en
+arrière ou en avant.  Un environnement temporaire peut aussi être créé à la
+volée, et optionnellement isolé (conteneur Linux), ou n'autorisant lecture,
+écriture ou réseau que spécifiquement.  Aussi, ces environnements peuvent être
+empaquetés dans des images Docker, Singularity ou simplement des archives
+repositionnables.  Pour finir, Guix permet, sur le même principe, la
+génération de «~machines virtuelles~» à partir d'une déclaration pouvant
+contenir un système d'exploitation.  Une fois installé, Guix ne nécessite pas
+de droits spécifiques pour manipuler ses différents environnements.
+
+\indent
+
+Dans ce tutoriel, nous nous proposons d'illustrer quelques spécificités de
+Guix.  Ce tutoriel fait echo à la présentation «~Administration système
+reproductible avec GNU Guix~» par Julien Lepiller au JRES 2019
+(\hrefsf{https://replay.jres.org/videos/watch/c77b3a44-b75f-4c10-9f39-8fb55ae096d7}{vidéo}
+et
+\hrefsf{https://conf-ng.jres.org/2019/document_revision_5343.html?download}{article}).
+
+\begin{center}
+  (Les termes en police \textsf{sans serif} sont des hyperliens.)
+\end{center}
+
+Ce tutoriel n'est qu'une introduction à l'outil Guix.  Nous avons pris le
+parti d'une approche aussi didactique que possible.  Ce document se veut une
+invitation et non pas un menu exhaustif.
+
+
+
+\thisslide{why}
+\begin{frame}<presentation>[label=why, fragile, plain, 
noframenumbering]{Pourquoi j'en suis venu à GNU Guix}
+  \begin{alertblock}{\(\approx\) 2010 \textbf{Thésard}}
+    Développement d'1-2 outils utilisant un gestionnaire de paquets
+    \uline{classique}
+
+    \hfill (Simulation numérique \texttt{C} et \texttt{Fortran} avec Debian / 
Ubuntu /
+    \texttt{apt})
+  \end{alertblock}
+
+  \begin{exampleblock}{\(\approx\) 2014 \textbf{Post-doc}}
+    Développement de 2-3 outils utilisant un gestionnaire de paquets sans
+    droit administrateur
+
+    \hfill (Simulation numérique \texttt{Python} et \texttt{C++} avec 
\texttt{conda})
+  \end{exampleblock}
+
+  \begin{block}{2016 \textbf{Ingénieur. de Recherche}}
+    \begin{itemize}
+    \item Administration d'un \emph{cluster} (\texttt{modulefiles})
+    \item Utilisation de 10+ outils pour un même projet
+    \end{itemize}
+
+    \hfill (Analyse «~bioinformatique~»)
+  \end{block}
+
+  \begin{center}
+    \textbf{Question : \alert{pourquoi cela fonctionne-t-il pour Alice et pas 
pour Bob ? Et vice-versa.}}
+  \end{center}
+\end{frame}
+
+De cette expérience, la question qui se dégage est la continuité du
+déploiement de l'environnement computationnel : comment développer sur son
+ordinateur portable, faire la mise au point sur son ordinateur de bureau et
+calculer massivement sur la grappe de calcul (\emph{cluster}) mutualisée sans
+perdre trop de temps sur des problèmes d'administration ?
+
+Notre motivation dans l'utilisation de Guix est d'apporter une réponse aux
+questions :
+
+\begin{itemize}
+\item Comment refaire demain là-bas ce que l'on a fait hier ici ?
+\item Quelle granularité sur la transparence ?
+\end{itemize}
+
+
+\paragraph{Pour information :}
+\begin{itemize}
+\item \hrefsf{https://docs.conda.io/en/latest/}{Conda} est un gestionnaire
+  d'environnement issu de la communauté Python et visant particulièrement
+  le contexte de logiciels scientifiques.
+\item La
+  \hrefsf{https://modules.readthedocs.io/en/latest/modulefile.html}%
+  {commande \texttt{module}}
+  est un outil largement répandu sur les grappes de calcul qui permet, en
+  jouant sur les variables d'environnement, de charger des outils spécifiques.
+\end{itemize}
+Nous précisons plus loin pourquoi nous ne les considérons pas satisfaisants.
+
+
+
+\begin{frame}<presentation>[plain, noframenumbering]{Ce que nous allons 
aborder}
+  \begin{center}
+    \begin{minipage}{0.7\textwidth}
+      \begin{itemize}
+      \item Comment refaire demain là-bas ce que l'on a fait hier ici ?
+      \item Quelle granularité sur la transparence ?
+      \end{itemize}
+    \end{minipage}
+  \end{center}
+
+  \setcounter{tocdepth}{2}
+  \tableofcontents
+\end{frame}
+
+
+\clearpage
+\section{Introduction}
+
+Dans cette section, nous cherchons à souligner le cadre des problèmes et des
+solutions existantes, ce qui permet, nous l'espérons d'avoir une idée où se
+positionne l'outil Guix.
+
+\subsection{Pourquoi seriez-vous intéressé par Guix ?}
+
+Comme nous allons parler de \emph{logiciels}, de \emph{paquets},
+\emph{dépendances}, puis de ce que fait un \emph{gestionnaire de paquets} pour
+créer des environnements computationnels, voici quelques définitions (dans des
+sens très larges) qui permettent de fixer les idées.
+
+
+\thisslide{start}
+\begin{frame}<presentation>[label=start, fragile]{Pour fixer les idées}
+  \begin{tabular}{rl}
+    \rule[-0.3cm]{0cm}{0.3cm} Logiciel
+    & code source ou programme \emph{binaire} associé
+    \\
+    \rule[-0.3cm]{0cm}{0.3cm} Paquet
+    & recette pour configurer, construire, installer un logiciel
+    \\
+    \rule[-0.3cm]{0cm}{0.3cm} Dépendance
+    & autre paquet nécessaire
+    \\
+    \rule[-0.6cm]{0cm}{0.6cm} Gestionnaire de paquets
+    &
+      \begin{minipage}{0.6\linewidth}
+        automatisation du processus traitant la
+        recette du paquet (et ses dépendances)
+      \end{minipage}
+    \\
+    Environnement computationnel
+    &
+      \begin{minipage}{0.6\linewidth}
+        pile de tous les logiciels nécessaires
+        pour la configuration, construction et
+        installation d'une collection de logiciels
+      \end{minipage}
+  \end{tabular}
+
+  \begin{exampleblock}{}
+    \begin{center}
+      Comment Alice et ses collaborateurs peuvent-ils obtenir le même 
environnement \\
+      pour \emph{calculer} avec Python et Numpy ?
+    \end{center}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Tuto avec un biais issu d’un environnement plus «~scientifique~» et 
moins «~ASR~»
+
+      \textbf{\uline{mais} \red{Guix s’adapte à tous les cas d’usage}}
+      \scriptsize{(ou presque)}
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+
+Les collaborateurs d'Alice sont Carole, Charlie et Bob.  Tous travaillent sur
+des machines différentes avec des distributions GNU/Linux différentes.  Dan
+n'a pas d'interaction avec Alice et a sous la main uniquement un document
+(article de recherche ou fichier de configuration).
+
+
+\thisslide{scenarii}
+\begin{frame}<presentation>[label=scenarii, fragile]{Scenarii}
+  \begin{itemize}
+  \item Alice utilise \texttt{python@3.9} et \texttt{numpy@1.20.3}
+    \vspace{-0.25cm}
+    \begin{center}
+      \begin{minipage}{0.75\linewidth}
+        \begin{exampleblock}{}
+\begin{verbatim}
+$ sudo apt install python python-numpy
+\end{verbatim}
+        \end{exampleblock}
+      \end{minipage}
+    \end{center}
+  \item Carole \textbf{collabore} avec Alice\ldots{}
+    mais utilise \texttt{python3.8} et \texttt{numpy@1.16.5} pour un autre
+    projet
+    \vspace{-0.6cm}
+    \begin{center}
+      \begin{minipage}{0.75\linewidth}
+        \begin{exampleblock}{}
+\begin{verbatim}
+$ apt-cache madison python-numpy
+python-numpy | 1:1.16.5-2ubuntu7 | ...
+\end{verbatim}
+        \end{exampleblock}
+      \end{minipage}
+    \end{center}
+  \item Charlie \textbf{mets à jour} son système et \textbf{tout est cassé}
+    \vspace{-0.25cm}
+    \begin{center}
+      \begin{minipage}{0.75\linewidth}
+        \begin{exampleblock}{}
+\begin{verbatim}
+$ sudo apt upgrade
+The following packages have unmet dependencies:
+E: Broken packages
+\end{verbatim}
+        \end{exampleblock}
+      \end{minipage}
+    \end{center}
+  \item Bob utilise les \textbf{\alert{mêmes} versions} qu'Alice mais n'a
+    \textbf{pas le \alert{même} résultat}
+  \item Dan essaie de \textbf{rejouer plus tard} le scénario d'Alice
+    mais rencontre l'\alert{enfer des dépendances}
+    \begin{center}
+      \begin{minipage}{0.75\linewidth}
+        \href{http://repeatability.cs.arizona.edu}%
+        {Repeatability in Computer Science (lien)}
+      \end{minipage}
+    \end{center}
+  \end{itemize}
+\end{frame}
+
+\begin{itemize}
+\item Qui n’a pas été dans la situation de Carole qui devait installer
+  plusieurs versions d'un même logiciel ?  Et ces versions peuvent
+  entrer en conflit.  En général, par défaut, une distribution Linux
+  installe uniquement une seule version d'un logiciel avec toutes ses
+  dépendances.  Le problème est l'endroit où résident ces logiciels, par
+  défaut le dossier nommé \texttt{/usr/}, et il ne peut pas y
+  avoir deux exécutables, par exemple \texttt{python3}, à deux versions
+  différentes, par exemple \texttt{3.9} et \texttt{3.10}.  Il faut donc un 
logiciel
+  externe qui s'occupe de la gestion de \uline{différentes versions} (et leurs
+  dépendances).
+\item Qui n'a pas été dans la situation de Charlie la veille d'un évènement
+  important et plus rien ne fonctionnait ?  À ma connaissance, cette
+  difficulté de \uline{mise à jour} est une difficulté des administrateurs
+  systèmes de machine partagée : une fois la mise à jour faite, s'il y a
+  de la casse, pas de possibilités de \uline{revenir en arrière}.
+\item Qui n'a pas été dans la situation de Bob «~pourquoi cela ne fonctionne
+  pas pour moi, et pourtant tout est pareil~» ?  Car peut-être que les
+  versions \texttt{python} et \texttt{numpy} de Bob sont bien les mêmes que
+  celles d’Alice, mais le problème est : est-ce bien le cas pour toutes les
+  dépendances et toutes les dépendances de dépendances ?
+\item Qui n’a pas été dans la situation de Dan en lisant un article
+  scientifique ou un tutoriel ou une documentation ?  Le problème est qu’il
+  est difficile de s’assurer que la liste des logiciels requis (ainsi que
+  toutes les dépendances et leurs dépendances) sont à la bonne version sur
+  deux systèmes différents à deux moments différents.
+\end{itemize}
+
+Pour résumer, les problèmes sont :
+
+\begin{enumerate}
+\item installer le logiciel ainsi que toutes les dépendances,
+\item installer plusieurs versions d’un même logiciel,
+\item capturer l’état complet du système.
+\end{enumerate}
+
+
+
+\thisslide{solutions}
+\begin{frame}<presentation>[label=solutions, fragile]{Solution(s)}
+  \begin{enumerate}
+  \item gestionnaire de paquets : APT (Debian/Ubuntu), YUM (RedHat), etc.
+  \item gestionnaire d'environnements : Modulefiles, Conda, etc.
+  \item conteneur : Docker, Singularity
+  \end{enumerate}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Guix = \#1 + \#2 + \#3
+    \end{center}
+  \end{alertblock}
+
+  \begin{description}
+    \item[APT, Yum] Difficile de faire coexister plusieurs versions ou
+      revenir en arrière ?
+    \item[Modulefiles] Comment sont-ils maintenus ? (qui les utilise sur son
+      \emph{laptop} ?)
+    \item[Conda] Quelle granularité sur la transparence ? (qui sait comment a
+      été produit PyTorch dans \texttt{pip install torch} ?
+      \href{http://hpc.guix.info/blog/2021/09/whats-in-a-package/}%
+      {\scriptsize{(lien)}})
+      \item[Docker] Dockerfile basé sur APT, YUM etc.
+        \begin{minipage}{1.0\linewidth}
+        \begin{exampleblock}{}
+\begin{verbatim}
+RUN apt-get update && apt-get install
+\end{verbatim}
+        \end{exampleblock}
+        \end{minipage}
+    \end{description}
+\end{frame}
+
+Rappelons brièvement les termes des solutions :
+\begin{itemize}
+\item un gestionnaire de paquets automatise le processus pour configurer,
+  construire et installer le logiciel ainsi que toutes les dépendances,
+\item un gestionnaire d'environnements autorise la coexistence de plusieurs
+  versions d'un même logiciel, le plus souvent en jouant sur les variables
+  d’environnement,
+\item un conteneur fournit tous les binaires pour être transporté d’une
+  machine à l’autre et donc fonctionne indépendamment de la configuration de
+  la machine hôte.
+\end{itemize}
+
+\bigskip
+
+La double difficulté majeure est :
+\begin{itemize}
+\item d’une part, un contrôle fin dans la production du binaire,
+\item d’autre part, la reproductibilité, au sens «~refaire ailleurs~» (autre
+  configuration, autre moment).
+\end{itemize}
+
+\medskip
+
+Guix, en étant un gestionnaire d’environnements sous \emph{stéroïde}, tente de
+répondre à cette double difficulté.
+
+
+
+\thisslide{interet}
+\begin{frame}<presentation>[label=interet]{Concrètement}
+  Soit
+  \begin{itemize}
+  \item vous vous reconnaissez dans un scénario,
+  \item vous n'êtes pas satisfait par une des solutions,
+  \item vous êtes curieux d'un nouveau outil.
+  \end{itemize}
+
+  \bigskip
+
+  Dans les 3 cas, ce tutoriel illustre :
+
+  \begin{itemize}
+  \item Comment faire en pratique avec GNU Guix.
+  \item Quel est le problème à traiter ?  Et pourquoi c'est compliqué.
+  \end{itemize}
+
+  \begin{alertblock}{}
+      \begin{center}
+        Guix est un gestionnaire d'environnements sous \emph{stéroïde}
+      \end{center}
+    \end{alertblock}
+
+    Ce tutoriel est complémentaire de la présentation de Julien Lepiller en
+    2019
+    
(\href{https://replay.jres.org/videos/watch/c77b3a44-b75f-4c10-9f39-8fb55ae096d7}{vidéo}
+    et
+    
\href{https://conf-ng.jres.org/2019/document_revision_5343.html?download}{article})
+\end{frame}
+
+
+
+\thisslide{steroide}
+\begin{frame}<presentation>[label=steroide]{\emph{Stéroïde} signifie\dots}
+  \begin{tabular}{lr}
+    un \uline{\textbf{gestionnaire de paquets}}
+    & (comme APT, Yum, etc.)
+    \\
+    \ \ transactionnel et déclaratif
+    & (revenir en arrière, versions concurrentes)
+    \\
+    \ \ \ \ qui produit des \uline{\textbf{\emph{packs} distribuables}}
+    & (conteneur Docker ou Singularity)
+    \\
+    \ \ \  \ \ \ qui génèrent des \textbf{\uline{\emph{machines virtuelles}} 
isolées}
+    & (\emph{à la} Ansible ou Packer)
+    \\
+    \ \ \ \ \ \ \ \ sur lequel on construit une distribution Linux
+    & (nous n'en parlerons pas)
+    \\
+    \ \ \ \ \ \ \ \ \ \ \dots et aussi une bibliothèque Scheme\dots
+    & (nous n'en parlerons pas, non plus)
+  \end{tabular}
+
+  \begin{alertblock}{}
+    Ce tuto court est un coup de projecteur sur :
+    \begin{itemize}
+    \item la gestion de paquets \emph{fonctionnelle}
+    \item création de \emph{machines virtuelles}
+    \end{itemize}
+    \begin{center}
+      \textbf{\alert{Ce que nous présentons fonctionne sur n'importe quelle
+          distribution Linux}}
+    \end{center}
+  \end{alertblock}
+  \begin{flushright}
+    \small{%
+      (Facile à essayer\dots)
+    }
+  \end{flushright}
+\end{frame}
+
+\paragraph{Convention.} Nous notons \texttt{foo@1.2} pour le logiciel
+\texttt{foo} à la version \texttt{1.2}.  Usuellement, une ligne commençant par
+\texttt{\$} (dollar) représente une commande \emph{shell}, ainsi que par la 
suite
+toutes les lignes commençant par \texttt{guix}.  La commande \texttt{sudo}
+signifie des droits administrateur.
+
+
+\clearpage
+\subsection{Installation de GNU Guix}
+
+Il est important de noter en tout premier lieu le
+\hrefsf{https://guix.gnu.org/en/manual/devel/fr/}{manuel} (traduit en français)
+qui fournit le point d’entrée pour l’installation et la configuration.  La
+version de référence est la \hrefsf{https://guix.gnu.org/en/manual/devel/en/}%
+{version anglaise}.
+
+\subsubsection{Installation recommandée}
+
+Nous recommandons d’installer Guix sur une distribution Linux, voir la section
+\href{https://guix.gnu.org/en/manual/devel/fr/guix.fr.html#Installation-binaire}%
+{\textsf{Installation binaire}} du manuel.  En tant que \texttt{root} (avec
+les droits administrateur), il faut exécuter les commandes :
+
+\begin{verbatim}
+cd /tmp
+wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
+chmod +x guix-install.sh
+./guix-install.sh
+\end{verbatim}
+
+\paragraph{Attention.}  Nous vous recommandons de parcourir le script 
\emph{shell}
+\texttt{guix-install.sh} et de ne pas l’exécuter aveuglément.  Ce script fait
+principalement 2 choses :
+\begin{enumerate}
+\item télécharge, installe et configure le démon \texttt{guix-daemon},
+\item crée les différents dossiers nécessaires au bon fonctionnement.
+\end{enumerate}
+
+\paragraph{Cette installation n'interfère en rien avec la distribution hôte.}
+Pour «~désinstaller~» Guix, il suffit de supprimer les dossiers \texttt{/gnu},
+\texttt{/var/guix}, \texttt{\$HOME/\{.cache,.config\}/guix},
+\texttt{/root/.config/guix} et les mécanismes de complétion de \emph{shell}
+(p. ex. \texttt{/etc/bash\_completion.d}).
+
+\paragraph{Remarques.} Pour une utilisation plus agréable, nous recommandons
+d’au\-to\-ri\-ser les substituts binaires (voir la section
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Substituts}{\textsf{Substituts}})
+lors de l’installation via le script.  Nous recommandons aussi de configurer
+\emph{Name Service Switch} (\texttt{nscd}) sur la distribution hôte (voir la
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Name-Service-Switch-1}{\textsf{section}}
+du manuel pour une explication du pourquoi).
+
+\medskip
+
+Pour des constructions locales, il est aussi possible d’utiliser un mécanisme
+de déchargement (\emph{offload}) sur une machine tierce.  Nous renvoyons à la
+section du manuel
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#R_00e9glages-du-d_00e9chargement-du-d_00e9mon}%
+{\textsf{Utiliser le dispositif de déchargement}}.
+
+\medskip
+
+Pour finir, nous recommandons d’installer le paquet \texttt{glibc-locales},
+dans le \emph{profil} \texttt{root} ainsi que dans le \emph{profil}
+utilisateurs (voir la section
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Regionalisation}%
+{\textsf{Régionalisation}}).
+\begin{center}
+  \texttt{sudo guix install glibc-locales}
+
+  \texttt{guix install glibc-locales}
+\end{center}
+et d’exporter la variable d’environnement
+\begin{center}
+  \texttt{export GUIX\_LOCPATH=\$HOME/.guix-profile/lib/locale}
+\end{center}
+ ce qui évite des messages de \emph{warning}.
+
+
+
+\begin{frame}<presentation>[fragile]{\emph{distro externe}}
+  \begin{alertblock}{}
+  \begin{center}
+    Guix s’installe sur \textbf{\uline{n’importe quelle distribution}} Linux 
récente.
+  \end{center}
+  \end{alertblock}
+  Il faut les droits administrateur (\texttt{root}) pour l’installation.
+
+  \begin{exampleblock}{}
+\begin{verbatim}
+$ cd /tmp
+$ wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
+$ chmod +x guix-install.sh
+$ sudo ./guix-install.sh
+\end{verbatim}
+  \end{exampleblock}
+
+  \begin{center}
+    (Quelques réglages supplémentaires sont expliqués dans les notes
+    additionnelles)
+  \end{center}
+
+  Pour commencer :
+  \begin{center}
+    \begin{minipage}{0.75\linewidth}
+\begin{verbatim}
+$ guix help
+\end{verbatim}
+    \end{minipage}
+  \end{center}
+
+\end{frame}
+
+\subsubsection{Autres méthodes d'installation}
+
+\paragraph{Guix System, Guix dans une VM.}
+
+Il nous apparaît plus aisé de commencer par installer Guix sur une
+distribution Linux et d’utiliser l’outil comme gestionnaire de paquets sous
+\emph{stéroïde}.  Mais les plus téméraires d’entre vous peuvent vouloir
+installer Guix comme système d’exploitation complet ou dans une machine
+virtuelle.  Dans ce cas, le manuel fournit une
+\hrefsf{https://guix.gnu.org/en/manual/devel/fr/guix.fr.html\#Installation-du-syst\_00e8me}%
+{section} dédiée. Nous recommandons d’utiliser
+l’\hrefsf{https://guix.gnu.org/en/manual/devel/fr/guix.fr.html\#Installation-graphique-guid\_00e9e}%
+{installateur graphique}.
+
+\medskip
+
+Par ailleurs, il est à noter que Guix n’a pas un modèle stable versus
+expérimental mais des révisions considérées comme \emph{release},
+intensivement testées mais ne recevant pas de correctifs.  Actuellement, c’est
+l’étiquette
+\hrefsf{https://guix.gnu.org/en/blog/2021/gnu-guix-1.3.0-released/}{v1.3.0}
+sortie au mois de mai 2021.  Il est possible de télécharger des images soit
+de la version dite «~\hrefsf{https://guix.gnu.org/fr/download/}{standard}~»
+(v1.3.0), soit des images générées à partir des derniers
+\hrefsf{https://guix.gnu.org/fr/download/latest/}{développements}.  Chacun a 
ses
+avantages et inconvénients :
+\begin{description}
+\item[avantage «~standard~» :] bien testé,
+\item[inconvénient «~standard~» :] potentiel manque de substituts binaires,
+\item[avantage «~derniers développements~» :] inclus les correctifs depuis le
+  dernier étiquetage,
+\item[inconvénient «~derniers développements~» :] potentiellement instable ;
+  ça peut fonctionner parfaitement comme cela peut être cassé.
+\end{description}
+
+\paragraph{Installation via le paquet Debian.}  Nous n’avons pas intensivement
+testé cette méthode d’installation, c’est pourquoi nous la ne recommanderions
+pas.  Mais elle est peut-être d’intérêt pour certains d’entre vous.  La
+version Debian \hrefsf{https://packages.debian.org/bullseye/guix}{Bullseye}
+fournit le paquet Guix :
+\begin{verbatim}
+$ sudo apt install guix
+\end{verbatim}
+
+\paragraph{Installation sur une grappe de calcul.}  Les grappes de calcul
+(\emph{cluster}) ont souvent des configurations très spécifiques, nous
+renvoyons à cette
+\hrefsf{https://hpc.guix.info/blog/2017/11/installing-guix-on-a-cluster/}{explications}
+pour les points essentiels.  Sinon, nous recommandons de prendre contact avec
+la communauté via p. ex. \texttt{guix-science@gnu.org}.
+
+\subsubsection{Révision de Guix pour ce tutoriel}
+
+Ce tutoriel devrait être pouvoir être joué quelque soit la révision.
+Cependant, il est possible que les exemples fournis évoluent ; comme les
+versions des paquets Python ou autres.  La commande, en tant qu’utilisateur
+sans privilège particulier,
+
+\begin{center}
+  \texttt{\$ guix pull -{}-commit=eb34ff1}
+\end{center}
+
+permet de se placer dans l’exact même révision que celle utilisée lors de
+l’écriture de ce document.
+
+\paragraph{Remarques.}  Les
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Serveur-de-substituts-officiel}%
+{\textsf{fermes de substituts officielles}} n’étant pas des ressources 
illimitées, il
+est possible que les substituts ne soient plus disponibles dans quelques mois
+ou années après mai 2022.  Le projet Guix s’efforce autant que possible
+d’assurer la conservation des substituts binaires qu’il produit et nous
+espérons que cette remarque soit caduque.
+
+\medskip
+
+Dans le cas d’absence de substituts binaires, cela signifie que la commande
+précédente (\texttt{pull}) risque de prendre plus de temps, mais surtout que
+les exemples utilisant les piles logicielles risquent de compiler depuis les
+sources toutes les dépendances (binaires) manquantes de la dite pile.  D’un
+côté, c’est pour cela que Guix est un outil puissant pour la reproductibilité.
+
+\medskip
+
+D’un autre côté, si les substituts ne sont plus disponibles, alors il sera
+difficile de suivre ce tutoriel avec votre ordinateur portable et nous
+conseillons donc d’utiliser un
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#R_00e9glages-du-d_00e9chargement-du-d_00e9mon}%
+{\textsf{déchargement (\emph{offload})}}.  Ou de saisir l’esprit général et
+d’utiliser vos propres exemples avec substituts.
+
+
+\begin{frame}<presentation>[plain,fragile,noframenumbering]{}
+
+  \vfill{}
+  \begin{center}
+    \textbf{Comment faire la gestion de paquets ?}
+  \end{center}
+
+  \vfill{}
+  \begin{flushright}
+    (Exemple : Alice sans privilège particulier)
+  \end{flushright}
+
+  \vfill{}
+  \begin{minipage}{0.57\linewidth}
+    \begin{alertblock}{}
+      \begin{itemize}
+      \item Démos avec des outils du «~\emph{monde scientifique}~»
+      \item Guix représente 20k+ paquets
+        \scriptsize{(constante progression)}\normalsize{}
+      \item Cela serait identique pour d'autres outils\\
+        \hfill{} comme Nginx, LDAP, SSH, etc.
+      \end{itemize}
+    \end{alertblock}
+  \end{minipage}
+\end{frame}
+
+
+\clearpage
+\section{Gestion de paquets}
+
+À partir de cette section, nous considérons une installation fonctionnelle de
+l’outil Guix sur une distribution Linux récente.  Toutes les commandes seront
+exécutées dans un terminal en tant qu’utilisateur régulier (sans droit
+d’administration particulier).  La révision de Guix utilisée est
+\texttt{eb34ff1}.
+
+\medskip
+
+Nous recommandons la lecture de la section
+«~\href{https://guix.gnu.org/en/manual/devel/fr/guix.fr.html\#Pour-d\_00e9marrer}{Pour
+  démarrer}~» du manuel.
+
+\subsection{Utilisation de \texttt{guix package}}
+
+Guix est avant tout un gestionnaire de paquets, c.-à-d. que Guix automatise le
+processus pour configurer, construire et installer le logiciel ainsi que
+toutes les dépendances.  Les fonctionnalités de gestion de paquets sont
+données par la commande \texttt{guix package}.
+
+
+\begin{frame}<presentation>[fragile]{Commandes basiques}
+  \begin{center}
+    Exemple : outils scientifiques classiques en Python
+  \end{center}
+
+  \bigskip
+
+  \begin{center}
+    (\texttt{demo/getting-started})
+  \end{center}
+\end{frame}
+
+
+
+\thisslide{cli-basic}
+\begin{frame}<presentation>[label=cli-basic, fragile]{Commandes basiques : 
Résumé}
+  \begin{exampleblock}{}
+    \begin{verbatim}
+guix search dynamically-typed programming language # 1.
+guix show    python                                # 2.
+guix install python                                # 3.
+guix install python-ipython python-numpy           # 4.
+guix remove  python-ipython                        # 5.
+guix install python-matplotlib python-scipy        # 6.
+\end{verbatim}
+  \end{exampleblock}
+
+  \begin{center}
+    alias de \texttt{guix package}, p. ex. \verb+guix package --install+
+  \end{center}
+
+  \begin{alertblock}{Transactionnel}
+\begin{verbatim}
+guix package --install python                                    # 3.
+guix package --install python-ipython python-numpy               # 4.
+guix package -r python-ipython -i python-matplotlib python-scipy # 5. & 6.
+\end{verbatim}
+  \end{alertblock}
+\end{frame}
+
+Les commandes précédentes sont des alias de la commande \texttt{guix package}.
+
+\begin{center}
+  \begin{tabular}{clcl}
+    $1.$ & \texttt{guix search}  & $\leftrightarrow$ & \texttt{guix package 
-{}-search=}\\
+    $2.$& \texttt{guix show}    & $\leftrightarrow$ & \texttt{guix package 
-{}-show=}\\
+    $3.$& \texttt{guix install} & $\leftrightarrow$ & \texttt{guix package 
-{}-install=}\\
+    $4.$& \texttt{guix remove}  & $\leftrightarrow$ & \texttt{guix package 
-{}-remove=}\\
+  \end{tabular}
+\end{center}
+
+Pour de plus amples informations sur chacune des commandes, se référer au
+manuel (section
+\hrefsf{https://guix.gnu.org/en/manual/devel/fr/guix.fr.html\#Invoquer-guix-package}%
+{Invoquer \texttt{guix package}}).  En quelques mots :
+
+\begin{enumerate}
+\item \texttt{guix search} : Recherche dans tous les paquets disponibles les
+  termes \texttt{dynamically-typed programming language} dans les noms,
+  synopsis et descriptions des paquets.
+\item \texttt{guix show} : Affiche les informations relatives au paquet : nom, 
version,
+  dépendances, synopsis, description, etc.  Par convention si aucune
+  version n’est donnée, il choisit la dernière.
+\item \texttt{guix install} : Installe le paquet \texttt{python}, par
+  convention si aucune version n’est donnée, il choisit la dernière.
+\item Installe les paquets \texttt{python-ipython python-numpy}.
+\item \texttt{guix remove} : Supprime l’installation du paquet 
\texttt{python-ipython}.
+\item Installe les deux autres paquets \texttt{python-matplotlib python-scipy}.
+\end{enumerate}
+
+Il est important de noter que les opérations d'installation / suppression
+sont transactionnelles.  D'une part, une action (transaction) peut comporter
+plusieurs opérations.  D'autre part, cette action (transaction) transforme un
+état dans un autre et ces états sont sauvegardés (voir \emph{génération} et
+la {Gestion de \emph{profil}}, section \textsf{\ref{sec:profil}}) ; en
+d'autres termes il est toujours possible de défaire une action (transaction).
+
+
+
+\thisslide{pkg-man}
+\begin{frame}<presentation>[label=pkg-man]{Guix, un gestionnaire de paquets 
comme les autres ?}
+  \begin{alertblock}{}
+    \begin{itemize}
+    \item Interface \emph{ligne de commande} comme les autres gestionnaires de
+      paquets
+    \item Installation/suppression sans privilège particulier
+    \item Transactionnel (= pas d'état «~\emph{cassé}~»)
+    \item \emph{Substituts} binaires (téléchargement d'éléments pré-construits)
+    \end{itemize}
+  \end{alertblock}
+  \begin{center}
+    \textbf{Trois fonctionnalités puissantes :}
+  \end{center}
+
+  \begin{exampleblock}{}
+    \begin{itemize}
+    \item Les \emph{profils} et leur composition
+    \item Gestion déclarative
+    \item Environnement isolé à la volée
+    \end{itemize}
+  \end{exampleblock}
+\end{frame}
+
+Toutes ces commandes ressemblent très fortement à toutes celles d’autres
+gestionnaires de paquets, comme \texttt{apt} (Debian/Ubuntu) ou \texttt{yum}
+(RedHat).  À la différence qu'il ne faut pas de droits d'administration
+particuliers pour installer des paquets.
+
+\medskip
+
+Nous allons maintenant illustrer trois fonctionnalités qui font de Guix le
+couteau suisse des gestionnaires d'environnement.  Les \emph{profils}
+permettent de garder sous contrôle l'installation d'outils (paquets)
+potentiellement en conflit.  La \emph{gestion déclarative} permet de
+configurer les \emph{profils} dans un style de programmation fonctionnelle.
+Pour finir, nous verrons la création à la volée d'un environnement
+computationnel et optionnellement isolé.
+
+\clearpage
+\subsection{Gestion de \emph{profil}}
+\label{sec:profil}
+
+Un notion essentielle dans l’utilisation de Guix est la notion de
+\emph{profil} : un répertoire contenant les paquets installés.
+
+
+\thisslide{profil-default}
+\begin{frame}<presentation>[label=profil-default, fragile]{Le \emph{profil} 
par défaut}
+  Les commandes d’installation précédentes finissent avec le conseil :
+  \begin{exampleblock}{}
+\begin{verbatim}
+hint: Consider setting the necessary environment variables by running:
+
+     GUIX_PROFILE="/home/alice/.guix-profile"
+     . "$GUIX_PROFILE/etc/profile"
+
+Alternately, see `guix package --search-paths -p "$HOME/.guix-profile"'.
+\end{verbatim}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{center}
+      \texttt{\$HOME/.guix-profile} est le \emph{profil} par défaut
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+Il n'est pas nécessaire d'entrer dans ces détails pour utiliser Guix mais ce
+tutoriel nous apparaît opportun pour décortiquer.
+
+\medskip
+
+Le profil par défaut est \texttt{\$HOME/.guix-profile} et nous pouvons
+afficher les variables d'environnements de ce profil avec la commande
+\begin{verbatim}
+$ guix package --search-paths -p $HOME/.guix-profile
+export PATH="/home/alice/.guix-profile/bin"
+export GUIX_PYTHONPATH="/home/alice/.guix-profile/lib/python3.9/site-packages"
+export GI_TYPELIB_PATH="/home/alice/.guix-profile/lib/girepository-1.0"
+export XDG_DATA_DIRS="/home/alice/.guix-profile/share"
+\end{verbatim}
+et ce profil est un lien symbolique
+\begin{verbatim}
+$ file $HOME/.guix-profile
+/home/alice/.guix-profile: symbolic link to
+                               /var/guix/profiles/per-user/alice/guix-profile
+\end{verbatim}
+et vers quoi pointe le lien ?
+\begin{verbatim}
+$ readlink -f $HOME/.guix-profile
+/gnu/store/jy24qk0vdgqvysnryldqn52b3fg03z10-profile
+\end{verbatim}
+où \texttt{jy24qk...} ressemble à un condensat (\emph{hash}) -- il condense
+toutes les entrées (dépendances) pour la construction dudit profil.  Le type
+du lien pointé est un dossier
+\begin{verbatim}
+$ file $(readlink -f ~/.guix-profile)
+/gnu/store/jy24qk0vdgqvysnryldqn52b3fg03z10-profile: directory
+\end{verbatim}
+et ce dossier contient
+\begin{verbatim}
+$ tree -L 1 $(readlink -f ~/.guix-profile)
+/gnu/store/jy24qk0vdgqvysnryldqn52b3fg03z10-profile
+|-- bin
+|-- etc
+|-- include
+|-- lib
+|-- manifest
+`-- share
+\end{verbatim}
+
+
+
+\thisslide{profil}
+\begin{frame}<presentation>[label=profil, fragile]{Mais qu'est-ce un 
\emph{profil} ?}
+  \begin{center}
+    Filesystem Hierarchy Standard (FHS) = norme de la hiérarchie des systèmes
+    de fichiers
+
+    \medskip
+
+    (définit l'arborescence et contenu des répertoires systèmes pour les 
systèmes Unix)
+  \end{center}
+
+  \begin{exampleblock}{}
+    \begin{Verbatim}
+      usr
+      |-- bin       Binaires exécutables
+      |-- etc       Fichiers de configuration
+      |-- include   Entêtes des bibliothèques partagées
+      |-- lib       Bibliothèques partagées
+      |-- share     Documentation entre autres
+    \end{Verbatim}
+  \end{exampleblock}
+
+  \begin{center} % XXXX: demo ?
+    \verb+ls $HOME/.guix-profile+
+  \end{center}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Un \emph{profil} est un répertoire contenant les paquets installés
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+\textbf{Conclusion}
+\begin{itemize}
+\item Un \emph{profil} contient les variables d’environnements ajustées.
+\item Un \emph{profil} est un lien symbolique.
+\item Un \emph{profil} pointe vers un dossier du dépôt (\emph{store}).
+\item Un \emph{profil} a la structure hiérarchique de FHS (comme 
\texttt{/usr/}).
+\end{itemize}
+
+Sans entrer dans les détails, le dépôt (\emph{store}) est monté à
+\texttt{/gnu/store} et il est dédupliqué, c.-à-d. qu'il pourrait être vu comme
+une forêt de liens symboliques (voir \textsf{Fig. \ref{fig:symlinks}}).
+\begin{figure}[!htb]
+  \centering
+  \includegraphics[width=0.7\textwidth]{static/forest-symlinks.pdf}
+  \caption{Forêt de liens symboliques \label{fig:symlinks}}
+\end{figure}
+L'exemple \textsf{Fig. \ref{fig:symlinks}} utilise des paquets qui sont 
classiques
+dans le contexte bioinformatique.  Cependant, on peut se poser la question des
+nombres 42 et 43.  Examinons ceci.
+\begin{verbatim}
+$ ls -l /var/guix/profiles/per-user/alice/guix-profile*
+/var/guix/profiles/per-user/alice/guix-profile -> guix-profile-5-link
+/var/guix/profiles/per-user/alice/guix-profile-0-link -> 
/gnu/store/0fv...-profile
+/var/guix/profiles/per-user/alice/guix-profile-1-link -> 
/gnu/store/vsr...-profile
+/var/guix/profiles/per-user/alice/guix-profile-2-link -> 
/gnu/store/k3c...-profile
+/var/guix/profiles/per-user/alice/guix-profile-3-link -> 
/gnu/store/dks...-profile
+/var/guix/profiles/per-user/alice/guix-profile-4-link -> 
/gnu/store/33d...-profile
+/var/guix/profiles/per-user/alice/guix-profile-5-link -> 
/gnu/store/jy2...-profile
+\end{verbatim}
+Par conséquent, l'historique est en quelque sorte conservé et Guix donne la
+possibilité de changer vers quoi les liens pointent.  Le profil lui-même est
+donc immutable.
+
+
+
+\thisslide{profil2}
+\begin{frame}<presentation>[label=profil2, fragile]{Exemples de 
fonctionnalités des \emph{profils}}
+
+  \begin{alertblock}{}
+    \begin{itemize}
+    \item Historique des paquets installés / supprimés 
(\verb+--list-generations+)
+    \item Retour en arrière (\verb+--roll-back+ or \verb+--switch-generations+)
+    \end{itemize}
+  \end{alertblock}
+
+  \begin{center}
+    (\texttt{demo/generations})
+  \end{center}
+
+  \begin{alertblock}{}
+    \begin{itemize}
+    \item Profils indépendants
+    \item Contrôle fin des variables d'environnement (\verb+--search-paths+)
+    \item Composition
+    \end{itemize}
+  \end{alertblock}
+
+  \begin{center}
+    (\texttt{demo/multi-profiles})
+  \end{center}
+\end{frame}
+
+Une première fonctionnalité est la conservation des actions (installation ou
+suppression) sur un profil.  Chaque action complète va créer une
+\emph{génération} (état) -- c'est en ce sens que Guix est transactionnel.  Il
+est donc possible de revenir en arrière (\texttt{roll-back}) ou de basculer
+vers une autre génération (\texttt{switch-generation}).  Par exemple,
+\begin{verbatim}
+$ guix package --list-generations
+Generation 1    avril 21 2022 20:22:28
+ + python            3.9.9   out     /gnu/store/sz7...-python-3.9.9
+
+Generation 2    avril 21 2022 20:38:30
+ + python-numpy      1.20.3  out     /gnu/store/s89...-python-numpy-1.20.3
+ + python-ipython    7.27.0  out     /gnu/store/rj0...-python-ipython-7.27.0
+
+Generation 3    avril 21 2022 20:41:38
+ - python-ipython    7.27.0  out     /gnu/store/rj0...-python-ipython-7.27.0
+
+Generation 4    avril 21 2022 21:05:14
+ + python-scipy      1.7.3   out     /gnu/store/x3x...-python-scipy-1.7.3
+ + python-matplotlib 3.5.1   out     /gnu/store/inl...-python-matplotlib-3.5.1
+
+Generation 5    avril 21 2022 21:19:34  (current)
+ + tree              2.0.2   out     /gnu/store/b9z..-tree-2.0.2
+\end{verbatim}
+où le symbole \texttt{+} représente un ajout de paquet, le symbole \texttt{-}
+une suppression pour chaque génération et \texttt{guix package
+  -{}-list-installed} fournit la liste complète des paquets de l'état courant.
+
+\medskip
+
+Il est possible de supprimer une (ou plusieurs) génération avec l'option
+\texttt{-{}-delete-generations}.  Nous renvoyons à la section du manuel sur le
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Invoquer-guix-gc}%
+{\textsf{ramasse-miette}} qui permet une gestion de ce que contient le dépôt
+(\emph{store}).
+
+\bigskip
+
+Pour finir, autant de profils que l'on souhaite peuvent être créés.  D'une
+part, chaque profil est indépendant et d'autre part, ils peuvent être
+composés. En d'autres termes
+\begin{verbatim}
+guix install python --profile=interpreteur
+guix install python-numpy --profile=bibliotheque
+eval $(guix package --search-paths=prefix -p interpreteur -p bibliotheque)
+\end{verbatim}
+et l'environnement résultant contiendra \texttt{python} et
+\texttt{python-numpy}.  D'autre part, l'ajout des variables d'environnement
+(\texttt{search-paths}) est contrôlable avec la valeur de l'argument
+\texttt{prefix}, \texttt{suffix} ou \texttt{exact} ; les variables
+d'en\-vi\-ron\-nement peuvent être, respectivement, placées avant ou après
+les valeurs actuelles, ou remplacer les valeurs actuelles.
+
+\bigskip
+
+Nous recommandons
+\href{https://guix.gnu.org/en/cookbook/fr/guix-cookbook.fr.html#Gestion-avanc_00e9e-des-paquets}%
+{\textsf{Les profils en pratique}} du livre de cuisine.
+
+
+\thisslide{profil3}
+\begin{frame}<presentation>[label=profil3, fragile]{\emph{Profil}, en résumé}
+  Les paquets sont installés dans un \emph{profil} qui est :
+  $\left. \text{\parbox{0.55\linewidth}{
+        \begin{itemize}
+        \item un lien symbolique,
+        \item pointant vers un élément du dépôt (\emph{store}),
+        \end{itemize}
+      }} \only<1|article:1>{\right.}\only<2-|article:0>{\right\}} $
+  \only<2-|article:0>{%
+  \hfill
+  \begin{minipage}{0.3\linewidth}
+    \begin{alertblock}{Dépôt (\emph{store})}
+      \begin{itemize}
+      \item Monté à \texttt{/gnu/store}
+      \item Dédupliqué
+      \end{itemize}
+    \end{alertblock}
+  \end{minipage}
+  }
+  $\left. \text{\parbox{1.0\linewidth}{
+  \begin{itemize}
+  \item et les éléments ont une structure hiérarchique type FHS (comme 
\texttt{/usr/}).
+  \end{itemize}
+  }} \right.$
+
+  \begin{exampleblock}{}
+    \begin{center}
+      On peut créer autant de profils que l’on souhaite
+    \end{center}
+  \end{exampleblock}
+
+  \vfill
+
+  \begin{alertblock}{}
+    \begin{center}
+      \textbf{Toutes les options de \texttt{guix package} s’appliquent à 
n’importe quel profil}
+    \end{center}
+  \end{alertblock}
+
+  \vfill
+
+  \begin{center}
+    \texttt{guix install python python-numpy -{}-profile=outils-python}
+  \end{center}
+
+\end{frame}
+
+
+\clearpage
+\subsection{Gestion déclarative}
+
+Il devient vite fastidieux de saisir à l'invite du \emph{shell} la liste des
+paquets et il apparaît naturel de vouloir sauvegarder cette liste dans un
+fichier.  Par exemple, il n'est pas rare de versionner cette liste.  Guix
+permet ceci, et un peu plus, au travers d'une gestion déclarative.
+
+
+\thisslide{declarative}
+\begin{frame}<presentation>[label=declarative, fragile]{Gestion déclarative}
+  \vspace{-0.3cm}
+  \begin{center}
+    déclaratif = fichier de configuration
+  \end{center}
+
+  \begin{exampleblock}{%
+      Un fichier \texttt{some-python.scm} peut contenir cette déclaration :%
+    }
+    
\lstinputlisting[language=Scheme,columns=space-flexible]{example/some-python.scm}
+  \end{exampleblock}
+
+  \begin{center}
+    \verb+guix package --manifest=some-python.scm+
+  \end{center}
+  équivalent à
+  \begin{center}
+    \verb+guix install python python-matplotlib python-numpy python-scipy+
+  \end{center}
+\end{frame}
+
+Le fichier de configuration est usuellement appelé \texttt{manifest}.  Il
+contient la liste des paquets comme saisi à l'invite du \emph{shell}.  Cette 
liste
+est une spécification du manifeste à instancier dans le profil.
+
+
+\thisslide{declarative2}
+\begin{frame}<presentation>[label=declarative2, fragile]{Gestion 
\emph{déclarative} : remarques}
+  \begin{description}
+  \item[Version ?] Nous le verrons dans la suite
+    \medskip
+  \item[Langage ?] \emph{Domain-Specific Language} (DSL) basé sur
+    \href{https://fr.wikipedia.org/wiki/Scheme}%
+    {Scheme}
+    \href{https://fr.wikipedia.org/wiki/Lisp}%
+    {(«~langage fonctionnel Lisp~»)}%
+    \medskip
+    \begin{itemize}
+    \item \verb+(Oui (quand (= Lisp parenthèses) (baroque)))+
+      \medskip
+    \item Mais \uline{\textbf{continuum}} :
+      \begin{enumerate}
+      \item configuration (\texttt{manifest})
+      \item définition des paquets (ou services)
+      \item extension
+      \item le c\oe ur est écrit aussi en Scheme
+      \end{enumerate}
+    \end{itemize}
+  \end{description}
+  \begin{alertblock}{}
+    \begin{center}
+      Guix est \textbf{adaptable} à ses besoins
+    \end{center}
+  \end{alertblock}
+
+  \vfill
+
+  \footnotesize{%
+    \href{https://fr.wikipedia.org/wiki/Programmation_déclarative}{Déclaratif}
+    vs
+    \href{https://fr.wikipedia.org/wiki/Programmation_impérative}{Impératif}
+  } \hfill \scriptsize{%
+    (%
+    et non pas
+    % \hfill
+    Donnée inerte vs Programme%
+    )
+  }
+
+  \footnotesize{%
+    Programmation déclarative = programmation fonctionnelle ou descriptive 
(\LaTeX) ou logique (Prolog)
+  }
+\end{frame}
+
+Tout d'abord, il est important de noter que \emph{déclaratif} ne signifie pas
+donnée inerte, comme l'on pourrait retrouver avec un format comme
+\hrefsf{https://fr.wikipedia.org/wiki/Comma-separated_values}{CSV} ou
+\hrefsf{https://fr.wikipedia.org/wiki/YAML}{YAML}.  Le terme
+\hrefsf{https://fr.wikipedia.org/wiki/Programmation_déclarative}{déclaratif}
+(«~on décrit le \emph{quoi}, c'est-à-dire le problème~») s'oppose à
+\hrefsf{https://fr.wikipedia.org/wiki/Programmation_impérative}{impératif}
+(«~on décrit le \emph{comment}, c'est-à-dire la structure de contrôle
+correspondant à la solution~»).
+
+Avec le \textsf{Tableau \ref{tab:cloc}}, nous espérons illustrer ce
+\emph{continuum} dans Guix.
+
+\begin{table}[!htb]
+  \centering
+  \begin{tabular}{l|rrrr}
+    Language     &files &blank &comment &code\\
+    \hline
+    Scheme       &1105  &47761 &63485   &804643\\
+    ~\texttt{\textasciigrave-{}-~packages}  &538   &26787 &37972   &642152\\
+    ~\texttt{\textasciigrave-{}-~guix}      &272   &9699  &13346   &75577\\
+    ~\texttt{\textasciigrave-{}-~services}  &53    &3232  &2764    &26723\\
+    C++          & 50 &3425 &2198 &10635\\
+    make         &  4 &213  &292  &3087\\
+    Bourne Shell & 29 &850  &1213 &2891
+  \end{tabular}
+  \caption{\texttt{cloc -{}-exclude-ext=patch -{}-exclude-dir=po .}}
+  \label{tab:cloc}
+\end{table}
+
+Les paquets, les services et Guix lui-même sont écrits dans le même langage
+\hrefsf{https://fr.wikipedia.org/wiki/Scheme}{Scheme} (pour être précis
+\hrefsf{https://www.gnu.org/software/guile/}{GNU Guile}).  Ce langage est
+dérivé du langage fonctionnel Lisp et il facilite la définition de langages
+dédiés (DSL, \emph{domain-specific language}).
+
+
+
+\thisslide{trans-declarative}
+\begin{frame}<presentation>[label=trans-declarative, fragile]{Gestion 
déclarative : exemple de transformation
+    \small{%
+    (\href{https://fr.wikipedia.org/wiki/Machine_de_Rube_Goldberg}%
+    {machine de \smiley{Goldberg} \tiny{(lien)}})}} % \ddot\smile
+  \vspace{-0.3cm}
+  \begin{exampleblock}{}
+    
\lstinputlisting[language=Scheme,columns=space-flexible]{example/some-python-bis.scm}
+  \end{exampleblock}
+  Guix DSL, \somevariable{\emph{variables}}, \someguile{Scheme} et 
\somestring{chaîne de caractères}.
+\end{frame}
+
+Par exemple, nous illustrons la capacité de manipuler
+\emph{programmatiquement} les paquets.  Avec le mots-clé \texttt{append}, deux
+listes sont concaténées.  Le mot-clé \texttt{map} applique une fonction aux
+éléments d’une liste et retourne une liste.  Le mot-clé \texttt{lambda}
+définit une fonction (anonyme).
+
+\medskip
+
+Ainsi, il est possible de déclarer des transformations à appliquer aux
+paquets.
+
+
+\clearpage
+\paragraph{Transformation de paquets.}
+Les
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Options-de-transformation-de-paquets}%
+{\textsf{transformations de paquets}} sont des options qui rendent possible la
+définition de variantes de paquets -- par exemple, des paquets construit en
+utilisant une
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#La-cha_00eene-d_0027outils-GCC}%
+{\textsf{chaîne d’outils}} différente que celle par défaut.
+
+
+\thisslide{transformation}
+\begin{frame}<presentation>[label=transformation, fragile]{Transformations de 
paquet : survol}
+    \begin{exampleblock}{}
+    \begin{center}
+      Comment utiliser GCC@7 pour compiler le paquet \texttt{python} ?
+    \end{center}
+  \end{exampleblock}
+
+  \begin{center}
+    Un paquet = recette pour configurer, construire, installer un logiciel
+
+    \medskip
+
+    (\texttt{./configure \&\& make \&\& make install})
+  \end{center}
+  La recette définit :
+  \begin{itemize}
+  \item un \blue{code source} et potentiellement des modifications 
\emph{ad-hoc} (\verb+patch+)
+  \item des \magenta{outils de construction} (compilateurs, moteur de
+    production etc., p. ex. \verb+gcc+, \verb+cmake+)
+  \item des \violet{dépendances}
+  \end{itemize}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Une transformation permet de les réécrire
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+
+
+\thisslide{cli-trans}
+\begin{frame}<presentation>[label=cli-trans, fragile]{Transformations : ligne 
de commande}
+  \begin{exampleblock}{}
+    \begin{center}
+      \verb+guix package --help-transformations+
+    \end{center}
+  \end{exampleblock}
+\begin{Verbatim}[commandchars=\\\{\}]
+\blue{--with-source      use SOURCE when building the corresponding package}
+\blue{--with-branch      build PACKAGE from the latest commit of BRANCH}
+\blue{--with-commit      build PACKAGE from COMMIT}
+\blue{--with-git--url    build PACKAGE from the repository at URL}
+\blue{--with-patch       add FILE to the list of patches of PACKAGE}
+\blue{--with-latest      use the latest upstream release of PACKAGE}
+\magenta{--with-c-toolchain build PACKAGE and its dependents with TOOLCHAIN}
+\magenta{--with-debug-info  build PACKAGE and preserve its debug info}
+\magenta{--without-tests    build PACKAGE without running its tests}
+\violet{--with-input       replace dependency PACKAGE by REPLACEMENT}
+\violet{--with-graft       graft REPLACEMENT on packages that refer to PACKAGE}
+\end{Verbatim}
+\end{frame}
+
+Les transformations sont appliquées récursivement, donc elles s’appliquent
+aussi aux dépendances de dépendances.  Par exemple, la ligne de commande pour
+recompiler le paquet \texttt{python} et toutes ses dépendances avec le
+compilateur GCC à la version 7 à la place de la version 10 (par défaut) est
+\begin{verbatim}
+guix install python --with-c-toolchain=python=gcc-toolchain@7
+\end{verbatim}
+et ceci se traduit naturellement dans un fichier de configuration
+\emph{manifest}.
+
+
+\thisslide{trans-manif}
+\begin{frame}<presentation>[label=trans-manif, fragile]{Transformations via 
fichier manifeste}
+  \vspace{-0.3cm}
+  \begin{exampleblock}{}
+    
\lstinputlisting[language=Scheme,columns=space-flexible]{example/some-python-with-gcc7.scm}
+  \end{exampleblock}
+\end{frame}
+
+Ici, nous utilisons le module définissant les transformations et nous
+définissions la transformation \texttt{transform} via
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#index-options_002d_003etransformation}{la
+procédure \texttt{options->transformation}} ; autrement dit \texttt{transform}
+est une fonction prenant en argument un paquet et retournant un nouveau paquet
+dans lequel la chaîne de compilation a été remplacée.  Pour finir,
+\texttt{compose} permet de composer deux fonctions et nous aurions pu écrire à
+la place
+\begin{center}
+  \texttt{(lambda (pkg) (transform (specification->package pkg)))}
+\end{center}
+Le manuel fournit un
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Index-de-programmation}%
+{\textsf{index de programmation}} qui aide à se familiariser avec le langage
+dédié.
+
+
+\clearpage
+\subsection{Environnement isolé à la volée}
+
+À ce stade, nous sommes capables de créer des profils.  Par exemple, la
+commande \texttt{guix package -{}-list-profiles} liste tous les profils de
+l'utilisateur.  Tant qu'il y a un élément qui pointe dans un profil, le
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Invoquer-guix-gc}{ramasse-miettes}
+ne peut pas \emph{glaner} les paquets non utilisés.  Dans certains cas, nous
+voulons temporairement tester un outil sans se préoccuper de la gestion du
+profil.  C'est la fonctionnalité de \texttt{guix shell}.
+
+
+
+\begin{frame}<presentation>[fragile]{Profils temporaires}
+    \begin{center}
+    Exemple : ajouter temporairement \texttt{IPython}
+  \end{center}
+
+  \bigskip
+
+  \begin{center}
+    (\texttt{demo/shell-ipython})
+  \end{center}
+\end{frame}
+
+
+\thisslide{shell}
+\begin{frame}<presentation>[label=shell,fragile]{Étendre temporairement un 
\emph{profil}}
+  \begin{exampleblock}{}
+\begin{verbatim}
+guix shell -m manifest.scm
+guix shell -m manifest.scm python-ipython -- ipython3
+\end{verbatim}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{tabular}{lcl}
+      \red{$\blacktriangleright$} \verb+--pure+ &:& réinitialise des variables
+                                                    d’environnement existantes
+      \\
+      \red{$\blacktriangleright$} \verb+--container+ &:& lance un conteneur 
isolé
+      \\
+      \red{$\blacktriangleright$} \verb+--development+ &:& inclus les 
dépendances du paquet
+    \end{tabular}
+  \end{alertblock}
+
+  \begin{exampleblock}{}
+\begin{verbatim}
+guix shell -m some-python.scm python-ipython             # 1.
+guix shell -m some-python.scm python-ipython --pure      # 2.
+guix shell -m some-python.scm python-ipython --container # 3.
+\end{verbatim}
+  \end{exampleblock}
+
+  \begin{center}
+    Bonus : \verb+guix shell emacs git git:send-email --development guix+
+  \end{center}
+\end{frame}
+
+La commande \texttt{guix shell} permet de créer ou étendre temporairement un
+profil.  Par exemple, dans la section précédente, le programme \texttt{cloc}
+est utilisé pour compter les lignes de code.  La commande \texttt{guix shell
+  cloc} a permis de lancer un \emph{shell} temporaire contenant le programme.
+
+\medskip
+
+Les options \texttt{pure} et \texttt{container} permettent de vérifier que
+toutes les dépendances de l'application sur laquelle on travaille sont bien
+capturées.  En particulier, l'option \texttt{container} permet de lancer un
+\emph{shell} temporaire totalement isolé.
+
+\bigskip
+
+\paragraph{Nota bene~:} La commande \texttt{guix shell} a été introduite 
récemment pour
+remplacer \texttt{guix environment}.  Cette dernière est encore conservée pour
+assurer une rétro-compatibilité.  Toutefois, nous recommandons d'utiliser
+\texttt{guix shell}, en particulier si vous n'avez jamais utilisé Guix
+auparavant.
+
+
+
+\begin{frame}<presentation>[plain,fragile,noframenumbering]{}
+  À ce stade, il semble naturel de vouloir \uline{partager ou construire des 
conteneurs isolés}.
+
+  \vfill{}
+  \begin{center}
+    \textbf{Comment créer des images ?}
+  \end{center}
+  \vfill{}
+  \begin{flushright}
+    (Exemple : Alice sans privilège particulier)
+  \end{flushright}
+\end{frame}
+
+
+\clearpage
+\section{Création d'images}
+
+Dans la section précédente, nous avons vu comment créer des environnements
+«~isolés~».  Il semble naturel de vouloir les partager ou les distribuer.
+
+\subsection{Création d’un \emph{pack}}
+
+La technologie usuelle pour transporter du matériel est celle d’un
+\textbf{conteneur}.  Cependant, il ne faut \uline{\textbf{pas perdre de vue}}
+la \uline{\textbf{transparence}} et la
+\textbf{\uline{re\-pro\-duc\-ti\-bi\-li\-té}}.
+
+
+\thisslide{conteneur}
+\begin{frame}<presentation>[label=conteneur,fragile]{Comment capturer un 
environnement ? Conteneur}
+  \begin{center}
+    Conteneur = \smiley{smoothie}
+  \end{center}
+
+  \begin{itemize}
+  \item Comment est construit le conteneur ? Dockerfile ?
+  \item Comment sont construits les binaires inclus dans le conteneur ?
+  \end{itemize}
+
+  \begin{exampleblock}{}
+\begin{verbatim}
+FROM amd64/debian:stretch
+RUN apt-get update && apt-get install git make curl gcc g++ ...
+RUN curl -L -O https://... && ... && make -j 4 && ...
+RUN git clone https://... && ... && make ... /usr/local/lib/libopenblas.a ...
+\end{verbatim}
+    \begin{center}
+      
\href{https://gitlab.onelab.info/gmsh/gmsh/-/blob/c7544ec812982dbe15e105059983f1b0c3896536/utils/docker/Dockerfile.debian.stretch.64bit}%
+      {source (lien) : Gmsh~}%
+      \href{http://gmsh.info/}%
+      {A three-dimensional finite element mesh generator (lien)}
+    \end{center}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Avec un Dockerfile au temps t, comment regénérer l'image au temps t’ ?
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+\bigskip % workaround
+
+Un conteneur est comme un «~smoothie~» dans le sens où nous pouvons
+immédiatement dire si nous l’aimons ou non, mais il est difficile, si ce n’est
+impossible, de donner précisément la liste exhaustive des ingrédients.  Par
+conséquent, comment, à deux moments différents, reproduire exactement le même
+conteneur sur deux machines différentes ?
+
+\bigskip
+
+
+\thisslide{pack}
+\begin{frame}<presentation>[label=pack, fragile]{Qu’est-ce qu’un \emph{pack} ?}
+  \begin{center}
+    \emph{pack} = collection de paquets dans un format d’archive
+  \end{center}
+
+  Quel est le but d’un \emph{pack} ?
+  \begin{itemize}
+  \item Alice  distribue «~tout~» à Carole,
+  \item Carole n’a pas installé Guix mais aura l’exact même environnement.
+  \end{itemize}
+
+  \begin{exampleblock}{Qu’est-ce qu’un format d’archive ?}
+    \begin{itemize}
+    \item \texttt{tar} (\emph{tarballs})
+    \item Docker
+    \item Singularity
+    \item paquet binaire Debian \texttt{.deb}
+    \end{itemize}
+  \end{exampleblock}
+\end{frame}
+
+Un \emph{pack} est un \emph{lot de logiciels} enregistrés sous leur forme
+binaire dans un format spécifique.  Le format d’archivage \texttt{tar} est
+probablement le plus connu, historiquement.  Aujourd’hui,
+\hrefsf{https://www.docker.com/}{Docker} ou
+\hrefsf{https://sylabs.io/guides/3.4/user-guide/quick_start.html}{Singularity}
+sont très largement utilisés comme format de conteneur.
+
+
+
+\thisslide{tout}
+\begin{frame}<presentation>[label=tout, fragile]{Qu'est-ce que «~tout~» ?}
+  \begin{center}
+    Carole a besoin de la \emph{clôture transitive} (= toutes les dépendances)
+  \end{center}
+  \begin{exampleblock}{}
+\begin{verbatim}
+$ guix size python-numpy --sort=closure
+store item             total    self
+python-numpy-1.20.3    301.5    23.6   7.8%
+...
+python-3.9.9           155.3    63.7  21.1%
+openblas-0.3.18        152.8    40.0  13.3%
+...
+total: 301.5 MiB
+\end{verbatim}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{center}
+      \texttt{guix pack} permet de créer cette archive contenant «~tout~»
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+\clearpage % workaround
+
+Le but d’un conteneur est de capturer l’intégralité de la pile logicielle pour
+fonctionner indépendamment du système hôte.  Guix fournit une commande
+(\texttt{guix size}) pour examiner la taille des éléments à inclure.  Par
+exemple, le paquet \texttt{python-numpy} ne représente que moins de 8\% des
+301,5Mo totaux nécessaires à son bon fonctionnement.  Nous voyons que le paquet
+\texttt{python-numpy} a aussi besoin du paquet \texttt{python} ainsi que de la
+bibliothèque d’algèbre linéaire \texttt{openblas}, entre autres.
+
+
+\thisslide{pack2}
+\begin{frame}<presentation>[label=pack2, fragile]{Création d’un \emph{pack}
+    pour le distribuer}
+
+  \begin{itemize}
+  \item Alice construit un \emph{pack} au format Docker
+    \begin{exampleblock}{}
+      \begin{center}
+        \verb+guix pack --format=docker -m manifest.scm+
+      \end{center}
+    \end{exampleblock}
+    puis distribue ce conteneur Docker (via un \emph{registry} ou autre).
+
+  \item Carole n'utilise pas \small{(encore?)}\normalsize{} Guix
+    \begin{exampleblock}{}
+\begin{verbatim}
+$ docker run -ti projet-alice python3
+Python 3.9.9 (main, Jan  1 1970, 00:00:01)
+[GCC 10.3.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>>
+\end{verbatim}
+    \end{exampleblock}
+    et utilise l'exact même environnement computationnel qu'Alice.
+  \end{itemize}
+\end{frame}
+
+\paragraph{Prenons un exemple :} Construire et déployer cette présentation.
+Les deux commandes suivantes sur une machine ayant Guix permettent de
+récupérer les sources (\LaTeX) puis de construire la présentation au format
+PDF.
+
+\begin{verbatim}
+guix shell git nss-certs \
+     -- git clone https://gitlab.com/zimoun/jres22-tuto-guix
+
+guix shell -m manifest.scm \
+     -- rubber --pdf presentation.tex
+\end{verbatim}
+
+Alice souhaite pouvoir générer cette présentation sur une infrastructure ne
+possédant pas Guix.  À la place, l’infrastructure utilise des conteneurs
+Docker.  Par conséquent, Alice empaquette au format Docker
+\begin{verbatim}
+guix pack                                                \
+     --format=docker                                     \
+     -C none                                             \
+     -S /bin=bin -S /lib=lib -S /share=share -S /etc=etc \
+     -m manifest.scm                                     \
+     --save-provenance
+\end{verbatim}
+qui produit l’élément dans le dépôt (\emph{store})
+\texttt{/gnu/store/n92...-rubber-...-docker-pack.tar}.  Nous renvoyons à la
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Invoquer-guix-pack}%
+{\textsf{section du manuel}} pour une description exhaustive des options de la
+commande \texttt{guix pack}.  Notons que \texttt{-{}-symlink / -S} ajoute les
+liens symboliques spécifiés dans le \emph{pack} ; par exemple, \texttt{-S
+  /bin=bin} crée un lien symbolique \texttt{/bin} qui pointe vers le
+sous-répertoire \texttt{bin} du profil.
+
+\bigskip
+
+Ce \emph{pack} une fois créé peut être chargé en local comme image Docker
+pour, par exemple, ajouter une étiquette (\emph{tag}) et pousser cette image 
sur un
+dépôt (\emph{registry})
+\begin{verbatim}
+$ docker load < $(guix pack ...)
+$ docker images
+REPOSITORY                            TAG    IMAGE ID     CREATED      SIZE
+rubber-texlive-base-texlive-fonts-ec  latest 6f08ec6e1f4c 52 years ago 1.03GB
+$ docker tag 6f08ec6e1f4c zimoun/jres
+$ docker push zimoun/jres
+\end{verbatim}
+où les points \dots~ sont par exemple les options précédentes.
+
+\medskip
+
+Il faut noter la date qui correspond au 1\ier{} janvier 1970, c.-à-d. qui
+donne les conditions pour reproduire l'image bit-à-bit.  D'autre part, il faut
+aussi noter que Guix vérifie si l'élément est déjà présent dans le dépôt
+(\emph{store}).
+
+\bigskip
+
+Maintenant, il suffit pour Carole de télécharger depuis le dépôt
+(\emph{registry}) le conteneur Docker.  Par exemple, ce conteneur pourrait
+être utilisé pour de l'intégration continue à travers GitLab~CI (voir l'%
+\hrefsf{https://gitlab.com/zimoun/jres22-tuto-guix/-/blob/main/.gitlab-ci.yml}%
+{exemple dédié} pour construire cette présentation).
+
+
+
+\thisslide{pack3}
+\begin{frame}<presentation>[label=pack3, fragile]{Au final, \texttt{guix 
pack}, c’est\dots}
+
+  \begin{center}
+    \emph{Agnostique} sur le format du «~conteneur~»
+  \end{center}
+
+  \begin{tabular}{cc}
+    \begin{minipage}{0.4\linewidth}
+      \begin{exampleblock}{}
+        \begin{itemize}
+        \item \texttt{tar} (\emph{tarballs})
+        \item Docker
+        \item Singularity
+        \item paquet binaire Debian \texttt{.deb}
+        \end{itemize}
+      \end{exampleblock}
+    \end{minipage}
+    &
+      \begin{minipage}{0.5\linewidth}
+        \begin{alertblock}{}
+          \begin{itemize}
+          \item archives repositionnables
+          \item sans \texttt{Dockerfile}
+          \item via \texttt{squashfs}
+          \item sans \texttt{debian/rule} (expérimental)
+          \end{itemize}
+        \end{alertblock}
+      \end{minipage}
+  \end{tabular}
+
+  \bigskip
+
+  \begin{center}
+    \textbf{Adaptable aux cas d’usage}
+  \end{center}
+\end{frame}
+
+\paragraph{Pour aller plus loin :} Peut-on extraire le manifeste Guix d’un
+\emph{pack} au format Docker ?
+\begin{center}
+  
\hrefsf{https://hpc.guix.info/blog/2021/10/when-docker-images-become-fixed-point/}%
+  {Reproductibilité d'un conteneur Docker généré par Guix}
+\end{center}
+
+\bigskip
+
+Internet étant fait de serveurs qui vont et viennent, les URL risquent de
+ne plus pointer vers le contenu.  Par conséquent, nous donnons ici des liens
+vers des archives (meilleure pérennité) pour le contenu de ce tutoriel :
+
+\begin{itemize}
+\item
+  
\hrefsf{https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://gitlab.com/zimoun/jres22-tuto-guix}%
+  {Source} sur \hrefsf{https://www.softwareheritage.org/}{Software Heritage}
+\item
+  
\hrefsf{https://web.archive.org/web/*/https://zimoun.gitlab.io/jres22-tuto-guix}%
+  {Déploiement} sur \hrefsf{https://web.archive.org/}{Web Archive}
+\end{itemize}
+
+en plus, évidemment, des JRES.
+
+
+\clearpage
+\subsection{Création d'une machine virtuelle}
+
+Dans la section précédente, nous avons vu comme créer des \emph{pack}
+contenant un déploiement de paquets.  Cependant, nous souhaiterions aussi
+pouvoir déployer des services.
+
+
+\thisslide{image}
+\begin{frame}<presentation>[label=image, fragile]{Création d’une image avec
+    \texttt{guix system} : un monde de services}
+
+  \begin{alertblock}{}
+    \begin{center}
+      \texttt{guix system} permet une
+      \uline{\textbf{configuration déclarative} d'un \emph{système}}
+    \end{center}
+  \end{alertblock}
+
+  \begin{itemize}
+  \item \texttt{guix system search} pour trouver les services disponibles
+  \item \texttt{guix system image} pour construire une image de type :
+    \begin{itemize}
+    \item qcow2
+    \item docker
+    \item iso9660, uncompressed-iso9660, efi-raw, raw-with-offset
+    \item rock64-raw, pinebook-pro-raw, pine64-raw, novena-raw
+    \item hurd-raw, hurd-qcow2
+    \end{itemize}
+  \item
+    \begin{minipage}{1.0\linewidth}
+      \begin{exampleblock}{}
+        \texttt{guix system vm} pour construire une machine virtuelle (VM)
+        \begin{center}
+          (la VM partage son dépôt avec le système hôte)
+        \end{center}
+      \end{exampleblock}
+    \end{minipage}
+  \end{itemize}
+\end{frame}
+
+Sur le même principe que la commande \texttt{guix package}, il est possible de
+chercher les services disponibles avec \texttt{guix system search}.  De plus,
+la commande \texttt{guix system} permet de générer une image suivant
+différents formats.  Par exemple, ceci permet d’obtenir une image
+\emph{bootable} qui donne une distribution complète – appelée Guix System.
+
+\bigskip
+
+La commande qui nous intéresse particulièrement est \texttt{guix system vm}.
+Elle permet de générer une machine virtuelle (VM) qui partage son dépôt avec
+son hôte (n’importe quelle distribution Linux avec Guix installé).  L’avantage
+principal est une isolation complète qui, par exemple, permet de fournir des
+services.  Le déploiement de services avec Guix mériterait un tutoriel en soi,
+nous donnons ici un point d’entrée.
+
+
+
+\thisslide{image2}
+\begin{frame}<presentation>[label=image2, fragile]{Configuration déclarative
+    d'une machine virtuelle}
+  \vspace{-0.3cm}
+  \begin{exampleblock}{}
+    
\lstinputlisting[language=Scheme,columns=space-flexible]{example/config-vm-1.scm}
+  \end{exampleblock}
+\end{frame}
+
+Comme pour la gestion de paquets, la configuration de la machine virtuelle se
+fait dans un langage déclaratif.  Le point d’entrée est le mot-clé
+\texttt{operating-system}
+(\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#r_00e9f_00e9rence-de-operating_002dsystem}%
+{\textsf{décrit dans le manuel}}) qui spécifie les options.  En particulier,
+un champ liste les paquets à provisionner et un autre champ liste les services
+avec éventuellement leurs caractéristiques.
+
+
+\thisslide{image3}
+\begin{frame}<presentation>[label=image3, fragile]{Configuration déclarative
+    d'une machine virtuelle (2)}
+  \vspace{-0.3cm}
+  \begin{exampleblock}{}
+    
\lstinputlisting[language=Scheme,columns=space-flexible]{example/config-vm-2.scm}
+  \end{exampleblock}
+\end{frame}
+
+
+\thisslide{image4}
+\begin{frame}<presentation>[label=image4, fragile]{Machines virtuelles avec 
Guix}
+
+  % \begin{center}
+  %   (\texttt{demo/vm})
+  % \end{center}
+
+  \begin{alertblock}{}
+    \begin{itemize}
+    \item Gestion déclarative
+    \item Réutilisation via des patrons (\emph{template})
+    \end{itemize}
+  \end{alertblock}
+
+\end{frame}
+
+Par exemple, la commande
+\begin{center}
+  \texttt{guix system vm src/example/vm-image.scm}
+\end{center}
+produit le script \texttt{/gnu/store/0n5...-run-vm.sh} qui lance QEMU avec les
+éléments du dépôt (\emph{store}) adéquats, c.-à-d.
+\begin{verbatim}
+$ /gnu/store/0n5...-run-vm.sh -nic user
+\end{verbatim}
+démarre la machine virtuelle avec, ici, le réseau.  Ces machines virtuelles
+peuvent être administrées avec le paquet \texttt{virt-manager}.
+
+
+
+\begin{frame}<presentation>[plain,fragile,noframenumbering]{}
+  Très bien tout cela, mais en quoi est-ce \uline{reproductible} ?
+
+  \vfill{}
+  \begin{center}
+    \textbf{Parlons de versions !}
+  \end{center}
+  \vfill{}
+  \begin{flushright}
+    (Exemple : Carole collabore avec Alice)
+  \end{flushright}
+\end{frame}
+
+
+\clearpage
+\section{Une histoire de versions}
+
+Le but de cette section est double, d'une part montrer par l'exemple la
+capacité de Guix de s'affranchir de l'état externe et d'autre part en quoi
+Guix est dit \emph{fonctionnel}.
+
+\subsection*{Version ?  Graphe ?}
+
+Une question récurrente des nouveaux utilisateurs de Guix est~: comment est-ce
+que je spécifie la version de l’outil à utiliser ?  Une réponse à cette
+question appelle une autre question~: qu’est-ce que l’on appelle version ?
+Est-ce la version du code source ?  Est-ce la version du binaire ?  Mais
+alors, pour le le même code source transformé par deux chaînes de compilation
+différentes, appelle-t-on les deux binaires résultants la même \emph{version}
+?
+
+
+\thisslide{version}
+\begin{frame}<presentation>[label=version, fragile]{Quelle est ma version de 
Guix ?}
+  % \vspace{-0.25cm}
+  \begin{exampleblock}{}
+\begin{verbatim}
+$ guix describe
+Generation 76  Apr 25 2022 12:44:37    (current)
+  guix eb34ff1
+    repository URL: https://git.savannah.gnu.org/git/guix.git
+    branch: master
+    commit: eb34ff16cc9038880e87e1a58a93331fca37ad92
+
+$ guix --version
+guix (GNU Guix) eb34ff16cc9038880e87e1a58a93331fca37ad92
+\end{verbatim}
+  \end{exampleblock}
+
+  % \vspace{-0.175cm}
+  \begin{alertblock}{}
+    \begin{center}
+      Un état fixe toute la collection des paquets et de Guix lui-même
+    \end{center}
+  \end{alertblock}
+
+  (Un état peut contenir plusieurs canaux (\emph{channel} = dépôt Git),\\
+  \hfill avec des URL, branches ou commits divers et variés)
+
+%   \vspace{-0.175cm}
+% \begin{verbatim}
+% $ guix package --list-available=^python | head -2
+% python               3.9.9    out,tk,idle    gnu/packages/python.scm:431:2
+% python-absl-py       0.6.1    out            
gnu/packages/python-xyz.scm:23415:2
+% \end{verbatim}
+\end{frame}
+
+Guix capture un état : la liste de tous les paquets et les commandes Guix
+elles-mêmes.  Les commandes Guix sont données par le canal principal et ce
+canal fournit un ensemble de paquets (et de services).  Il est tout à fait
+possible d’étendre la collection de paquets en fournissant d’autres canaux
+pour avoir des paquets variants.  Par exemple, l’initiative
+\hrefsf{https://hpc.guix.info/about/}{GuixHPC} (qui correspond à Guix dans un
+contexte scientifique) essaie de maintenir une \hrefsf{liste de canaux}.
+
+\medskip
+
+Pour spécifier un canal supplémentaire, l’utilisateur (sans droit particulier)
+doit modifier le fichier \texttt{\$HOME/.config/guix/channels.scm}, p. ex.
+\begin{verbatim}
+(cons (channel
+       (name 'guix-hpc)
+       (url "https://gitlab.inria.fr/guix-hpc/guix-hpc";))
+      %default-channels)
+\end{verbatim}
+Si la canal fournit aussi des substituts binaires ce qui évite de consommer
+des ressources, alors il faut
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Autoriser-un-serveur-de-substituts}%
+{autoriser le serveur de substituts}.  Dans le cas de ce canal, la clé
+publique est
+\begin{verbatim}
+(public-key
+ (ecc
+  (curve Ed25519)
+  (q #89FBA276A976A8DE2A69774771A92C8C879E0F24614AAAAE23119608707B3F06#)))
+\end{verbatim}
+L’ajout de serveurs de substituts nécessite cependant des droits
+d’administration privilégiés pour des raisons de sécurité.
+
+
+\thisslide{dag}
+\begin{frame}<presentation>[label=dag, fragile]{État = Graphe Acyclique Dirigé 
(\emph{DAG})}
+  \vspace{-0.5cm}
+  \begin{center}
+    \texttt{guix graph -{}-max-depth=6 python | dot -Tpng > graph-python.png}
+  \end{center}
+
+  \vfill{}
+  \includegraphics[width=\textwidth]{static/graph-python.png}
+  \vfill{}
+
+  Graphe complet : Python = 137 n\oe uds, Numpy = 189, Matplotlib = 915, Scipy
+  = 1439 n\oe uds
+% graph python-scipy -t bag | grep label | cut -f2 -d'[' | sort | uniq | wc -l
+\end{frame}
+
+Guix capture un état, c.-à-d. que Guix capture le graphe complet pour produire
+le binaire résultant.  Il capture les relations de dépendances, les recettes
+de construction et la machinerie de Guix elle-même pour traiter tout cela.
+
+\medskip
+
+Il n’y a pas de résolveur de dépendances qui cherche à trouver la meilleure
+solution à un problème sous-contraintes.  Guix lui construit un graphe à
+partir de la collection de paquets qu’il connaît dans son état courant.
+Ensuite, ce graphe peut être
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Options-de-transformation-de-paquets}%
+{\textsf{transformé}} pour obtenir les variants.
+
+\medskip
+
+Ainsi la variabilité est contrôlée aussi finement que possible.  Dans la
+plupart des cas d’usage, le résultat final (la courbe publiée par Alice,
+l’utilisation de tel ou tel outil par Carole, etc.) ne sera pas impacté.  La
+question se pose à l’inverse quand il y a une différence dans ce résultat.
+D’où vient l’erreur ?  En d’autres termes, ce contrôle fin est d’intérêt quand
+on cherche à redéployer une pile logicielle pour reproduire ou dupliquer.
+
+
+\subsection*{Définir un paquet}
+
+
+\thisslide{def-pkg}
+\begin{frame}<presentation>[label=def-pkg, fragile]{Définition d’un paquet 
(n\oe ud du graphe)}
+  \vspace{-0.3cm}
+  \begin{exampleblock}{}
+    
\lstinputlisting[language=Scheme,columns=space-flexible]{example/mock-define-python.scm}
+  \end{exampleblock}
+
+  \vspace{-0.2cm}
+  \begin{alertblock}{}
+    \begin{itemize}
+    \item Chaque \texttt{inputs} est une définition similaire
+      \hfill (récursion $\rightarrow$ graphe)
+    \item Il n’y a pas de cycle
+      \hfill (\texttt{bzip2} ou ses \texttt{inputs} ne peuvent pas utiliser 
\texttt{python})
+    \end{itemize}
+  \end{alertblock}
+
+  \vspace{-0.25cm}
+  \begin{center}
+    \small{%
+    (Quel commencement du graphe ?  Problème du \emph{bootstrap} dont nous ne
+    parlerons pas ici)
+    }\normalsize
+  \end{center}
+\end{frame}
+
+Un paquet correspond à un n\oe ud du graphe.  D’une part, il contient des
+\emph{meta} informations comme le nom, la version du code source, un synopsis
+et description, la licence.  D’autre part, il contient la recette pour être
+construit par Guix~: où trouver les sources, quelle chaîne de compilation par
+défaut, quelles dépendances, et quelles modifications spécifiques
+(\texttt{arguments}) pour indiquer les options de compilation ou les
+changements mineurs dans la chaîne de compilation.
+
+\medskip
+
+Pour faciliter la création de nouveaux paquets,
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Invoquer-guix-import}%
+{\textsf{la commande \texttt{guix import}}} permet de générer une recette Guix
+à partir des dépôts dédiés à un écosystème (PyPI, CRAN, Bioconductor, etc.).
+Il faut noter que l’\emph{utilisabilité} de la recette résultante est très
+variable car elle dépend fortement de la qualité ou disponibilité des
+métadonnées du dépôt source.
+
+\medskip
+
+De notre point de vue, empaqueter pour Guix est généralement plus facile que
+pour les autres gestionnaires.  Cependant, la construction totalement isolée
+de Guix oblige à une certaine gymnastique.  Au final, nous tenons à souligner
+que le travail d’empaquetage quelque soit le gestionnaire sous-jacent est un
+tâche laborieuse.
+
+
+\clearpage
+\subsection*{Changer d'état}
+
+La
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Invoquer-guix-pull}%
+{\textsf{commande \texttt{guix pull}}} permet de changer d’état en mettant à
+jour la collection de paquets des différents canaux et Guix lui-même.  Par
+exemple, la commande \texttt{guix pull --news} permet de savoir quelles sont
+les différences entre notre état précédent et notre état courant.
+
+\medskip
+
+La commande \texttt{guix upgrade} permet de mettre à jour les paquets d’un
+profil.  Cette commande respecte les transformations, s’il y a, dans la mise à
+jour.
+
+\medskip
+
+En ayant la capacité d’utiliser d’autres canaux, de créer des profils et de
+mettre à jour la collection des paquets, un utilisateur sans privilège devient
+autonome dans la gestion de ses outils.  Bien entendu, sur une machine
+mutualisée, l’administrateur peut créer des profils exposés aux utilisateurs
+pour leurs fournir des suites d’outils par défaut.
+
+
+\thisslide{pull}
+\begin{frame}<presentation>[label=pull, fragile]{Concrètement, en pratique ?}
+
+  \begin{alertblock}{}
+    \begin{center}
+      une version = un graphe
+    \end{center}
+  \end{alertblock}
+
+  \begin{center}
+    Mise à jour de Guix
+
+    \texttt{guix pull}
+
+    (création d'une nouvelle \emph{génération} interne)
+  \end{center}
+
+  \begin{itemize}
+  \item Il est possible de \uline{spécifier un \emph{état}} :
+    \begin{exampleblock}{}
+      \begin{center}
+        \begin{tabular}{rl}
+          \blue{\texttt{alice@laptop\$}} & \texttt{guix describe 
-{}-format=channels >
+                                           alice-laptop.scm}
+          \\
+          \violet{\texttt{carole@desktop\$}} & \texttt{guix pull 
-{}-channels=alice-laptop.scm}
+        \end{tabular}
+      \end{center}
+    \end{exampleblock}
+  \item Il est possible de se placer \uline{\textbf{temporairement} dans un 
état spécifique}\\
+    \hfill pour exécuter une commande (comme créer un profil)
+
+    \begin{exampleblock}{}
+      \begin{center}
+        \texttt{guix time-machine -{}-commit=c61df1792c -{}- install python -p 
python/autres}
+      \end{center}
+    \end{exampleblock}
+  \end{itemize}
+\end{frame}
+
+Comme il est possible de connaître l’historique d’installation et de
+suppression des paquets d’un profil avec la commande \texttt{guix package -l},
+la commande \texttt{guix pull -{}-list-generations} fournit l’historique des
+états de l’utilisateur.  Notons que les commandes Guix elle-mêmes vivent dans
+un profil particulier (nommé \texttt{\$HOME/.config/guix/current}).
+
+\medskip
+
+Ainsi, sur une machine multi-utilisateurs, cette liste des états peut différer
+entre les utilisateurs.  La commande \texttt{guix describe} permet de capturer
+l’état courant pour soit le \emph{versionner} avec un projet, soit le
+partager.  Par exemple, Alice sauvegarde son état courant dans le fichier
+\texttt{alice-laptop.scm} et transmet à Carole ce fichier.  Ensuite, Carole
+sur une autre machine peut se placer dans l’exact même état qu’Alice.
+
+\medskip
+
+Lorsque l’on travaille sur plusieurs projets, il peut devenir fastidieux de
+changer d’état \emph{globalement} et il est souhaitable d’avoir la capacité de
+se placer temporairement dans un état donné pour réaliser une opération
+(installation, création de profil, etc.).  Ceci est possible avec la
+\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Invoquer-guix-time_002dmachine}%
+{\textsf{commande} \texttt{guix time-machine}}.
+
+
+
+\thisslide{time-machine}
+\begin{frame}<presentation>[label=time-machine, fragile]{Reproductibilité en 
arrière, en avant :
+    \texttt{guix time-machine}}
+
+  \vspace{-1cm}
+  \begin{center}
+    \begin{tikzpicture}
+      % draw horizontal line
+      \draw[thick, -Triangle] (0,0) -- (12,0) node[font=\scriptsize,below 
left=3pt and -8pt]{time};
+
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] at (0,-.3) 
{2018};
+
+      % draw vertical lines
+      \foreach \x in {1,...,11}
+      \draw (\x cm,3pt) -- (\x cm,-3pt);
+
+      \foreach \x/\descr in {3/Carole,6/Alice,8/Bob}
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] at (\x,-.3) 
{$\descr$};
+
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] (Carole) at 
(3,+.3)  {d7e57e};
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] (Alice) at 
(6,+.3)  {eb34ff1};
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] (Dan) at 
(8,+.3)  {3682bd};
+
+      \draw[->] (Carole.north) to [out=50,in=150] (Alice.west);
+      \draw[->] (Dan.north) to [out=100,in=50] (Alice.east);
+
+      \draw[lightgray!0!red, line width=4pt] (2,-.6) -- +(8,0);
+      \foreach \x/\percol in {1/75,9/75}
+      \draw[lightgray!\percol!red, line width=4pt] (\x,-.6) -- +(1,0);
+
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] at (11,-.3) 
 {$Dan$};
+      \node[font=\scriptsize, text height=1.75ex, text depth=.5ex] (Dan) at 
(11,+.3)  {c99c3d};
+      \draw[dashed,->] (Dan.north) to [out=40,in=90] (Alice.north);
+
+    \end{tikzpicture}
+  \end{center}
+
+  \begin{exampleblock}{}
+    Pour être \uline{reproductible dans le temps}, il faut :
+    \begin{itemize}
+    \item Une préservation de \textbf{tous} les codes source~%
+      \small{%
+        (\href{https://ngyro.com/pog-reports/latest/}%
+        {$\approx 75\%$ archivés \tiny{(lien)}\small} dans~%
+        \href{https://www.softwareheritage.org/}%
+        {Software Heritage \tiny{(lien)}\small})%
+      }\normalsize
+    \item Une \emph{backward} compatibilité du noyau Linux
+    \item Une compatibilité du \emph{hardware} (p. ex. CPU, disque dur 
\tiny{(NVMe)}\normalsize, etc.)
+    \end{itemize}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Quelle est la taille de la fenêtre temporelle avec les 3 conditions
+      satisfaites ?
+    \end{center}
+  \end{alertblock}
+  \begin{center}
+    \scriptsize{(À ma connaissance, le projet Guix réalise une expérimentation
+      grandeur nature et quasi-unique depuis sa v1.0 en 2019)}
+  \end{center}
+\end{frame}
+
+Carole et Bob, les collaborateurs d’Alice, qui aussi travaillent sur d’autres
+projets avec d’autres collaborateurs peuvent convenir d’un état et s’y
+placer.  Ils auront le même environnement logiciel.  Grâce aux mécanismes
+d’\href{https://guix.gnu.org/manual/devel/fr/guix.fr.html#Inf_00e9rieurs}%
+{inférieurs}, il est possible de tendre à une reproductibilité dans le temps.
+
+\medskip
+
+Pour assurer cette reproductibilité, le seul point sur lequel nous pouvons
+directement agir est la sauvegarde de tous les codes sources.  Le projet Guix
+participe à la mise en place de ponts avec des systèmes d’archivage comme
+Software Heritage.  Chaque état correspond à une collection de paquets et donc
+à des codes sources et des recettes Guix de construction.  Le chantier est en
+cours pour préserver «~quoi~» et «~comment~» construire.
+
+
+\clearpage
+\section{Au final\dots}
+\subsection*{Au final\dots}
+
+
+\thisslide{continuum2}
+\begin{frame}<presentation>[label=continuum2, fragile]{\dots Guix est un 
\emph{continuum}%
+    \hfill \small{(sur n'importe quelle distribution Linux)}}
+
+  \vspace{-0.5cm}
+
+  \begin{center}
+    \begin{tabular}{llr}
+      un \uline{\textbf{gestionnaire de paquets}} déclaratif
+      & \texttt{guix package}
+      & (\texttt{-m} \emph{manifest})
+      \\
+      \ \ temporairement étendu à la volée
+      & \texttt{guix shell}
+      & (\texttt{-{}-container})
+      \\
+      \ \ \ \ maîtrisant exactement l'\emph{état}
+      & \texttt{guix time-machine}
+      & (\texttt{-C} \emph{channels})
+      \\
+      \ \ \ \ \ \ qui produit des \uline{\textbf{\emph{packs} distribuables}}
+      & \texttt{guix pack}
+      & (\texttt{-f docker})
+      \\
+      \ \ \ \ \ \ \ \ qui génèrent des \textbf{\uline{\emph{machines 
virtuelles}} isolées}
+      & \texttt{guix sytem vm}
+      \\
+      \ \ \ \ \ \ \ \ \ \ \ \ \ et aussi une bibliothèque Scheme
+      & \texttt{guix repl}
+      & (\emph{extensions})
+      \\
+      $\Big($
+      la distribution Linux elle-même
+      & \texttt{config.scm}
+      & (Guix System)
+        $\Big)$
+    \end{tabular}
+
+    \begin{alertblock}{}
+      \begin{center}
+        \textbf{%
+          Guix permet un contrôle fin du graphe de configuration sous-jacent
+        }
+      \end{center}
+    \end{alertblock}
+  \end{center}
+
+  \begin{exampleblock}{}
+    \begin{center}
+      \texttt{guix time-machine -C channels.scm -{}-}
+      \emph{commande options}
+      \texttt{une-config.scm}
+    \end{center}
+  \end{exampleblock}
+
+  \begin{alertblock}{}
+    \begin{center}
+      \texttt{une-config.scm} est \textbf{reproductible}
+      d'une machine à l'autre et dans le temps
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+
+
+\thisslide{scenarii2}
+\begin{frame}<presentation>[label=scenarii2,fragile]{Scenarii}
+  \vspace{-0.2cm}
+  \begin{itemize}
+  \item Alice utilise \texttt{python@3.9} et \texttt{numpy@1.20.3}
+    \vspace{-0.1cm}
+    \begin{exampleblock}{}
+\begin{verbatim}
+$ guix install python python-numpy
+\end{verbatim}
+    \end{exampleblock}
+  \item Carole \textbf{collabore} avec Alice\ldots{}
+    mais utilise d'autres outils pour un autre projet
+    \vspace{-0.1cm}
+    \begin{exampleblock}{}
+\begin{verbatim}
+$ guix time-machine -C version-alice.scm \
+       -- install -m outils-alice.scm -p projet/alice
+\end{verbatim}
+        \end{exampleblock}
+  \item Charlie \textbf{mets à jour} son système et \textbf{tout est cassé}
+    \vspace{-0.1cm}
+    \begin{exampleblock}{}
+\begin{verbatim}
+$ guix pull --roll-back
+\end{verbatim}
+    \end{exampleblock}
+  \item Bob utilise les \textbf{{mêmes} versions} qu'Alice mais n'a
+    \textbf{pas le {même} résultat}
+    \vspace{-0.1cm}
+    \begin{exampleblock}{}
+\begin{verbatim}
+error: You found a bug
+\end{verbatim}
+    \end{exampleblock}
+  \item Dan essaie de \textbf{rejouer plus tard} le scénario d'Alice\dots
+    \vspace{-0.25cm}
+    \begin{flushright}
+      \scriptsize{(voir ligne commande Carole)}\normalsize
+      \hfill{}
+      \dots ça dépend de la date du scénario ;-)
+    \end{flushright}
+  \end{itemize}
+\end{frame}
+
+\clearpage
+\subsection*{Limitations}
+
+En tant que contributeur régulier, j'ai une vision biaisée qui peut-être
+sur-estime les défauts à traiter et sous-estime toutes les
+fonctionnalités qui résolvent un large spectre de problèmes.  Pour sûr, après
+plus de deux années d'utilisation intensive de l'ordinateur portable à la
+machine de calcul en passant pour la station de travail, je ne reviendrai
+pas à des outils sans un paradigme déclaratif et fonctionnel.
+
+
+\thisslide{limit}
+\begin{frame}<presentation>[label=limit,fragile]{On s'habitue vite\dots}
+  \begin{itemize}
+  \item Fonctionne uniquement avec Linux.
+  \item Environnement isolé implique une forte transparence,
+    \begin{flushright}
+      c.-à-d., difficile avec des parties propriétaires.
+    \end{flushright}
+
+  \item Certaines commandes peuvent apparaître lentes (\texttt{pull}, 
\texttt{search}, etc.),
+    \begin{flushright}
+      ou retourner des erreurs obscures.
+    \end{flushright}
+  \item Les premiers pas requièrent un peu de patience,
+    \begin{flushright}
+      et d’accepter que ce
+      n’est \uline{pas \emph{comme d’habitude}}.
+    \end{flushright}
+  \end{itemize}
+
+  \vfill{}
+  \begin{alertblock}{}
+    \begin{center}
+      \textbf{La communauté est très accueillante et toujours disponible pour 
aider}
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+\begin{enumerate}
+\item Le problème est la transparence de la chaîne de \emph{bootstrap} : 
comment
+  construire à «~partir de rien~».  Techniquement, en quelques mots, le
+  nœud du problème est le port de la bibliothèque C \texttt{glibc} pour un 
autre
+  noyau.  Autrement dit, quelle est la taille de la graine binaire que l'on
+  s'autorise comme racine du graphe des dépendances ?
+\item Il est possible d’utiliser des pilotes spécifiques pour certains
+  matériels \emph{hardware} mais c’est du travail.  D’un autre côté, dans un
+  contexte de reproductibilité scientifique, ne doit-on pas chercher au
+  maximum la transparence de toute la chaîne de traitement ?
+
+  L’autre implication est l’utilisation de logiciels requérant par exemple un
+  jeton de licence – comme le compilateur Fortran d’Intel \texttt{ifort}.
+  L’environnement de construction étant totalement isolé, l’accès au jeton est
+  impossible lors de la compilation.
+\item Tout est régulièrement amélioré, dans la mesure du possible avec les
+  moyens disponibles.
+\item On y vient, on n’en repart pas.
+\end{enumerate}
+
+\subsection*{Ressources}
+
+
+\thisslide{prod}
+\begin{frame}<presentation>[label=prod]{En production}
+  \vspace{-0.2cm}
+  \begin{exampleblock}{}
+    \begin{tabular}{lcrl|c}
+      \textbf{Grid’5000}           &          &  828-nodes  &(12,000+ cores, 
31 clusters) &(France)     \\
+      \textbf{GliCID (CCIPL)}      & Nantes   &  392-nodes  &(7500+ cores)     
            &(France)    \\
+      \textbf{PlaFrIM Inria}       & Bordeaux &  120-nodes  &(3000+ cores)     
            &(France)    \\
+      \textbf{GriCAD}              & Grenoble &  72-nodes   &(1000+ cores)     
            &(France)    \\
+      \textbf{Max Delbrück Center} & Berlin   &  250-nodes  &+ workstations    
            &(Allemagne) \\
+      \textbf{UMC}                 & Utrecht  &  68-nodes   &(1000+ cores)     
            &(Pays-Bas)  \\
+      \textbf{UTHSC Pangenome}     &          &  11-nodes   &(264 cores)       
            &(USA)       \\
+      \\
+      \quad (le vôtre ?)
+    \end{tabular}
+  \end{exampleblock}
+
+  \vspace{-0.25cm}
+  \begin{center}
+      
\includegraphics[width=0.25\paperwidth]{static/guixhpc-logo-transparent-white}
+
+    \vspace{-0.25cm}
+
+    \href{https://hpc.guix.info/}{\texttt{https://hpc.guix.info}}
+  \end{center}
+
+  \vspace{-1.2cm}
+  \begin{flushright}
+    \includegraphics[width=0.175\paperwidth]{static/cafe-guix}
+  \end{flushright}
+\end{frame}
+
+
+\thisslide{thanks}
+\begin{frame}<presentation>[label=thanks]{Remerciements}
+  \begin{itemize}
+  \item Ludovic Courtès
+  \item Ricardo Wurmus (Guix comme bibliothèque Scheme : Guix Workflow 
Language)
+  \item Mathieu Othacehe
+    (\href{https://guix.gnu.org/cuirass/}%
+    {Cuirass \scriptsize{(lien)} \normalsize = CI}
+    qui assure la disponibilité des \emph{substituts} binaires)
+  \item tous les contributeurs (de la question au \emph{patch} en passant par
+    la rapport de \emph{bug})
+  \end{itemize}
+
+  \vfill{}
+
+  \emph{«~Présidents~» de la session} JRES :
+  \begin{itemize}
+  \item Yann Dupont
+  \item Emmanuel Halbwachs
+  \end{itemize}
+\end{frame}
diff --git a/talks/jres-2022/src/example/config-vm-1.scm 
b/talks/jres-2022/src/example/config-vm-1.scm
new file mode 100644
index 0000000..0e0b8d3
--- /dev/null
+++ b/talks/jres-2022/src/example/config-vm-1.scm
@@ -0,0 +1,22 @@
+(use-modules (gnu) (guix) (srfi srfi-1))
+(use-service-modules desktop mcron networking xorg)
+(use-package-modules certs fonts xorg)
+
+(operating-system
+  (host-name "gnu")
+  (keyboard-layout (keyboard-layout "us" "altgr-intl"))
+
+  (users (cons (user-account
+                (name "guest")
+                (password "") ;no password
+                (group "users"))
+               %base-user-accounts))
+
+  (packages (append (list font-bitstream-vera nss-certs)
+                    %base-packages))
+
+  (services
+   (append (list (service xfce-desktop-service-type)
+                 (simple-service 'cron-jobs mcron-service-type
+                                 (list auto-update-resolution-crutch))
+                 (service dhcp-client-service-type)))))
diff --git a/talks/jres-2022/src/example/config-vm-2.scm 
b/talks/jres-2022/src/example/config-vm-2.scm
new file mode 100644
index 0000000..68322b6
--- /dev/null
+++ b/talks/jres-2022/src/example/config-vm-2.scm
@@ -0,0 +1,13 @@
+(use-modules (gnu) (guix) (srfi srfi-1))
+(use-service-modules desktop mcron networking xorg)
+(use-package-modules certs fonts xorg)
+
+(operating-system
+  [...]
+  (packages (append (list font-bitstream-vera nss-certs)
+                    %base-packages))
+  (services
+   (append (list (service xfce-desktop-service-type)
+                 (simple-service 'cron-jobs mcron-service-type
+                    (list auto-update-resolution-crutch))
+                 (service dhcp-client-service-type)))))
diff --git a/talks/jres-2022/src/example/mock-define-python.scm 
b/talks/jres-2022/src/example/mock-define-python.scm
new file mode 100644
index 0000000..994538d
--- /dev/null
+++ b/talks/jres-2022/src/example/mock-define-python.scm
@@ -0,0 +1,9 @@
+(define python
+  (package
+    (name "python")
+    (version "3.9.9")
+    (source ... )
+    (build-system gnu-build-system)
+    (arguments ... )
+    (inputs (list bzip2 expat gdbm libffi sqlite
+                  openssl readline zlib tcl tk))))
diff --git a/talks/jres-2022/src/example/some-python-bis.scm 
b/talks/jres-2022/src/example/some-python-bis.scm
new file mode 100644
index 0000000..cd6ceb5
--- /dev/null
+++ b/talks/jres-2022/src/example/some-python-bis.scm
@@ -0,0 +1,11 @@
+(define python "python")
+
+(specifications->manifest
+ (append
+  (list python)
+  (map (lambda (pkg)
+         (string-append python "-" pkg))
+       (list
+        "matplotlib"
+        "numpy"
+        "scipy"))))
diff --git a/talks/jres-2022/src/example/some-python-with-gcc7.scm 
b/talks/jres-2022/src/example/some-python-with-gcc7.scm
new file mode 100644
index 0000000..6c71cb0
--- /dev/null
+++ b/talks/jres-2022/src/example/some-python-with-gcc7.scm
@@ -0,0 +1,13 @@
+(use-modules (guix transformations))
+
+(define transform
+  (options->transformation
+   '((with-c-toolchain . "python=gcc-toolchain@7"))))
+
+(packages->manifest
+ (map (compose transform specification->package)
+      (list
+       "python"
+       "python-matplotlib"
+       "python-numpy"
+       "python-scipy")))
diff --git a/talks/jres-2022/src/example/some-python.scm 
b/talks/jres-2022/src/example/some-python.scm
new file mode 100644
index 0000000..5436dac
--- /dev/null
+++ b/talks/jres-2022/src/example/some-python.scm
@@ -0,0 +1,6 @@
+(specifications->manifest
+ (list
+  "python"
+  "python-matplotlib"
+  "python-numpy"
+  "python-scipy"))
diff --git a/talks/jres-2022/src/header.tex b/talks/jres-2022/src/header.tex
new file mode 100644
index 0000000..4914847
--- /dev/null
+++ b/talks/jres-2022/src/header.tex
@@ -0,0 +1,86 @@
+
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{graphicx}
+\usepackage{longtable}
+\usepackage{wrapfig}
+\usepackage{rotating}
+\usepackage[normalem]{ulem}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{capt-of}
+\usepackage{hyperref}
+\usepackage[french]{babel}
+\usepackage{fancyvrb}
+
+\usepackage{tikz}
+\usetikzlibrary{decorations.pathreplacing,positioning, arrows.meta}
+
+
+\usetheme{Madrid}
+\useoutertheme[subsection=true]{smoothbars}
+
+\makeatletter
+\usecolortheme{whale}
+\usecolortheme{orchid}
+\setbeamerfont{block title}{size={}}
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{itemize items}[triangle]
+\makeatletter
+\setbeamertemplate{footline}
+{
+  \leavevmode%
+  \hbox{%
+    \begin{beamercolorbox}[wd=.15\paperwidth,ht=2.25ex,dp=1ex,left]{author in 
head/foot}%
+      \usebeamerfont{author in head/foot}\quad S. Tournier
+    \end{beamercolorbox}%
+    \begin{beamercolorbox}[wd=.7\paperwidth,ht=2.25ex,dp=1ex,center]{title in 
head/foot}%
+      \usebeamerfont{title in head/foot}\insertshorttitle
+    \end{beamercolorbox}%
+    \begin{beamercolorbox}[wd=.15\paperwidth,ht=2.25ex,dp=1ex,right]{date in 
head/foot}%
+      \insertframenumber{} / \inserttotalframenumber\hspace*{2ex}
+    \end{beamercolorbox}}%
+  \vskip0pt%
+}
+\makeatother
+
+\title[Reproductibilité des environnements logiciels avec GNU Guix]%
+{Reproductibilité des environnements logiciels \\ avec GNU Guix}
+\author{Simon Tournier}
+\date{JRES, 19 mai 2022}
+\institute{Inserm US53 - UAR CNRS 2030 \\ \texttt{simon.tournier@u-paris.fr}}
+\hypersetup{
+  pdfauthor={Simon Tournier},
+  pdftitle={Reproductibilité des environnements logiciels avec GNU Guix},
+  pdfkeywords={GNU Guix, reproductibilité, déploiement logiciels, gestionnaire 
de paquets, machine virtuelle},
+  pdfsubject={tutoriel court de l'outil GNU Guix},
+  pdfcreator={with love},
+  pdflang={French}}
+
+
+\newcommand{\violet}{\textcolor{violet}}
+\newcommand{\blue}{\textcolor{blue}}
+\newcommand{\red}{\textcolor{red}}
+\newcommand{\magenta}{\textcolor{magenta}}
+\newcommand{\cyan}{\textcolor{cyan}}
+\newcommand{\green}{\textcolor{green}}
+\definecolor{mauve}{rgb}{0.58,0,0.82}
+\newcommand{\mauve}{\textcolor{mauve}}
+
+\input{listings-scheme}
+
+\newcommand{\someguile}{\textcolor{someguile}}
+\newcommand{\somestring}{\textcolor{somestring}}
+\newcommand{\somevariable}{\textcolor{somevariable}}
+
+\newcommand{\thisslide}[1]{%
+  \begin{figure}[!htb]
+    \begin{center}
+      \includeslide[width=\textwidth]{#1}
+    \end{center}
+  \end{figure}
+}
+
+\newcommand{\smiley}[1]{${\textsf{#1~}}^{\textrm{:-)}}$}
+
+\newcommand{\hrefsf}[2]{\href{#1}{\textsf{#2}}}
diff --git a/talks/jres-2022/src/listings-scheme.tex 
b/talks/jres-2022/src/listings-scheme.tex
new file mode 100644
index 0000000..359817a
--- /dev/null
+++ b/talks/jres-2022/src/listings-scheme.tex
@@ -0,0 +1,97 @@
+% This file contains some restricted keywords for highlighting the all the
+% snippets in LaTeX.  The main purpose is to easy reading the Scheme
+% Domain-Specific code by coloring what is Guile-specific, user-specific and 
DSL-specific.
+%
+% The language shell is also trivially defined.
+
+\usepackage{listings}
+\usepackage{color}
+
+\definecolor{someguile}{rgb}{0.0, 0.25, 0.8}
+\definecolor{somestring}{rgb}{0.8, 0.25, 0.0}
+\definecolor{somevariable}{rgb}{0.0, 0.5, 0.0}
+\definecolor{somecomment}{rgb}{1.0, 0.0, 0}
+\definecolor{bracket}{rgb}{0.6, 0.6, 0.6}
+
+\lstdefinelanguage{Scheme}{
+    basicstyle=\normalsize\ttfamily\slshape\color{somevariable},
+    sensitive=true,
+    alsoletter={-,\#,:,>},
+    morestring = [b]",
+    stringstyle=\upshape\color{somestring},
+    morecomment=[l]{;},
+    commentstyle=\upshape\color{somecomment},
+    literate=
+            *{(}{{\textcolor{bracket}{(}}}{1}
+            {)}{{\textcolor{bracket}{)}}}{1},
+    classoffset=0,
+    % Guile
+    morekeywords={
+        define, define-public,
+        list, map, compose,
+        cons,
+        lambda,
+        let, let*, quote,
+        append, string-append,
+        use-modules, define-module, \#:use-module, \#:prefix
+        },
+    keywordstyle=\ttfamily\upshape\color{someguile},
+    classoffset=1,
+    % Fix
+    morekeywords={
+        guix, transformations,
+        gnu, srfi, srfi-1,
+        desktop, mcron, networking, xorg,
+        certs, fonts,
+        font-bitstream-vera, nss-certs,
+        xfce-desktop-service-type,
+        cron-jobs, mcron-service-type,
+        dhcp-client-service-type,
+    },
+    keywordstyle=\ttfamily\upshape\color{black},
+    classoffset=1,
+    % DSL
+    morekeywords={
+    package,
+    name, version,
+    build-system, gnu-build-system, arguments,
+    inputs,
+    synopsis, description, license,
+    source, origin,
+    method, url-fetch, git-fetch,
+    specifications->manifest, specification->package, packages->manifest,
+    options->transformation, with-c-toolchain,
+    },
+    % DSL VM
+    morekeywords={
+    use-service-modules, use-package-modules,
+    operating-system,
+    host-name, timezone, locale, keyboard-layout, label, firmware,
+    bootloader, bootloader-configuration, grub-bootloader, targets, 
terminal-outputs,
+    users, user-account, name, password, group, supplementary-groups,
+    file-systems, file-system, mount-point, device, type,
+    base-file-systems,          % bug with %base-
+    base-user-accounts,
+    base-packages,
+    packages,
+    services, service, simple-service,
+    plain-file,
+    },
+    keywordstyle=\ttfamily\bfseries\upshape\color{black},
+    classoffset=0,
+}
+
+\lstdefinelanguage{shell}{
+    basicstyle=\normalsize\ttfamily,
+    sensitive=true,
+    morestring = [b]",
+    stringstyle=\upshape\color{red},
+    morecomment=[l]{\#},
+    commentstyle=\upshape\color{green},
+}
+
+% \lstdefinelanguage{text}{
+%     basicstyle=\normalsize\ttfamily,
+%     sensitive=true,
+%     commentstyle=\upshape\color{green},
+% }
diff --git a/talks/jres-2022/src/manifest.scm b/talks/jres-2022/src/manifest.scm
new file mode 100644
index 0000000..7e649dc
--- /dev/null
+++ b/talks/jres-2022/src/manifest.scm
@@ -0,0 +1,26 @@
+(specifications->manifest
+ (list
+  "rubber"
+
+  "texlive-base"
+  "texlive-fonts-ec"
+  "texlive-kpfonts"
+  "texlive-cm-super"
+  "texlive-amsfonts-fixed"
+
+  "texlive-beamer"
+  "texlive-translator"
+  "texlive-ulem"
+  "texlive-capt-of"
+  "texlive-hyperref"
+  "texlive-carlisle"
+
+  "texlive-latex-geometry"
+  "texlive-latex-wrapfig"
+  "texlive-latex-amsmath"
+  "texlive-babel-french"
+  "texlive-latex-listings"
+  "texlive-latex-fancyvrb"
+  "texlive-latex-pgf"
+  "texlive-latex-fancyhdr"
+  ))
diff --git a/talks/jres-2022/src/presentation.tex 
b/talks/jres-2022/src/presentation.tex
new file mode 100644
index 0000000..202777d
--- /dev/null
+++ b/talks/jres-2022/src/presentation.tex
@@ -0,0 +1,70 @@
+\documentclass[aspectratio=169,ignorenonframetext,presentation]{beamer}
+
+\input{header}
+
+\begin{document}
+
+\begin{frame}[plain, fragile, noframenumbering]{}
+  \vspace{5mm}
+  \titlepage
+
+  \vfill{}
+  \vspace{-12mm}
+  \begin{center}
+    \includegraphics[width=0.2\paperwidth]{static/Guix-white}
+
+    \vspace{-10mm}
+    \href{https://hpc.guix.info}{\texttt{https://hpc.guix.info}}
+  \end{center}
+  \vfill{}
+  \normalsize
+  \begin{minipage}{0.2\paperwidth}
+    \vspace{-7mm}
+    \includegraphics[width=0.2\paperwidth]{static/LOGO-JRES-2022}
+  \end{minipage}
+  \begin{flushright}
+    \begin{minipage}{0.2\paperwidth}
+      \vspace{-20mm}
+      \includegraphics[width=0.2\paperwidth]{static/u-paris}
+    \end{minipage}
+  \end{flushright}
+\end{frame}
+
+
+%% From Beamer documentation p.207
+%% User Guide for version 3.66.
+%% http://mirrors.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf
+\mode<all>
+\input{contenu}
+\mode*
+
+\begin{frame}[plain, noframenumbering]{}
+  \begin{center}
+    \vfill{}
+    \Large{%
+      \textbf{%
+        Des questions ?%
+      }}\normalsize
+
+    \vfill{}
+    \texttt{guix-science@gnu.org}
+
+    \vfill{}
+    \includegraphics[width=0.2\paperwidth]{static/cafe-guix}\\
+    
\href{https://hpc.guix.info/events/2022/café-guix/}{\texttt{https://hpc.guix.info/events/2022/café-guix/}}
+
+    % \vfill{}
+    % \tiny{%
+    % Copyright \copyright{} 2021 Simon Tournier%
+    % }
+  \end{center}
+\end{frame}
+
+%% From Beamer documentation p.207
+%% User Guide for version 3.66.
+%% http://mirrors.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf
+\mode<all>
+\input{supplement}
+\mode*
+
+\end{document}
diff --git a/talks/jres-2022/src/static/Guix-white.pdf 
b/talks/jres-2022/src/static/Guix-white.pdf
new file mode 100644
index 0000000..3641e7f
Binary files /dev/null and b/talks/jres-2022/src/static/Guix-white.pdf differ
diff --git a/talks/jres-2022/src/static/LOGO-JRES-2022.png 
b/talks/jres-2022/src/static/LOGO-JRES-2022.png
new file mode 100644
index 0000000..aa190df
Binary files /dev/null and b/talks/jres-2022/src/static/LOGO-JRES-2022.png 
differ
diff --git a/talks/jres-2022/src/static/cafe-guix.png 
b/talks/jres-2022/src/static/cafe-guix.png
new file mode 100644
index 0000000..1698c65
Binary files /dev/null and b/talks/jres-2022/src/static/cafe-guix.png differ
diff --git a/talks/jres-2022/src/static/forest-symlinks.pdf 
b/talks/jres-2022/src/static/forest-symlinks.pdf
new file mode 100644
index 0000000..527cf68
Binary files /dev/null and b/talks/jres-2022/src/static/forest-symlinks.pdf 
differ
diff --git a/talks/jres-2022/src/static/graph-python.png 
b/talks/jres-2022/src/static/graph-python.png
new file mode 100644
index 0000000..b0026b2
Binary files /dev/null and b/talks/jres-2022/src/static/graph-python.png differ
diff --git a/talks/jres-2022/src/static/guixhpc-logo-transparent-white.pdf 
b/talks/jres-2022/src/static/guixhpc-logo-transparent-white.pdf
new file mode 100644
index 0000000..3368aad
Binary files /dev/null and 
b/talks/jres-2022/src/static/guixhpc-logo-transparent-white.pdf differ
diff --git a/talks/jres-2022/src/static/u-paris.png 
b/talks/jres-2022/src/static/u-paris.png
new file mode 100644
index 0000000..0b9ac7e
Binary files /dev/null and b/talks/jres-2022/src/static/u-paris.png differ
diff --git a/talks/jres-2022/src/supplement.tex 
b/talks/jres-2022/src/supplement.tex
new file mode 100644
index 0000000..a167422
--- /dev/null
+++ b/talks/jres-2022/src/supplement.tex
@@ -0,0 +1,281 @@
+\mode*        %Follow up of Beamer configuration when using ignorenonframetext.
+
+\clearpage
+\appendix
+\section{Bonus}
+
+\subsection{Définition fonctionnelle d'un paquet}
+
+Pour Guix, la construction d'un paquet est vue comme une fonction pure :
+
+\begin{itemize}
+\item la construction retournée est la même pour les mêmes arguments,
+\item l'évaluation n'a pas d'effets de bord.
+\end{itemize}
+Par exemple, si la compilation sauvegarde la date, alors la
+construction retournée n'est pas identiquement la même pour les mêmes
+arguments.  Par ailleurs, l'évaluation a un effet de bord car fournir
+une date est une action qui a besoin d'éléments extérieurs qui ne
+dépendent pas uniquement ni exclusivement du corps de la fonction.
+
+
+\thisslide{def-fonc}
+\begin{frame}<presentation>[label=def-fonc, fragile, 
noframenumbering]{Définition fonctionnelle (\emph{derivation})
+    \hfill \small{(A valeur d’illustration pour fixer les idées)}\normalsize}
+  \vspace{-0.35cm}
+  \begin{Verbatim}[commandchars=\\\{\}]
+{def} pkg(\blue{source}, \magenta{build_sytem}, \magenta{arguments}, 
\violet{inputs}):
+    src = fetch(source)
+    {import} build_system {as} bs
+    build = bs.builder(arguments)
+    envBuild = build.add(inputs)
+    binary = envBuild(src)
+    {return} binary
+  \end{Verbatim}
+
+\begin{center}
+   \texttt{python3 = pkg(\blue{Python}, \magenta{configure\_make},
+     \violet{deps}=[bzip2, expat, ...]) }
+\end{center}
+
+  \vspace{-0.35cm}
+   \begin{exampleblock}{}
+    \begin{itemize}
+    \item Les {sources} \texttt{src} sont obtenues à partir de la définition du
+      paquet via \blue{\texttt{source}}
+    \item La recette \texttt{build} est déduite de la définition du paquet via
+      \magenta{\texttt{build-system}} et \magenta{\texttt{arguments}}
+      (\texttt{./configure \&\& make \&\& make install})
+    \item L’environnement \texttt{envBuild} est \uline{\textbf{totalement
+          isolé}} et ne contient que le nécessaire défini par
+      \magenta{\texttt{build-system}} étendus de dépendances
+      \violet{\texttt{inputs}} supplémentaires
+    \end{itemize}
+   \end{exampleblock}
+\end{frame}
+
+
+\clearpage
+\subsection{Autour du graphe des dépendances}
+
+Suivant la transformation de paquets que nous appliquons, il peut arriver que
+le \emph{monde} soit recompilé.  Ici, nous illustrons la signification d'un
+contrôle fin du graphe des dépendances.
+
+\bigskip
+
+Nous commençons par construire la paquet \texttt{python} avec le chaîne de
+compilation \texttt{gcc@7} via un fichier déclaratif \emph{manifeste}.  En
+étant attentifs, nous remarquons que le paquet \texttt{ghc-emojis} sera
+reconstruit.
+
+\thisslide{around-dag}
+\begin{frame}<presentation>[label=around-dag, fragile, noframenumbering]%
+  {Transformations : pourquoi tout peut-il être recompilé ?}
+  \begin{exampleblock}{}
+\begin{verbatim}
+$ guix build -m example/some-python-with-gcc7.scm --derivations --dry-run
+...
+/gnu/store/vi2j8aakp7jqxq8m97xvqk0d8q8i27s2-ghc-emojis-0.1.2.drv
+...
+\end{verbatim}
+  \end{exampleblock}
+
+  La recette définit :
+  \begin{itemize}
+  \item un \blue{code source} et potentiellement des modifications 
\emph{ad-hoc} (\verb+patch+)
+  \item des \magenta{outils de construction} (compilateurs, moteur de
+    production, etc., p. ex. \verb+gcc+, \verb+cmake+)
+  \item des \violet{dépendances}
+  \end{itemize}
+
+
+  \begin{exampleblock}{}
+    \begin{center}
+      Pourquoi doit-on recompiler une bibliothèque Haskell sur les caractères
+      emoji ?
+    \end{center}
+  \end{exampleblock}
+\end{frame}
+
+La question est pourquoi une pile logicielle Python à caractère scientifique
+dépend-elle d'une bibliothèque Haskell de caractère emojis ?
+
+\bigskip
+
+Rappelons que Guix permet d'inspecter le graphe des dépendances.  Par exemple,
+le paquet \texttt{python} a 137 dépendances (n\oe uds), majoritairement
+indirectes.
+
+\bigskip % because issue with layout
+
+
+\thisslide{dag-bis}
+\begin{frame}<presentation>[label=dag-bis, fragile, noframenumbering]%
+  {Graph Acyclique Dirigé (\emph{DAG})}
+  \vspace{-0.5cm}
+  \begin{center}
+    \texttt{guix graph -{}-max-depth=6 python | dot -Tpng > graph-python.png}
+  \end{center}
+
+  \vfill{}
+  \includegraphics[width=\textwidth]{static/graph-python.png}
+  \vfill{}
+
+  Graphe complet : \red{Python = 137 n\oe uds}, Numpy = 189, Matplotlib = 915, 
Scipy
+  = 1439 n\oe uds
+\end{frame}
+
+
+
+\thisslide{inspect-dag}
+\begin{frame}<presentation>[label=inspect-dag, fragile, noframenumbering]%
+  {Inspection du graphe des dépendances}
+  \vspace{-0.2cm}
+\begin{verbatim}
+python-scipy The Scipy library provides efficient numerical routines
+ghc-emojis   Conversion between emoji characters and their names
+\end{verbatim}
+
+  \vspace{-0.1cm}
+  \begin{exampleblock}{}
+    \begin{center}
+      Quelle dépendance entre une bibliothèque scientifique et une
+      bibliothèque de pictogrammes ?
+    \end{center}
+  \end{exampleblock}
+
+  \begin{tabular}{p{0.5\linewidth}p{0.5\linewidth}}
+    \begin{minipage}[t]{0.5\linewidth}
+\begin{Verbatim}[commandchars=\\\{\}]
+$ guix graph      \textbackslash
+   --path \blue{python-scipy} \red{ghc-emojis}
+\blue{python-scipy@1.7.3}
+python-pydata-sphinx-theme@0.6.3
+python-jupyter-sphinx@0.3.2
+python-nbconvert@6.0.7
+pandoc@2.14.0.3
+\red{ghc-emojis@0.1.2}
+\end{Verbatim}
+    \end{minipage}
+    &
+      \begin{minipage}[t]{0.5\linewidth}
+\begin{Verbatim}[commandchars=\\\{\}]
+$ guix graph      \textbackslash
+   -t bag-emerged \textbackslash
+   --path \red{ghc-emojis} \violet{python}
+\red{ghc-emojis@0.1.2}
+ghc@8.10.7
+\violet{python@3.9.9}
+\end{Verbatim}
+    \end{minipage}
+  \end{tabular}
+
+  \begin{alertblock}{}
+    \begin{center}
+      Guix permet un contrôle fin de l'arbre des dépendances et son inspection
+    \end{center}
+  \end{alertblock}
+\end{frame}
+
+Nous cherchons donc quel est le chemin entre la bibliothèque scientifique
+Python Scipy et la bibliothèque Haskell Emojis.  Incroyable, non ?  Pour
+construire Scipy, une bibliothèque Python traitant principalement de calcul
+scientifique comme des solveurs de système linéaire, il faut donc un
+compilateur Haskell comme GHC.
+
+\medskip
+
+Nous cherchons ensuite quel est le chemin entre la bibliothèque Haskell Emojis
+et l'interpréteur Python.  Incroyable, à nouveau, car il y en a un.  Le
+compilateur Haskell a besoin de Python.
+
+\bigskip
+
+Finalement, recompiler le paquet \texttt{python} va automatiquement recompiler
+\texttt{ghc}.  Puis, comme le \emph{build system} du paquet
+\texttt{ghc-emojis} n'est pas identiquement le même, ce paquet va être
+reconstruit.  Et ainsi de suite\dots
+
+\clearpage
+\subsection{Pour fixer les idées}
+
+
+\thisslide{exec}
+\begin{frame}<presentation>[label=exec, fragile, noframenumbering]%
+  {Que signifie exécuter un programe ?}
+  \vspace{-0.5cm}
+\begin{verbatim}
+python3 -c 'print(1+2)'
+\end{verbatim}
+
+  \begin{itemize}
+  \item \texttt{python3} est ici un exécutable binaire (lisible par une 
machine)
+  \item Le code source de \emph{Python} est 
\href{https://github.com/python/cpython}{accessible} (lisible par une personne)
+  \item \texttt{python3} dépend à l’exécution de bibliothèques (dépendances)
+  \end{itemize}
+
+  \begin{center}
+    Comment \texttt{python3} est-il obtenu ?
+  \end{center}
+
+  Analogie: \texttt{yahourt} = \emph{Lait} + \texttt{skyr}
+  (Skyr : Yaourt islandais)
+
+  \begin{center}
+    \texttt{python3} = \emph{Python} + \texttt{compilateur} (+ \texttt{make} + 
etc.)
+  \end{center}
+
+  \begin{alertblock}{Conclusion}
+    \begin{itemize}
+    \item Les sources (\emph{Python}) ne suffisent pas pour la 
Reproductibilité,
+    \item il faut aussi connaître deux environnements :
+      \begin{itemize}
+      \item de construction (\texttt{compilateur}, \texttt{make}, etc.),
+      \item d’exécution (dépendances)
+      \end{itemize}
+    \end{itemize}
+  \end{alertblock}
+\end{frame}
+
+Pour trouver les dépendances nécessaires à l'exécution, il suffit de lancer
+\texttt{ldd \$(which python3)}.  À titre d'illustration, ces bibliothèques sont
+nécessaires~: \texttt{linux-vdso.so.1 libpthread.so.0 libutil.so.1 libm.so.6 
...}
+
+\medskip
+
+Par conséquent, on peut se demander :
+\begin{enumerate}
+\item Comment le binaire \texttt{python3} a-t-il été produit ?  Quel
+  compilateur ?  Quelles dépendances ?
+\item Comment les dépendances ont-elles été produites ?
+\end{enumerate}
+
+
+\thisslide{pkg-manager}
+\begin{frame}<presentation>[label=pkg-manager, fragile, noframenumbering]%
+  {Qu'est-ce qu'un gestionnaire de paquets ?}
+  \begin{center}
+    gestionnaire des paquets = gestion des dépendances
+  \end{center}
+  fournit dans une mesure l’environnement de construction et/ou d’exécution.
+
+  \begin{exampleblock}{Est-ce que \texttt{foo} = \texttt{bar} ?}
+    \begin{itemize}
+    \item \texttt{foo} <- \emph{Source@1.2} + \texttt{env-construction@A}
+    \item \texttt{bar} <- \emph{Source@1.2} + \texttt{env-construction@B}
+    \end{itemize}
+  \end{exampleblock}
+
+  \begin{center}
+    Comment s’assurer que deux environnements sont identiques ?
+  \end{center}
+
+  \begin{alertblock}{Conclusion}
+    Trop de combinaisons pour avoir le même environnement :
+    \begin{itemize}
+    \item sur plusieurs machines,
+    \item à différents points dans le temps.
+    \end{itemize}
+  \end{alertblock}
+\end{frame}
diff --git a/talks/jres-2022/src/support-notes-additionnelles.tex 
b/talks/jres-2022/src/support-notes-additionnelles.tex
new file mode 100644
index 0000000..73b6a41
--- /dev/null
+++ b/talks/jres-2022/src/support-notes-additionnelles.tex
@@ -0,0 +1,58 @@
+\documentclass[a4paper,oneside,11pt]{article}
+\usepackage{beamerarticle}
+\setjobnamebeamerversion{presentation}
+
+\AtBeginDocument{\def\labelitemi{$\bullet$}}
+
+\usepackage{fancyhdr}
+
+\fancyhf{}
+\fancyhead[R]{Guix @ JRES 2022}
+\fancyfoot[C]{\thepage}
+\pagestyle{fancy}
+\newlength\tindent
+\setlength{\tindent}{\parindent}
+\setlength{\parindent}{0pt}
+
+% \renewcommand{\indent}{\hspace*{\tindent}}
+% \usepackage[french]{babel}
+
+\input{header}
+
+\hyphenation{%
+  as-su-rer
+  au-to-ri-ser
+  col-lec-tion
+  com-man-de
+  com-men-cer
+  com-pi-la-teur
+  com-pu-ta-tion-nel
+  cons-trui-re
+  dif-fi-cul-té
+  dis-po-ni-bi-li-té
+  dé-fi-nis-sons
+  dé-pen-dan-ces
+  en-vi-ron-ne-ments
+  ex-ploi-ta-tion
+  ex-pé-ri-men-tal
+  i-den-ti-que-ment
+  ma-chi-ne
+  op-tions
+  re-po-si-tion-nables
+  re-pro-duc-ti-ble
+  re-pro-duc-ti-bi-li-té
+  re-tour-née
+  scien-ti-fi-que scien-ti-fi-ques
+  sur-es-ti-mant
+  to-ta-le-ment
+  u-ti-li-sa-tion
+  ver-sion
+}
+
+\begin{document}
+
+\maketitle
+\input{contenu}
+\input{supplement}
+
+\end{document}
diff --git a/talks/jres-2022/support-notes-additionnelles.20220519.pdf 
b/talks/jres-2022/support-notes-additionnelles.20220519.pdf
new file mode 100644
index 0000000..91adbe9
Binary files /dev/null and 
b/talks/jres-2022/support-notes-additionnelles.20220519.pdf differ
diff --git a/talks/jres-2022/talk.20220519.pdf 
b/talks/jres-2022/talk.20220519.pdf
new file mode 100644
index 0000000..dc200b5
Binary files /dev/null and b/talks/jres-2022/talk.20220519.pdf differ



reply via email to

[Prev in Thread] Current Thread [Next in Thread]