Mostrando postagens com marcador comandos. Mostrar todas as postagens
Mostrando postagens com marcador comandos. Mostrar todas as postagens

Advanced Copy patch 0.9-9.0

Advanced Copy patch 0.9-9.0

Advanced Copy patch 0.9-9.0


 Em Novembro de 2020 eu apresentei aqui no blog o projeto Advanced Copy  (ou simplesmente advcpmv). Trata-se de um patch que adiciona barra de progresso aos comandos cp e mv do GNU.

cpadv
O comando cpadv exibe a barra de status com a opção -g

 Em abriu Jarun disponibilizou o patch 0.9-9.0 que traz uma correção que ocorria de certas vezes não era exibido quando arquivos eram movidos ou o progresso global. Diferente da versão 0.8-8.32, a versão 0.9.9.0 possui o arquivo install.sh que substitui o wget pelo curl. Para instalar o advcpmv basta executar o script install.sh através do comandos sh (aproveite e confira como encontrei um bug no comando sh do toybox cliando aqui. Testei este script com o toysh e funcionou normalmente), torna o processo o processo de compilação e instalação um pouco mais fácil.

Lançado toybox 0.8.7

toybox command line terminal

Lançado toybox 0.8.7

 No dia 6 de Maio foi lançada a versão 0.8.7 do toybox; o terminal de comandos padrão do Android. O toybox é utilizando também em vários outros projetos como o sbase, no POSIX-2008/SUSv4, no Linux Standard Base, no buildroot, na klibc (que já teve vídeo no canal), no Nash do Fedora, no Beatiebox do FreeBSD, no BsdBox, e vários outros projetos.

NOVOS COMANDOS

 O toybox 0.8.7 recebeu novos comandos: uclampset, gpiodetect, gpioinfo, gpioiget, gpiofind, gpioset e uma versão simplificada do httpd (inicialmente para realizar testes com o comando wget) porém, o comando catv foi removido já que todos utilizam o comando cat com a opção -v (honestamente eu nem tinha reparado nesse comando no toybox).

catv
o comando catv foi descartado no toybox 0.8.7


COMANDOS PROMOVIDOS

 Os comandos host, wget, openvt e deallocvt saíram do diretório pendentes para revisão e foram promovidos para estáveis depois de receber limpezas (aí eu senti firmeza). Outros comandos também receberam limpezas como nos comandos ping, fsync, ionice, pmap, truncate, timeout, tty, factor, mount, fusão do chvt/deallocvt para o openvt.c; fusão do lspci.c para o lsusb.c permitindo que compartilhem arquivos de configuração (config file reading infrastructure) e remoção do arquivo lib/linestack.c que ficou parado lá por anos. Vale a ressalva que esses comandos ainda permanece em pendentes ou já eram declarados estáveis.


NOVOS RECURSOS

 Há também novos recursos em comandos já existente como o top que agora permite se locomover entre a lista SHIFT LEFT/RIGHT (esse eu achei doido); o find -samefile (além das correções de bugs nas opções -newerXY e @time.nanosecond parsing), o cmp -n, o tar recebeu a opção --strip components e as opções --owner e --group agora permitem especificar :UID e :GID; os comandos lsusb e lspci agora realizam a leitura dos arquivos /etc/{usb,pci}.ids[.gz] para proporcionar leitura humana; o ifconfig se tornou capaz de renomear interfaces.



CORREÇÕES DE BUGS

 Houveram várias correções de bugs também como no cp --preserve xattr e cp --xattr (nesse último caso evitam copiar contextos do selinux); o sort -u; wget -O - (agora escrevendo na saída); pwget -B remove mais caracteres que outras implementações não emitem; sed agora trabalha com múltiplo w para o mesmo arquivo (essa é a versão de ser que eu mais gosto. Leia também sobre o minised); correções no nl -E, realpath -e, várias no sh (${X: -1:1} que não é o mesmo que ${X:-1:1} devido :- possuir um sentido especial).

 Um desenvolvedor do Google enviou um patch para o toysh eliminando avisos desnecessários quando compilado com o clang. Mais sobre o avanço do toybsh pode ser conferido no próprio blog do Rob Lanldey clicando aqui. Muitas pessoas andam dando bastante atenção ao toysh pois esse será um grande salto para o Android. Com isso, muitos testes estão sendo realizados como o próprio Rob mencionou em seu blog que possui notas de teste para o toysh como como echo $ (se verdadeiro)echo $ (verdadeiro &&) e echo $(case a in a) echo hello;; esac) que podem produzir erro de sitax. Eu mesmo recentemente postei um vídeo explicando como eu reportei a Rob Landley o bug que encontrei.


 Eu incentivo a todos a testarem seus scripts com o toysh e caso apresentar erros, reportem os erros e como reproduzí-los pois isso facilita bastante os trabalho da equipe (seus testes são importantes); quanto mais testes forem realizados, melhor para que o toysh execute scripts com a mesma fidelidade e compatibilidade que outros terminais. Rob landley mesmo postou em seu blog que está realizando vários testes e que "é por isso que ele tem/precisa de muitos testes".

minised: Um sed melhor do que o sed

Erick Raymond minised command

minised: Um sed melhor do que o sed

 minised é uma versão menor e melhor do que o tradicional sed que conhecemos. Antes que haja choro e ranger de dentes, afirmando que estou falando mal do GNU, o minised era utilizado pelo próprio GNU até que eles resolveram criar sua própria versão baseado em um pacote de regexp (que eu duvido que eles vão ter coragem de assumir isso).

minised comparado ao GNU sed
Comparado ao GNU sed, minised possui um terço do seu tamanho.

minised staticly linked against diet libc
Mesmo compilado estaticamente com a diet libc, o binário do minised manteve-se pequeno aumentando apenas 4k.

toybox sed command
O terminal de comandos toybox também proporciona sua própria versão de sed que, se compilado separadamente, também é tão pequeno quanto o minised porém possuindo muito mais recursos que o GNU sed (digite toybox sed --help e compare com o GNU sed).

 O minised foi desenvolvido por Erick Raymond (autor do livro A Catedral e o Bazar já mencionado várias vezes por mim e é um ótimo livro, diga-se de passagem) e René Rebe que também possui um longo portfólio (iniciando em 1997). Além do projeto GNU, o minised é a versão padrão de sed do sistema operacional Minix, utilizado em projetos embarcados da ExactCode e na distribuição da T2_SDE (inclusive fundado por René Rebe)

GNU sed vs minised benchmark
Comparado ao GNU sed, o minised conclui operações em menos tempo e utilizando menos recurso de hardware. O resultado pode ser conferido no vídeo a seguir.


toybox sed command benchmark
O desempenho do toybox sed também fica dentro dos padrões de desempenho do minised.

 Após a ExactCODE buscar por uma implementação do comando sed que pudesse ser utilizada em embarcados e que fosse compatível com à diet libc, a empresa alemã acabou descobrindo o minised que, mesmo não recebendo mais suporte há um bom tempo e contendo vários bugs, ainda assim o minised se apresentou ser melhor do que o GNU sed em certos casos, o que levou a empresa se tornar mantenedora oficial do minised realizando correcções, limpezas, melhorias, adicionando recursos que faltavam e conformidades POSIX (espero que a ExactCODE passe a manter a diet libc também :).

sed é um comando tão abrangente que existe até mesmo um livro de 275 páginas escrito por Daniel Goldman chamado Definitive Guide to sed: Tutorial and Reference. A versão kindle pode ser adquirida clicando aqui e a versão impressa clicando aqui.


 O minised esteve sob a licença GPL desde a versão 1.3 passando a ser regido sob a licença BSD a partir da versão 1.14 estando Erick Raymond de acordo com a migração. A versão atual do minised é a 1.16 e de acordo com as notas de lançamento, parece que a versão 1.17 já está para ser lançada (o trabalho pode ser acompanhado clicando aqui). Além da versão do toybox, os pacotes 9base (conjunto de comandos do sistema operacional Plan9 portado para outros sistemas operacionais) e sbase (conjunto de comandos do Unix portado para outros Unix) também possuem suas próprias versões do comando sed. Tenham em mente que sempre há uma variedade de versões dos mesmos recursos disponíveis para Linux. Não se limitem á uma única fonte de recurso; sempre busque as que melhor adequam as suas necessidades.

toybox recebendo sua própria versão do strace

toybox recebendo sua própria versão do strace
toybox recebendo sua própria versão do strace
 Recentemente foi lançada a versão 0.8.6 do terminal de comandos toybox. Somente dando uma recapitulada, o toybox é um terminal de comandos feito do zero e que passou a ser utilizado no Android a partir da versão 7. Todos os seus comandos foram e são desenvolvidos do zero; mesmo sendo comandos que você já tenha familiaridade, trata-se de suas próprias versões dos mesmos comandos sendo livre de códigos de terceiros. E como todos os seus comandos, o toybox receberá sua própria versão do comando strace.

Compilando o strace do toybox.
Compilando o strace do toybox.
 Essa primeira versão recebeu incialmente suporte apenas a um pequeno conjunto de system calls e opções, mas  já é possível realizar certos trabalhos normalmente. Uma parte fundamental que informam é que não há com o que se preocupar com certas funções do strace devido torná-lo muito complexo e que por esse motivo o Android nunca teve uma versão do strace (além de haver um período de transição gradativa dos micro-controladores)

strace do toybox e suas opções.
Opções strace do toybox.
 Uma informação que eu obtive é que Rob Landley quer uma versão de strace sem decodificação (apenas números brutos), o que esperam que não seja algo complicado. Tem também o fato de a glibc não utilizar as mesmas estruturas do kernel podem apresentar certos problemas, o que os leva a adicionar mais linhas de código para cada arquitetura que querem apresentar suporte (vale lembrar que a dietlibc utiliza a mesma estrutura do kernel Linux).

Rastreando o comando ls com o strace do toybox.
Rastreando o comando ls com o strace do toybox.
 Ainda há um longo caminho a ser percorrido; o strace do toybox está recebendo bugfix e talvez não terá a versão para MacOSX. Vamos aguardar para ver a evolução de mais um comando surgindo no toybox.

Lançado bc 5.2.1

bc 5.2.1
Imagem referente ao lançamento da versão anterior

 No dia 24 de Novembro eu anunciei que a linguagem bc do Gavin Howared versão 5.2 havia sido lançada (na verdade foi lançada há três semanas). E como eu já havia descrito em artigos anteriores, eu sempre espero algum tempo antes de anunciar seu lançamento pois, como a sua versão de bc avança muito rápido, é bom eu sempre esperar um pouco para acumular as novidades.
 Dito e feito, há uma semana foi lançada a versão 5.2.1 que traz correções de dois bugs quando se está no modo padrão POSIX. Um deles é devido a peculiaridade da gramática POSIX e o outro devido a linguagem bc ser muito estrito.

Lançada bc 5.1.1

Lançada a linguagem bc 5.1.1
Lançada a linguagem bc 5.1.1

 Em Maio deste ano (após o lançamento do toybox 0.8.5) eu iniciei uma trajetória de testes na linguagem bc. De lá pra cá já foi um bug report, o lançamento na versão da versão 5.0 e entrevista com o autor da linguagem e bc Gavin Howard tanto a versão em inglês quanto em português.
 No dia seis de Outubro foi lançada a versão 5.1.1 da linguagem bc. Eu não trouxe nenhuma noticia das versões anteriores pois não eram tão importantes dependendo do publico. A versão 5.0.1 por exemplo, só trazia correções para o MacOS e o Android; a versão 5.0.2 trazia uma correção na parte de teste porém, como mencionado por Gavin, caso você não tenha tido alguma experiencia que a parte de teste não apresentou problemas, essa versão não era tão importante para você.

 Já a partir da versão 5.1.0 (que foi o próximo lançamento depois da versão 5.0.2) trouxe grande novidades porém, como Gavin está sempre dando atenção especial a linguagem bc, resolvi aguardar um pouco e ver se seria lançada uma nova versão. Dito e feito, dois dias depois foi lançada a versão 5.1.1.

 A versão 5.1.0 trouxe as flags -z (para fazer bc e dc imprimirem zeros à esquerda nos números -1 <x <1) e -L (para desabilitar o wrapping quando imprimir números);  mais quatro funções à biblioteca lib2.bc (plz(), plznl(), pnlz() e pnlznl()) para permitir imprimir números com ou sem zeros a esquerda, mesmo com ou sem a opção -z já mencionado anteriormente e mais funções builtin para consultar global state como comprimento, pilhas globais e zeros à esquerda.

Uma das novas opções da linguagem bc
Uma das novas opções da linguagem bc

 Houveram também correções de bugs no if statement  que causava um erro caso não utilizasse um else antes de definir uma função; no bc banner e  na opção -q e  na versão do Windows onde arquivos não eram lidos corretamente (além de melhorias nas builds do Windows).

 Já a versão 5.1.1 trouxe somente correções de bugs complementares a versão 5.1.0 também relacionados ao statement else que o bc não lidava corretamente ao final dos arquivos ou antes da definição da função. Caso pretende baixar a linguagem e testar, não esqueçam de conferir o hash e o stat tanto do código fonte compactado quanto do arquivo .sig, sigam as instruções do manpage build.md (clicando aqui. Vale ressaltar que nessa manpage o Gavin dá dicas de como otimizar a bc) e caso encontre algum bug, não esqueça de reportar (isso facilita muito o trabalho dos desenvolvedores seguindo a cultura bazar ;)

Testando a linguagem bc no toybox 0.8.5

Testando a linguagem bc no toybox 0.8.5
Testando a linguagem bc no toybox 0.8.5 (referencia da calculadora, clique aqui)

    Esses dias postei no Instagram sobre os testes que estou realizando com a linguagem bc do terminal de comandos toybox. E como vi que teve uma boa repercussão pelo pessoal de meio acadêmico, então resolvi postar aqui também.

    Em Novembro de 2018 foi anunciado que o terminal de comandos toybox receberia suporte ao comando bc (confira aqui). Na verdade bc é uma linguagem Para realizar cálculos arbitrários ou simplesmente uma calculadora em linha de comando com suporte a linguagem de Turing compelto.

    Na versão 0.8.3 de maio de 2020, a linguagem entrou para a versão pendente. Como a versão 0.8.5 (o anuncio do lançamento pode ser conferido clicando aqui) foi lançada em Maio deste ano, eu resolvi verificar o progresso do comando.

Solucionando o problema de cálculos no Bash

    Realizar cálculos através do terminal de comandos não é nenhuma novidade. Isso é algo que há muito tempo já é natural de se realizar através de comandos como o echo.

Realizando cálculos através do comando echo.
Realizando cálculos através do comando echo.

    Porém, diferente do Ksh e o Zsh que são terminais muito mais poderosos (venha aprender mais sobre o zsh comigo clicando aqui), o Bash carece de suporte a unidade de ponto flutuante como pode conferido no exemplo abaixo:

Erro que ocorre no Bash ao tentar realizar calculo com valores quebrados.
Erro que ocorre no Bash ao tentar realizar calculo com valores quebrados.

    Mas para que você iria querer realizar este tipo de calculo pelo terminal? Pode ser que você precise escrever um shellscript que faça calculos de números exatos (não se sabe). 

    A questão é que no dia a dia, para facilitar as nossas vidas, nós arredondamos os valores; como é o caso da medida de onça que arredondamos para 30 gramas sendo que seu valor de real é de 28,3 gramas (mais especificamente 28,3495). O mesmo ocorre com outras medidas como galão (3785,41 mililitro) ou milha que corresponde a 1,6km (1,60934 km) e assim por diante. Dando um exemplo de situação na tecnologia é a velocidade de download da internet. Supondo que sua rede seja de 5 Megabits, o valor real dela é de 0.625Kbps e a de 10 Megabits corresponde a 1,25Kbps.

O comando (linguagem) bc como uma das soluções para o Bash

    Então, para solucionar este problema no Bash e obter resultados deste tipo de cálculo, é necessário utilizar algum tipo recurso externo como as linguagens Perl, awk (linguagem que eu gosto muito. Quem gosta de awk? Só eu mesmo...) e bc. bc é uma linguagem aritmética de precisão arbitrária (Página do Opengroup.org e do Plan9).

Solucionando o cálculos de ponto flutuante no Bash com a linguagem bc
Solucionando o cálculos de ponto flutuante no Bash com a linguagem bc

    Não é necessário digitar a sintaxe do bc conforme mostrei para obter o resultado do calculo; essa é uma das formas de se utilizar o comando. Digitando apenas bc, o terminal aparenta estar em hibernação, mas na verdade o terminal entra em um ambiente aguardando para receber informações (entrada). Ou seja, ele se torna uma calculadora.

Executando bc como uma calculadora.
Executando bc como uma calculadora.

Versão do bc no toybox

    A versão que utilizamos anteriormente foi desenvolvido por Philip A. Nelson (philnelson@acm.org) e forte participação de Steve Sommars (Steve.Sommars@att.com).

    Já na versão do toybox (desenvolvido por Gavin D. Howard e outros contribuidores) que apesar de que o terminal ainda está na versão 0.8.5 (estando 80% pronto para os seus objetivos), sua versão da linguagem bc já é funcional estando na versão 1.1.0, realiza as mesmas funções e ainda consegue ser mais amigável (o que é algo bem mais interessante pois desta forma o usuário sabe que está dentro de um ambiente).

Comando bc do toybox em sua versão 1.1.0
Comando bc do toybox em sua versão 1.1.0. Caso queira sair do ambiente de calculadora, ao pressionar a sequencia de teclas ctrl+c, o bc enviará a mensagem pedindo para digitar quit para sair.

Opções do comando bc do terminal toybox
Opções do comando bc do terminal toybox

awk como mais uma das soluções para o Bash

    Outro forma de realizar os mesmo cálculos é utilizando o awk que é uma linguagem de processamento que surgiu na  AT&T Bell Labs. awk possui suporte a TCP/IP, é data-driven e é rica em expressões regulares (é possível até mesmo escrever seu scripts #!/usr/bin/awk -f).

    Devido a forte adoção de linguagens como Python, pode aparentar que awk ganhando ganhe destaque no mercado; mas acredite ou não, há empresas que contratam pessoas que tenham como qualidade saber shell script ou awk ou perl.

    Eu o conheci conheci awk utilizando a linguagem como os comandos grep e cut (e que inclusive há casos de retornar melhores resultados que ambos os comandos); mas é possível utilizá-la também para realizar os mesmo cálculos que bc.

Realizando o mesmo calculo em ponto flutuante, porém, com a linguagem awk.
Realizando o mesmo calculo em ponto flutuante, porém, com a linguagem awk.

    Porém, se tentar realizar o calculo de rede para descobrir a velocidade da sua rede (supondo que 5Megabits), a bc irá retornar o valor 0 (zero). Porém, utilizando a opção -l (ou --mathlib que utiliza rotinas matemáticas pré-definidas) a linguagem bc traz os resultados exatos do calculo. 

utilizando a linguagem bc com a opção --mathlib para rotinas matemáticas pré-definidas
utilizando a linguagem bc com a opção --mathlib para rotinas matemáticas pré-definidas

    Então, outras três opções a serem exploradas na linguagem bc são a -s (--standard para erro se quaisquer extensões non-POSIX forem utilizadas), a opção -w  (--warn para aviso se quaisquer extensões non-POSIX forem utilizadas) e a possibilidade de trabalhar com escala:

Trabalhando com escala de dentro do bc.
Trabalhando com escala de dentro do bc.

Trabalhando com escala como comando no bc.
Trabalhando com escala como comando no bc.

    Já a linguagem awk consegue naturalmente retornar a resposta de forma mais exata (o que não torna awk melhor que bc, apenas realiza a mesma função).

Calculando a velocidade de download com a linguagem awk
Calculando a velocidade de download com a linguagem awk

    Ambas as linguagens são muito boas para realizar este tipo de operação, mas a linguagem bc é especializada em cálculos. Vale a ressalva que bc é realmente uma linguagem permitindo que você até mesmo programe definindo variáveis, condicionais e loops (algo que pode ser estudando a manpage da bc); calcular a divisão casas decimais; potência; raiz quadrada; o valor de pi; converter o número hexadecimal 2D para decimal; converter o números decimais em hexadecimal, octal e binário; verificar se números são pares ou ímpares e muito mais.

Código para executar os números de Fibonacci.Código para executar os números de Fibonacci.
Código para executar os números de Fibonacci.



Exemplo de código bc extraído de sua man page (man 1 bc)
Exemplo de código bc extraído de sua man page (man 1 bc)

Outro exemplo de código bc extraído de sua man page (man 1 bc)Exemplo de código bc extraído de sua man page (man 1 bc)

Dicas finais

    Bom, além de ter em mãos duas soluções para cálculos utilizando ponto flutuante, três outras dicas que eu deixaria seriam:
  1. Analisar qual o melhor terminal para escrever seus scripts (geralmente os professores tem um forte vício em ensinar utilizando #!/bin/bash e o que pode ser um grande erro. De repente #!/bin/sh pode ser uma opção melhor).
  2. Foquem também awk para melhorar os seus scripts.
  3. venha aprender Linux comigo porque aqui você aprende de verdade e sem papo de ideologia ou filosofia ;)

Marcadores

A pior história sobre Linux que já ouvi (5) A.I (1) ambiente gráfico (19) AMD (14) analise (9) Andriod (14) android (5) artigo (5) aws (1) bc (16) benchmark (3) BSDs (27) btrfs (30) bugs (1) Caixa de Ferramentas do UNIX (19) canto do Diego Lins (2) certificações Linux (7) Código Fonte (53) comandos (24) comp (1) compressores (5) container (6) CPU (19) criptografia (4) crowdfunding (9) cursos (24) daemons (13) Debian (31) desenvolvimento (80) desktop (19) DevOps (3) DevSecOps (3) dic (1) Dica de leitura (86) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (1) diocast (1) dioliunx (3) distribuições Linux (13) Docker (11) DragonflyBSD (20) ead Diolinux (2) edição de vídeo (5) EMMI Linux (4) emuladores (5) endless (5) English interview (3) Enless OS (2) entrevista (17) espaço aberto (82) evento (6) facebook (1) Fedora (10) filesystem (75) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (20) Funtoo Linux (13) games (90) gerenciadores de pacotes (3) GOG (3) google (8) gpu (3) hardware (101) hash (1) helenos (3) I.A (1) init system (8) Intel (15) IoT (1) ispconfig (1) jogos (36) kde (1) kernel (134) lançamento (60) leis (1) LFCS (1) licenças (8) Linus (16) linus torvalds (2) Linux (194) linux foundation (3) linux para leigos (1) live (5) LPI (8) LTS (1) machine learning (1) matemática (4) mesa redonda (27) microsoft (6) microst (1) muito além do GNU (146) não viva de boatos (9) navegadores (3) NetBSD (7) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) open source (82) OpenBSD (5) OpenShift (1) os vários sabores de Linux (39) padrim (2) palestras e eventos (5) partições (6) pentest (8) pipewire (1) processadores (27) professor Augusto Manzano (11) Programação (60) promoção (1) propagandas com Linux (8) Red Hat (21) redes (3) resenha nerd (4) Resumo da Semana do Dlins (2) resumo do Tux (19) retrospectiva Linux (1) risc-V (1) runlevel (2) segurança digital (19) servidores (1) shell (3) sistema operacional (22) smartphones (3) Software livre e de código aberto (150) sorteio (3) Steam (9) Steam no Linux (7) supercomputadores (4) suse (7) systemd (7) terminal (83) terminal de comandos (11) toca do tux (1) toybox (23) tutorial (6) Tux (3) unboxing (7) UNIX (16) UNIX Toolbox (14) vartroy (1) vga (1) vulnerabilidade (4) wayland (5) whatsapp (1) Windows Subsystem for Linux (2) wine (14) WoT (1) ZFS (13) zsh (2)