2
0
Fork 0
mirror of git://git.savannah.gnu.org/guix/maintenance.git synced 2023-12-14 03:33:04 +01:00
maintenance/talks/rennes-2015/talk.tex
2015-11-09 23:52:33 +01:00

769 lines
25 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% The comment below tells Rubber to compile the .dot files.
%
% rubber: module graphics
% rubber: rules rules.ini
\documentclass{beamer}
\usetheme{default}
\usepackage{helvet}
\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}
\usepackage{fancyvrb} % for \Verb
% 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{guixorange2}{RGB}{236,117,40} % guixorange S
\definecolor{guixtaupe}{RGB}{134,113,127} % guixtaupe S
\definecolor{guixgrey}{RGB}{91,94,111} % guixgrey 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}
% 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}}}
\title{Reproducible Software Deployment with GNU~Guix}
\author{Ludovic Courtès}
\date{\small{Inria Rennes Bretagne Atlantique, November 2015}}
\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}
\maketitle
\setbeamercolor{normal text}{bg=guixblue2}
\begin{frame}
\Huge{\textbf{The difficulty of keeping software environments under
control.}}
\end{frame}
\setbeamercolor{normal text}{fg=white,bg=black}
\begin{frame}[plain]
\Huge{\#1. Upgrades are hard.}
\end{frame}
\screenshot{images/debian-upgrade-warning}
\screenshot{images/debian-upgrade-instructions}
\begin{frame}[plain]
\Huge{\#2. Stateful system management is intractable.}
\end{frame}
\begin{frame}[plain, fragile]
\begin{overlayarea}{\textwidth}{8cm}
\begin{tikzpicture}[stylish/.style = {
draw=guixorange1, very thick,
fill=white, text=black, text width=3.2cm,
rounded corners=2mm, minimum height=1.4cm,
text centered
}]
\matrix[row sep=6mm, column sep=1.5cm] {
\node(inita)[stylish]{\textbf{\Large{\$DISTRO}}};
& \node(initb)[stylish]{\textbf{\Large{\$DISTRO}}};
\\
\node<2->(state1a)[stylish]{state $1_a$};
& \node<2->(state1b)[stylish]{state $1_b$};
\\
\node<3->(state2a)[stylish]{state $2_a$};
& \node<3->(state2b)[stylish]{state $2_b$};
\\
\node<4->(state3a)[stylish]{state $3_a$};
& \node<4->(state3b)[stylish]{state $3_b$};
\\
};
\path[->, very thick, draw=white]<2->
(inita) edge node[right]{\texttt{apt-get update}} (state1a);
\path[->, very thick, draw=white]<3->
(state1a) edge node[right]{\texttt{apt-get install foo}} (state2a);
\path[->, very thick, draw=white]<4->
(state2a) edge node[right]{\texttt{apt-get remove bar}} (state3a);
\path[->, very thick, draw=white]<2->
(initb) edge node[right]{\texttt{apt-get update}} (state1b);
\path[->, very thick, draw=white]<3->
(state1b) edge node[right]{\texttt{apt-get remove bar}} (state2b);
\path[->, very thick, draw=white]<4->
(state2b) edge node[right]{\texttt{apt-get install foo}} (state3b);
\end{tikzpicture}
\end{overlayarea}
\begin{tikzpicture}[overlay]
\node<5>[rounded corners=4, text centered,
fill=guixorange1, text width=3cm,
inner sep=5mm, opacity=.75, text opacity=1,
drop shadow={opacity=0.5}] at (5, 4) {
\textbf{\Huge{= ?}}
};
\end{tikzpicture}
\end{frame}
\begin{frame}[plain]
\Huge{\#3. It's worse than this.}
\end{frame}
\screenshot{images/package-managers-cropped}
\begin{frame}[plain]
\Huge{It's worse, really.}
\end{frame}
\begin{frame}
\Large{``Let's Package jQuery: A Javascript Packaging Dystopian
Novella'' by Chris Webber}
\\[2.cm]
\url{http://dustycloud.org/blog/javascript-packaging-dystopia/}
\end{frame}
\begin{frame}[plain]
\LARGE{\textbf{Giving up?}}
\\[1.0cm]
\uncover<2->{$\rightarrow$ ``app bundles'' (Docker images)}
\end{frame}
\screenshot{images/docker-security}
% TODO: http://www.vitavonni.de/blog/201503/2015031201-the-sad-state-of-sysadmin-in-the-age-of-containers.html
\begin{frame}[plain]
\begin{tikzpicture}[remember picture, overlay]
\node [at=(current page.center), inner sep=0pt]
{\includegraphics[height=\paperheight]{images/hope-hero}};
\end{tikzpicture}
\end{frame}
%% \section{Functional Package Management}
\setbeamercolor{normal text}{bg=guixblue2}
\begin{frame}[plain]
\Huge{\textbf{Functional package management.}}
\end{frame}
\setbeamercolor{normal text}{fg=white,bg=black}
\begin{frame}[plain]
\Large{
$\texttt{openmpi} = f(\texttt{hwloc}, \texttt{gcc}, \texttt{make},\texttt{coreutils})$
\uncover<2->{$\texttt{hwloc} = g(\texttt{pciaccess}, \texttt{gcc}, \texttt{make}, \texttt{coreutils})$}
\uncover<3->{$\texttt{gcc} = h(\texttt{make}, \texttt{coreutils}, \texttt{gcc}_0)$}
\uncover<3->{\textrm{...}}
}
\uncover<1>{\large{where $f =$ \texttt{./configure \&\& make \&\& make install}}}
\begin{tikzpicture}[overlay]
\node<4->[fill=guixorange1, text=black, text opacity=1, opacity=.7,
rounded corners=2mm, inner sep=5mm] at (5, 1) {
\textbf{\Large{the complete DAG is captured}}
};
\end{tikzpicture}
\end{frame}
\begin{frame}
\Large{
\begin{itemize}
%% \item<3-> \textit{Caching Function Calls Using Precise Dependencies}
%% (``Vesta''), Heydon et al., 2000
\item \textit{A Safe and Policy-Free System for Software
Deployment}, Dolstra et al., 2003\\ \alert{\textbf{Nix}},
\url{http://nixos.org/nix/}
\item \textit{Functional Package Management with Guix}, Courtès,
2013
\end{itemize}
}
\end{frame}
\begin{frame}[fragile]
\begin{semiverbatim}
(define hello
(\alert{package}
(name "hello")
(version "2.10")
(source (\alert{origin}
(method url-fetch)
(uri (string-append
"mirror://gnu/\textrm{...}/hello-" version
".tar.gz"))
(sha256 (base32 "0wqd\textrm{...}dz6"))))
(\alert{build-system} gnu-build-system)
(synopsis "Hello, world!")
(description "Produce a friendly greeting.")
(home-page "http://www.gnu.org/software/hello/")
(license gpl3+)))
\end{semiverbatim}
% \begin{tikzpicture}[overlay]
% \node[rounded corners=4, text centered,
% fill=guixorange1, text width=3cm,
% inner sep=3mm, rotate=-5, opacity=.75, text opacity=1,
% drop shadow={opacity=0.5},
% at=(current page.center)] {
% \textbf{\large{Emacs + Geiser demo!}}
% };
% \end{tikzpicture}
\end{frame}
\begin{frame}[fragile]{}
\begin{tikzpicture}[tools/.style = {
text width=35mm, minimum height=4cm,
text centered,
rounded corners=2mm,
fill=white, text=black
},
tool/.style = {
fill=white, text=black, text width=3cm,
text centered
},
daemon/.style = {
rectangle, text width=50mm, text centered,
rounded corners=2mm, minimum height=15mm,
top color=guixorange1,
bottom color=guixyellow,
text=black
},
builders/.style = {
draw=guixorange1, very thick, dashed,
fill=black, text=white, text width=5cm,
rounded corners=2mm,
},
builder/.style = {
draw=guixred2, thick, rectangle,
fill=black, text=white,
rotate=90
}]
\matrix[row sep=3mm, column sep=1cm] {
\node(builders)[builders, text height=5cm]{}
node[fill=black, text=white] at (0, 2) {\large{\textbf{build processes}}}
node[fill=black, text=white] at (0, 1.5) {chroot, separate UIDs}
node[builder, onslide=<1-2>{black}] at (-1,-0.5) {\alert<3->{Guile}, make, etc.}
node[builder, onslide=<1-2>{black}] at ( 0,-0.5) {\alert<3->{Guile}, make, etc.}
node[builder, onslide=<1-2>{black}] at ( 1,-0.5) {\alert<3->{Guile}, make, etc.}; &
\node[tools]{}
node[fill=white, text=black] at (0, 1) {\large{\textbf{Guile Scheme}}}
node[tool] at (0, 0) {\texttt{(guix packages)}}
node(client)[tool] at (0, -1) {\texttt{(guix store)}};
\\
\node(daemon)[daemon]{\large{\textbf{build daemon}}}; &
&
\\
};
\end{tikzpicture}
\begin{tikzpicture}[overlay]
\path[very thick, draw=guixorange1]<2->
(client.south) edge [out=-90, in=0, ->] node[below, sloped]{RPCs} (daemon.east);
\path[->, very thick, draw=guixorange1]<3->
(daemon) edge (builders);
\end{tikzpicture}
\end{frame}
\begin{frame}[fragile]
%% \frametitle{Bit-Reproducible Builds$^*$}
%% \framesubtitle{$^*$ almost!}
\begin{semiverbatim}
\$ guix build hello
\uncover<2->{/gnu/store/\tikz[baseline]{\node[anchor=base](nixhash){\alert<2>{h2g4sf72\textrm{...}}};}-hello-2.10}
\uncover<3->{\$ \alert<3>{guix gc --references /gnu/store/\textrm{...}-hello-2.10}
/gnu/store/\textrm{...}-glibc-2.22
/gnu/store/\textrm{...}-gcc-4.9.3-lib
/gnu/store/\textrm{...}-hello-2.10
}
\end{semiverbatim}
\begin{tikzpicture}[overlay]
\node<1>(labelnixhash) [fill=white, text=black] at (current page.center) {%
\Large{\textbf{isolated build}: chroot, separate name spaces, etc.}
};
\node<2>(labelnixhash) [fill=white, text=black] at (4cm, 2cm) {%
hash of \textbf{all} the dependencies};
\path[->]<2>(labelnixhash.north) edge [bend left, in=180, out=-45] (nixhash.south);
\draw<4-> (-10pt, 105pt) [very thick, color=guixorange2, rounded corners=8pt]
arc (10:-50:-50pt and 110pt);
\node<4->[fill=white, text=black, text opacity=1, opacity=.7,
rounded corners=2mm, inner sep=5mm]
at (7, 2) {\textbf{\Large{(nearly) bit-identical for everyone}}};
%% \node<5>[fill=white, text=black, text opacity=1, opacity=.7,
%% rounded corners=1mm, inner sep=3mm]
%% at (8, 1) {\url{http://reproducible.debian.net}};
\end{tikzpicture}
\end{frame}
\begin{frame}[fragile]
\begin{semiverbatim}
\$ guix package -i gcc-toolchain coreutils sed grep
\textrm{...}
\$ eval `guix package --search-paths`
\textrm{...}
\$ guix package --manifest=my-software.scm
\textrm{...}
\end{semiverbatim}
\begin{tikzpicture}[overlay]
\node[rounded corners=4, text centered,
fill=guixorange1, text width=3cm,
inner sep=3mm, rotate=5, opacity=.75, text opacity=1,
drop shadow={opacity=0.5}] at (5, 4) {
\textbf{\large{demo}}
};
\end{tikzpicture}
\end{frame}
\begin{frame}[fragile]
\Huge{Want your PhD student to hack on GNUnet?}
\\[2cm]
\uncover<2->{\Large{A simple matter of installing the deps, right?}}
\end{frame}
\begin{frame}[plain]
\begin{tikzpicture}[remember picture, overlay]
\node [at=(current page.center), inner sep=0pt]
{\includegraphics[width=\paperwidth]{images/gnunet-graph}};
\end{tikzpicture}
\end{frame}
\begin{frame}[fragile]
\begin{semiverbatim}
\$ guix environment --container gnunet
\textrm{...}
\$ guix environment --ad-hoc python-ipython python-numpy \\
-E ipython
\textrm{...}
\end{semiverbatim}
\end{frame}
\screenshot{images/ci-jenkins-cropped}
\setbeamercolor{normal text}{bg=guixblue2}
\begin{frame}[plain]
\Huge{\textbf{Whole-system deployment.}}
\end{frame}
\setbeamercolor{normal text}{fg=white,bg=black}
\begin{frame}[fragile]
\begin{overlayarea}{\textwidth}{8cm}
\begin{tikzpicture}[kernel/.style = {
text width=10cm, minimum height=1.4cm,
text centered,
rounded corners=2mm,
fill=white, text=black
},
userland/.style = {
draw=guixorange1, very thick,
fill=white, text=black, text width=5cm,
rounded corners=2mm, minimum height=1.4cm,
text centered
}]
\matrix[row sep=6mm, column sep=1cm] {
\node(kernel)[kernel]{\textbf{\Large{Linux-libre}}};
\\
\node<2->(initrd)[userland]{\textbf{\Large{initial RAM disk}}};
\\
\node<4->(dmd)[userland]{\textbf{\Large{PID 1: GNU dmd}}
\\ services...};
\\
\node<6->(user)[userland, dashed]{\textbf{\Large{applications}}};
\\
};
\path[->, very thick, draw=guixred1]<2->
(kernel) edge (initrd);
\path[->, very thick, draw=guixred1]<4->
(initrd) edge (dmd);
\path[->, very thick, draw=guixred1]<6->
(dmd) edge (user);
\end{tikzpicture}
\end{overlayarea}
\begin{tikzpicture}[overlay,
guile/.style = {
fill=guixyellow, text=black, rotate=30,
rounded corners=4mm, text width=3cm,
opacity=.75, text opacity=1, text centered,
minimum height=1.3cm
}]
\node<3->(labelinitrd) [guile] at (initrd.east) {%
\Large{Guile}
};
\node<5->(labelinitrd) [guile] at (dmd.east) {%
\Large{Guile}
};
\end{tikzpicture}
\end{frame}
\setbeamercolor{normal text}{bg=guixblue2}
\begin{frame}[plain]
\Huge{\textbf{Trustworthiness.}}
\end{frame}
\setbeamercolor{normal text}{fg=white,bg=black}
\begin{frame}[plain]
\begin{quotation}
\noindent
\Large{Debians dirtiest secret:\\
\noindent
\textbf{Binary packages \alert{built by developers} are used in
the archive}}
\end{quotation}
\hfill{ --- Lucas Nussbaum, FOSDEM 2015}
\end{frame}
% TODO: CIA's XCode exploit here
\begin{frame}[fragile]
\frametitle{Transparent binary/source deployment}
\begin{overlayarea}{\textwidth}{6cm}
\begin{semiverbatim}
alice@foo\$ \alert{guix package --install=}emacs
The following package will be installed:
emacs-24.5 /gnu/store/\dots{}-emacs-24.5
\only<1>{
The following files will be \alert{downloaded}:
/gnu/store/\dots{}-emacs-24.5
/gnu/store/\dots{}-libxpm-3.5.10
/gnu/store/\dots{}-libxext-1.3.1
/gnu/store/\dots{}-libxaw-1.0.11
}\only<2>{
The following files will be \alert{downloaded}:
/gnu/store/\dots{}-libxext-1.3.1
/gnu/store/\dots{}-libxaw-1.0.11
The following derivations will be \alert{built}:
/gnu/store/\dots{}-emacs-24.5.drv
/gnu/store/\dots{}-libxpm-3.5.10.drv
}
\end{semiverbatim}
\end{overlayarea}
\end{frame}
\begin{frame}[plain, fragile, t]
\begin{tikzpicture}[box/.style = {
rounded corners=2mm,
fill=white, text=black, text width=4.8cm,
inner sep=2mm
},
server/.style = {
text centered, rounded corners=2mm,
fill=guixorange1, text=black, text width=3.4cm,
inner sep=3mm
},
note/.style = {
rounded corners=4, text centered,
fill=guixorange1, text width=3cm,
inner sep=3mm, rotate=5, opacity=.75, text opacity=1,
drop shadow={opacity=0.5}
}]
\matrix[row sep=1.4cm, column sep=1.4cm] {
\node(def)[box]{\texttt{(define foo (package \textrm{...}))}};
& \node(user)[server]{\textbf{user}};
\\
\node<2->(build)[box]{\texttt{guix build foo}
\texttt{/gnu/store/\textrm{...}-foo-1.0}};
& \node<4-5>(hydra)[server]{hydra.gnu.org \textbf{build~farm}};
\\
\node<3->(push){\texttt{git push}};
& \node<3->(savannah)[server]{git.sv.gnu.org}; \\
\\
};
\path[->, very thick, draw=guixorange1]<2->
(def) edge node[left]{test} (build);
\path[->, very thick, draw=guixorange1]<3->
(build) edge (push);
\path[->, very thick, draw=guixorange1]<3->
(push) edge[->, in=-110, out=-70] (savannah);
\path[->, very thick, draw=guixorange1]<4-5>
(hydra) edge node[right]{pull} (savannah);
\path[->, very thick, draw=guixorange1]<4-6>
(user) edge[in=30,out=-30] node[left, sloped]{pull}
(savannah.north east);
\path[->, very thick, draw=guixorange1]<5>
(user) edge node[right]{get binary} (hydra);
\node<7>[overlay, fill=black, opacity=.8,
text height=9cm, text width=11cm,
at=(current page.center)] {};
\node<7>[note, rotate=3] at (2,1) {\textbf{no ``maintainer uploads''}};
\node<7>[note, rotate=-10] at (-2,-1) {\textbf{no single point of trust}};
\end{tikzpicture}
\end{frame}
\begin{frame}[plain, fragile]
\begin{tikzpicture}[white/.style = {
text centered, rounded corners=2mm,
fill=white, text=black, text width=2.8cm,
inner sep=3mm
},
orange/.style = {
text centered, rounded corners=2mm,
fill=guixorange1, text=black, text width=2.8cm,
inner sep=3mm
}]
\matrix[row sep=1cm, column sep=0.5cm] {
\node(source)[white]{\large{\textbf{source}}\\package~recipes};
& \node(binary)[orange]{\large{\textbf{binary}} \texttt{hydra.gnu.org}};
\\
\node{\texttt{(define emacs (\alert{package} \textrm{\dots{}}))}};
& \node{\texttt{/gnu/store/\textrm{\dots{}}-emacs-24.5}};
\\
};
\path[<->, very thick, draw=white]
(source) edge node[above]{\Huge{\textbf{?}}} (binary);
\end{tikzpicture}
\end{frame}
\begin{frame}{The path to greater user control}
\Large{
\begin{enumerate}
\item{ \textbf{Bit-reproducible builds}
\begin{itemize}
\item<2-> we have \highlight{isolated build environments}!
\item<2-> ... but we need builds to be \highlight{deterministic}
\item<2-> \url{http://reproducible-builds.org}
\end{itemize}}
\item{\textbf{No single binary provider}
\begin{itemize}
\item<3-> \texttt{guix publish}
\item<3-> publish over GNUnet? (GSoC 2015)
\end{itemize}}
\item \textbf{\alert<4>{Tools for users to challenge binaries}}
\end{enumerate}
}
\end{frame}
\begin{frame}[fragile]
\begin{semiverbatim}
$ \alert{guix challenge} --substitute-urls="http://hydra.gnu.org http://guix.example.org"
\alert{/gnu/store/\dots{}-openssl-1.0.2d contents differ}:
local hash: 0725l22\dots{}
http://hydra.gnu.org/\dots{}-openssl-1.0.2d: 0725l22\dots{}
http://guix.example.org/\dots{}-openssl-1.0.2d: 1zy4fma\dots{}
\alert{/gnu/store/\dots{}-git-2.5.0 contents differ}:
local hash: 00p3bmr\dots{}
http://hydra.gnu.org/\dots{}-git-2.5.0: 069nb85\dots{}
http://guix.example.org/\dots{}-git-2.5.0: 0mdqa9w\dots{}
\alert{/gnu/store/\dots{}-pius-2.1.1 contents differ}:
local hash: 0k4v3m9\dots{}
http://hydra.gnu.org/\dots{}-pius-2.1.1: 0k4v3m9\dots{}
http://guix.example.org/\dots{}-pius-2.1.1: 1cy25x1\dots{}
\end{semiverbatim}
\end{frame}
%% \begin{frame}
%% \frametitle{Ken Thompson's attack?}
%% \begin{itemize}
%% \item ``Reflections on Trusting Trust'', Ken Thompson
%% \item ``Countering ... Through Diverse Double Compilation'', David
%% A. Wheeler
%% \end{itemize}
%% \end{frame}
\setbeamercolor{normal text}{bg=guixblue2}
\begin{frame}[plain]
\Huge{\textbf{Status.}}
\end{frame}
\setbeamercolor{normal text}{fg=white,bg=black}
\begin{frame}{Timeline}
\begin{itemize}
\item Nov. 2012 --- dubbed GNU
\item{Jan. 2013 --- \alert{0.1}}
\item ...
\item{Apr. 2014 --- \alert{0.6}, signed binaries, \texttt{guix
system}}
\item{July 2014 --- \alert{0.7}, \textbf{installable operating
system}}
\item ...
\item{29 Jan. 2015 --- \alert{0.8.1}, \textbf{ARMv7 port}}
\item ...
\item Aug. 2015 --- Reproducibility in Parallel Computing Workshop
(RepPar)
\item{5 Nov. 2015 --- \alert{0.9.0}, new service framework, etc.}
\end{itemize}
\end{frame}
\screenshot{images/better}
\begin{frame}{Status}
\Large{
\begin{itemize}
\item full-featured package manager
\item 2,600+ packages, 4 platforms
\item \textbf{Guix System Distribution$^\beta$}
\item binaries at \url{http://hydra.gnu.org}
\item tooling: auto-update, ``linting'', etc.
\item l10n: 8 languages!
\end{itemize}}
\end{frame}
\begin{frame}
\Large{
\begin{itemize}
\item $\approx$25 contributors each month
\item ... and lots of friendly people!
\item $\approx$400 commits per month
\item $\approx$200--500 new packages per release
\end{itemize}
}
\end{frame}
\begin{frame}[plain]
\vspace{0.7cm}
\Large{
\begin{itemize}
\item \textbf{install the distribution}
\item \textbf{use it}, report bugs, add packages
\item help with the \textbf{infrastructure} + admin
\item \textbf{donate} hardware/money
\item share your \textbf{ideas}!
\end{itemize}
}
\begin{textblock}{5}(7,8)
\tikz
\node[overlay, rounded corners=4, text centered,
minimum size=10mm, fill=guixorange1, text width=5cm,
inner sep=3mm, rotate=-7, opacity=.75, text opacity=1,
drop shadow={opacity=0.5}] at (3, 3) {
\textbf{your help needed!}
};
\end{textblock}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[plain]
\vfill{
\vspace{2.5cm}
\center{\includegraphics[width=0.3\textwidth]{images/GuixSD}}\\[1.0cm]
\texttt{ludo@gnu.org}\hfill{\alert{\url{http://gnu.org/software/guix/}}}
}
\end{frame}
\begin{frame}{}
\begin{textblock}{12}(2, 8)
\tiny{
Copyright \copyright{} 2010, 2012, 2013, 2014, 2015 Ludovic Courtès \texttt{ludo@gnu.org}.\\[3.0mm]
GNU Guix logo, GFDL, \url{http://gnu.org/s/guix/graphics}
Copyright of other images included in this document is held by
their respective owners.
\\[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{http://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{http://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: "american"
% compile-command: "rubber --pdf talk.tex"
% End:
%% LocalWords: Reproducibility