Tabulação no vim. Como indentar corretamente o seu código.

Este post é para aquelas pessoas que acreditam que a indentação é muito mais do que uma questão de mera estética.
Código bom, começa com uma boa indentação e comentários pertinentes.
Fora disso, é a barbárie! 😉
vim editor on kde
Há vários padrões de indentação, contudo. Alguns usuários preferem uma tabulação um pouco mais distante da margem, outros preferem um espaçamento menor entre uma tabulação e outra etc.
Neste post, vamos abordar como configurar o editor de textos vi, para organizar a tabulação do jeito que você acha melhor.
Veja alguns modelos populares de indentação:

  • Tabulações ou tabs com a largura de 8 colunas e cada nível de indentação corresponde a um tab — popular no kernel do Linux
  • Tabs com largura de 4 colunas e cada nível de indentação corresponde a um tab — comum entre desenvolvedores Windows (Visual Studio)
  • Cada nível de indentação tem 4 espaçamentos. A tabulação não é usada — comum entre programadores Java

Veja, a seguir, como ajustar cada item, direto na interface do programa e no arquivo de configurações.
Para teste, estamos usando o Ubuntu 16.04 LTS (também chamado Xenial Xerus)com a versão 7.4 do Vim.
Para saber qual a versão do aplicativo, use a opção ‘–version’:

vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 16 2016 10:50:38)

Conceitos de tabulação, indentação etc.

Vamos entender alguns conceitos e parâmetros, que podem ser usados para configurar a tabulação e a indentação dentro do texto.

  • tabstop —   determina quantas colunas são inseridas para cada vez que for pressionada a tecla Tab.
    É o único que afeta um texto já existente. Os outros, afetarão o texto que for escrito, daqui em diante.
  • expandtab —   quando ajustado, pressionar a tecla Tab, no modo de inserção, irá produzir o número apropriado de espaços.
  • shiftwidth —   controla quantas colunas e texto são indentadas com as operações de reindentações.
  • softtabstop —   controla quantas colunas o vim usa quando a tecla Tab é pressionada, no modo de inserção.
    Se o ‘softtabstop’ tem valor inferior ao ‘tabstop’ e o ‘expandtab’ não estiver ligado, o vim irá usar a combinação de tabulações e espaços para obter o espaçamento desejado.
    Se o ‘softabstop’ for igual ao ‘tabstop’ e o ‘expandtab’ não estiver ligado, o vim só usará tabulações.
    Quando o ‘expandtab’ estiver ligado, o vim irá usar sempre o número apropriado de espaços.

A melhor maneira de entender é experimentando. Vejamos alguns exemplos, fáceis de aplicar.
vim tab and indent

Indentação na vida real

Lembre-se, somente o ‘tabstop’, terá efeito imediato, dentro do texto que você for usar para aplicar os exemplos.
Os outros ajustes só terão efeitos perceptíveis, à medida em que você inserir texto novo.
O primeiro exemplo, reproduz o tipo mais usado por desenvolvedores do kernel Linux, de que já falamos acima.
Para obter tabulações com largura de 8 colunas e cada nível de indentação com uma só tabulação:

:set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab

O próximo exemplo, é o do Visual Studio.
Para obter tabulações com largura de 4 colunas e cada nível de indentação com uma só tabulação:

:set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab

Veja o exemplo de uso mais comum entre desenvolvedores Java — cada nível da indentação tem 4 espaços. Tabulações não são usadas:

:set softtabstop=4 shiftwidth=4 expandtab 

Segue mais 2 exemplos de ajuste da tabulação e indentação no vim.
No primeiro, ajustamos a tabulação para a largura de 8 colunas e cada nível de indentação em 3 colunas – que pode ser em espaços ou tabulações:

:set tabstop=8 softtabstop=3 shiftwidth=3 noexpandtab 

No segundo, o ajuste da tabulação fica em 5 colunas e o nível de indentação em 6 colunas — em espaços ou tabulações:

:set tabstop=5 softtabstop=6 shiftwidth=6 noexpandtab 

Me conte como você prefere configurar o seu editor vi ou vim.

O arquivo de configurações do vim

Depois de experimentar vários ajustes, você provavelmente irá escolher uma configuração para ser o padrão, para todos os novos arquivos.
Se você usa o Linux/UNIX, o arquivo de configurações é o ~/.vimrc. No Windows, ele fica em $HOME/_vimrc.
Se você usa a versão gráfica, gvim, pode acessar o painel de configurações, através do menu Editar.
Se o arquivo de configuração, não estiver presente no seu diretório home (no Linux), vocẽ pode copiar a versão “de fábrica”, /etc/vim/vimrc e alterá-la de acordo com as suas necessidades.
Uma outra alternativa é abrir o vim, já com estas opções ‘setadas’, dentro de um comentário. Veja um exemplo de comentário de primeira linha:

/* vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab : */ 

É importante deixar esta linha comentada, ou o seu compilador irá pensar que este código tem a ver com ele — o que poderá causar problemas para você.
Happy coding! 😉

Referências

http://tedlogan.com/techblog3.html.

Alternativas ao systemd

O systemd é mais um sistema init disponível para sistemas operacionais GNU/LINUX.
Diferente de outros, este é exclusivo de sistemas operacionais Unix-like que usam o kernel Linux.
Se você clicar na tag systemd, vai encontrar vários posts, neste site, sobre o assunto — inclusive um que fala muito mal dele (que coisa feia, Elias…) 😉
ssytemd emot carrousel
Neste texto, vamos abordar o conceito do init system, quais são as opções deste tipo de software e, por fim, conhecer algumas distribuições Linux que usam alternativas ao systemd — não vai dar pra falar de todas, por que são mais de 70.

O que é um init system

Em sistemas operacionais Unix-like, o init é o primeiro processo iniciado, durante a inicialização do sistema.
Init é abreviatura da palavra initialization.
É o ancestral direto ou indireto de todos os processos rodando no seu sistema, neste momento.
Ele adota todos os processos órfãos automaticamente.
O init é iniciado pelo kernel usando nome de arquivo hard-coded.
A principal causa do kernel panic é quando o init não pode ser carregado. Ele é tipicamente identificado como o PID 1.
O systemd é mais do que apenas um sistema init. Enquanto uns avaliam este fato como uma evolução do conceito, outras apontam nele um de seus maiores defeitos.

Alternativas ao systemd

Várias alternativas ao systemd estão disponíveis para uso da comunidade.
Segue uma relação (atual e relevante) de init systems, para Linux:

  • Bootscripts — comumente usado no GoboLinux
  • Initng — é um substituto atual para o UNIX System V init e para o Sysvinit (usado no Linux), escrito em C e lançado em 2005.
    Nas implementações tradicionais do init, processos são iniciados em ordem pre-determinada. Além disto, um processo só será iniciado, depois que o anterior estiver finalizado.
    O Initng inicia processos assim que suas dependências forem satisfeitas. Foi projetado para iniciar vários processos em paralelo e melhorar a velocidade de boot dos sistemas.
  • runit — Esquema init com supervisão de serviços. Concebido como substituto do SysVinit e outros projetos.
  • minit — Um init mínimo com supervisão de processos, ordenação de dependências de serviços, ativação de serviços paralelos etc.

Você vai encontrar mais itens na página do Wikipedia — fique atento para o fato de que alguns projetos estão mortos.

Distribuições Linux que usam outros init systems

Como disse, no começo, são muitas dezenas de opções. E ter opções, no mundo do software livre é importante.
Não vai dar para citar todas, contudo sugiro visitar o site without-systemd para ver uma relação mais completa.
O Distrowatch também tem uma relação de distribuições Linux que não usam o systemd.
Na lista, abaixo, separei uma relação de distribuições livres do systemd, que se destacam por diversos motivos:

  1. FreeBSD, OpenBSD etc — Os BSD não são Linux e não existe compatibilidade entre o systemd e estas distros — embora seja possível usá-los com o kernel Linux.
    O site tem vários posts sobre BSD, caso você se interesse.
  2. Slackware — no momento, a distro não aderiu ao systemd, mas não existe nenhum comprometimento do Patrick Volkerding no sentido de se manter distante deste sistema. Para quem gosta do Slackware, vale experimentar o Porteus — http://www.porteus.org/.
    Este projeto tem o comprometimento de seguir sem o systemd.
  3. Devuan — este é o projeto Debian, tocado por ex-integrantes que não concordaram com a mudança para o systemd. Veja mais no site http://devuan.org. Experimente também o Finnix, o Overclockix, o Trios, o Debian GNU/Hurd e o Debian KFreeBSD. Estes 2 últimos são opções para puristas e vale a pena conhecer.
  4. Tails — este é um projeto derivado do Debian e voltado para oferecer mais criptografia e segurança, com mais conforto para o usuário.
    Temos alguns textos, no site, mencionando este projeto.
  5. UbuntuBSD — como o nome indica, é baseado no Ubuntu e usa o núcleo do FreeBSD. Em vez do Unity, usa o ambiente gráfico XFCE. Também é uma opção interessante. Dá uma olhada no site oficial da distro: https://www.ubuntubsd.org/.
  6. Alpine Linux — Distro independente, de propósito genérico e projetada para power users.
    usea OpenRC como init systemhttp://www.alpinelinux.org/.
  7. Gentoo — Uma das distribuições mais conhecidas, que não se rendeu ao systemd — https://www.gentoo.org/.
  8. ReactOS — Tal como o Gentoo, trata-se de uma distro Linux, já estabelecida e com uma comunidade formada ao seu redor — https://www.reactos.org/.

Conhece alguma outra distro livre do systemd, que você gostaria de recomendar? Escreva nos comentários!

Referências

https://en.wikipedia.org/wiki/Init.
https://distrowatch.com/search.php?pkg=systemd&distrorange=NotInLatest#pkgsearch.
http://without-systemd.org/wiki/index.php/Main_Page#GNU.2FLinux_distributions.

Aprenda a usar o comando getfacl do Linux

O comando getfacl é um dos comandos padrão do Linux e serve para obter uma lista do controle de acesso de qualquer arquivo no seu sistema.

O utilitário está presente também no FreeBSD e, para cada arquivo, o getfacl exibe uma quantidade de informações a respeito dele.

De acordo com a documentação, ele relaciona os seguintes dados sobre um arquivo:

  • nome do arquivo
  • nome do usuário que é dono dele
  • nome do grupo a que ele pertence
  • informações sobre permissões

Vamos ver um exemplo, para clarear o assunto:


getfacl /etc/machine-info 

getfacl: Removing leading '/' from absolute path names
# file: etc/machine-info
# owner: root
# group: root
user::rw-
group::r--
other::r--

O resultado do comando, acima, mostra uma mensagem informativa de que ele removeu o primeiro ‘/’ do nome do arquivo — para facilitar a compreensão.
Em seguida, ele mostra o nome do arquivo, seguido pelo usuário e grupo a que ele pertence.
As 3 últimas linhas mostram o ACL (Access Control List), ou seja, a “lista de controle de acesso” — o que cada um (usuário, grupo e outros) pode fazer com o arquivo: (r)ead (ler) e (w)rite (escrever).
No caso do exemplo, o superusuário é o único que pode alterar o arquivo. Os outros podem apenas ler.
Se o getfacl for usado contra um sistema de arquivos que não suporta ACLs, ele exibe as permissões de acesso definidas no modo tradicional de bits de permissão.

Exemplos de uso do getfacl

É possível rodar o programa contra vários arquivos, de uma vez só, usando curingas:


getfacl Documentos/Unigine_Benchmark*

# file: Documentos/Unigine_Benchmark.html
# owner: mclane
# group: mclane
user::rw-
group::r--
other::r--

# file: Documentos/Unigine_Benchmark.html
# owner: justincase
# group: justincase
user::rw-
group::r--
other::r--

É possível usar o comando setfacl para ajustar as permissões, bem como atributos de dono, de seus arquivos.
No exemplo acima, observe que o primeiro arquivos pertence ao usuário ‘mclane’.
Vamos dar permissões de leitura e escrita dele ao usuário ‘justincase’. Veja como:


setfacl -m u:justincase:rw- Unigine_Benchmark.html

getfacl Unigine_Benchmark.html 

Veja o rsultado, na 5a linha:

# file: Unigine_Benchmark.html
# owner: mclane
# group: mclane
user::rw-
user:justincase:rw-
group::r--
mask::rw-
other::r--

Se você tiver “permissão negada” para ajustar as permissões de um arquivo com o setfacl, execute com privilégios administrativos.

Referências

http://linuxcommand.org/man_pages/getfacl1.html.

Verifique se há atualizações no FreeBSD com o portmaster

Se você prefere compilar seus softwares a partir do código fonte, usando o sistema de ports, no FreeBSD, uma alternativa atraente é usar o comando portmaster.
Este comando é usado nas tarefas de gestão de software no FreeBSD — para verificar/aplicar atualizações, instalar/remover ports e todas as suas dependências.
Leia mais sobre gestão de pacotes no FreeBSD, com o Portsnap.
Neste post, estou usando exemplos baseados no FreeBSD 10.3 STABLE.
freebsd flat logo bumper badge
Para obter o utilitário portmaster, faça a sua instalação via ports system, se ainda não vez.

Como instalar o portmaster no FreeBSD

Se ainda não tiver o portmaster instalado no sistema, use um destes 2 métodos de instalação.
Para baixar e instalar, via pkg:

sudo pkg install portmaster
Password:
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   1.5MB/s    00:04
Processing entries: 100%
FreeBSD repository update completed. 25560 packages processed.
Updating database digests format: 100%
New version of pkg detected; it needs to be installed first.
The following 1 package(s) will be affected (of 0 checked):
Installed packages to be UPGRADED:
    pkg: 1.8.7 -> 1.8.7_1
Number of packages to be upgraded: 1
    2 MiB to be downloaded.

Proceed with this action? [y/N]: 

… ou compile a ferramenta, a partir dos fontes. Para isto, vá até o diretório do pacote, na árvore de ports e instale-o com o make:


cd /usr/ports/ports-mgmt/portmaster/ 
sudo make install clean 

freebsd make install clean
Especificamente sobre este processo, o sistema poderá perguntar se você deseja instalar extensões programáveis para uma ou mais shells. Eu optei por não e as desmarquei (figura acima).
É possível ver mensagem sobre adicionar informações ao /etc/make.conf e converter seu banco de dados de pacotes (package database) — o que não é necessário nas versões do FreeBSD 10.1 ou superiores.

Como atualizar o sistema com o portmaster

Uma vez instalado o portmaster, verfique se há atualizações disponíveis:

portmaster -L

Como você pode ver, no exemplo acima, não é necessário ter privilégios administrativos para fazer este procedimento.
O meu resultado (parcial, abaixo), mostra que há 47 atualizações pendentes:

===>>> 47 total installed ports
       ===>>> 2 have new versions available

O portmaster examina todos os softwares instalados no seu sistema e o compara com o arquivo de índice, a procura de novas versões disponíveis.
Funciona como o comando pkg e independe do fato de os softwares terem sido instalados via package ou ports.
No que tange as dependências, ele os categoriza e determina como estão conectados entre si.
Repare a saída (acima) do comando. Todos os que tenham atualização disponível, terão uma linha indentada, em destaque (exemplo abaixo):

===>>> pt-freebsd-doc-48963,1
       ===>>> New version available: pt-freebsd-doc-49071,1

Novamente, você pode optar por um destes 2 métodos de atualização: packages ou portmaster.
Se optar por fazer a atualização através do primeiro, use novamente o comando pkg:

sudo pkg upgrade 
Password: 
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%
New version of pkg detected; it needs to be installed first.
The following 1 package(s) will be affected (of 0 checked):

Installed packages to be UPGRADED:
          pkg: 1.8.7 -> 1.8.7_1

Number of packages to be upgraded: 1

          2 MiB to be downloaded.

Proceed with this action? [y/N]:  

Se você prefere o segundo método, para atualizar todos os ports que necessitam de atualização, use a seguinte opção:

portmaster -aD

Para remover os distfiles velhos, use ‘–clean-distfiles’:

portmaster --clean-distfiles

Fique atento, pois este processo pode pedir sua intervenção algumas ou várias vezes, até ser concluído.

Como descobrir a versão do FreeBSD?

Quando você precisa fornecer informações sobre o software instalado, para obter ajuda ou saber se um determinado tutorial vai servir ou não, conhecer a versão do FreeBSD e o kernel instalado, pode ser muito útil.
Veja, aqui, algumas maneiras de obter estas informações.
O comando freebsd-version procura determinar a versão e o patch level do sistema instalado.
Pode ser executado “puro” ou acompanhado das opções ‘-k’ ou ‘-u’. Veja o exemplo:

freebsd-version 
10.3-STABLE

A opção ‘-k’ exibe a versão e o patch level do kernel instalado.
Diferente do uname, que iremos abordar mais a frente, se alguma versão mais nova do kernel tiver sido instalada, o freebsd-version vai imprimir a versão do novo kernel e não do atual, mesmo que você ainda não tenha reiniciado a máquina.
A opção ‘-u’ exibe a versão e o patch level do userland instalado.


O comando uname vai exibir um conjunto maior de informações, que inclui a versão do kernel instalado e a arquitetura da máquina.
No exemplo, abaixo, o comando exibe todas as informações que ele consegue obter do sistema:

uname -a 
FreeBSD brain 10.3-STABLE FreeBSD 10.3-STABLE #0 r300060: Tue May 17 19:23:37 UT
C 2016
root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

Você pode obter apenas a versão do FreeBSD, com o comando uname, assim:

uname -rs 
FreeBSD 10.3-STABLE

Veja um conjunto de exemplos:

# exibe o kernel ident 
uname -i 
GENERIC

# mostra a versão do kernel do FreeBSD
uname -K 
1003502

# exibe o tipo de arquitetura da plataforma em que está sendo executado
uname -m 
amd64

# mostra o nome dado a este sistema
uname -n 
brain

# faz o mesmo que -s, para manter a compatibilidade com outros sistemas
uname -o 
FreeBSD

# exibe o tipo de arquitetura do processador atual
uname -p 
amd64

# exibe a versão atual do sistema operacional
uname -r 
10.3-STABLE

# exibe o nome do sistema operacional instalado
uname -s 
FreeBSD

# mostra a versão do FreeBSD dentro do ambiente de usuário
uname -U 
1003502

# mostra o nível de versão do sistema operacional
uname -v
FreeBSD 10.3-STABLE #0 r300060: Tue May 17 19:23:37 UTC 2016     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC

Você pode obter informações sobre a arquitetura do sistema com o getconf:

getconf LONG_BIT 
64

Por fim, é possível saber mais sobre o processador do sistema de hardware, com o comando sysctl. Veja um exemplo:

sysctl -a | egrep -i 'hw.machine|hw.model|hw.ncpu' 
hw.machine: amd64
hw.model: AMD Phenom(tm) 9550 Quad-Core Processor
hw.ncpu: 1
hw.machine_arch: amd64

Referências

http://serverfault.com/questions/593318/where-does-uname-get-version-number-in-freebsd-release.