civodul pushed a commit to branch master in repository maintenance. commit 885e217618340c2e6402080e344f50825e9c9be0 Author: zimoun <zimon.touto...@gmail.com> AuthorDate: Fri Dec 20 20:15:16 2019 +0100
talks: Add BlueHats 2019 talk. * talks/bluehats-2019: New directory. Signed-off-by: Ludovic Courtès <l...@gnu.org> --- .gitignore | 8 + talks/bluehats-2019/images/Guix-white.pdf | 1 + talks/bluehats-2019/images/big-picture-3.pdf | 1 + talks/bluehats-2019/images/diderot_u-paris.png | Bin 0 -> 2260 bytes talks/bluehats-2019/images/diderot_u-paris_bis.png | Bin 0 -> 2130 bytes talks/bluehats-2019/images/guix-refcard.pdf | 1 + .../images/guixhpc-logo-transparent.pdf | 1 + .../images/software-heritage-logo-title-white.pdf | 1 + talks/bluehats-2019/outline | 62 +++ talks/bluehats-2019/talk.20191211.pdf | Bin 0 -> 468454 bytes talks/bluehats-2019/talk.tex | 440 +++++++++++++++++++++ 11 files changed, 515 insertions(+) diff --git a/.gitignore b/.gitignore index 07b7f65..d290e5f 100644 --- a/.gitignore +++ b/.gitignore @@ -186,3 +186,11 @@ /talks/jcad-2019/talk.snm /talks/jcad-2019/talk.toc /talks/jcad-2019/talk.vrb +/talks/bluehats-2019/talk.aux +/talks/bluehats-2019/talk.log +/talks/bluehats-2019/talk.nav +/talks/bluehats-2019/talk.out +/talks/bluehats-2019/talk.pdf +/talks/bluehats-2019/talk.snm +/talks/bluehats-2019/talk.toc +/talks/bluehats-2019/talk.vrb diff --git a/talks/bluehats-2019/images/Guix-white.pdf b/talks/bluehats-2019/images/Guix-white.pdf new file mode 120000 index 0000000..288a029 --- /dev/null +++ b/talks/bluehats-2019/images/Guix-white.pdf @@ -0,0 +1 @@ +../../fosdem-2019/minimalist/images/Guix-white.pdf \ No newline at end of file diff --git a/talks/bluehats-2019/images/big-picture-3.pdf b/talks/bluehats-2019/images/big-picture-3.pdf new file mode 120000 index 0000000..b8d0c4f --- /dev/null +++ b/talks/bluehats-2019/images/big-picture-3.pdf @@ -0,0 +1 @@ +../../fosdem-2018/hpc/images/big-picture-3.pdf \ No newline at end of file diff --git a/talks/bluehats-2019/images/diderot_u-paris.png b/talks/bluehats-2019/images/diderot_u-paris.png new file mode 100644 index 0000000..3eaf755 Binary files /dev/null and b/talks/bluehats-2019/images/diderot_u-paris.png differ diff --git a/talks/bluehats-2019/images/diderot_u-paris_bis.png b/talks/bluehats-2019/images/diderot_u-paris_bis.png new file mode 100644 index 0000000..841d735 Binary files /dev/null and b/talks/bluehats-2019/images/diderot_u-paris_bis.png differ diff --git a/talks/bluehats-2019/images/guix-refcard.pdf b/talks/bluehats-2019/images/guix-refcard.pdf new file mode 120000 index 0000000..560fc1a --- /dev/null +++ b/talks/bluehats-2019/images/guix-refcard.pdf @@ -0,0 +1 @@ +../../fosdem-2019/minimalist/images/guix-refcard.pdf \ No newline at end of file diff --git a/talks/bluehats-2019/images/guixhpc-logo-transparent.pdf b/talks/bluehats-2019/images/guixhpc-logo-transparent.pdf new file mode 120000 index 0000000..9976a7f --- /dev/null +++ b/talks/bluehats-2019/images/guixhpc-logo-transparent.pdf @@ -0,0 +1 @@ +../../fosdem-2018/hpc/images/guixhpc-logo-transparent.pdf \ No newline at end of file diff --git a/talks/bluehats-2019/images/software-heritage-logo-title-white.pdf b/talks/bluehats-2019/images/software-heritage-logo-title-white.pdf new file mode 120000 index 0000000..0c5148d --- /dev/null +++ b/talks/bluehats-2019/images/software-heritage-logo-title-white.pdf @@ -0,0 +1 @@ +../../aramis-2019/images/software-heritage-logo-title-white.pdf \ No newline at end of file diff --git a/talks/bluehats-2019/outline b/talks/bluehats-2019/outline new file mode 100644 index 0000000..dea487d --- /dev/null +++ b/talks/bluehats-2019/outline @@ -0,0 +1,62 @@ +-*- mode: org -*- + +This talk was in French with a slot of 5-7 minutes, questions included. It was +taken in a full day satellite to Paris Open Source Summit. The initiative was +lead by Bastien Guerry from https://www.etalab.gouv.fr/. More information of +the programme [[https://forum.etalab.gouv.fr/t/journee-bluehats-lors-du-paris-open-source-summit-le-11-decembre-2019/4614][here]]. + +The slot was very short and the audience very heterogeneous; especially about +the day-to-day concerns. As an engineer working in an institute doing research +in biology, I have tried to explain what is the Reproducible Science challenge +in the modern age of data. + +In short, today a scientific result is an experiment producing data *and* a +numerical processing. From what I am seeing, the experimental part is more or +less well described, or let say that people in labs are aware of its importance +because they have already several decades (even more) of collective learning. + +However, not enough people take care about the numerical processing. Mainly, in +my opinion, because we are living a scientific paradigm shift. From what I am +seeing, more than often, it is not understood that more scientific value is in +the numerical process than really in the data itself (or how they are produced). +Even if I am fully biased because computing is my job and I understand nothing +about labs. + +To guarantee Reproducible Science in the modern age of data, we need to +guarantee several items, especially: + 1. Open Articles + 2. Open Data + 3. Open Source + 4. Controlled computing environment (open, too) +Today, initiatives have been starting, to name some, about 1. [[http://rescience.github.io/][ReScience journal]] +or french specific [[https://hal.archives-ouvertes.fr/][HAL]], 2. [[https://zenodo.org/][Zenodo]] and 3. [[https://www.softwareheritage.org/][Software Heritage]]. + +However, what about the point 4.? + +To fix the ideas, let consider some examples I encounter everyday. + + Alice use the tool foo-1.2, bar-3.4 and baz-5.6 + + Carole works with Alice but works for another project with the tools foo-7.8 + and bar-9.0 + + Charlie upgrades their system and then nothing is working + + Bob uses the same versions than Alice but he hits different results + + Dan wants to replay the same numerical processing several months (or years) + later but he is not able to reinstall the same versions of the tools because + the tools have been updated breaking the backward compatibility. +With these scenarii, the idea is to spot concrete issues of the daily life of +researchers. + +Each issue is fixable separately: + * package managers fix the dependency hell + * virtual environments fix the coexistence of several versions + * containers fix the exact same version (and the coexistence). +But now the nightmare is to work with all these layers. Wait, Guix already +provides all we need. + +Guix allows to control with a fine grain the toolchain and this control is the +masterpiece of Reproducible Science. At in least in my opinion. + +The two keys are the binary transparency which allows to track what should be +wrong and the bootstrapping which is the root ingredient of the former. + +Then, it is how Guix works, firstly as an end-user for each scenario and +secondly some plumbing presented in length elsewhere (FOSDEM, etc.) diff --git a/talks/bluehats-2019/talk.20191211.pdf b/talks/bluehats-2019/talk.20191211.pdf new file mode 100644 index 0000000..01dd5b6 Binary files /dev/null and b/talks/bluehats-2019/talk.20191211.pdf differ diff --git a/talks/bluehats-2019/talk.tex b/talks/bluehats-2019/talk.tex new file mode 100644 index 0000000..9aea272 --- /dev/null +++ b/talks/bluehats-2019/talk.tex @@ -0,0 +1,440 @@ +\documentclass[aspectratio=169]{beamer} + +\usetheme{default} + +\usefonttheme{structurebold} +\usepackage{helvet} +\usepackage{multimedia} % movie +\usecolortheme{seagull} % white on black + +\usepackage[utf8]{inputenc} +\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref,xspace,multicol} +\usepackage[absolute,overlay]{textpos} +\usepackage{tikz} +\usetikzlibrary{arrows,shapes,trees,shadows,positioning, decorations.pathreplacing} +\usepackage{fancyvrb} % for \Verb + +\usepackage[french]{babel} + +% Remember the position of every picture. +\tikzstyle{every picture}+=[remember picture] + +\tikzset{onslide/.code args={<#1>#2}{% + \only<#1>{\pgfkeysalso{#2}} % \pgfkeysalso doesn't change the path +}} + +% Colors. +\definecolor{guixred1}{RGB}{226,0,38} % red P +\definecolor{guixorange1}{RGB}{243,154,38} % guixorange P +\definecolor{guixyellow}{RGB}{254,205,27} % guixyellow P +\definecolor{guixred2}{RGB}{230,68,57} % red S +\definecolor{guixred3}{RGB}{115,34,27} % dark red +\definecolor{guixorange2}{RGB}{236,117,40} % guixorange S +\definecolor{guixtaupe}{RGB}{134,113,127} % guixtaupe S +\definecolor{guixgrey}{RGB}{91,94,111} % guixgrey S +\definecolor{guixdarkgrey}{RGB}{46,47,55} % guixdarkgrey S +\definecolor{guixblue1}{RGB}{38,109,131} % guixblue S +\definecolor{guixblue2}{RGB}{10,50,80} % guixblue S +\definecolor{guixgreen1}{RGB}{133,146,66} % guixgreen S +\definecolor{guixgreen2}{RGB}{157,193,7} % guixgreen S + +\setbeamerfont{title}{size=\huge} +\setbeamerfont{frametitle}{size=\huge} +\setbeamerfont{normal text}{size=\Large} + +% White-on-black color theme. +\setbeamercolor{structure}{fg=guixorange1,bg=black} +\setbeamercolor{title}{fg=white,bg=black} +\setbeamercolor{date}{fg=guixorange1,bg=black} +\setbeamercolor{frametitle}{fg=white,bg=black} +\setbeamercolor{titlelike}{fg=white,bg=black} +\setbeamercolor{normal text}{fg=white,bg=black} +\setbeamercolor{alerted text}{fg=guixyellow,bg=black} +\setbeamercolor{section in toc}{fg=white,bg=black} +\setbeamercolor{section in toc shaded}{fg=white,bg=black} +\setbeamercolor{subsection in toc}{fg=guixorange1,bg=black} +\setbeamercolor{subsection in toc shaded}{fg=white,bg=black} +\setbeamercolor{subsubsection in toc}{fg=guixorange1,bg=black} +\setbeamercolor{subsubsection in toc shaded}{fg=white,bg=black} +\setbeamercolor{frametitle in toc}{fg=white,bg=black} +\setbeamercolor{local structure}{fg=guixorange1,bg=black} + +\newcommand{\highlight}[1]{\alert{\textbf{#1}}} +\newcommand{\orange}[1]{\textcolor{guixorange1}{\textbf{#1}}} +\newcommand{\comment}[1]{\textcolor{guixgreen2}{#1}} +\newcommand{\red}[1]{\textcolor{guixred2}{#1}} + + +\title{GNU Guix: vers la reproductibilité computationnelle} + +\author{Simon Tournier} +\date{BlueHats, Paris, 11 Décembre 2019} +\institute{\texttt{simon.tourn...@univ-paris-diderot.fr}} + +\setbeamertemplate{navigation symbols}{} % remove the navigation bar + +\AtBeginSection[]{ + \begin{frame} + \frametitle{} + \tableofcontents[currentsection] + \end{frame} +} + + +\newcommand{\screenshot}[1]{ + \begin{frame}[plain] + \begin{tikzpicture}[remember picture, overlay] + \node [at=(current page.center), inner sep=0pt] + {\includegraphics[width=\paperwidth]{#1}}; + \end{tikzpicture} + \end{frame} +} + + +\begin{document} + +\begin{frame}[plain, fragile] + \vspace{10mm} + \titlepage + + \vfill{} + Ing. Rech. Calcul Sci. \scriptsize{(+un peu adminsys)} + + \normalsize + + Analyses avec biologistes/médecins + + \tiny{(avant)} \scriptsize{Simul. num. (fem, bem, sys. lin.)} + \normalsize + \hfill{% + \begin{minipage}{0.2\paperwidth} + \begin{tabular}{c|c} + \includegraphics[width=0.1\paperwidth]{images/diderot_u-paris} + & + \includegraphics[width=0.04\paperwidth]{images/diderot_u-paris_bis} + \end{tabular} + \end{minipage} + } +\end{frame} + + +\begin{frame}[plain] + \begin{center} + \textcolor{guixgreen1}{Résultat scientifique = expérience + traitement numérique} + \end{center} + \begin{tabular}{cclll} + \orange{$\rhd$} & expérience &:& comment produire la donnée & $\approx$décrit + \\ + \orange{$\rhd$} & trait. num. &:& quels logiciels, paramètres, versions, etc. & \alert{?} + \end{tabular} + + \vfill{} + + \begin{center} + \highlight{Reproductibilité scientifique à l'ére numérique :} + \end{center} + + \begin{tabular}{cll} + \orange{1.} & Articles accessibles & HAL, ReScience + \\ + \orange{2.} & Données ouvertes & Zenodo + \\ + \orange{3.} & Code source ouvert & Forges, Software Heritage + \\ + \orange{4.} & Environnement d'exécution & \alert{?} + \end{tabular} + + \begin{center} + {et comment lier tout ca ?} + \end{center} + + \vfill{} + + $\left( + \begin{tabular}{lcl} + reproductibilité &=& vérification\\ + réplicabilité &=& validation + \end{tabular} + \right)$ + + \vspace{-0.75cm} + + \begin{flushright} + \href{https://scibian.org/up/201609/Software_Heritage.pdf}% + {\small{R. Di Cosmo@Scibian2016 (lien)}}\\ + \href{https://aramis.resinfo.org/wiki/lib/exe/fetch.php?media=pleniaires:aramis_keynote_enjeux-et-defis-recherche-reproductible_konrad_hinsen.pdf}% + {\small{K. Hinsen@Aramis2019 (lien)}} + \end{flushright} +\end{frame} + +\begin{frame}{Scenarii concrets} + \begin{itemize} + \item Alice a utilisé les outils numériques \emph{foo-1.2}, \emph{bar-3.4} et \emph{baz-5.6}. + \item Carole travaille avec Alice \dots \\ + \hfill{mais utilise aussi les versions \emph{foo-7.8}, \emph{bar-9.0}.} + \item Charlie a mis à jour son système et plus rien ne fonctionne. + \item Bob utilise les mêmes versions qu'Alice \dots \\ + \hfill{mais n'obtient pas les mêmes résultats.} + \item Dan veut refaire l'analyse des mois (années?) plus tard \dots\\ + \hfill{mais rencontre le \emph{dependencies hell}\footnote{au mieux}.} + \end{itemize} + \begin{center} + \highlight{Solution(s)} + \end{center} + + \vspace{-0.6cm} + + \begin{tikzpicture}[decoration=brace] + \node[text width=0.6\paperwidth] (box) + { + \begin{enumerate} + \item \textbf{gestionnaire de paquets}: \texttt{apt}, \texttt{yum}, etc. + \item \textbf{environnement virtuel}: \texttt{conda}, \texttt{modulefiles}, etc. + \item \textbf{conteneur}: Docker, Singularity, etc. + \end{enumerate} + }; + \draw [decorate] (box.north east) --node[right=10pt]{\alert{Guix}} (box.south east); + \end{tikzpicture} + + + +\end{frame} + + +\begin{frame}{Guix en résumé} + \begin{enumerate} + \item outil de gestion de paquets: paradigme fonctionnel et transactionnel + \item gestionnaire d'environnements + \item permet générer des conteneurs + \item fournit des outils (biblio. Scheme) pour adapter à ses propres spécificités + \end{enumerate} + + \vfill{} + \begin{center} + \highlight{Contrôle (fin) sur la chaîne de dépendances} + \end{center} + + \vfill{} + + \begin{tabular}{cll} + \alert{$\star\star$} & Reproductibilité binaire & + \scriptsize{(du moins permet de la tracer)}\normalsize \\ + \alert{$\star\star$} & \emph{Bootstrap} & + \scriptsize{(binaire${}_{n}$ $\leftarrow$ source + binaire${}_{n-1}$)}\normalsize + \end{tabular} +\end{frame} + +\begin{frame}[fragile] + \begin{semiverbatim} + \small{ + \comment{\# Alice} + guix \alert{install} foo@1.2 bar@3.4 baz@5.6 \comment{\# -m manifest.scm} + guix \alert{describe} -f channels > \red{alice-conf.scm} + + \comment{\# Carole} + guix install \alert{--profile}=./avec-alice foo@1.2 bar@3.4 baz@5.6 + guix install foo@7.8 bar@9.0 + + \comment{\# Charlie} + guix package \alert{--roll-back} \comment{\# generations} + + \comment{\# Bob} + guix \alert{pull --channels}=\red{alice-conf.scm} + guix \alert{pack} -f docker ... \comment{# -f squashfs} + + \comment{\# Dan} + guix \alert{time-machine} -C \red{alice-conf.scm} -- install foo@1.2 bar@3.4 baz@5.6 + } + \end{semiverbatim} +\end{frame} + +\setbeamercolor{normal text}{fg=black,bg=white} +\begin{frame}[fragile] + \vspace{2.5cm} + \begin{tikzpicture}[remember picture, overlay] + \node [at=(current page.center), inner sep=0pt, rotate=-90, + drop shadow={opacity=0.5}, draw, color=guixgrey, line width=1pt] + {\includegraphics[height=1.4\paperheight]{images/guix-refcard}}; + \end{tikzpicture} +\end{frame} +\setbeamercolor{normal text}{fg=white,bg=black} + +\begin{frame}{Déploiement sur Clusters} + \large{ + \begin{tabular}{lcrl} + \highlight{Max Delbrück Center} &(DE):& 250-node &+ workstations \\ + \highlight{UMC Utrecht} &(NL):& 68-node &(1,000+ cores)\\ + \highlight{University of Queensland} &(AU):& 20-node &(900 cores)\\ + \highlight{PlaFRIM Inria Bordeaux} &(FR):& 120-node &(3000+ cores)\\ + \highlight{GriCAD Grenoble} &(FR):& 72-node &(1000+ cores)\\ + \highlight{CCIPL Nantes} &(FR):& 230-node &(4000+ cores)\\ + \quad (le votre ?)\\ + \end{tabular} + } + \begin{center} + \includegraphics[height=0.3\paperheight]{images/guixhpc-logo-transparent} + + \url{https://guix-hpc.bordeaux.inria.fr} + \end{center} +\end{frame} + +\setbeamercolor{normal text}{bg=black} +\begin{frame}[fragile]{Survol technique} + + \begin{semiverbatim} + \Large{ +guix build pastix \only<2>{\alert{--with-source=}./my-pastix.tar.gz} \only<3>{\alert{--with-input=}lapack=my-lapack} +\uncover<4->{/gnu/store/\tikz[baseline]{\node[anchor=base](nixhash){\alert<4>{h2g4sf72\textrm{...}}}}-pastix-6.0.2} + +\uncover<5->{{guix \alert<5>{gc --references} /gnu/store/\textrm{...}-pastix-6.0.2} +/gnu/store/3fa68b5\textrm{...}-glibc-2.24 +/gnu/store/bd9c330\textrm{...}-gcc-4.9.3-lib +/gnu/store/ca175fd\textrm{...}-pastix-6.0.2 +}} + \end{semiverbatim} + + \begin{tikzpicture}[overlay] + \node<1-3>(labelnixhash) [fill=white, text=black, inner sep=0.5cm, + rounded corners] at (current page.center) {% + \Large{\textbf{isolated build}: chroot, separate name spaces, etc.} + }; + + \node<4>(labelnixhash) [fill=white, text=black] at (4cm, 2cm) {% + hash de \textbf{toutes} les dépendances}; + \path[->]<4>(labelnixhash.north) edge [bend left, in=180, out=-45] (nixhash.south); + + \draw<6-> (-10pt, 105pt) [very thick, color=guixorange2, rounded corners=8pt] + arc (10:-50:-50pt and 110pt); + \node<6->[fill=white, text=black, text opacity=1, opacity=.7, + rounded corners=2mm, inner sep=5mm] + at (7, 2) {\textbf{\Large{(presque) bit-identique pour tout le monde}}}; + \end{tikzpicture} + + \begin{semiverbatim} + \Large{ + } + \end{semiverbatim} + +\end{frame} + + +\setbeamercolor{normal text}{bg=guixgrey} +\begin{frame}[fragile] + \begin{semiverbatim} +(define pastix + (\alert{package} + (name "pastix") + (home-page "https://gitlab.inria.fr/solverstack/pastix") + (\alert{source} (origin + (method git-fetch) + (uri (git-reference + (\alert{url} home-page) + (\alert{commit} "2f30ff07a")\tikz{\node(commit){};} + (recursive? #t))) + (sha256 + (base32 + "106rf402cvfdhc2yf\textrm{...}")))) + \textrm{...})) + \end{semiverbatim} + + \begin{tikzpicture}[overlay] + \node(swh) [inner sep=3mm, rounded corners, fill=black, + opacity=.3, text opacity=1] at (12,5) { + % https://annex.softwareheritage.org/public/logo/ + \includegraphics[width=0.33\textwidth]{images/software-heritage-logo-title-white} + }; + \node [at=(current page.south), anchor=south, + inner sep=2mm, rounded corners, fill=black, text width=11.75cm, + opacity=.3, text opacity=1] { + \href{https://www.softwareheritage.org/2019/04/18/software-heritage-and-gnu-guix-join-forces-to-enable-long-term-reproducibility/}% + {SWH and Guix join forces to enable long term reproductibility (lien)} + }; + + \path[very thick, draw=guixorange1] + (swh) edge [out=-90, in=0, ->] (commit); + \end{tikzpicture} +\end{frame} +\setbeamercolor{normal text}{fg=white,bg=black} + +\setbeamercolor{normal text}{fg=black,bg=white} +\begin{frame}[plain]{Dans un monde \emph{idéal}} + \vspace{-0.9cm} + \includegraphics[width=\textwidth]{images/big-picture-3} +\end{frame} +\setbeamercolor{normal text}{fg=white,bg=black} + +\begin{frame}{(Venez (partager (les (parenthèses !))))} + \Large{ + \begin{itemize} + \item \textbf{installez} + \begin{center} + \href{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh}{\texttt{https://.../guix-install.sh}} + \end{center} + \vspace{0.5cm} + \item \textbf{utilisez}, rapportez des problèmes, empaquetez + \begin{center} + \url{https://issues.guix.gnu.org/} + \end{center} + \vspace{0.5cm} + \item \textbf{partagez} vos \highlight{idées} ! + \begin{center} + \texttt{help-g...@gnu.org} + + \vspace{0.5cm} + + \texttt{\#guix} \small{(irc.freenode.net)} + \end{center} + \end{itemize} + } +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[plain] + \vfill{ + \vspace{1.5cm} + \center{\includegraphics[width=0.3\textwidth]{images/Guix-white}}\\[1.0cm] + \texttt{help-g...@gnu.org}\hfill{\alert{\url{https://guix.gnu.org}}} + } +\end{frame} + +\begin{frame}{} + + \begin{textblock}{12}(2, 8) + \tiny{ + Copyright \copyright{} 2019 Simon Tournier \texttt{zimon.touto...@gmail.com}.\\[3.0mm] + GNU Guix logo, CC-BY-SA 4.0, \url{https://gnu.org/s/guix/graphics} + + GNU~Guix Reference Card under GFDL~1.3+. + + Copyright of other images included in this document is held by + their respective owners; especially from Ludovic Courtès. + \\[3.0mm] + This work is licensed under the \alert{Creative Commons + Attribution-Share Alike 3.0} License. To view a copy of this + license, visit + \url{http://creativecommons.org/licenses/by-sa/3.0/} or send a + letter to Creative Commons, 171 Second Street, Suite 300, San + Francisco, California, 94105, USA. + \\[2.0mm] + At your option, you may instead copy, distribute and/or modify + this document under the terms of the \alert{GNU Free Documentation + License, Version 1.3 or any later version} published by the Free + Software Foundation; with no Invariant Sections, no Front-Cover + Texts, and no Back-Cover Texts. A copy of the license is + available at \url{https://www.gnu.org/licenses/gfdl.html}. + \\[2.0mm] + % Give a link to the 'Transparent Copy', as per Section 3 of the GFDL. + The source of this document is available from + \url{https://git.sv.gnu.org/cgit/guix/maintenance.git}. + } + \end{textblock} +\end{frame} + +\end{document} + +% Local Variables: +% coding: utf-8 +% comment-start: "%" +% comment-end: "" +% ispell-local-dictionary: "french" +% End: