vzi es el sucesor espiritual de viz
La línea de comando vzi se implementa (ahora) usando deno, y la renderización requiere el protocolo Chrome DevTools. vzi solo ha sido probado para Mac, aunque debería funcionar trivialmente en Linux (solo dígale la ruta al binario de Chrome).
Muchos de nosotros hemos estado usando la línea de comandos durante décadas. El éxito de la interfaz de línea de comandos está íntimamente ligado a la idea de las canalizaciones Unix . Las tuberías nos brindan la capacidad de componer funciones complejas sobre la marcha, adaptadas a las necesidades de los datos de entrada que estamos manipulando. Para este propósito, el caparazón es el mecanismo de entrada de mayor ancho de banda que los humanos han inventado hasta ahora para instruir a las máquinas.
Y, sin embargo, no tenemos una buena manera de canalizar datos hacia ese otro entorno altamente dinámico en el que pasamos mucho tiempo: el navegador. El objetivo de vzi es cerrar esa brecha, para que podamos incluir composiciones basadas en web como parte de nuestros preciados canales de datos.
Al mirar los datos en la terminal, a menudo no tenemos una buena manera de interpretarlos, pero con una ligera transformación, nuestros ojos son capaces de comprender patrones profundos. Dada una fuente de datos que contiene coordenadas de latitud y longitud, una forma natural de explorar estos datos es utilizando un mapa. Puedes hacerlo con vzi canalizando los datos a él, por ejemplo:
$ your data source | vzi -m scatter -d 'y=lat($[0])' -d 'x=lng($[1])' -d c=2
Aquí hay una captura de pantalla del estado producido al usar el comando anterior con líneas de datos del formato latitude longitude language
:
El estado del informe real producido por vzi en un momento dado es una página web completa y completa, mucho más rica que una imagen estática. Si lo desea, se pueden guardar los estados finales (o intermedios) del informe, o simplemente puede desear interactuar con él temporalmente dentro del navegador, ignorando el resultado. De cualquier manera, vzi hace que las sesiones de análisis de datos sean más divertidas y productivas.
Otro tipo de visualización que viene incorporada es el módulo bucket
. A continuación se muestra una captura de pantalla del informe generado por el comando:
$ bin/gen-yxz | vzi -m hist -d c=2
Los módulos pueden reutilizar código entre sí. El comando anterior es en realidad equivalente al comando:
$ bin/gen-yxz | vzi -m bucket -d c=2 -d orderBy=freq
Los módulos scatter
y bucket
son bastante generales y se pueden utilizar con gran efecto en cualquier cantidad de situaciones. Sin embargo, es fácil escribir otros módulos de tuberías y, de hecho, hacerlo puede ser un ejercicio bastante divertido.
Primero, instale Chrome Canary. No es estrictamente necesario, pero es la mejor y más sencilla forma de utilizar vzi actualmente.
Puede instalar la herramienta de línea de comando globalmente con deno usando:
deno install -A -f https://raw.githubusercontent.com/jflatow/vzi/master/bin/vzi
Un mejor método para los desarrolladores es clonar el repositorio e instalarlo:
$ git clone https://github.com/jflatow/vzi.git
$ cd vzi && make install
Pruebe rápidamente que funciona:
$ vzi
Debería abrir una ventana en el navegador. De lo contrario, es posible que necesite usar la opción -b
para indicarle a vzi dónde está la ruta ejecutable del navegador. Para obtener una lista completa de opciones: vzi -h
.
Si Canary ya se inició sin el puerto de depuración remota abierto, es posible que reciba un error cuando vzi solicite una nueva página (es decir, /json/new
). En ese caso, simplemente salga de Chrome y deje que vzi lo inicie como quiera, o vuelva a abrirlo usted mismo con el puerto abierto. El puerto predeterminado utilizado por vzi es 9222
, pero puede especificarlo usando la opción -p
.
Con la ventana del navegador aún abierta, en la canalización estándar que está abierta al navegador, puede escribir un mensaje:
> hello, world!
Asegúrese de ingresar una nueva línea al final, para que la línea esté completa. De vuelta en la ventana abierta del navegador, debería ver su mensaje en el cuerpo del documento. Ingrese tantas líneas como desee, cada una actualiza el documento. Cuando haya terminado, cierre la tubería usando ^D
.
Si ha clonado el directorio de repositorio vzi , puede intentar esto desde dentro:
$ bin/gen-yxz | vzi -m scatter -d c=2
De forma predeterminada, vzi producirá un documento de informe único y final en stdout . La canalización que ejecuta vzi (a través de Chrome ) define lo que sucede con el estado del navegador a medida que se reciben nuevos eventos.
Hay tres formas de indicarle a vzi cómo ejecutar su canalización:
-c, --cli
-m, --module
$ cat events | vzi pipe.js
$ cat events | vzi -c '...'
$ cat events | vzi -m module
Si se proporciona la opción -K, --keep-alive
, vzi no intentará cerrar el navegador. El -OK
se puede utilizar en conjunto para una sesión tranquila e interactiva.
Si se proporciona la opción -O, --no-output
, la salida se desactivará. Si se proporciona la opción -o, --output
, vzi escribirá el estado del informe en la ruta de salida después de cada lote de eventos. De esta manera, se pueden observar cambios en el archivo de salida para observar el estado reciente de la canalización (por ejemplo, cuando se ejecuta sin cabeza). Si no se especifican -o
ni -O
, solo se escribe el estado final en stdout .
$ cat events | vzi pipe.js -O
$ cat events | vzi pipe.js -o report.html
$ cat events | vzi pipe.js > report.html
También se puede controlar el mecanismo que usa vzi para representar los eventos usando la opción -p, --port
. Si se proporciona, se supone que el puerto habla el protocolo de conexión de DevTools (por ejemplo, un navegador con la depuración remota habilitada). Si no se proporciona la opción -p
, vzi creará su propio navegador para renderizar.
$ cat events | vzi pipe.js
$ cat events | vzi pipe.js -p PORT
$ cat events | vzi pipe.js -p PORT > report.html
Se puede dar la opción -H, --headless
para forzar a vzi a crear un navegador sin cabeza. Esto requiere un navegador capaz de ejecutarse sin cabeza (NB: Chrome Canary en el momento de escribir este artículo).
$ cat events | vzi pipe.js -H
Correr sin cabeza se considera un modo de funcionamiento bastante avanzado, aunque funciona bastante bien. En general, existen 2 modos de funcionamiento del navegador: adjunto y desconectado . Cuando se ejecuta de forma independiente (predeterminado si no sin cabeza), las cosas son un poco más fáciles y fluidas para comenzar. Especialmente cuando corres sin cabeza, ya que puedes ver exactamente lo que está sucediendo. En el modo adjunto, las interrupciones terminan matando al navegador, por lo que, a menos que envíe un EOF adecuado, no obtendrá un informe de salida. Esto todavía está bien sin cabeza, ya que aún verá el resultado en el navegador tal como se genera. Sin embargo, cuando se ejecuta en modo sin cabeza adjunto, generalmente no desea canalizar una secuencia infinita. Esto se debe a que sin un EOF no podrá finalizar el proceso correctamente, por lo que no verá el resultado ni obtendrá un informe.
Algunas de las opciones disponibles pueden resultar confusas si no se comprende cómo funciona la herramienta. La configuración general es compleja pero sencilla. Una vez que se conoce la implementación de DevTools, se abre una página y los eventos se envían a través de una capa encima del protocolo de depuración de Chrome. Dentro de este contexto, se ejecutan las funciones del controlador de tuberías definidas por el usuario.
Hay dos interfaces clave que proporciona vzi . Una es la especificación de cómo se produce un informe de resultados. El otro es el entorno en el que se ejecutan las funciones definidas por el usuario y las devoluciones de llamada que se utilizan. A la lógica definida por el usuario que se ejecuta en este entorno la llamamos tubería . La tubería maneja la lógica de visualización de la tubería Unix en la que se ejecuta.
La interfaz de tubería está actualmente definida en index.js. Los mejores ejemplos son los módulos integrados, enumerados aquí en orden de complejidad:
Aquí hay algunos otros ejemplos rápidos que puedes probar, suponiendo que hayas clonado el repositorio:
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)'