Skip to content

Introdução para (hu)manos #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
66 changes: 62 additions & 4 deletions src/0-introducao.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,68 @@
# Introdução

Nix é uma ferramenta que aplica conceitos e questões da programação funcional em transformação de arquivos.
## O gerenciador de pacotes Nix

Um dos títulos que dão ao Nix é que ele é um gerenciador de pacotes mas a base dele permite que ele seja algo bem mais generalizável.
**[Nix](https://nixos.org/explore.html)** é um gerenciador de pacotes de software como dpkg/apt do Debian ou rpm do RedHat. Entretanto, assim como AppImage, Flatpack e Snap, pode ser instalado em *qualquer distribuição Linux*, e também em *Android*, *MacOS* ou *WSL*.

O Nix em sí é uma linguagem de programação de tipagem dinâmica que segue o paradigma funcional e seus conceitos mas que possui um diferencial que muda totalmente o jogo: O conceito de derivação.
Nix tem um foco em _reproducibilidade_. Para isso, ele toma uma série de medidas, entre elas:

Derivação é um dos tipos de dados da linguagem Nix que vai ser melhor abordado na seção de **Tipos de dados**.
- separa a aquisição de fontes (código-fonte propriamente dito, _patches_ etc.) das demais fases de construção do pacote;
- exige verificação (mediante _hash sum_) das fontes adquiridas;
- impede o acesso à Internet durante a compilação do pacote;
- impede o acesso a arquivos e programas que não foram explicitamente requisitados como dependências;

Gerenciadores de pacotes tradicionais instalam seus pacotes diretamente na raiz do sistema, gerando arquivos espalhados em diversos diretórios.
Por outro lado, Nix instala cada pacote em um diretório dedicado, por padrão dentro de `/nix/store/`, em um formato similar a `/nix/store/<hash>-<nome do pacote>/{bin, lib, share, . . . }`


Este conjunto de medidas, bem como muitas outras, garante a reprodutibilidade da compilação. Em razão disso, é possível acelerar a compilação de pacotes ao mantê-los em um servidor de cache.
Por padrão, o projeto NixOS fornece o servidor [cache.nixos.org](https://cache.nixos.org), mas é perfeitamente possível configurar e utilizar outros.

## A Linguagem Nix

Para cada pacote são necessárias informações como nome, origem do código-fonte (caminho ou endereço online), versão (hash), dependências e instruções de compilação ou empacotamento.

Essas informações devem ser descritas geralmente em um arquivo `default.nix` usando a linguagem programação de domínio especifico do Nix, também chamada **Nix** ou **Nix DSL**, é parecida com JSON, mas tem funções, variáveis pode importar outros arquivos Nix.
Comment on lines +23 to +25

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acho que dá para deixar isso mais limpo:

Suggested change
Para cada pacote são necessárias informações como nome, origem do código-fonte (caminho ou endereço online), versão (hash), dependências e instruções de compilação ou empacotamento.
Essas informações devem ser descritas geralmente em um arquivo `default.nix` usando a linguagem programação de domínio especifico do Nix, também chamada **Nix** ou **Nix DSL**, é parecida com JSON, mas tem funções, variáveis pode importar outros arquivos Nix.
Nix utiliza uma linguagem de programação própria para descrever o processo de implantação (_deploy_) de software.
Esta linguagem usa uma abordagem funcional semelhante a (Haskell)[https://www.haskell.org/], mas com uma sintaxe própria inspirada em [JSON](https://www.json.org/json-pt.html).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Eu até estava pensando em instalar, mas você falou funcional e haskell, deve ser chato difícil" - Pensa Joaozinho de 19 anos em seu Ubuntu.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se a gente falar derivation nunca mais vai ver o cara na vida 💣 🤣

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Desculpa, mas desde que Java começou a incluir elementos funcionais na linguagem, isso deixou de ser coisa de nerd leitor de paper do arxiv.

Ubuntu? Por favor, a distro do momento para novatos é o Pop!OS e o Linux Mint, se atualiza.

Enfim, isso é só uma curiosidade sobre as origens da linguagem. Ou você acha mermu que esse hipotético Joãozinho Ubunteiro de 19 anos sabe o que é JSON?
E se souber, é bem capaz que tenha visto programação funcional em Javascript, haha!

Ninguém está sugerindo ser necessário estudar Haskell para usar Nix, não mais que estudar Modula para entender Python.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

> deriveishoun assusta as pessoa

> DSL

🤦

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso deixou de ser coisa de nerd leitor de paper do arxiv.

[ Citation needed ]

Joãozinho Ubunteiro de 19 anos sabe o que é JSON?

Preferia que ele não precisasse saber o que é JSON para usar Nix,
Mas como é muito orientado a configuração, nosso mínimo é:
Abrir um arquivo num editor de texto, ter noção de que aquilo respeita uma estrutura.
Em 24/01/2022 fiz a seguinte estatística nada ciêntifica (busquei no github por quantidade de arquivos)

image
image

Ninguém está sugerindo ser necessário estudar Haskell para usar Nix, não mais que estudar Modula para entender Python.

image

Se colocar Haskel nessa imagem aí que o cara desiste mesmo

Copy link

@AndersonTorres AndersonTorres Aug 12, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[citation needed]

https://opensource.com/article/17/6/functional-javascript

https://www.amazon.com.br/Functional-JavaScript-Steve-Vinoski/dp/1449360726

https://medium.com/@mvalho/java-8-functional-interfaces-tornando-o-java-mais-legal-72401462d0e2

  1. Tipo, século passado em tempo de programador.

E Java 8 era novidade na época. Hoje em dia estamos no Java 20.

Só se for 39% (Pop + Mint)

O fonte fala de websites. Mas que seja.

E, das langs aí em cima, acho que só C e HTML não têm suporte a paradigmas funcionais.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Tipo, século passado em tempo de programador.

Nix tem 20 anos, dá alguns séculos nessa linha de pensamento, e não é popular

Quando chega gente nova e pergunta alguma coisa a gente fala:
Nóis: - Sabe haskell...?
Newbie: - não
Nóis: - Ok, mas sabe OCaml?
Newbie: - não
Nóis: - Lisp, Erlang, F#, Clojure, Scala...
Newbie: - não
Nóis: -
image

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nix tem 20 anos, dá alguns séculos nessa linha de pensamento, e não é popular

Eu apontei que Java - uma linguagem com programadores já velhotes implementou paradigmas funcionais há um bom tempo.

Quando chega gente nova e pergunta alguma coisa a gente fala:

- Já viu Python?
- Já
- Manja o lambda do Python? (ou o list comprehension)
- Um pouco
- Pois bem, isso é programação funcional

ACCESS GRANTED
image

Mas não vou perseguir isso.

Copy link
Author

@hugosenari hugosenari Sep 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lembrei disso

@lucasew, toda vez que a gente fala derivation:
https://www.instagram.com/reel/CwoLlzYpuyt/?igshid=MzRlODBiNWFlZA==


## Nixpkgs

Existe uma coleção comunitária com mais de 80 mil pacotes Nix, que está configurada por padrão, chamada **[nixpkgs](https://search.nixos.org)**, às vezes referenciada apenas como **pkgs**.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Existe uma coleção comunitária com mais de 80 mil pacotes Nix, que está configurada por padrão, chamada **[nixpkgs](https://search.nixos.org)**, às vezes referenciada apenas como **pkgs**.
[Nixpkgs](https://github.com/NixOS/nixpkgs) é uma coleção de mais de 80.000 pacotes que podem ser instalados pelo gerenciador Nix.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gostei do texto, mas é para iniciantes, apontar para o codigo é tipo chegar e perguntar se querem ver o relógio preto

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Justo. Mas uma search engine não é lá a melhor apresentação.

Que seja então o manual: https://nixos.org/manual/nixpkgs/stable/

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thus it’s mainly for packagers and developers who want to add packages to Nixpkgs.

😞
A pessoa está na introdução, ainda acho o search menos obtuso.

Na verdade eu queria um nixpkgs guide for nix users e isso aí é mais para um API Guide, Deployment Guide, se fosse seguindo o exemplo abaixo

image
source

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Na verdade eu queria um nixpkgs guide for nix users

Não temos nada oficial neste sentido.

Ademais, o link precisa ser oficial, não for humans. Até porque este documento que você está editando é precisamente o link para humanos.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E qual link oficial condiz mais com isso é uma coleção de mais de 80.000 pacotes que podem ser instalados pelo gerenciador Nix.?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por mim, poderia simplesmente apontar a homepage nixos mesmo.
Afinal, tem uma issue exatamente sobre a falta de páginas dedicadas a explanar o Nixpkgs.

NixOS/nixos-homepage#734



### NixOS

**[NixOS](https://nixos.org/)** é uma distribuição Linux de referência, construída com base no gerenciador Nix e nos pacotes do Nixpkgs.

NixOS é projetada como um conjunto de módulos que podem ser combinados pelo usuário, permitindo uma vasta gama de customizações, indo desde o gerenciador de boot e o kernel até desktops inteiros como o KDE Plasma e o Gnome.

Tal configuração não está limitada à simples instalação dos softwares, mas também se estende às suas configurações. Enquanto em distros tradicionais o usuário necessita editar arquivos espalhados pelo `/etc`, o sistema de módulos do NixOS também realiza esta configuração.

Grosso modo, o próprio NixOS é tratado como um pacote de software do ponto de vista do gerenciador Nix.

Uma propriedade interessante do sistema NixOS é o suporte à reversão (_rollback_), onde iterações anteriores (conhecidas como _gerações_) não são automaticamente apagadas, permanecendo disponíveis para serem utilizadas em caso de alguma falha na geração atual.


### Home Mananger

O **[HomeManager](https://nix-community.github.io/home-manager)** é outro sistema modular escrito em Nix, com a diferença que este é voltado para o usuário, em contraste com o NixOS, que é voltado para o sistema como um todo.

Enquanto o NixOS alavanca o Nixpkgs para o administrador do sistema operacional, o Home Manager alavanca o mesmo Nixpkgs para o usuário comum.

A exemplo do seu irmão maior, o Home Manager também instala e configura os pacotes instalados, auxiliando na geração automatizada dos famigerados _dotfiles_.

Atualmente, o Home Manager conta com suporte ao NixOS, ao MacOS X e a virtualmente todas as distros Linux, o que o torna uma opção interessante para quem deseja utilizar softwares ainda não presentes na sua distro local.

### Projetos como *pacote de ambiente*

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
### Projetos como *pacote de ambiente*
### Projetos que usam Nix

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não sei se o título bate,
a ideia inicial era:
nix, onde tudo é um pacote
nixpkgs, coleção de pacotes
nixos, um pacote que é uma distro e configs são pacotes
nix-modules, uma mão na roda para gerar pacotes de config para NixOS
home-manager, um pacote que são as configs do usuário
mkShell, um pacote para projetos de dev, ops ou data science

'Projetos que usam' esta mais para: olha tem quem use.
Talvez, 'Gestão de projetos com Nix' 🤔

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Essa parte poderia ser então chamada de funcionalidades extras, e poderia ser bem mais enxuta.


Caso um desenvolvedor de software, cientista de dados, ou qualquer profissional que precise *ferramentas diferentes para diferentes projetos* do dia a dia, é possível criar um *ambiente para cada projeto*, atualmente exitem diversas ferramentas, algumas usando Nix Modules como [DevEnv](https://github.com/cachix/devenv) e [DevShell](https://github.com/numtide/devshell) outras usando apenas pacotes como [DevBox](https://github.com/jetpack-io/devbox) e [Flox](https://github.com/flox/flox). Também é possível criar teu próprio ambiente apenas com Nix e Nixpkgs criando um arquivo `shell.nix` contendo as definições do teu pacote de ambiente.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note que boa parte desses projetos usa o Nix/Nixpkgs como base, mas não são oficiais. Uma rápida menção na seção de outros já basta.


Existe ainda a possibilidade de iniciar ambiente diretamente usando o comando `nix-shell -p DEPENDENCIA`.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse aqui merecia um pouco mais de molho. Por exemplo, uma nix-shell rodando um programinha simples como o cowsay...


### Outros… como *pacote*

Existem também algumas ferramentas para:

- Imagens OSI usadas por Docker, Kubernetes, etc.
- [Imagens de máquina virtual](https://github.com/nix-community/nixos-generators)>.
- Pacotes para dpkg/apt e rpm/yum.
- [Configurar qualquer outra distribuição Linux](https://github.com/numtide/system-manager)> da mesma forma que o NixOS.