Initial commit (unfinished, up to flakes)
This commit is contained in:
commit
7f1f5c16c0
12 changed files with 515 additions and 0 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
||||||
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/direnv
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=direnv
|
||||||
|
|
||||||
|
### direnv ###
|
||||||
|
.direnv
|
||||||
|
.envrc
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/direnv
|
||||||
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1765608474,
|
||||||
|
"narHash": "sha256-9Wx53UK0z8Di5iesJID0tS1dRKwGxI4i7tsSanOHhF0=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "28bb483c11a1214a73f9fd2d9928a6e2ea86ec71",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-25.11",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
64
flake.nix
Normal file
64
flake.nix
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
}: let
|
||||||
|
supportedSystems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
];
|
||||||
|
|
||||||
|
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||||
|
|
||||||
|
nixpkgsFor = forAllSystems (system: import nixpkgs {inherit system;});
|
||||||
|
in {
|
||||||
|
packages = forAllSystems (system: let
|
||||||
|
pkgs = nixpkgsFor.${system};
|
||||||
|
src = ./src;
|
||||||
|
slides = "${src}/slides.md";
|
||||||
|
presenterm_config = ./presenterm_config.yaml;
|
||||||
|
in rec {
|
||||||
|
run-presentation = pkgs.writeShellApplication {
|
||||||
|
name = "run-presentation";
|
||||||
|
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
presenterm
|
||||||
|
nix # For snippet execution
|
||||||
|
];
|
||||||
|
|
||||||
|
text = ''
|
||||||
|
presenterm -x ${slides} -c ${presenterm_config}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
run-presentation-kitty = pkgs.writeShellApplication {
|
||||||
|
name = "run-presentation-kitty";
|
||||||
|
|
||||||
|
runtimeInputs = [
|
||||||
|
run-presentation
|
||||||
|
pkgs.kitty
|
||||||
|
];
|
||||||
|
|
||||||
|
text = ''
|
||||||
|
kitty --config=NONE run-presentation
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
});
|
||||||
|
devShells = forAllSystems (
|
||||||
|
system: let
|
||||||
|
pkgs = nixpkgsFor.${system};
|
||||||
|
in {
|
||||||
|
default = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
presenterm
|
||||||
|
python3Packages.weasyprint
|
||||||
|
markdown-oxide
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
13
presenterm_config.yaml
Normal file
13
presenterm_config.yaml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
snippet:
|
||||||
|
exec:
|
||||||
|
custom:
|
||||||
|
nix:
|
||||||
|
filename: "snippet.nix"
|
||||||
|
|
||||||
|
# A prefix that indicates a line that starts with it should not be visible but should be executed if the
|
||||||
|
# snippet is marked with `+exec`.
|
||||||
|
hidden_line_prefix: "/// "
|
||||||
|
|
||||||
|
# A list of commands that will be ran one by one in the same directory as the snippet is in.
|
||||||
|
commands:
|
||||||
|
- ["nix-instantiate", "--eval", "--strict" ,"$pwd/snippet.nix"]
|
||||||
1
src/data
Normal file
1
src/data
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Hola mundo
|
||||||
BIN
src/images/doge.png
Normal file
BIN
src/images/doge.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 97 KiB |
BIN
src/images/nix-star-history-20251215.png
Normal file
BIN
src/images/nix-star-history-20251215.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 403 KiB |
BIN
src/images/nixos-curve.jpg
Normal file
BIN
src/images/nixos-curve.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
BIN
src/images/nixos-logo-25.11-xantusia-lores.png
Normal file
BIN
src/images/nixos-logo-25.11-xantusia-lores.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 299 KiB |
BIN
src/images/question-mark.png
Normal file
BIN
src/images/question-mark.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 330 KiB |
401
src/slides.md
Normal file
401
src/slides.md
Normal file
|
|
@ -0,0 +1,401 @@
|
||||||
|
---
|
||||||
|
title: Introducción a Nix & NixOS
|
||||||
|
sub_title: Sistemas y paquetes que funcionan donde y cuando quieras
|
||||||
|
author: Pedro Rey
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introducción
|
||||||
|
|
||||||
|
NixOS está de moda
|
||||||
|
===
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
La _temida_ curva de aprendizaje de Nix(OS)
|
||||||
|
===
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
¿ Qué es Nix, NixOS, Nixpkgs ?
|
||||||
|
===
|
||||||
|
|
||||||
|
<!-- pause -->
|
||||||
|
|
||||||
|
## Muchos nombres, muy parecidos no?
|
||||||
|
|
||||||
|
<!-- pause -->
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
Nix
|
||||||
|
===
|
||||||
|
|
||||||
|
- Gestor de paquetes
|
||||||
|
- Declarativo
|
||||||
|
- Reproducible
|
||||||
|
- Sencillo
|
||||||
|
|
||||||
|
<!-- pause -->
|
||||||
|
|
||||||
|
Declarativo?
|
||||||
|
===
|
||||||
|
|
||||||
|
> El usuario especifica el estado final deseado y Nix se encarga de conseguirlo.
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
Nix, el lenguaje
|
||||||
|
===
|
||||||
|
|
||||||
|
> Sólo existe por y para Nix, el gestor de paquetes: para describir paquetes y configuraciones, así como sus variantes y composiciones. **No está pensado para casos de uso generales**.
|
||||||
|
|
||||||
|
- Sencillo
|
||||||
|
- Funcional
|
||||||
|
- Lazy
|
||||||
|
- Turing completo
|
||||||
|
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
fibonacci = n:
|
||||||
|
if n == 0 then
|
||||||
|
0
|
||||||
|
else if n == 1 then
|
||||||
|
1
|
||||||
|
else
|
||||||
|
fibonacci(n - 1) + fibonacci(n - 2);
|
||||||
|
in
|
||||||
|
fibonacci 12
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
NixOS
|
||||||
|
===
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Nix como gestor de paquetes
|
||||||
|
- _OS as code_
|
||||||
|
- Se encarga **solo** de la parte declarativa
|
||||||
|
- Datos dinámicos (estado) y **carpeta de usuario**, **NO**
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
users.users.john= {
|
||||||
|
isNormalUser = true;
|
||||||
|
home = "/home/john";
|
||||||
|
description = "John Doe";
|
||||||
|
extraGroups = [ "wheel" "networkmanager" ];
|
||||||
|
openssh.authorizedKeys.keys = [ "ssh-dss AAAAB3Nza... john@foobar" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
Home Manager
|
||||||
|
===
|
||||||
|
|
||||||
|
- Gestión de _dotfiles_
|
||||||
|
- Independiente de NixOS
|
||||||
|
- Por la comunidad
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
programs.zsh = {
|
||||||
|
enable = true;
|
||||||
|
enableCompletion = true;
|
||||||
|
autosuggestion.enable = true;
|
||||||
|
syntaxHighlighting.enable = true;
|
||||||
|
|
||||||
|
oh-my-zsh = {
|
||||||
|
enable = true;
|
||||||
|
plugins = ["git" "fzf"];
|
||||||
|
};
|
||||||
|
|
||||||
|
shellAliases = {
|
||||||
|
c = "clear";
|
||||||
|
cd = "z";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.zoxide = {
|
||||||
|
enable = true;
|
||||||
|
enableZshIntegration = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fzf.enable = true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
Ecosistema
|
||||||
|
===
|
||||||
|
|
||||||
|
- Entornos de desarrollo
|
||||||
|
- Entornos de compilación
|
||||||
|
- Máquinas virtuales en la nube
|
||||||
|
- Imáges de contenedores (more on that later)
|
||||||
|
- NixOps, clan, colmena...
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# Construir una imagen de coker para el paquete hello
|
||||||
|
pkgs.dockerTools.buildLayeredImage {
|
||||||
|
name = "nix-hello";
|
||||||
|
tag = "latest";
|
||||||
|
contents = [ pkgs.hello ];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
# Nix, el lenguaje
|
||||||
|
|
||||||
|
## Modo interactivo
|
||||||
|
```bash
|
||||||
|
nix repl
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Espacios
|
||||||
|
<!-- column_layout: [1, 1] -->
|
||||||
|
<!-- column: 0 -->
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
x = 1;
|
||||||
|
y = 2;
|
||||||
|
in x + y
|
||||||
|
```
|
||||||
|
<!-- column: 1 -->
|
||||||
|
```nix +exec
|
||||||
|
let x=1;y=2;in x+y
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Attribute sets
|
||||||
|
<!-- column_layout: [1, 1] -->
|
||||||
|
<!-- column: 0 -->
|
||||||
|
### Nix
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
string = "hello";
|
||||||
|
integer = 1;
|
||||||
|
float = 3.141;
|
||||||
|
bool = true;
|
||||||
|
null = null;
|
||||||
|
list = [ 1 "two" false ];
|
||||||
|
attribute-set = {
|
||||||
|
a = "hello";
|
||||||
|
b = 2;
|
||||||
|
c = 2.718;
|
||||||
|
d = false;
|
||||||
|
}; # comentarios
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<!-- column: 1 -->
|
||||||
|
### JSON
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"string": "hello",
|
||||||
|
"integer": 1,
|
||||||
|
"float": 3.141,
|
||||||
|
"bool": true,
|
||||||
|
"null": null,
|
||||||
|
"list": [1, "two", false],
|
||||||
|
"object": {
|
||||||
|
"a": "hello",
|
||||||
|
"b": 1,
|
||||||
|
"c": 2.718,
|
||||||
|
"d": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- reset_layout -->
|
||||||
|
|
||||||
|
```nix +exec
|
||||||
|
/// let a=
|
||||||
|
/// {
|
||||||
|
/// string = "hello";
|
||||||
|
/// integer = 1;
|
||||||
|
/// float = 3.141;
|
||||||
|
/// bool = true;
|
||||||
|
/// null = null;
|
||||||
|
/// list = [ 1 "two" false ];
|
||||||
|
/// attribute-set = {
|
||||||
|
/// a = "hello";
|
||||||
|
/// b = 2;
|
||||||
|
/// c = 2.718;
|
||||||
|
/// d = false;
|
||||||
|
/// };
|
||||||
|
/// };
|
||||||
|
/// in
|
||||||
|
a.attribute-set.c
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## `let ... in ...`
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
a = 1;
|
||||||
|
in
|
||||||
|
a + a
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- pause -->
|
||||||
|
|
||||||
|
## `with ...; ...`
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
a = {
|
||||||
|
x = 1;
|
||||||
|
y = 2;
|
||||||
|
z = 3;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
with a; [ x y z ]
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## `inherit ...`
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
x = 1;
|
||||||
|
y = 2;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit x y;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## String interpoilation `${...}`
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
name = "mundo";
|
||||||
|
in
|
||||||
|
"hola ${name}"
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Paths
|
||||||
|
```nix +exec
|
||||||
|
/tmp/no/existe
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Funciones
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
f = x: x + 1;
|
||||||
|
in f 1
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- pause -->
|
||||||
|
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
f = x: x.a;
|
||||||
|
v = { a = 1; };
|
||||||
|
in
|
||||||
|
f v
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Librerias
|
||||||
|
### `builtins`
|
||||||
|
- Vienen con Nix
|
||||||
|
- Escritas en **C++**
|
||||||
|
|
||||||
|
```nix +exec
|
||||||
|
builtins.toString
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--pause -->
|
||||||
|
### `pkgs.lib`
|
||||||
|
- En nixpkgs
|
||||||
|
- Escritas en Nix
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
pkgs = import <nixpkgs> {};
|
||||||
|
in
|
||||||
|
pkgs.lib.strings.toUpper "lookup paths considered harmful"
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Impuridades
|
||||||
|
### Path
|
||||||
|
|
||||||
|
```bash +exec
|
||||||
|
echo "Hola mundo" > data
|
||||||
|
nix-instantiate --eval -E '"${./data}"'
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--pause -->
|
||||||
|
### Fetchers
|
||||||
|
|
||||||
|
- `builtins.fetchurl`
|
||||||
|
- `builtins.fetchTarball`
|
||||||
|
- `builtins.fetchGit`
|
||||||
|
- `builtins.fetchClosure`
|
||||||
|
|
||||||
|
|
||||||
|
```nix +exec
|
||||||
|
builtins.fetchurl "https://www.kernel.org/theme/images/logos/tux.png"
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
## Derivaciones
|
||||||
|
|
||||||
|
- Nix se usa para escribir derivaciones
|
||||||
|
- Nix ejecuta derivaciones para producir resultados de _compilación_
|
||||||
|
- Esos resultados se pueden usar como entrada para otras derivaciones
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ lib, stdenv, fetchurl }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "hello";
|
||||||
|
version = "2.12";
|
||||||
|
src = fetchurl {
|
||||||
|
url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz";
|
||||||
|
sha256 = "1ayhp9v4m4rdhjmnl2bq3cibrbqqkgjbl3s7yk2nhlh8vj3ay16g";
|
||||||
|
};
|
||||||
|
meta = with lib; {
|
||||||
|
license = licenses.gpl3Plus;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<!-- pause -->
|
||||||
|
```nix +exec
|
||||||
|
let
|
||||||
|
pkgs = import <nixpkgs> {};
|
||||||
|
in "${pkgs.hello}"
|
||||||
|
```
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
Flakes
|
||||||
|
===
|
||||||
|
- Experimentales
|
||||||
|
- Simplemente un **_wrapper_** para otras configuraciones de Nix
|
||||||
|
- `flake.nix` `flake.lock`
|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
¿Preguntas?
|
||||||
|
===
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!-- end_slide -->
|
||||||
|
|
||||||
|
<!-- jump_to_middle -->
|
||||||
|
|
||||||
|
Muchas Gracias ❤️
|
||||||
|
===
|
||||||
Loading…
Add table
Add a link
Reference in a new issue