vzi é o sucessor espiritual de viz
A linha de comando vzi (agora) é implementada usando deno, e a renderização requer o protocolo Chrome DevTools. vzi só foi testado para Mac, embora deva funcionar trivialmente no Linux (basta informar o caminho para o binário do Chrome).
Muitos de nós usamos a linha de comando há décadas. O sucesso da interface de linha de comando está intimamente ligado à ideia dos pipes Unix . Pipes nos dão a capacidade de compor funções complexas dinamicamente, adaptadas às necessidades dos dados de entrada que estamos manipulando. Para este propósito, o shell é o mecanismo de entrada de maior largura de banda que os humanos já inventaram para instruir máquinas.
E ainda assim, não temos uma boa maneira de canalizar os dados para outro ambiente altamente dinâmico no qual passamos muito tempo: o navegador. O objetivo do vzi é preencher essa lacuna, para que possamos incluir composições baseadas na web como parte de nossos preciosos pipelines de dados.
Olhando para os dados no terminal, muitas vezes não temos uma boa maneira de interpretá-los, mas com alguma ligeira transformação, os nossos olhos são capazes de compreender padrões profundos. Dada uma fonte de dados que contém coordenadas de latitude e longitude, uma forma natural de explorar esses dados é utilizar um mapa. Você pode fazer isso com o vzi canalizando os dados para ele, por exemplo:
$ your data source | vzi -m scatter -d 'y=lat($[0])' -d 'x=lng($[1])' -d c=2
Aqui está uma captura de tela do estado produzido usando o comando acima com linhas de dados no formato latitude longitude language
:
O estado real do relatório produzido pelo vzi a qualquer momento é uma página da web completa e completa, muito mais rica do que uma imagem estática. Se você escolher, o(s) estado(s) do relatório final (ou intermediário) pode(m) ser salvo(s), ou você pode simplesmente desejar interagir com ele temporariamente dentro do navegador, ignorando a saída. De qualquer forma, o vzi torna as sessões de análise de dados mais divertidas e produtivas.
Outro tipo de visualização que vem integrado é o módulo bucket
. Abaixo está uma captura de tela do relatório produzido pelo comando:
$ bin/gen-yxz | vzi -m hist -d c=2
Os módulos podem reutilizar códigos uns dos outros. O comando acima é na verdade equivalente ao comando:
$ bin/gen-yxz | vzi -m bucket -d c=2 -d orderBy=freq
Os módulos scatter
e bucket
são bastante gerais e podem ser usados com grande efeito em diversas situações. No entanto, é fácil escrever outros módulos de tubos e fazer isso pode ser um exercício bastante agradável.
Primeiro, instale o Chrome Canary. Não é estritamente obrigatório, mas é a maneira melhor e mais fácil de usar o vzi atualmente.
Você pode instalar a ferramenta de linha de comando globalmente com deno usando:
deno install -A -f https://raw.githubusercontent.com/jflatow/vzi/master/bin/vzi
Um método melhor para desenvolvedores é clonar o repositório e instalá-lo:
$ git clone https://github.com/jflatow/vzi.git
$ cd vzi && make install
Teste rapidamente se funciona:
$ vzi
Deve abrir uma janela no navegador. Caso contrário, pode ser necessário usar a opção -b
para informar ao vzi onde está o caminho executável do navegador. Para uma lista completa de opções: vzi -h
.
Se o Canary já estiver iniciado sem a porta de depuração remota aberta, você poderá receber um erro quando o vzi solicitar uma nova página (ou seja, /json/new
). Nesse caso, basta sair do Chrome e deixar o vzi iniciá-lo da maneira que desejar ou reabri-lo você mesmo com a porta aberta. A porta padrão usada pelo vzi é 9222
, mas você pode especificá-la usando a opção -p
.
Com a janela do navegador ainda aberta, no canal stdin aberto para o navegador, você pode digitar uma mensagem:
> hello, world!
Certifique-se de inserir uma nova linha no final, para que a linha fique completa. De volta à janela aberta do navegador, você deverá ver sua mensagem no corpo do documento. Insira quantas linhas desejar, cada uma atualiza o documento. Quando terminar, feche o pipe usando ^D
.
Se você clonou o diretório do repositório vzi , você pode tentar isso dentro dele:
$ bin/gen-yxz | vzi -m scatter -d c=2
Por padrão, o vzi produzirá um único documento de relatório final em stdout . O pipe executado pelo vzi (via Chrome ) define o que acontece com o estado do navegador conforme novos eventos são recebidos.
Existem três maneiras de dizer ao vzi como executar seu pipe:
-c, --cli
-m, --module
$ cat events | vzi pipe.js
$ cat events | vzi -c '...'
$ cat events | vzi -m module
Se a opção -K, --keep-alive
for fornecida, o vzi não tentará fechar o navegador. O -OK
pode ser usado em conjunto para uma sessão silenciosa e interativa.
Se a opção -O, --no-output
for fornecida, a saída será desabilitada. Se a opção -o, --output
for fornecida, o vzi gravará seu estado de relatório no caminho de saída após cada lote de eventos. Dessa forma, pode-se observar alterações no arquivo de saída para observar o estado recente do pipeline (por exemplo, ao executar sem comando). Se nem -o
nem -O
forem especificados, apenas o estado final será gravado em stdout .
$ cat events | vzi pipe.js -O
$ cat events | vzi pipe.js -o report.html
$ cat events | vzi pipe.js > report.html
Também é possível controlar o mecanismo que o vzi usa para renderizar os eventos usando a opção -p, --port
. Se fornecido, presume-se que a porta fale o protocolo de conexão do DevTools (por exemplo, um navegador com depuração remota habilitada). Se a opção -p
não for fornecida, o vzi criará seu próprio navegador para renderização.
$ cat events | vzi pipe.js
$ cat events | vzi pipe.js -p PORT
$ cat events | vzi pipe.js -p PORT > report.html
A opção -H, --headless
pode ser fornecida para forçar o vzi a criar um navegador sem cabeça. Isso requer um navegador capaz de funcionar sem cabeça (NB: Chrome Canary no momento da redação deste artigo).
$ cat events | vzi pipe.js -H
Correr sem cabeça é considerado um modo de operação bastante avançado, embora funcione muito bem. Em geral, existem 2 modos de operação do navegador: anexado e desanexado . Quando você executa desanexado (padrão, se não sem cabeça), as coisas ficam um pouco mais fáceis e suaves para começar. Principalmente quando você corre sem cabeça, pois pode ver exatamente o que está acontecendo. No modo anexado, as interrupções acabam matando o navegador; portanto, a menos que você envie um EOF adequado, não receberá um relatório de saída. Isso ainda funciona sem headless, pois você ainda vê a saída no navegador conforme é gerada. No entanto, quando você executa no modo headless anexado, geralmente não deseja canalizar um fluxo infinito. Isso ocorre porque sem um EOF você não será capaz de encerrar o processo normalmente e, portanto, não verá a saída nem receberá um relatório.
Algumas das opções disponíveis podem ser confusas sem a compreensão de como a ferramenta funciona. A configuração geral é complexa, mas direta. Uma vez conhecida a implementação do DevTools, uma página é aberta e os eventos são enviados por meio de uma camada sobre o protocolo de depuração do Chrome. Dentro deste contexto, as funções do manipulador de pipe definidas pelo usuário são executadas.
Existem duas interfaces principais fornecidas pelo vzi . Uma delas é a especificação de como um relatório de saída é produzido. O outro é o ambiente no qual as funções definidas pelo usuário são executadas e os retornos de chamada usados. Chamamos a lógica definida pelo usuário que é executada neste ambiente de pipe . O pipe lida com a lógica de visualização do pipe Unix em que ele é executado.
A interface do pipe está atualmente definida em index.js. Os melhores exemplos são os módulos integrados, listados aqui em ordem de complexidade:
Aqui estão alguns outros exemplos rápidos que você pode tentar, supondo que tenha clonado o repositório:
bin/gen-yxz | vzi -m scatter -d y='log($[0])' -d ys='exp(_)'
bin/gen-line | vzi -m hist -d v=1 -d k='second((new Date - 0) / 1000, 3)'