vzi はviz の精神的な後継者です
vziコマンド ラインは (現在は) deno を使用して実装されており、レンダリングには Chrome DevTools プロトコルが必要です。 vzi はMac に対してのみテストされていますが、Linux でも簡単に動作するはずです (Chrome バイナリへのパスを指定するだけです)。
私たちの多くは何十年もコマンド ラインを使用してきました。コマンド ライン インターフェイスの成功は、 Unixパイプのアイデアと密接に結びついています。パイプを使用すると、操作している入力データのニーズに合わせて複雑な関数をその場で作成できるようになります。この目的のために、シェルは人間がマシンに命令するために発明した中で最も帯域幅の高い入力メカニズムです。
しかし、私たちは、多くの時間を費やすもう 1 つの非常に動的な環境、つまりブラウザーにデータをパイプする良い方法を持っていません。 vziの目標は、そのギャップを埋めることであり、私たちが大切にしているデータ パイプラインの一部として Web ベースの作品を含めることができます。
端末内のデータを見ても、それをうまく解釈する方法がないことがよくありますが、わずかな変換を行うことで、私たちの目は深いパターンを理解できるようになります。緯度と経度の座標を含むデータ ソースがある場合、このデータを探索する自然な方法は地図を使用することです。 vzi を使用してデータをパイプすることでこれを行うことができます。例:
$ your data source | vzi -m scatter -d 'y=lat($[0])' -d 'x=lng($[1])' -d c=2
以下は、 latitude longitude language
形式のデータ行を含む上記のコマンドを使用して生成された状態のスクリーンショットです。
vziによって常に生成される実際のレポートの状態は、完全で本格的な Web ページであり、静的な画像よりもはるかに豊富です。選択した場合は、最終 (または中間) レポートの状態を保存したり、出力を無視してブラウザ内で一時的にレポート状態を操作したりすることもできます。いずれにせよ、 vzi を使用すると、データ分析セッションがより楽しく、生産的になります。
組み込まれているもう 1 つのタイプの視覚化は、 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
オプションを使用して指定できます。
ブラウザ ウィンドウが開いたままの状態で、ブラウザに対して開いているstdinパイプにメッセージを入力できます。
> hello, world!
行が完全になるように、最後に必ず改行を入力してください。開いているブラウザ ウィンドウに戻ると、ドキュメント本文にメッセージが表示されます。好きなだけ行を入力すると、各行がドキュメントを更新します。完了したら、 ^D
使用してパイプを閉じます。
vziリポジトリ ディレクトリのクローンを作成した場合は、そのディレクトリ内からこれを試すことができます。
$ bin/gen-yxz | vzi -m scatter -d c=2
デフォルトでは、 vzi は単一の最終的なレポートドキュメントをstdoutに生成します。 vzi ( Chrome経由) によって実行されるパイプは、新しいイベントを受信したときにブラウザーの状態に何が起こるかを定義します。
vzi にパイプの実行方法を指示するには 3 つの方法があります。
-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
ヘッドレスでの実行はかなり高度な操作モードとみなされますが、非常にうまく機能します。一般に、ブラウザにはアタッチとデタッチの2 つの動作モードがあります。デタッチして実行すると (ヘッドレスでない場合はデフォルト)、開始が少し簡単かつスムーズになります。特にヘッドレスなしで実行すると、何が起こっているかを正確に確認できるためです。アタッチ モードでは、割り込みによりブラウザが強制終了されるため、適切な EOF を送信しない限り、出力レポートを取得できません。生成された出力がブラウザに表示されるため、ヘッドレスなしでも問題ありません。ただし、接続されたヘッドレス モードで実行する場合、通常は無限ストリームをパイプする必要はありません。これは、EOF がないとプロセスを正常に強制終了できず、出力もレポートも取得できないためです。
利用可能なオプションの中には、ツールの仕組みを理解していないと混乱を招くものもあります。全体的なセットアップは複雑ですが、簡単です。 DevTools の実装が判明すると、ページが開かれ、Chrome デバッグ プロトコル上のレイヤーを介してイベントが送信されます。このコンテキスト内で、ユーザー定義のパイプ ハンドラー関数が実行されます。
vzi が提供する主要なインターフェイスは 2 つあります。 1 つは、出力レポートの作成方法の仕様です。もう 1 つは、ユーザー定義関数が実行される環境と、使用されるコールバックです。この環境で実行されるユーザー定義のロジックをパイプと呼びます。このパイプは、内部で実行される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)'