[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
02/02: talks: Add INRAE workshop 2022.
From: |
Tobias Geerinckx-Rice |
Subject: |
02/02: talks: Add INRAE workshop 2022. |
Date: |
Wed, 22 Jun 2022 12:45:59 -0400 (EDT) |
nckx pushed a commit to branch master
in repository maintenance.
commit 70d972ea83778990f1c0f1701d6a6dada242c2b7
Author: zimoun <zimon.toutoune@gmail.com>
AuthorDate: Mon Jun 20 05:54:28 2022 +0200
talks: Add INRAE workshop 2022.
* talks/fcc-inrae-2022: New directory.
Signed-off-by: Tobias Geerinckx-Rice <me@tobias.gr>
---
talks/fcc-inrae-2022/README | 12 +
talks/fcc-inrae-2022/channels.scm | 6 +
talks/fcc-inrae-2022/do-pres.sh | 6 +
talks/fcc-inrae-2022/example/config-vm-1.scm | 22 +
talks/fcc-inrae-2022/example/config-vm-2.scm | 13 +
.../example/mock-define-pkg-source.scm | 7 +
talks/fcc-inrae-2022/example/mock-define-pkg.scm | 7 +
.../fcc-inrae-2022/example/mock-define-python.scm | 9 +
talks/fcc-inrae-2022/example/some-python-bis.scm | 11 +
.../example/some-python-with-gcc7.scm | 13 +
talks/fcc-inrae-2022/example/some-python.scm | 6 +
talks/fcc-inrae-2022/listings-scheme.tex | 97 +
talks/fcc-inrae-2022/manifest.scm | 26 +
talks/fcc-inrae-2022/pres.tex | 2048 ++++++++++++++++++++
talks/fcc-inrae-2022/static/Guix-white.pdf | Bin 0 -> 8483 bytes
talks/fcc-inrae-2022/static/all-abs-hist.png | Bin 0 -> 95158 bytes
talks/fcc-inrae-2022/static/cafe-guix.png | Bin 0 -> 17311 bytes
talks/fcc-inrae-2022/static/graph-python.png | Bin 0 -> 479843 bytes
talks/fcc-inrae-2022/static/graph.png | Bin 0 -> 106012 bytes
.../static/guixhpc-logo-transparent-white.pdf | Bin 0 -> 8808 bytes
talks/fcc-inrae-2022/static/u-paris.png | Bin 0 -> 7104 bytes
talks/fcc-inrae-2022/talk.20220621.pdf | Bin 0 -> 1352403 bytes
22 files changed, 2283 insertions(+)
diff --git a/talks/fcc-inrae-2022/README b/talks/fcc-inrae-2022/README
new file mode 100644
index 0000000..c31e18e
--- /dev/null
+++ b/talks/fcc-inrae-2022/README
@@ -0,0 +1,12 @@
+# -*- mode: org -*-
+
+Reprodutibilité, une solution avec Guix
+
+Git: https://gitlab.com/zimoun/fcc-inrae
+SWH:
https://archive.softwareheritage.org/swh:1:rev:984f0c79907ffffd5cd25afac968d4fb377e03cb
+
+#+begin_src bash
+ guix time-machine -C channels.scm \
+ -- shell -m manifest.scm \
+ -- rubber --pdf pres.pdf
+#+end_src
diff --git a/talks/fcc-inrae-2022/channels.scm
b/talks/fcc-inrae-2022/channels.scm
new file mode 100644
index 0000000..7df15c6
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/do-pres.sh b/talks/fcc-inrae-2022/do-pres.sh
new file mode 100755
index 0000000..abe824b
--- /dev/null
+++ b/talks/fcc-inrae-2022/do-pres.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+
+guix time-machine -C channels.scm \
+ -- shell -m manifest.scm \
+ -- rubber --pdf pres.tex
diff --git a/talks/fcc-inrae-2022/example/config-vm-1.scm
b/talks/fcc-inrae-2022/example/config-vm-1.scm
new file mode 100644
index 0000000..0e0b8d3
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/example/config-vm-2.scm
b/talks/fcc-inrae-2022/example/config-vm-2.scm
new file mode 100644
index 0000000..68322b6
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/example/mock-define-pkg-source.scm
b/talks/fcc-inrae-2022/example/mock-define-pkg-source.scm
new file mode 100644
index 0000000..f9ae51a
--- /dev/null
+++ b/talks/fcc-inrae-2022/example/mock-define-pkg-source.scm
@@ -0,0 +1,7 @@
+(package ; definition du noeud python-pytorch
+ (name "python-pytorch")
+ (version "1.10.2")
+ (source ... ) ; les donnees pointees ICI
+ (build-system python-build-system)
+ (arguments ... )
+ (inputs (list ...)))
diff --git a/talks/fcc-inrae-2022/example/mock-define-pkg.scm
b/talks/fcc-inrae-2022/example/mock-define-pkg.scm
new file mode 100644
index 0000000..ff6ddb3
--- /dev/null
+++ b/talks/fcc-inrae-2022/example/mock-define-pkg.scm
@@ -0,0 +1,7 @@
+(package ; definition du noeud python
+ (name "python")
+ (version "3.9.9")
+ (source ... ) ; -> Gitlab, etc.
+ (build-system gnu-build-system) ; ./configure; make; install
+ (arguments ... ) ; options de production
+ (inputs (list ...))) ; liste d'autres noeuds -> graphe (DAG)
diff --git a/talks/fcc-inrae-2022/example/mock-define-python.scm
b/talks/fcc-inrae-2022/example/mock-define-python.scm
new file mode 100644
index 0000000..994538d
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/example/some-python-bis.scm
b/talks/fcc-inrae-2022/example/some-python-bis.scm
new file mode 100644
index 0000000..cd6ceb5
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/example/some-python-with-gcc7.scm
b/talks/fcc-inrae-2022/example/some-python-with-gcc7.scm
new file mode 100644
index 0000000..6c71cb0
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/example/some-python.scm
b/talks/fcc-inrae-2022/example/some-python.scm
new file mode 100644
index 0000000..5436dac
--- /dev/null
+++ b/talks/fcc-inrae-2022/example/some-python.scm
@@ -0,0 +1,6 @@
+(specifications->manifest
+ (list
+ "python"
+ "python-matplotlib"
+ "python-numpy"
+ "python-scipy"))
diff --git a/talks/fcc-inrae-2022/listings-scheme.tex
b/talks/fcc-inrae-2022/listings-scheme.tex
new file mode 100644
index 0000000..359817a
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/manifest.scm
b/talks/fcc-inrae-2022/manifest.scm
new file mode 100644
index 0000000..7e649dc
--- /dev/null
+++ b/talks/fcc-inrae-2022/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/fcc-inrae-2022/pres.tex b/talks/fcc-inrae-2022/pres.tex
new file mode 100644
index 0000000..07c29c1
--- /dev/null
+++ b/talks/fcc-inrae-2022/pres.tex
@@ -0,0 +1,2048 @@
+ \documentclass[aspectratio=169,ignorenonframetext,presentation]{beamer}
+
+%
+% Header
+%
+
+\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}
+
+\newcommand{\tikzmark}[2]{%
+ \tikz[remember picture,baseline=(#1.base)]%
+ {\node[inner sep=0pt] (#1) {#2 \quad};}}
+
+\newcommand{\tikzbrace}[3]{%
+\begin{tikzpicture}[remember picture,overlay]
+ \draw[decorate,decoration={brace}] (#1.north east) -- node[right]
+ { % XXXX: hfill
+ #3}
+ (#1.north east |- #2.south east);
+\end{tikzpicture}}
+
+
+\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é, solution avec Guix]%
+{Reproductibilité des environnements logiciels \\ une solution avec GNU Guix ?}
+\author{Simon Tournier}
+\date{Ateliers FCC, 21 juin 2022}
+\institute{Inserm US53 - UAR CNRS 2030 \\ \texttt{simon.tournier@u-paris.fr}}
+\hypersetup{
+ pdfauthor={Simon Tournier},
+ pdftitle={Reproductibilité des environnements logiciels, une solution avec
GNU Guix ?},
+ pdfkeywords={GNU Guix, reproductibilité, déploiement logiciels, gestionnaire
de paquets, machine virtuelle},
+ pdfsubject={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}}}
+
+
+%
+% Document
+%
+\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}
+
+
+
+\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}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%
+% Intro
+%
+\section{Introduction}
+
+
+
+\begin{frame}[fragile]{Le monde est \emph{open}, n'est-ce pas ?}
+
+ \begin{itemize}
+ \item \emph{open} journal
+ \item \emph{open} data
+ \item \emph{open} source
+ \item \emph{open} science
+ \item \emph{open} etc.
+ \end{itemize}
+
+ \begin{exampleblock}{}
+ \begin{center}
+ Quel est le problème de reproductibilité dans un contexte scientifique ?
+
+ (même si tout devient \emph{open})
+ \end{center}
+ \end{exampleblock}
+
+ \begin{center}
+ « ordinateur » : traitement automatique de données
+ \uncover<2->{
+ $\Longrightarrow$ \red{environnement computationnel}
+ }
+ \end{center}
+
+ \uncover<2->{
+ \begin{alertblock}{}
+ \begin{center}
+ Quel contrôle de l’{environnement computationnel} ?
+ \end{center}
+ \end{alertblock}
+}
+
+\end{frame}
+
+
+
+\begin{frame}[fragile]{Exemple d’un calcul}
+ \begin{lstlisting}[language=C, caption={Fonction $J_0$ de Bessel},
captionpos=t]{Name=open-source}
+ #include <stdio.h>
+ #include <math.h>
+
+ int main(){
+ printf("%E\n", j0f(0x1.33d152p+1f));
+ }
+ \end{lstlisting}
+
+ \begin{center}
+ \begin{tabular}{lcl}
+ Alice &voit :& 5.\blue{64}34\blue{4}0E-08 % #no ptions
+ \\
+ Carole &voit :& 5.\red{96}34\red{3}0E-08 % -lm -fno-builtin
+ \end{tabular}
+ \end{center}
+
+ \begin{alertblock}{}
+ \begin{center}
+ Pourquoi ? Le code est disponible pourtant.
+ \end{center}
+ \end{alertblock}
+
+ \small{%
+ Établir si le différence est significative ou non est laissé à l'expertise
+ des scientifiques du domaine.
+ }
+\end{frame}
+
+
+
+\begin{frame}[fragile]{Quelques questions sur ce calcul}
+ \begin{lstlisting}[basicstyle=\tiny, language=C]{Name=open-source}
+ #include <stdio.h>
+ #include <math.h>
+
+ int main(){
+ printf("%E\n", j0f(0x1.33d152p+1f));
+ }
+ \end{lstlisting}
+
+ \begin{center}
+ \begin{tabular}{lcl}
+ Alice &voit :& 5.\blue{64}34\blue{4}0E-08 % #no options
+ \\
+ Carole &voit :& 5.\red{96}34\red{3}0E-08 % -lm -fno-builtin
+ \end{tabular}
+ \end{center}
+
+ \begin{exampleblock}{}
+ \begin{itemize}
+ \item Quel compilateur ?
+ \item Quelles bibliothèques (\texttt{<math.h>}) ?
+ \item Quelles versions ?
+ \item Quelles options de compilation ?
+ \end{itemize}
+ \end{exampleblock}
+\end{frame}
+
+
+\begin{frame}[fragile,label=p4]{En d’autres termes}
+ \begin{itemize}
+ \item Quelles sont les sources des outils ?
+ \item Quelles sont les outils requis pour la construction ?
+ \item Quelles sont les outils requis pour l’exécution ?
+ \item Comment chaque outil est-il produit ?
+ \end{itemize}
+
+ \begin{exampleblock}{}
+ \begin{center}
+ Répondre à ces questions signifie \textbf{contrôler la variabilité} de
+ l’environnement computationnel
+ \end{center}
+ \end{exampleblock}
+
+ \vfill
+
+ \begin{alertblock}{}
+ \begin{center}
+ Comment capturer ces informations ?
+ \end{center}
+ \end{alertblock}
+ (Réponse usuelle :Gestionnaire de paquets (Conda, APT, Brew, \dots) ;
+ \emph{Modulefiles} ; Conteneur ; etc.)
+\end{frame}
+
+
+
+\begin{frame}[fragile]{Options de constructions (compilation)}
+ \begin{lstlisting}[basicstyle=\tiny, language=C]{Name=open-source}
+ #include <stdio.h>
+ #include <math.h>
+
+ int main(){
+ printf("%E\n", j0f(0x1.33d152p+1f));
+ }
+ \end{lstlisting}
+
+ \vfill
+
+ \begin{exampleblock}{}
+ \begin{center}
+ \begin{tabular}{rlll}
+ \blue{\texttt{alice@laptop\$}} & \texttt{gcc bessel.c}
+ && \texttt{\&\& ./a.out}
+ \\
+ & \texttt{5.643440E-08}
+ \\
+ \red{\texttt{carole@desktop\$}} & \texttt{gcc bessel.c}
+ & \texttt{\mauve{-lm -fno-builtin}}
+ & \texttt{\&\& ./a.out}
+ \\
+ & \texttt{5.963430E-08}
+ \end{tabular}
+ \end{center}
+ \end{exampleblock}
+
+ \begin{flushright}
+ \small{(Ah, sacré \emph{constant folding})}
+ \end{flushright}
+
+ \begin{alertblock}{}
+ \begin{center}
+ Alice et Carole ont fait leur calcul dans deux environnements
+ computationnels différents
+ \end{center}
+ \end{alertblock}
+
+\end{frame}
+
+
+
+\begin{frame}[fragile]{Enjeu de la reproductibilité en recherche
+ \hfill
+ \small{\emph{analyse post-mortem du bétail}}}
+ \begin{exampleblock}{D'un point de vue la « méthode scientifique » :}
+ \begin{center}
+ {Tout l'enjeu est le \uline{\textbf{contrôle de la variabilité}}}
+ \end{center}
+ \end{exampleblock}
+
+ \vfill
+
+ \begin{exampleblock}{D'un point de vue du « savoir scientifique » (caractère
+ universel) :}
+ \begin{itemize}
+ \item Un observateur indépendant doit être capable d'observer le même
+ résultat.
+ \item L'observation doit être pérenne (dans une certaine mesure).
+ \end{itemize}
+ \end{exampleblock}
+
+ \vfill
+
+ \begin{alertblock}{}
+ Dans un monde où (presque) tout est donnée numérique (\emph{data}),
+ \begin{center}
+ \textbf{comment refaire plus tard et là-bas ce qui a été fait
aujourd’hui et ici ?}
+ \end{center}
+ \begin{flushright}
+ (sous entendu avec un « ordinateur »)
+ \end{flushright}
+ \end{alertblock}
+\end{frame}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\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}
+
+
+\subsection{Pourquoi seriez-vous intéressé par Guix ?}
+
+
+\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}
+ Prés. 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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\thisslide{steroide}
+\begin{frame}<presentation>[label=steroide]{Guix est gestionnaire
+ d’environnements sous \emph{stéroïde}}
+ \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}{}
+ Cette petite présentation est un rapide coup de projecteur sur :
+ \begin{center}
+ la gestion de paquets \emph{fonctionnelle}
+ \quad \quad
+ $\Rightarrow$ reproductibilité
+ \end{center}
+ \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}
+
+
+
+\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, voir le manuel)
+ \end{center}
+
+ Pour commencer :
+ \begin{center}
+ \begin{minipage}{0.75\linewidth}
+\begin{verbatim}
+$ guix help
+\end{verbatim}
+ \end{minipage}
+ \end{center}
+\end{frame}
+
+
+
+\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}
+
+
+
+\section{Gestion de paquets}
+\subsection*{Utilisation de \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}
+
+ \vfill
+ \href{https://replay.jres.org/w/3TuYmocHwKtzs7q1VtL1GB}{(voir vidéo JRES)}
+
+\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}
+
+
+
+\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}
+
+
+\subsection*{Gestion de \emph{profil}}
+\label{sec:profil}
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+\subsection*{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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+\subsection*{Environnement isolé à la volée}
+
+
+\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}
+
+
+
+\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}
+
+
+
+\section{Création d'images}
+\subsection*{Création d’un \emph{pack}}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\subsection*{Création d'une machine virtuelle}
+
+
+\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}
+
+
+
+\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}
+
+
+
+\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}
+
+
+
+\section{Une histoire de versions}
+\subsection{Version ? Graphe ?}
+
+
+
+\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}
+
+
+\begin{frame}[fragile]{Alice dit « GCC à la version 11.2.0 »}
+ \vspace{-0.1cm}
+ \includegraphics[width=\textwidth]{static/graph.png}
+ \vfill{}
+ \begin{alertblock}{}
+ \begin{center}
+ Est-ce la même version de GCC si \texttt{mpfr} est à la version 4.0 ?
+ \end{center}
+ \end{alertblock}
+ \vfill
+ \begin{flushright}
+ Graphe complet : 43 ou 104 ou 125 ou 218 n\oe uds
+
+ \small
+ (suivant ce que l’on considère comme graine binaire du \emph{bootstrap})
+ \end{flushright}
+\end{frame}
+
+
+
+\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}
+
+
+\begin{frame}[fragile]{Révision = un graphe spécifique}
+ \begin{alertblock}{}
+ \begin{center}
+ une version = un graphe
+ \end{center}
+ \end{alertblock}
+
+\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
+\end{verbatim}
+
+ \begin{alertblock}{}
+ \begin{center}
+ La révision \texttt{eb34ff1} capture \textbf{tout} le graphe
+ \end{center}
+ \end{alertblock}
+
+ \begin{exampleblock}{}
+ \begin{itemize}
+ \item Alice dit « j’ai utilisé Guix à la révision \texttt{eb34ff1} »
+ \item Carole connaît toutes les informations pour reproduire le même
environnement
+ \end{itemize}
+ \end{exampleblock}
+\end{frame}
+
+
+
+\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}
+
+
+\begin{frame}[fragile]{Gestionnaire de paquets = gestionnaire de graphe}
+ \vspace{-0.1cm}
+ \begin{alertblock}{}
+ \begin{center}
+ Comment capturer les informations du transparent \ref{p4}?
+ \end{center}
+ \end{alertblock}
+
+ \begin{itemize}
+ \item Quelles sont les sources des outils ?
+ \hfill \texttt{source}
+ \item \tikzmark{A}{Quelles sont les outils requis pour la construction ?}
+ \item \tikzmark{B}{Quelles sont les outils requis pour l’exécution ?}
+ \item Comment chaque outil est-il produit ?
+ \hfill \texttt{build-system}, \texttt{arguments}
+ \end{itemize}
+ \tikzbrace{A}{B}{\texttt{inputs}, \texttt{propagated-},
\texttt{native-inputs}}
+
+ \vspace{-0.5cm}
+ \begin{exampleblock}{}
+ \vspace{-0.3cm}
+
\lstinputlisting[language=Scheme,columns=space-flexible]{example/mock-define-pkg.scm}
+ \end{exampleblock}
+\end{frame}
+
+
+
+\subsection{Changer d'état}
+
+
+\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}
+
+
+
+\begin{frame}[fragile]{Collaboration}
+ \begin{description}
+ \item[Alice] décrit son environnement :
+ \begin{itemize}
+ \item la révision (Guix lui-même et aussi potentiellement les autres
canaux):
+ \begin{center}
+ \texttt{guix describe -f channels > alice.scm}
+ \end{center}
+ \item la liste des paquets avec le fichier \texttt{paquets.scm}
+ \end{itemize}
+ génère son environnement avec, e.g.,
+ \begin{center}
+ \texttt{guix shell -m paquets.scm}
+ \end{center}
+ et \uline{\textbf{partage ses deux fichiers}}.
+ \item[Carole] génère le même environnement \uline{\textbf{à partir des deux
fichiers}} d’Alice,
+ \begin{center}
+ \texttt{guix time-machine -C alice.scm -{}- shell -m paquets.scm}
+ \end{center}
+ \item[Dan] peut donc aussi avoir le même environnement qu’Alice et Carole.
+ \end{description}
+\end{frame}
+
+
+
+\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}
+
+
+\subsection{Préservation}
+
+
+\begin{frame}[fragile]{Pourquoi les préserver ?}
+ \vspace{-0.25cm}
+ \begin{exampleblock}{}
+ Parce que les \textbf{services en ligne parfois s’arrêtent}
+ \begin{itemize}
+ \item \href{https://code.google.com/archive/}{Google Code (lien)} début
2016
+ \item Alioth (Debian) en 2018 remplacé par
+ \href{https://salsa.debian.org/public}{Salsa}
+ \item Gna! en 2017 après 13 années d’activité
+ \item Gitourious en 2015 (le second plus populaire service
+ d’hébergement pour Git en 2011)
+ \item etc.
+ \item<2-> \texttt{gforge.inria.fr}
+ par exemple \href{https://issues.guix.gnu.org/42162}{Guix issue \#42162
(lien)}
+\begin{verbatim}
+Believe it or not, gforge.inria.fr was finally phased out on
+Sept. 30th. And believe it or not, despite all the work and all the
+chat :-), we lost the source tarball of Scotch 6.1.1 for a short period
+of time (I found a copy and uploaded it to berlin a couple of hours
+ago).
+\end{verbatim}
+ \end{itemize}
+ \end{exampleblock}
+\end{frame}
+
+
+\begin{frame}[fragile]{Comment les préserver ?}
+ \begin{alertblock}{}
+ \begin{center}
+ Forge $\neq$ Archive
+ \end{center}
+ \end{alertblock}
+
+ \begin{flushright}
+ L'objectif d'une forge est de permettre à plusieurs développeurs de
+ \textbf{participer ensemble au développement} d'un ou plusieurs logiciels,
+ le plus souvent à travers le réseau Internet.
+
+ \medskip
+
+
\href{https://fr.wikipedia.org/w/index.php?title=Forge_(informatique)&oldid=192671997}%
+ {https://fr.wikipedia.org/wiki/Forge\_(informatique)}
+ \end{flushright}
+
+ \vfill
+
+ \begin{flushright}
+ L'archivage est un ensemble d'actions qui a pour but de garantir
+ l'\textbf{accessibilité sur le long terme} d'informations (dossiers,
+ documents, données) que l'on doit ou souhaite conserver pour des raisons
+ juridiques
+
+ \medskip
+
+ \href{https://fr.wikipedia.org/w/index.php?title=Archivage&oldid=186832550}
+ {https://fr.wikipedia.org/wiki/Archivage}
+ \end{flushright}
+
+
+ \begin{exampleblock}{}
+ \begin{center}
+ \href{https://www.softwareheritage.org/}%
+ {Software Heritage \emph{« are building the universal software archive
»} (lien)}
+ \end{center}
+ \end{exampleblock}
+\end{frame}
+
+
+
+\begin{frame}[fragile]{Les services en ligne parfois s’arrêtent\dots}
+ \begin{center}
+ Pourquoi serait-il différent pour Software Heritage ?
+ \end{center}
+
+ Aucune garantie mais…
+
+ \begin{flushright}
+ Software Heritage is an open, non-profit initiative unveiled in 2016 by
+ Inria. It is supported by a broad panel of institutional and industry
+ partners, in collaboration with UNESCO.
+
+ \medskip
+
+ The long term goal is to collect all publicly available software in source
+ code form together with its development history, replicate it massively to
+ ensure its preservation, and share it with everyone who needs it.
+ \end{flushright}
+
+ \begin{exampleblock}{}
+ \begin{itemize}
+ \item Supporté par des institutions
+ \item Avec la mission d’archiver
+ \end{itemize}
+ \end{exampleblock}
+
+\end{frame}
+
+
+\begin{frame}[fragile]{État des lieux de Guix et Software Heritage (SWH)}
+
+ \begin{alertblock}{Guix est capable de}
+ \begin{itemize}
+ \item sauvegarder \hfill (automatiquement) les sources dans SWH
+ \item retrouver \hfill (automatiquement) les sources depuis SWH
+ \end{itemize}
+ \end{alertblock}
+ \begin{exampleblock}{}
+ \begin{center}
+ Mais pas tous les types de sources !
+ \end{center}
+ \end{exampleblock}
+
+ \vfill
+
+ \begin{itemize}
+ \item Des outils disponibles dans Guix pour les sources :
+ \begin{itemize}
+ \item dépôt Git \hfill \texttt{git-fetch}
+ \item archives \emph{tarballs} (compressées) \hfill \texttt{url-fetch}
+ \end{itemize}
+ \item \dots et manquants pour tout le reste \hfill (aide bienvenue :-))
+ \end{itemize}
+\end{frame}
+
+
+
+\begin{frame}[fragile]{Quelques stats : préservation de Guix}
+ \vspace{-0.25cm}
+ \begin{center}
+
\href{https://ngyro.com/pog-reports/latest/}{https://ngyro.com/pog-reports/latest/}
+
+ \begin{tabular}{cc}
+ \begin{minipage}{0.6\linewidth}
+ \includegraphics[width=0.95\textwidth]{static/all-abs-hist.png}
+ \end{minipage}
+ &
+ \begin{minipage}{0.4\linewidth}
+ Sauvegarder dans Software Heritage :
+ \begin{itemize}
+ \item Git = 98.3\%
+ \item \emph{tarballs} $\approx$ 70\%
+ \end{itemize}
+ \end{minipage}
+ \end{tabular}
+ \end{center}
+\end{frame}
+
+
+\begin{frame}[fragile]{Oui, mais\dots}
+ \begin{itemize}
+ \item Comment identifier mon code ?
+ \begin{center}
+
\href{https://www.softwareheritage.org/2020/07/09/intrinsic-vs-extrinsic-identifiers/}%
+ {Identifiant intrinsèque vs extrinsèque (lien)}
+ \end{center}
+ tag (v1.2.3) vs hash (\texttt{eb34ff1}), quel hash ? etc.
+ \item Comment s’assurer que tout le graphe est bien préservé ?
+ \item Que se passe-t-il s'il manque les sources d'un seul n\oe ud ?
+ \item On n’a pas parlé du \emph{boostrap} (les racines du graphes).
+ \item etc.
+ \end{itemize}
+\end{frame}
+
+
+\section{Au final\dots}
+\subsection*{Au final\dots}
+
+
+\begin{frame}<presentation>[plain,fragile,noframenumbering]{}
+ \begin{center}
+ \textbf{Au final}
+ \end{center}
+\end{frame}
+
+
+
+\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}
+
+
+
+\subsection*{Limitations}
+
+
+\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}
+
+
+
+\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.65cm}
+ \begin{center}
+
\includegraphics[width=0.25\paperwidth]{static/guixhpc-logo-transparent-white}
+
+ \vspace{-0.55cm}
+
+ \href{https://hpc.guix.info/}{\texttt{https://hpc.guix.info}}
+ \end{center}
+
+ %\vspace{-1.2cm}
+ JRES -- Marseille, 2022
+ \href{https://zimoun.gitlab.io/jres22-tuto-guix/}{(PDF)}
+ \href{https://replay.jres.org/w/3TuYmocHwKtzs7q1VtL1GB}{(Vidéo)}
+
+ \vspace{-1.cm}
+ \begin{flushright}
+ \includegraphics[width=0.175\paperwidth]{static/cafe-guix}
+ \end{flushright}
+\end{frame}
+
+\subsection*{Mémo}
+
+
+\begin{frame}[fragile]{comment refaire plus tard et là-bas ce qui a été fait
aujourd’hui et ici ?}
+ \begin{alertblock}{}
+ \begin{center}
+ \textbf{traçabilité et transparence}
+ \end{center}
+ \end{alertblock}
+ \begin{center}
+ \emph{être capable d’étudier bogue-à-bogue}
+ \end{center}
+
+ \begin{exampleblock}{}
+ Guix devrait s’occuper de tout
+ \begin{center}
+ \texttt{guix time-machine -C channels.scm -{}- \emph{cmd} -m
manifest.scm}
+ \end{center}
+ si on spécifie
+ \begin{description}
+ \item[« comment construire »] \hfill \texttt{channels.scm}
+ \item[« quoi construire »] \hfill \texttt{manifest.scm}
+ \end{description}
+ \end{exampleblock}
+
+\end{frame}
+
+
+
+\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{}
+ \vspace{1.5cm}
+ \href{https://zimoun.gitlab.io/fcc-inrae/}%
+ {Cette présentation voir là\\
+ \texttt{{https://zimoun.gitlab.io/fcc-inrae/}}}
+
+ \vfill{}
+
\href{https://archive.softwareheritage.org/swh:1:rev:f722a7ce1a5a98c8b5c1619ba826e034b5090db6;origin=https://gitlab.com/zimoun/fcc-inrae;visit=swh:1:snp:ad6a15c3fc4153ba0b4a6c09f5a62a25f5008304}%
+ {(Software Heritage id swh:1:rev:f722a7ce1a5a98c8b5c1619ba826e034b5090db6)}
+
+ % \vfill{}
+ % \tiny{%
+ % Copyright \copyright{} 2021 Simon Tournier%
+ % }
+ \end{center}
+\end{frame}
+
+
+\end{document}
diff --git a/talks/fcc-inrae-2022/static/Guix-white.pdf
b/talks/fcc-inrae-2022/static/Guix-white.pdf
new file mode 100644
index 0000000..3641e7f
Binary files /dev/null and b/talks/fcc-inrae-2022/static/Guix-white.pdf differ
diff --git a/talks/fcc-inrae-2022/static/all-abs-hist.png
b/talks/fcc-inrae-2022/static/all-abs-hist.png
new file mode 100644
index 0000000..48eb687
Binary files /dev/null and b/talks/fcc-inrae-2022/static/all-abs-hist.png differ
diff --git a/talks/fcc-inrae-2022/static/cafe-guix.png
b/talks/fcc-inrae-2022/static/cafe-guix.png
new file mode 100644
index 0000000..1698c65
Binary files /dev/null and b/talks/fcc-inrae-2022/static/cafe-guix.png differ
diff --git a/talks/fcc-inrae-2022/static/graph-python.png
b/talks/fcc-inrae-2022/static/graph-python.png
new file mode 100644
index 0000000..b0026b2
Binary files /dev/null and b/talks/fcc-inrae-2022/static/graph-python.png differ
diff --git a/talks/fcc-inrae-2022/static/graph.png
b/talks/fcc-inrae-2022/static/graph.png
new file mode 100644
index 0000000..f25a7b0
Binary files /dev/null and b/talks/fcc-inrae-2022/static/graph.png differ
diff --git a/talks/fcc-inrae-2022/static/guixhpc-logo-transparent-white.pdf
b/talks/fcc-inrae-2022/static/guixhpc-logo-transparent-white.pdf
new file mode 100644
index 0000000..3368aad
Binary files /dev/null and
b/talks/fcc-inrae-2022/static/guixhpc-logo-transparent-white.pdf differ
diff --git a/talks/fcc-inrae-2022/static/u-paris.png
b/talks/fcc-inrae-2022/static/u-paris.png
new file mode 100644
index 0000000..0b9ac7e
Binary files /dev/null and b/talks/fcc-inrae-2022/static/u-paris.png differ
diff --git a/talks/fcc-inrae-2022/talk.20220621.pdf
b/talks/fcc-inrae-2022/talk.20220621.pdf
new file mode 100644
index 0000000..7ad46a5
Binary files /dev/null and b/talks/fcc-inrae-2022/talk.20220621.pdf differ