[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
01/04: talks: Add FOSDEM 2019 minimalistic talk.
From: |
Ludovic Courtčs |
Subject: |
01/04: talks: Add FOSDEM 2019 minimalistic talk. |
Date: |
Sun, 3 Feb 2019 15:18:49 -0500 (EST) |
civodul pushed a commit to branch master
in repository maintenance.
commit 6185134209ac198b58251a7f6ec2aafe78567c54
Author: Ludovic Courtès <address@hidden>
Date: Thu Jan 31 08:54:42 2019 +0100
talks: Add FOSDEM 2019 minimalistic talk.
* talks/fosdem-2019: New directory.
---
.gitignore | 8 +
talks/fosdem-2019/distributions/outline.org | 142 +++++
.../minimalist/images/Guix-horizontal-print.pdf | 1 +
talks/fosdem-2019/minimalist/images/Guix-white.pdf | Bin 0 -> 8483 bytes
talks/fosdem-2019/minimalist/images/buffet.jpg | Bin 0 -> 133073 bytes
.../images/cacm-felleisen-programmable.png | Bin 0 -> 141710 bytes
talks/fosdem-2019/minimalist/images/cacm2.png | Bin 0 -> 457762 bytes
.../fosdem-2019/minimalist/images/guix-refcard.pdf | Bin 0 -> 55185 bytes
.../images/hashicorp-conf-lang-for-full.jpg | Bin 0 -> 226834 bytes
.../minimalist/images/nix-shell-escapes.png | 1 +
talks/fosdem-2019/minimalist/images/sloc.png | Bin 0 -> 34493 bytes
talks/fosdem-2019/minimalist/outline.org | 87 +++
talks/fosdem-2019/minimalist/talk.tex | 657 +++++++++++++++++++++
13 files changed, 896 insertions(+)
diff --git a/.gitignore b/.gitignore
index 221c86e..52b120f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -155,3 +155,11 @@
/cdn/terraform/terraform.tfstate
/cdn/terraform/terraform.tfstate.backup
/cdn/terraform/.terraform
+/talks/fosdem-2019/minimalist/talk.aux
+/talks/fosdem-2019/minimalist/talk.log
+/talks/fosdem-2019/minimalist/talk.nav
+/talks/fosdem-2019/minimalist/talk.out
+/talks/fosdem-2019/minimalist/talk.pdf
+/talks/fosdem-2019/minimalist/talk.snm
+/talks/fosdem-2019/minimalist/talk.toc
+/talks/fosdem-2019/minimalist/talk.vrb
diff --git a/talks/fosdem-2019/distributions/outline.org
b/talks/fosdem-2019/distributions/outline.org
new file mode 100644
index 0000000..15132ae
--- /dev/null
+++ b/talks/fosdem-2019/distributions/outline.org
@@ -0,0 +1,142 @@
+#+TITLE: GNUÂ Guixâs take on a new approach to software distribution
+
+* Summary
+
+In a time where distros are sometimes viewed as âthat thing you run
+inside a containerâ, where alternative approaches to software
+distribution are taking steamâfrom CONDA and pip to Flatpak and
+Dockerâis there still room for the traditional approach to GNU/Linux
+distros?
+
+As GNUÂ Guix reaches 1.0 after six years of development, this talk will
+reflect on what Guix has to offer to users and how that compares to
+other approaches. You can view Guix as a package manager, but with
+transactional upgrades and roll-backs. Or you can view it as a
+standalone distribution like Debian but with a declarative interface Ă
+la Puppet. Guix is also an environment manager Ă la VirtualEnv but not
+limited to a single language, a container provisioning tool likeâthink
+âDockerfileâ but with reproducibility and transparency built in, and a
+continuous integration/deployment toolâwhy write a lengthy
+âgitlab-ci.ymlâ when you can reuse your package definition?
+
+In this talk I will give an overview of all these tools Guix provides
+and discuss our journey from a âpackage managerâ kind of project to a
+complete software deployment toolbox. I will present key properties
+that set Guix apart: transparency through reproducible builds and
+provenance tracking, and practical user freedom through a broad range of
+discoverable APIs that we hope invite users to hack. We believe Guix
+has shown that thereâs still room for innovation in the distro space,
+and still value in distro-style software distribution.
+
+* Abstract
+
+As GNUÂ Guix reaches 1.0, this talk will reflect on what it has to offer
+to users and how it compares to other approachesâfrom CONDA and pip to
+Flatpak and Docker. Guix is not only a transactional package manager
+and declarative GNU/Linux distribution: itâs also an environment
+manager, a container provisioning tool, and more. We will describe
+these tools and our journey to 1.0, emphasizing key properties that set
+Guix apart: reproducibility, transparency, and hackability.
+
+
+* intro: sad state of distros
+
+** the âdepressed distro developers trackâ?
+
+** letâs face it, distros are losing momentum
+
+** âattacksâ on distros suggest theyâre not serving user needs
+
+*** for users: pip, CONDA, Cargo, Cabal, etc.
+
+*** for developers: VirtualEnv, Spack/EasyBuild/modules, npm, etc.
+
+*** for both: Flatpak, snap, Docker, Vagrant, etc.
+
+**** âthat thing you run Docker onâ
+
+**** âissuesâ: snap 2048 mining, Docker vulns, Docker license opacity
+
+*** for admins: Ansible, Puppet, Propellor, etc.
+
+** are distros doomed? are they a bad idea?
+
+ - i never wanted to be a distro developer, i became one by accident
+ - i was a happy Debian user but i never imagined working *on* Debian
+ packaging could be interesting
+
+* distros are invaluable
+
+** license control, QA (integration)
+
+** âcurated package collectionâ vs jungle-everyone-uploads
+
+** collective control
+
+** transparency? sort-of, can do better!
+
+** flexibility? not quite!
+
+** dev tools? hmm
+
+** conclusion: letâs raise the bar!
+
+* Guix
+
+** liberating, dependable, hackable
+
+*** we protect your freedom (and security!), empower you
+
+*** transactional upgrades and rollbacks => demo
+
+*** reproducibility, bootstrapping!
+
+*** you can inspect package defs, rebuild them, grep/M-. the whole system
+
+** hacking packages: demo
+
+ #+begin_src sh
+ tar xf $(guix build --source hello)
+ cd hello*
+ guix environment hello
+ ./configure
+ make -j5
+ #+end_src
+
+** building app bundles: guix pack
+
+** reproducibility n°1: guix package -m & guix describe & guix pull
+
+** reproducibility n°1: declarative & stateless OS configs
+
+** reproducibility n°2: bit-reproducibility
+
+** building from source: bootstrappable.org
+
+* open questions
+
+** what to do with all the software out there? (Cabal, npm, etc.)
+
+* whatâs cooking?
+
+** 1.0!
+
+** 9K+ packages + importers + updaters
+
+** graphical installer
+
+** better UI
+
+** package customization on the command line
+
+** more resilient build farm
+
+** better ARM support
+
+* take-away message
+
+** provides compelling tools for users, devs, admins
+
+** makes it easy to be a distro dev
+
+** takes transparency & hackability to the next level
diff --git a/talks/fosdem-2019/minimalist/images/Guix-horizontal-print.pdf
b/talks/fosdem-2019/minimalist/images/Guix-horizontal-print.pdf
new file mode 120000
index 0000000..5c30073
--- /dev/null
+++ b/talks/fosdem-2019/minimalist/images/Guix-horizontal-print.pdf
@@ -0,0 +1 @@
+/home/ludo/src/guix-maintenance/talks/bosc-2017/images/Guix-horizontal-print.pdf
\ No newline at end of file
diff --git a/talks/fosdem-2019/minimalist/images/Guix-white.pdf
b/talks/fosdem-2019/minimalist/images/Guix-white.pdf
new file mode 100644
index 0000000..3641e7f
Binary files /dev/null and b/talks/fosdem-2019/minimalist/images/Guix-white.pdf
differ
diff --git a/talks/fosdem-2019/minimalist/images/buffet.jpg
b/talks/fosdem-2019/minimalist/images/buffet.jpg
new file mode 100644
index 0000000..5ed6a1e
Binary files /dev/null and b/talks/fosdem-2019/minimalist/images/buffet.jpg
differ
diff --git
a/talks/fosdem-2019/minimalist/images/cacm-felleisen-programmable.png
b/talks/fosdem-2019/minimalist/images/cacm-felleisen-programmable.png
new file mode 100644
index 0000000..64a302f
Binary files /dev/null and
b/talks/fosdem-2019/minimalist/images/cacm-felleisen-programmable.png differ
diff --git a/talks/fosdem-2019/minimalist/images/cacm2.png
b/talks/fosdem-2019/minimalist/images/cacm2.png
new file mode 100644
index 0000000..eb48184
Binary files /dev/null and b/talks/fosdem-2019/minimalist/images/cacm2.png
differ
diff --git a/talks/fosdem-2019/minimalist/images/guix-refcard.pdf
b/talks/fosdem-2019/minimalist/images/guix-refcard.pdf
new file mode 100644
index 0000000..0cf24c1
Binary files /dev/null and
b/talks/fosdem-2019/minimalist/images/guix-refcard.pdf differ
diff --git
a/talks/fosdem-2019/minimalist/images/hashicorp-conf-lang-for-full.jpg
b/talks/fosdem-2019/minimalist/images/hashicorp-conf-lang-for-full.jpg
new file mode 100644
index 0000000..e34fd6f
Binary files /dev/null and
b/talks/fosdem-2019/minimalist/images/hashicorp-conf-lang-for-full.jpg differ
diff --git a/talks/fosdem-2019/minimalist/images/nix-shell-escapes.png
b/talks/fosdem-2019/minimalist/images/nix-shell-escapes.png
new file mode 120000
index 0000000..41151b2
--- /dev/null
+++ b/talks/fosdem-2019/minimalist/images/nix-shell-escapes.png
@@ -0,0 +1 @@
+../../../cufp-2016/images/nix-shell-escapes.png
\ No newline at end of file
diff --git a/talks/fosdem-2019/minimalist/images/sloc.png
b/talks/fosdem-2019/minimalist/images/sloc.png
new file mode 100644
index 0000000..e47e9f9
Binary files /dev/null and b/talks/fosdem-2019/minimalist/images/sloc.png differ
diff --git a/talks/fosdem-2019/minimalist/outline.org
b/talks/fosdem-2019/minimalist/outline.org
new file mode 100644
index 0000000..0d523d1
--- /dev/null
+++ b/talks/fosdem-2019/minimalist/outline.org
@@ -0,0 +1,87 @@
+#+TITLE: Building a whole distro on top of a minimalistic language
+
+* Summary
+
+GNUÂ Guix is a package manager, GNU/Linux distribution, and more
+generally a âsoftware deployment toolboxâ featuring key features such as
+transactional upgrades and rollbacks, declarative operating system
+configuration, and more. Guix has become a relatively large piece of
+software but a key aspect of it is that Guix builds on Scheme, a Lisp
+dialect known for its emphasis on minimalism. From day one, use of
+Scheme as its single implementation language has shaped Guix.
+
+This talk will be about what it means for Guix to be implemented as a
+set of libraries on top of this tiny core that Scheme is. Together we
+will have a guided tour through Guixâ interfaces, be they âprogrammingâ
+or âuserâ interfaces; weâll look at its embedded domain-specific
+languages (EDSLs) that make it just as clear as your favorite
+YAML/JSON/XML thing while retaining the full power (and joy!) of a
+general-purpose programming language. Weâll discuss the features of
+Scheme that make it possible. I will share my thoughts on how such a
+design can empower users and how well this has worked in practice.
+
+* Abstract
+
+GNUÂ Guix is a package manager and GNU/Linux distribution that builds on
+Scheme, a Lisp dialect known for its emphasis on minimalism. This talk
+will be an exploration of Guixâ use of Schemeâs extensibility to build
+high-level abstractions and user interfaces in a broad sense.
+
+* intro
+
+** Babel tower of GNU/Linux
+
+** proliferation of specific âlanguagesâ
+
+** âauberge espagnoleâ or âpotluckâ
+
+** a strength, but also a hindrance for users: practical user freedom?
+
+* Lisp mystique
+
+** ânot by piling feature upon featureâ
+
+** âThe truth is that Lisp âŚâ (GHM 2014)
+
+**
[[https://cacm.acm.org/magazines/2018/3/225475-a-programmable-programming-language/fulltext][âlanguage-oriented
programmingâ with Racket]]
+
+** âescaping DSL hell by having parentheses all the way downâ
+
+* GNU/Linux distro as a Scheme library
+
+** minimalism: 500K SLOC
+** thesis: embedding the DSL provides tools: lint, refresh, etc.
+
+*** full-blown language supports abstraction ("package" objects, etc.)
+
+*** EDSL thanks to macros (deep or shallow embedding)
+
+*** expose data structures
+
+*** IDE
+
+** why stop here? ELS diagram Nix/Guix side by side
+
+* Unification beyond the distro
+
+
+** the problem
+
+ - lots of glueing, no big picture
+ + different languages, approaches, config file syntax
+ + sometimes redundant
+
+** The initrd: 'expression->initrd'
+
+** VMs: 'expression->linux-vm'
+
+** PID 1: example Shepherd service
+
+*** dependency graph of services
+
+*** static checks
+
+** more services: mcron
+
+** service in container
+
diff --git a/talks/fosdem-2019/minimalist/talk.tex
b/talks/fosdem-2019/minimalist/talk.tex
new file mode 100644
index 0000000..6e818ce
--- /dev/null
+++ b/talks/fosdem-2019/minimalist/talk.tex
@@ -0,0 +1,657 @@
+\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}
+\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{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}}}
+
+\title{Building a whole distro on top of a minimalistic language}
+
+\author{Ludovic Courtès}
+\date{FOSDEM, 2 February 2019}
+
+\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
+
+\begin{frame}[plain]
+ \begin{tikzpicture}[remember picture, overlay]
+ %
https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Buffet_brekafast_%285078306699%29.jpg/1024px-Buffet_brekafast_%285078306699%29.jpg
+ \node [at=(current page.center), inner sep=0pt]
+ {\includegraphics[width=\paperwidth]{images/buffet}};
+ \node [at=(current page.center), text=white, text opacity=1]
+ {\Huge{\textbf{the GNU/Linux potluck}}};
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=white}
+\begin{frame}[plain]
+ \begin{tikzpicture}[remember picture, overlay]
+ \node [at=(current page.center), inner sep=0pt]
+
{\includegraphics[width=0.7\paperwidth]{images/Guix-horizontal-print}};
+ \end{tikzpicture}
+\end{frame}
+\setbeamercolor{normal text}{fg=white,bg=black}
+
+\screenshot{images/sloc}
+
+\setbeamercolor{normal text}{bg=white}
+\begin{frame}[fragile]
+ \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.3\paperheight]{images/guix-refcard}};
+ \end{tikzpicture}
+\end{frame}
+\setbeamercolor{normal text}{fg=white,bg=black}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+ \vspace{-1cm}
+ \small{
+(\alert{operating-system}
+ (host-name "schememachine")
+ (timezone "Europe/Brussels")
+ (locale "fr_BE.utf8")
+ (bootloader (\alert{bootloader-configuration}
+ (bootloader grub-efi-bootloader)
+ (target "/boot/efi")))
+ (file-systems (cons (\alert{file-system}
+ (device (file-system-label "my-root"))
+ (mount-point "/")
+ (type "ext4"))
+ %base-file-systems))
+ (users (cons (\alert{user-account}
+ (name "charlie")
+ (group "users")
+ (home-directory "/home/charlie"))
+ %base-user-accounts))
+ (services (cons* (\alert{service} dhcp-client-service-type)
+ (\alert{service} openssh-service-type)
+ %base-services)))
+ }
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+\$ guix system build config.scm
+\textrm{...}
+
+\$ guix system vm config.scm
+\textrm{...}
+
+\$ guix system container config.scm
+\textrm{...}
+
+\$ guix system reconfigure config.scm
+\textrm{...}
+ \end{semiverbatim}
+\end{frame}
+
+
+%% \screenshot{images/nix-shell-escapes}
+
+%% \setbeamercolor{normal text}{bg=guixred3,fg=white}
+%% \begin{frame}[plain]
+%% \begin{quotation}
+%% \noindcalent
+%% \LARGE{``Escaping DSL hell by having parentheses all the way down''}
+%% \end{quotation}
+%% \vspace{1cm}
+%% \hfill{-- talk by Tom Hall}\\
+%%
\hfill{\small{\url{https://skillsmatter.com/skillscasts/5488-escaping-dsl-hell-by-having-parenthesis-all-the-way-down}}}
+%% \end{frame}
+%% \setbeamercolor{normal text}{bg=black,fg=white}
+
+%c
https://www.hashicorp.com/resources/keynote-terraform-free-saas-tier-hcl-upgrades
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[remember picture, overlay]
+ \node [at=(current page.center), inner sep=0pt]
+
{\includegraphics[width=\paperwidth]{images/hashicorp-conf-lang-for-full}};
+ \node<2-> [at=(current page.center), text width=10cm,
+ fill=black, inner sep=5cm, opacity=.5, text opacity=1]
+ {\LARGE{``Hereâs one of my favorite features. \\[.3cm]
+ The new \texttt{for} keyword allows you \\ to iterate
+ over lists and generate lists and maps. \\[.3cm]
+ This gives you \textbf{a whole bunch of new flexibility}.''\par}};
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixblue1,fg=white}
+\begin{frame}[plain, fragile]
+ \frametitle{}
+
+ \vspace{0.5cm}
+ \textrm{\Huge{%
+ The truth is that Lisp is not the right language for
+ any particular problem. Rather, Lisp encourages one to attack a
+ new problem by \textbf{implementing new languages} tailored to that
+ problem. }}
+
+ \vspace{1cm}
+ \hfill{-- Abelson \& Sussman, 1987}
+\end{frame}
+\setbeamercolor{normal text}{bg=black,fg=white}
+
+%% \setbeamercolor{normal text}{bg=guixblue2,fg=white}
+%% \begin{frame}
+%% \frametitle{}
+
+%% \vspace{0.5cm}
+%% \textrm{\Huge{%
+%% Programming languages should be designed not by piling feature on top
of
+%% feature, but by removing the weaknesses and restrictions that make
+%% additional features appear necessary.
+%% }}
+
+%% \vspace{1cm}
+%% \hfill{-- Clinger et al., 1998}
+%% \end{frame}
+%% \setbeamercolor{normal text}{bg=black,fg=white}
+
+%% \screenshot{images/cacm-felleisen-programmable}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+ \small{
+(define hello
+ (\alert{package}
+ (name "hello")
+ (version "2.8")
+ (source (\alert{origin}
+ (method url-fetch)
+ (uri (string-append
+ "http://ftp.gnu.org/\textrm{...}/hello-" version
+ ".tar.gz"))
+ (sha256 (base32 "0wqd\textrm{...}dz6"))))
+ (\alert{build-system} gnu-build-system)
+ (synopsis "An example GNU package")
+ (description "Produce a friendly greeting.")
+ (home-page "https://gnu.org/software/hello/")
+ (license gpl3+)))
+
+;; \textsl{Yields: /gnu/store/\textrm{...}-hello-2.8}
+}
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+\Large{
+ (service openssh-service-type)
+}
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+\Large{
+ (service openssh-service-type
+ (openssh-configuration
+ (x11-forwarding? #true)
+ (permit-root-login 'without-password)))
+}
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+\Large{
+ ;; Sets up cgit + nginx + fcgiwrap.
+ (service cgit-service-type
+ (cgit-configuration
+ (repository-directory "/srv/git")
+ (project-list (list "foo" "bar"))))
+}
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+(\alert{operating-system}
+ ;; \textrm{...}
+ (services (remove (lambda (service)
+ (eq? ntp-service-type
+ (service-kind service)))
+ %desktop-services)))
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+(\alert{define} %my-services
+ ;; My very own list of services.
+ (\alert{modify-services} %desktop-services
+ (mingetty-service-type config =>
+ (mingetty-configuration
+ (\alert{inherit} config)
+ (motd (plain-file "motd"
+ "Howdy FOSDEM!"))))
+ (upower-service-type config =>
+ (upower-configuration
+ (\alert{inherit} config)
+ (ignore-lid? #true)
+ (percentage-critical 5.)))))
+ \end{semiverbatim}
+\end{frame}
+
+
+%% \begin{frame}[plain]
+%% \Large{$\Rightarrow$ plan working
+%% \textbf{as expected}}
+%% \\[1cm]
+%% \uncover<2->{\Huge{\textbf{DSL embedding helps!}}}
+%% \end{frame}
+
+\begin{frame}
+ \Large{
+ \begin{itemize}
+ \item Emacs and Web user interfaces
+ \item \texttt{guix refresh} package auto-updater
+ \item \texttt{guix lint} package checker
+ \item \texttt{guix graph} dependency graph viewer
+ \item \texttt{guix system extension-graph} service composition viewer
+ \item ...
+ \end{itemize}
+ }
+\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] at (-1,-0.5) {\alert{Guile}, make, etc.}
+%% node[builder] at ( 0,-0.5) {\alert{Guile}, make, etc.}
+%% node[builder] at ( 1,-0.5) {\alert{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]
+%% (client.south) edge [out=-90, in=0, ->] node[below, sloped]{RPCs}
(daemon.east);
+%% \path[->, very thick, draw=guixorange1]
+%% (daemon) edge (builders);
+%% \end{tikzpicture}
+%% \end{frame}
+
+\setbeamercolor{normal text}{bg=guixblue2}
+\begin{frame}
+ \Huge{\textbf{Unification\\beyond the ``distro''.}}
+\end{frame}
+\setbeamercolor{normal text}{fg=white,bg=black}
+
+\begin{frame}[fragile]
+ \frametitle{Nix \& string interpolation}
+
+ {
+ \begin{semiverbatim}
+\{ \tikz[baseline]{\node[anchor=base](formalparams){fetchurl, stdenv};}
\}\tikz[baseline]{\node[anchor=base](colon){:};}
+
+\tikz[baseline]{\node[anchor=base](stdenv){stdenv};}.\tikz[baseline]{\node[anchor=base](funcall){\alert<1>{mkDerivation}};}
\{
+ name = "hello-2.3";
+ src = fetchurl \{
+ url = mirror://gnu/hello/hello-2.3.tar.bz2;
+ sha256 = "0c7vijq8y68...";
+ \};
+ \uncover<2->{\tikz[baseline]{\node[anchor=base](bash){preCheck = \alert{"echo
'Test suite coming up!'"};};}}
+ meta = \{
+ description = "Produces a friendly greeting";
+ homepage = http://www.gnu.org/software/hello/;
+ license = "GPLv3+";
+ \};
+\}
+ \end{semiverbatim}
+ }
+
+ \begin{textblock}{5}(10, 3)
+ \tikz{\node<1>(labelcolon)[fill=white, text=black]{function definition};}
+ \end{textblock}
+
+ \begin{textblock}{5}(11, 6)
+ \tikz{\node<1>(labelfuncall)[fill=white, text=black]{function call};}
+ \end{textblock}
+
+ \begin{textblock}{5}(11, 9)
+ \tikz{\node<2>(labelbash)[fill=white, text=black]{Bash snippet};}
+ \end{textblock}
+
+ \begin{tikzpicture}[overlay]
+ \path[->, thick]<1>(labelcolon) edge (colon);
+ \path[->, thick]<1>(labelfuncall) edge (funcall);
+ \path[->, thick]<2>(labelbash) edge (bash);
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=white}
+\screenshot{images/nix-shell-escapes}
+\setbeamercolor{normal text}{bg=black}
+
+\begin{frame}[fragile]{The Initial RAM Disk}
+ \pause
+ \begin{semiverbatim}
+(expression->initrd
+ (\alert{with-imported-modules} (source-module-closure
+ '((gnu build linux-boot)
+ (guix build utils)))
+ \alert{\tikz[baseline]{\node[anchor=base](tilde){#~};}}(begin
+ (\alert{use-modules} (gnu build linux-boot)
+ (guix build utils))
+
+ (boot-system #:mounts '\alert{#$}file-systems
+ #:linux-modules '\alert{#$}linux-modules
+ #:linux-module-directory '\alert{#$}kodir)))
+ \end{semiverbatim}
+
+ \begin{textblock}{4}(7, 3)
+ \tikz{\node<3->(labeltilde)[fill=white, text=black]{\large{\textbf{code
staging}}};}
+ \end{textblock}
+
+ \begin{tikzpicture}[overlay]
+ \path[->, thick]<3-> (labeltilde) edge (tilde);
+ \end{tikzpicture}
+\end{frame}
+
+\begin{frame}
+ \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=6cm,
+ 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->(shepherd)[userland]{\textbf{\Large{PID 1: GNU Shepherd}}
+ \\ 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 (shepherd);
+ \path[->, very thick, draw=guixred1]<6->
+ (shepherd) 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 (shepherd.east) {%
+ \Large{Guile}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\begin{frame}[fragile]{System Services}
+ \begin{semiverbatim}
+;; \textsl{Service definition for the GNU Shepherd (PID 1)}
+;; \textsl{embedded in GuixSD.}
+
+(\alert{shepherd-service}
+ (provision '(mysql))
+ (documentation "Run the MySQL server.")
+ (start (let ((my.cnf (mysql-configuration-file config)))
+ \alert{#~}(make-forkexec-constructor
+ (list (string-append \alert{#$}mysql "/bin/mysqld")
+ (string-append "--defaults-file="
+ \alert{#$}my.cnf))
+ #:user "mysql" #:group "mysql")))
+ (stop \alert{#~}(make-kill-destructor)))
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+;; Shepherd service to mount/unmount a file system.
+
+(\alert{with-imported-modules} '((gnu build file-systems))
+ (\alert{shepherd-service}
+ (provision '(file-system-/home))
+ (start \alert{#~}(lambda ()
+ (mount "/dev/foo" "/home" "ext4")))
+ (stop \alert{#~}(lambda ()
+ (umount "/home")))))
+ \end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{semiverbatim}
+;; Shepherd service for the BitlBee IRC gateway daemon.
+\uncover<2->{(\alert{with-imported-modules} '((gnu build linux-container))}
+ (\alert{shepherd-service}
+ (provision '(bitlbee))
+ (requirement '(loopback))
+ (start
\alert{#~}(\alert<2>{make-forkexec-constructor\uncover<2->{/container}}
+ (list \alert{#$}(file-append bitlbee "/sbin/bitlbee")
+ \textrm{...})))
+ (stop \highlight{#~}(make-kill-destructor)))\uncover<2->{)}
+ \end{semiverbatim}
+
+ \begin{tikzpicture}[overlay]
+ \node<2->[rounded corners=4, text centered,
+ fill=guixorange1, text width=4cm,
+ inner sep=3mm, rotate=5, opacity=.75, text opacity=1,
+ drop shadow={opacity=0.5}] at (9, 0) {
+ \large{\textbf{containerized service!}}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixblue2}
+\begin{frame}
+ \Huge{\textbf{Wrap-up.}}
+\end{frame}
+\setbeamercolor{normal text}{fg=white,bg=black}
+
+\begin{frame}{}
+ \LARGE{
+ \begin{itemize}
+ \item distro \& tools as a \highlight{Scheme library}
+ \item \highlight{hackability} through uniformity
+ \item \highlight{code staging} techniques to glue it all
+ \end{itemize}
+ }
+\end{frame}
+
+\begin{frame}{Join us now, share the parens!}
+ \vspace{0.7cm}
+ \Large{
+ \begin{itemize}
+ \item \textbf{install the distribution}
+ \item \textbf{use it}, report bugs, add packages
+ \item share your \textbf{ideas}!
+ \end{itemize}
+ }
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[plain]
+
+\vfill{
+ \vspace{1.5cm}
+ \center{\includegraphics[width=0.3\textwidth]{images/Guix-white}}\\[1.0cm]
+ address@hidden://gnu.org/software/guix/}}}
+}
+
+\end{frame}
+
+\begin{frame}{}
+
+ \begin{textblock}{12}(2, 8)
+ \tiny{
+ Copyright \copyright{} 2010, 2012--2019 Ludovic Courtès address@hidden
+ GNU Guix logo, CC-BY-SA 4.0, \url{https://gnu.org/s/guix/graphics}
+
+ Buffet picture under CC-BY-SA 2.0 by Matt @ PEK,
+
\url{https://commons.wikimedia.org/wiki/File:Buffet_brekafast_(5078306699).jpg}.\\
+ GNU~Guix Reference Card under GFDL~1.3+.
+
+ 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: