-
Notifications
You must be signed in to change notification settings - Fork 2
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
base: master
Are you sure you want to change the base?
Changes from all commits
24ddfd2
bce8da3
a3e3b65
63e11a7
498939c
48f25ea
03534fd
06fece9
a8716c0
d45bc80
5061c63
9c46df0
a777904
6a91f06
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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. | ||||||
|
||||||
## 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**. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 There was a problem hiding this comment. Choose a reason for hiding this commentThe 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/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
😞 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 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
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. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. E qual link oficial condiz mais com isso There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Por mim, poderia simplesmente apontar a homepage nixos mesmo. |
||||||
|
||||||
|
||||||
### 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* | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Não sei se o título bate, 'Projetos que usam' esta mais para: olha tem quem use. There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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`. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. |
There was a problem hiding this comment.
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:
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 💣 🤣
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
🤦
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[ Citation needed ]
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)
Se colocar Haskel nessa imagem aí que o cara desiste mesmo
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
E Java 8 era novidade na época. Hoje em dia estamos no Java 20.
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.
There was a problem hiding this comment.
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
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: -
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eu apontei que Java - uma linguagem com programadores já velhotes implementou paradigmas funcionais há um bom tempo.
- Já viu Python?
- Já
- Manja o lambda do Python? (ou o list comprehension)
- Um pouco
- Pois bem, isso é programação funcional
ACCESS GRANTED

Mas não vou perseguir isso.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
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==