Enviado em 31/01/2017 - 21:28h 
		-- Usa nix package manager, um package manager com configuração declarativa
   --> Nix ( package manager ) pode ser instalado em varias distribuições e ate MacOS e ser um package manager para o usuario especifico em vez do sistema inteiro como no NixOS
-- Troca a hirearquia do FHS ( /bin /usr/bin /lib /usr/lib /usr/local/* , etcetera) por uma configuração em /nix/store (que é uma partição montada como read-only, pra evitar mudanças nos pacotes )
-- Pacotes são prefixados em /nix/store/$hashDoPacote-$pacote-$versão, voce pode ter quantos pacotes iguais (tipo firefox), em quantas versões quiser (36, 49, 51, 52, nightly, aurora), dentro de cada diretorio pro pacote ele tem uma estrutura normal com (/bin /lib /share) que tem symlink pra varios lugares que estão na _PATH_ do usuario, dependendo da configuração.
-- Configuração declarativa, em vez de ir instalando, voce configura arquivos dentro do dir /etc/nixos linguagem especifica do Nix como voce quer seu sistema, Networking, Partições pra montar, pacotes no sistema, variaveis do sistema, serviços do systemd, ativar programas, voce simplesmente da 
 nixos-rebuild switch    e voce vai estar na nova configuração.
-- Upgrades atomicos, a mudança de configuração acontece ou não, não existe um estado que fica no meio com seu sistema mal-formado, ou o seu sistema sai na nova versão ou ele da erro e fica na versão anterior.
-- Facil retornar pra versões anteriores, caso voce consiga quebrar algo ( e vamos ser honestos voce vai conseguir quebrar algo ), simplesmente dando reboot e escolhendo uma configuração anterior no menu do Grub e voce tem seu sistema em estado funcional denovo, tambem pode rodar 
 nixos-rebuild switch --rollback # Volte para a configuração anterior  
-- Como Nix é uma linguagem e não uma representação de Dados como em outros pacotes, é facil fazer mudanças a pacotes e criar seus propios.
Exemplos da configuração declarativa:
Tirado do website do Nix
^ Instala grub em /dev/sda, monta / (rootfs) como um device, e ativa sshd.
pequeno snippet do meu hardware-configuration.nix
^ Indica os modulos disponiveis durante a initramfs, indica os modulos (kvm-intel só nesse caso) disponiveis durante boot, e monta rootfs por uuid (pra confiança) em ext4
Isso cria um usuario chamado leon, com uid 1000, com shell dash como default, com home em /home/leon, nos grupos wheel,input,video,disk e audio.
^ Ativa sudo, esconde informação dos processos pro usuario (ele não ve processos que não são dele), e define uma regra em pam pra não deixar fazer login caso erre a senha 3 vezes pra qualquer pessoas no grupo users (leon esta nesse grupo)
esse é mais complicado, ele primeiro faz a função do pacote termite ( o terminal) chamar um arquivo de configuração em /etc/nixos/conf/termite.conf, depois ele muda atributos do pacote rofi e faz um wrapper ( um programa que é executado antes e faz com que o programa original inicie do jeito certo ) pra ele rodar a configuração em /etc/nixos/conf/rofi/rofi.conf, depois ele passa um .vimrc custom que esta em /etc/nixos/conf/neovim/neovim.conf e depois define varios plugins pro usuario.
bem simples, ele declara um serviço pra usuario no systemd pro programa dunst (daemon de notificações), e depois eu ativo (true) e desativo (false) varios programas que eu quero ou não
Ativa o Xorg, com drivers da intel, na versão intel-965, com GlamorEGL, com layout br, desativa sessão do xterm e roda dbus (pra daemon de notificação), depois ele define uma corrente de comandos pra rodar durante a inicialização do usuario do >> sessionCommands >> ao >> ''; <<, e depois define leon como usuario default do SLiM (display manager) e um tema custom pra ele que é baixado da internet
desativa ssh e as aliases da shell FISH, ele tambem roda aquele bloco de comandos toda vez que uma sessão interativa do FISH é iniciada
Simples declaração de pacotes do sistema, como GNU Coreutils, manpages, parted, wget, etcetc
Configura fontes e depois lista as fontes disponiveis no meu sistema
Importa varios arquivos (imagine isso como a função main() de um programa,chamando varias funções), coloca LANG em UTF8, keymap das ttys em br-abtn2 e timezone pro brazil
https://github.com/venam/2bwm ;
Uma pequena declaração de um pacote, descreve varias coisas, nome, versão, Pegar do github, do usuario venam no repositorio 2bwm, a git revision atual (tem que atualizar quando derem update) sha256 (tem que atualizar manualmente, pra garantir integridade do pacote), buildInputs são as dependencias do pacote, se usar nativeBuildInputs as dependencias continuarão instaladas no sistema depois de compilar, patches defines (uhh) patches pro programa, installFlags  muda flags durante o make, nesse caso ele muda o PREFIX pra $out, que é o local em /nix/store que o programa vai ficar, e meta define varias coisas como Homepage, uma descrição e a licença que esta o programa.
seta varias variaveis do sistema.
Define configurações do nix, usa Unstable (Rolling release), monta pacotes em uma Sandbox, optimiza a store automaticamente fazendo hardlinks entre coisas dentro de pacotes que são parecidas e no final permite usar pacotes que não tem uma licença livre.