vzi是 viz 的精神继承者
vzi命令行(现在)使用 deno 实现,渲染需要 Chrome DevTools 协议。 vzi仅针对 Mac 进行了测试,尽管它应该可以在 Linux 上正常工作(只需告诉它 Chrome 二进制文件的路径)。
我们中的许多人已经使用命令行数十年了。命令行界面的成功与Unix管道的思想密切相关。管道使我们能够根据我们正在操作的输入数据的需求动态组合复杂的函数。为此,shell 是人类迄今为止发明的用于指令机器的最高带宽输入机制。
然而,我们没有好的方法将数据传输到我们花费大量时间的另一个高度动态的环境:浏览器。 vzi的目标是弥合这一差距,因此我们可以将基于网络的合成作为我们珍视的数据管道的一部分。
在终端中查看数据时,我们通常没有很好的方法来解释它,但通过一些轻微的转换,我们的眼睛能够理解深层的模式。给定包含纬度和经度坐标的数据源,探索该数据的自然方法是使用地图。您可以通过将数据通过管道传递给vzi来做到这一点,例如:
$ your data source | vzi -m scatter -d 'y=lat($[0])' -d 'x=lng($[1])' -d c=2
以下是使用上述命令生成的状态屏幕截图,其中数据行的格式为latitude longitude language
:
vzi在任何给定时间生成的实际报告状态是一个完整且成熟的网页,比静态图像丰富得多。如果您选择,可以保存最终(或中间)报告状态,或者您可能只是希望在浏览器内暂时与其交互,而忽略输出。无论哪种方式, vzi都使数据分析会议变得更加有趣和高效。
另一种内置的可视化类型是存储bucket
模块。下面是该命令生成的报告的屏幕截图:
$ bin/gen-yxz | vzi -m hist -d c=2
模块可以互相重用代码。上面的命令实际上相当于以下命令:
$ bin/gen-yxz | vzi -m bucket -d c=2 -d orderBy=freq
scatter
和bucket
模块相当通用,可以在许多情况下发挥巨大作用。然而,编写其他管道模块很容易,而且这样做实际上是一个非常有趣的练习。
首先,安装 Chrome Canary。这不是严格要求的,但它是目前使用vzi 的最佳和最简单的方法。
您可以使用 deno 全局安装命令行工具:
deno install -A -f https://raw.githubusercontent.com/jflatow/vzi/master/bin/vzi
对于开发人员来说,更好的方法是克隆存储库并安装它:
$ git clone https://github.com/jflatow/vzi.git
$ cd vzi && make install
快速测试一下是否有效:
$ vzi
它应该在浏览器中打开一个窗口。如果没有,您可能需要使用-b
选项来告诉vzi浏览器可执行路径在哪里。有关选项的完整列表: vzi -h
。
如果 Canary 已经启动而没有打开远程调试端口,则当vzi请求新页面(即/json/new
)时,您可能会收到错误消息。在这种情况下,只需退出 Chrome 并让vzi按其想要的方式启动它,或者在端口打开的情况下自行重新打开它。 vzi使用的默认端口是9222
,但您可以使用-p
选项指定它。
在浏览器窗口仍然打开的情况下,您可以在向浏览器打开的标准输入管道上键入一条消息:
> hello, world!
确保在末尾输入换行符,以便该行完整。返回打开的浏览器窗口,您应该在文档正文中看到您的消息。输入任意多行,每一行都会更新文档。完成后,使用^D
关闭管道。
如果您已经克隆了vzi repo 目录,您可以从其中尝试以下操作:
$ bin/gen-yxz | vzi -m scatter -d c=2
默认情况下, vzi将在stdout上生成单个最终报告文档。由vzi (通过Chrome )执行的管道定义了收到新事件时浏览器状态会发生什么。
有三种方法告诉vzi如何执行它的管道:
-c, --cli
选项直接传递脚本-m, --module
选项传递内置模块的名称 $ cat events | vzi pipe.js
$ cat events | vzi -c '...'
$ cat events | vzi -m module
如果给出-K, --keep-alive
选项, vzi将不会尝试关闭浏览器。 -OK
可以一起使用以实现安静的交互式会话。
如果给出-O, --no-output
选项,输出将被禁用。如果给出-o, --output
选项, vzi将在每批事件之后将其报告状态写入输出路径。通过这种方式,人们可以观察输出文件的变化,以便观察管道的最新状态(例如,当无头运行时)。如果-o
和-O
均未指定,则仅将最终状态写入stdout 。
$ cat events | vzi pipe.js -O
$ cat events | vzi pipe.js -o report.html
$ cat events | vzi pipe.js > report.html
还可以使用-p, --port
选项来控制vzi用于呈现事件的机制。如果给定,则假定该端口使用 DevTools 有线协议(例如启用了远程调试的浏览器)。如果未给出-p
选项, vzi将创建自己的浏览器进行渲染。
$ cat events | vzi pipe.js
$ cat events | vzi pipe.js -p PORT
$ cat events | vzi pipe.js -p PORT > report.html
可以给出-H, --headless
选项来强制vzi创建无头浏览器。这需要一个能够无头运行的浏览器(注意:撰写本文时的Chrome Canary )。
$ cat events | vzi pipe.js -H
无头运行被认为是一种相当高级的操作模式,尽管它效果很好。一般来说,浏览器有两种操作模式:附加模式和分离模式。当你独立运行时(默认情况下,如果不是无头的话),事情会更容易、更顺利地开始。尤其是当你没有无头跑步时,因为你可以清楚地看到发生了什么。在附加模式下,中断最终会杀死浏览器,因此除非您发送正确的 EOF,否则您将不会获得输出报告。如果没有 headless,这仍然没问题,因为您仍然可以在浏览器中看到生成的输出。但是,当您在附加的无头模式下运行时,您通常不希望通过管道传输无限流。这是因为如果没有 EOF,您将无法正常终止进程,因此您既不会看到输出,也不会得到报告。
如果不了解该工具的工作原理,一些可用选项可能会令人困惑。整体设置复杂但简单。一旦了解了 DevTools 的实现,就会打开一个页面,并通过 Chrome 调试协议之上的一层发送事件。在此上下文中,执行用户定义的管道处理程序函数。
vzi提供了两个关键接口。一是如何生成输出报告的规范。另一个是用户定义函数运行的环境以及使用的回调。我们将在此环境中执行的用户定义逻辑称为管道。该管道处理其内部运行的Unix管道的可视化逻辑。
管道接口当前在index.js 中定义。最好的例子是内置模块,这里按复杂性顺序列出:
假设您已经克隆了存储库,那么您可以尝试以下一些其他快速示例:
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)'