\documentclass[aspectratio=43]{beamer}

\usetheme{simple}

\usepackage{lmodern}
\usepackage[scale=2]{ccicons}
\usepackage{hyperref}
\usepackage[inkscapeformat=png]{svg}

\usepackage[utf8]{inputenc} % No olvides utilizar UTF8, especialmente si tu presentación está en castellano


\def\edicion{XXXV} % Edición de las jornadas
\def\fecha{Abril 2023} % Fecha de las jornadas

\title{NixOS} % Modifica el título de la presentación a tu gusto
\subtitle{Linux dentro de 10 años} % Incluye un subtítulo si lo ves necesario, o bórralo
\author{Manuel Palenzuela Merino} % Cambia el autor de la presentación
\twitter{github.com/Baitinq} % Pon tu Twitter o déjalo en blanco

% Esto no lo cambies
\institute{\edicion \ Jornadas Técnicas del GUL}
\date{\fecha}


% Página principal (no tocar)
\titlegraphic{img/logo1.png}

\begin{document}

{
    \setbeamertemplate{footline}{}
    \begin{frame}
        \titlepage
    \end{frame}
}
\addtocounter{framenumber}{-1}

\setwatermark{\includegraphics[height=8cm]{img/logo1.png}} % Marca de agua (opcional)

\section{Distribuciones de Linux "tradicionales"}
\subsection{Problemas}
\section{Que es Nix?}
\section{Nix (Lenguaje)}
\subsection{Derivaciones}
\section{Nixpkgs}
\section{Nix (Package Manager)}
\section{NixOS}
\subsection{Highlights}
\subsection{Configuraciones}
\section{El futuro de Linux}
\subsection{Mas informacion}
\section{Preguntas}

% ------------------------------------------------------------------------------------------
% La presentación empieza aquí. La primera diapositiva puede dejarse tal cual o sustituirse.
% ------------------------------------------------------------------------------------------

\begin{frame}
    \frametitle{Antes de empezar}
    \begin{enumerate}
        \item{Podeis preguntar dudas en cualquier momento}
        \item{Cuantas mas preguntas mejor :))}
        \item{Tambien se aceptan sugerencias durante la charla (mas alto, explicar algo mas a fondo, etc)}
        \item{\href{https://github.com/Baitinq/nixos-presentation}{https://github.com/Baitinq/nixos-presentation}}
    \end{enumerate}
\end{frame}

\begin{frame}
    \frametitle{Tabla de contenidos} % Puedes ponerle un título más chulo a la diapositiva con el índice de contenidos o dejar éste
    \tableofcontents % Para poblar la tabla de contenidos debes utilizar \section y \subsection apropiadamente (ver demo)
\end{frame}

\begin{frame}
    \frametitle{Distribuciones de Linux "tradicionales"}
        \begin{columns}
    \column{0.4\textwidth}
        Ej:
        \begin{itemize}
            \item{Arch Linux}
            \item{Debian}
            \item{Fedora}
            \item{Ubuntu}
        \end{itemize}
    \column{0.4\textwidth}
        Que son:
        \begin{enumerate}
            \item Package manager
            \item Repositorios
            \item Filesystem structure
            \item Etc?
        \end{enumerate}
    \end{columns}
\end{frame}

% TODO: Do sections in table of contents
\begin{frame}
    \frametitle{Problemas de distros "tradicionales"}
    \begin{itemize}
        \item Actualizaciones/cambios de configuración modifican destructivamente el estado del sistema (sobrescribiendo archivos en secuencia -\> \textbf{inconsistencia temporal})
        \item Diferentes versiones de un binario
        \item Conflictos de paquetes
        \item No hay rollbacks
        \item No hay gestión de la configuración (dotfiles)
        \item\textbf{NO HAY DETERMINISMO}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Que es Nix?}
    
    \begin{enumerate}[I]
    \item{\href{https://nix.dev/tutorials/nix-language}{Nix (lenguaje)}}
    \item{\href{https://github.com/NixOS/nixpkgs}{Nixpkgs}}
    \item{\href{https://github.com/NixOS/nix}{Nix (package manager)}}
    \end{enumerate}

\end{frame}

\begin{frame}
    \frametitle{Nix (Lenguaje)}
    \begin{itemize}
    \item Es un DSL (no un GPL!)
    \item Usado para describir \textbf{derivaciones}
    \item Dynamically typed (por el momento)
    \item Lazy
    \item Funcional (no hay side-effects)
    \item Turing completo
    \end{itemize}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Nix (lenguaje)}
    \begin{block}{}
        \begin{verbatim} 
let
  nombre = "GUL";
  saludar = x: "hola " + x + "!";
in {
  x = saludar nombre;
  z = 1;
}
        \end{verbatim}
    \end{block}
    \begin{block}{}
    \begin{verbatim}
nix-repl> { x = "hola GUL!"; z = 1; }
    \end{verbatim}
    \end{block}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Nix (lenguaje) - Derivaciones}
    \begin{block}{}
    \fontsize{10}{12}\begin{verbatim}
nix-repl> d = derivation { name = "myname"; builder ="mybuilder";
system = "mysystem"; }
nix-repl> d
«derivation /nix/store/z3hhlxbckx4g3n9sw91nnvlkjvyw754p-myname.drv»
    \end{verbatim}
    \end{block}
\begin{block}{hello.nix}
\begin{verbatim}
with import <nixpkgs> {};
stdenv.mkDerivation {
  name = "hello";
  src = ./hello-2.10.tar.gz;
}
\end{verbatim}
\end{block}
\begin{block}{}
\fontsize{10}{12}\begin{verbatim}
$ nix-build hello.nix
/nix/store/6y0mzdarm5qxfafvn2zm9nr01d1j0a72-hello
$ /nix/store/6y0mzdarm5qxfafvn2zm9nr01d1j0a72-hello/bin/hello
Hello, world!
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}
    \frametitle{Nixpkgs (the Nix packages collection)}
    \begin{itemize}
        \item Repositorio en GitHub (Licencia FOSS)
        \item Contiene definiciones de paquetes (derivations)
        \item Tambien contiene tests, librerias, etc.
        \item Ramas diferentes (rolling: master, stable: release-YY.MM)
        \item Compilado y testeado por Hydra (+=y subido al cache binario)
    \end{itemize}
\vspace{14}
    \begin{itemize}
        \item Numero de paquetes $\Rightarrow$ nixpkgs-unstable: \textbf{82918} vs AUR: \textbf{72357}
        \item Puesto numero \textbf{12} en lenguajes mas populares en GitHub (en cuanto a PRs)
    \end{itemize}
\end{frame}

\begin{frame}
        \includesvg[scale=0.4]{img/map_repo_size_fresh.svg}
\end{frame}

\begin{frame}[fragile]
    \begin{block}{aircrack-ng.nix}
\fontsize{7}{9}\begin{verbatim}
{ lib, stdenv, fetchurl, libpcap, openssl, zlib, wirelesstools
, iw, ethtool, pciutils, libnl, usbutils }:

stdenv.mkDerivation {
  pname = "aircrack-ng";
  version = "1.7";

  src = fetchurl {
    url = "https://download.aircrack-ng.org/aircrack-ng-${version}.tar.gz";
    sha256 = "1hsq1gwmafka4bahs6rc8p98yi542h9a502h64bjlygpr3ih99q5";
  };

  buildInputs = [ libpcap openssl zlib libnl iw ethtool pciutils ];

  [...]

  meta = with lib; {
    description = "Wireless encryption cracking tools";
    homepage = "http://www.aircrack-ng.org/";
    license = licenses.gpl2Plus;
    maintainers = with maintainers; [ ];
    platforms = platforms.linux;
  };
}
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Nix (package manager)}
\begin{itemize}
    \item Un gestor de paquetes puramente funcional (y deterministico)
    \item Instalación de paquetes por usuarios sin privilegios
    \item Guarda los paquetes en la Nix store (/nix/store por defecto)
    \item Cada paquete tiene su propio UUID (/nix/store/\$hash\$version\$name)
    \item Permite instalar diferentes versiones de un mismo paquete
    \item Elimina totalmente problemas de dependencias
    \item Actualizaciones y rollbacks \textbf{atomicos}
    \item Instalable en cualquier distro + MacOS (homebrew replacement?)
\end{itemize}
\begin{block}{Ejemplos:}
\begin{verbatim}
$ nix-env -i aircrack-ng
$ nix run vim
$ nix run "github:example/repo#package"
$ nix shell blender-bin#blender_2_83
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}
    \frametitle{NixOS}

    \begin{center}
        Integra profundamente Nix (los 3 tipos) en una distribucion de Linux!
    \end{center}
    \vspace{20}
    \begin{center}
        \includegraphics[scale=0.1]{img/1280px-NixOS_logo.svg.png}
    \end{center}
\end{frame}

%TODO: IMAGES

\begin{frame}
    \frametitle{NixOS Highlights}

    \begin{itemize}
\item Actualizaciones atomicas (software & configuration)
\item Actualizaciones fiables (y rollbacks - configuración vinculada a la versión de software correcta + recargas/reinicios del servicio)
\item Rollbacks
\item Reproducible
\item Configuracion del OS \textbf{declarativa}
\begin{itemize}
\item TODO tu sistema operativo en un repositorio git
\end{itemize}
\item \textbf{DETERMINISMO}
    \end{itemize}
\end{frame}

\begin{frame}
\frametitle{Mi Configuracion}
    \includegraphics[scale=0.34]{img/20230413_10h27m54s_grim.png}
\end{frame}

\begin{frame}[fragile]
\frametitle{Configuracion minima de NixOS}
\begin{block}{configuration.nix}
\begin{verbatim}
{
    boot.loader.grub.device = "/dev/sda";

    fileSystems."/".device = "/dev/sda1";

    services.sshd.enable = true;
}
\end{verbatim}
\end{block}
\begin{block}{}
\begin{verbatim}
$ nixos-rebuild switch -I nixos-config=configuration.nix
$ nixos-rebuild switch --rollback
$ nixos-rebuild test -I nixos-config=configuration.nix
$ nixos-rebuild build-vm -I nixos-config=configuration.nix
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{Configuraciones NixOS}
\begin{block}{configuration.nix}
\fontsize{9}{11}\begin{verbatim}
{ config, pkgs, ...} :
{
     imports = [ ./hardware.nix ];

     environment.systemPackages = with pkgs; [ thunderbird firefox vim ];
     
     users.users."alice" = {
       isNormalUser = true;
       home = "/home/alice";
       extraGroups = [ "wheel" "networkmanager" ];
    };

     services.xserver = {
       windowManager.i3.enable = true;
       displayManager.sddm.enable = true;
       videoDrivers = [ "nvidia" ];
     };

     networking.firewall.enable = true;
}
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}
    \frametitle{El futuro de Linux}
    \begin{itemize}
        \item NixOS tiene problemas
        \item Alternativas: 
        \begin{itemize}
        \item Fedora Silverblue?
        \item Seguir como estamos?
        \end{itemize}
    \end{itemize}
    \begin{center}
            \includegraphics[scale=0.34]{img/1366_2000.jpg}
    \end{center}
\end{frame}

\begin{frame}
\frametitle{Mas informacion}
\begin{center}
\begin{itemize}
    \item \begin{center}NixOS modules\end{center}
    \item \begin{center}Overriding\end{center}
    \item \begin{center}Flakes\end{center}
    \item \begin{center}Etc..\end{center}
\end{itemize}
\end{center}
\begin{columns}
        \column{0.6\textwidth}
\begin{itemize}
    \item \href{https://nixos.org}{NixOS website}
    \item  \href{https://nixos.org/manual/nixos/stable/}{Nix Manuals}
    \item  \href{https://nixos.org/guides/nix-pills/}{\textbf{Nix Pills}}
    \item  \href{https://learnxinyminutes.com/docs/nix/}{Learn X in Y minutes, where X=nix}
\end{itemize}
        \column{0.4\textwidth}
            \includegraphics[scale=0.4]{img/207px-Home-nixos-logo.png}
\end{columns}
\end{frame}

\begin{frame}
    \frametitle{Gracias por escuchar!}
    \begin{center}
            \includegraphics[scale=0.4]{img/207px-Home-nixos-logo.png}
            \begin{itemize}
                \item Preguntas
                \item Feedback
            \end{itemize}
    \end{center}
    \vspace{44}
    \href{https://github.com/Baitinq/nixos-config}{https://github.com/Baitinq/nixos-config}
\end{frame}


\end{document}
