all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
blob b0f4a85924b6fd89b641e8ced70763162532fb34 9240 bytes (raw)
name: talks/jres-2022/src/supplement.tex 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
 
\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.

\f
\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

\f
\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}


\f
\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}

\f
\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}

\f
\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}


debug log:

solving b0f4a85 ...
found b0f4a85 in https://yhetil.org/guix/20220620035132.3461-1-zimon.toutoune@gmail.com/

applying [1/1] https://yhetil.org/guix/20220620035132.3461-1-zimon.toutoune@gmail.com/
diff --git a/talks/jres-2022/src/supplement.tex b/talks/jres-2022/src/supplement.tex
new file mode 100644
index 0000000..b0f4a85

Checking patch talks/jres-2022/src/supplement.tex...
1:288: new blank line at EOF.
+
Applied patch talks/jres-2022/src/supplement.tex cleanly.
warning: 1 line adds whitespace errors.

index at:
100644 b0f4a85924b6fd89b641e8ced70763162532fb34	talks/jres-2022/src/supplement.tex

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.