vzi est le successeur spirituel de viz
La ligne de commande vzi est (maintenant) implémentée à l'aide de deno et le rendu nécessite le protocole Chrome DevTools. vzi n'a été testé que pour Mac, bien qu'il devrait fonctionner sous Linux (il suffit de lui indiquer le chemin d'accès au binaire Chrome).
Beaucoup d’entre nous utilisent la ligne de commande depuis des décennies. Le succès de l’interface de ligne de commande est intimement lié à l’idée des pipes Unix . Les tuyaux nous donnent la possibilité de composer des fonctions complexes à la volée, adaptées aux besoins des données d'entrée que nous manipulons. À cette fin, le shell est le mécanisme d’entrée à bande passante la plus élevée que les humains aient jamais inventé pour instruire les machines.
Et pourtant, nous ne disposons d’aucun moyen efficace pour acheminer les données vers cet autre environnement hautement dynamique dans lequel nous passons beaucoup de temps : le navigateur. L'objectif de vzi est de combler cette lacune, afin que nous puissions inclure des compositions basées sur le Web dans le cadre de nos précieux pipelines de données.
En regardant les données dans le terminal, nous n’avons souvent aucun moyen efficace de les interpréter, mais avec une légère transformation, nos yeux sont capables de comprendre des schémas profonds. Étant donné une source de données contenant des coordonnées de latitude et de longitude, une manière naturelle d’explorer ces données consiste à utiliser une carte. Vous pouvez le faire avec vzi en y redirigeant les données, par exemple :
$ your data source | vzi -m scatter -d 'y=lat($[0])' -d 'x=lng($[1])' -d c=2
Voici une capture d'écran de l'état produit en utilisant la commande ci-dessus avec des lignes de données du formulaire latitude longitude language
:
L'état réel du rapport produit par vzi à un moment donné est une page Web complète et à part entière, bien plus riche qu'une image statique. Si vous le souhaitez, le ou les états finaux (ou intermédiaires) du rapport peuvent être enregistrés, ou vous pouvez simplement souhaiter interagir temporairement avec eux dans le navigateur, en ignorant la sortie. Quoi qu'il en soit, vzi rend les sessions d'analyse de données plus amusantes et productives.
Un autre type de visualisation intégré est le module bucket
. Ci-dessous une capture d'écran du rapport produit par la commande :
$ bin/gen-yxz | vzi -m hist -d c=2
Les modules peuvent réutiliser le code les uns des autres. La commande ci-dessus est en fait équivalente à la commande :
$ bin/gen-yxz | vzi -m bucket -d c=2 -d orderBy=freq
Les modules scatter
et bucket
sont plutôt généraux et peuvent être utilisés à bon escient dans un certain nombre de situations. Cependant, il est facile d’écrire d’autres modules pipe, et cela peut en fait être un exercice plutôt agréable.
Tout d’abord, installez Chrome Canary. Ce n'est pas strictement obligatoire, mais c'est actuellement le moyen le meilleur et le plus simple d'utiliser vzi .
Vous pouvez installer l'outil de ligne de commande globalement avec deno en utilisant :
deno install -A -f https://raw.githubusercontent.com/jflatow/vzi/master/bin/vzi
Une meilleure méthode pour les développeurs consiste à cloner le référentiel et à l'installer :
$ git clone https://github.com/jflatow/vzi.git
$ cd vzi && make install
Testez vite que ça marche :
$ vzi
Cela devrait ouvrir une fenêtre dans le navigateur. Sinon, vous devrez peut-être utiliser l'option -b
pour indiquer à vzi où se trouve le chemin de l'exécutable du navigateur. Pour une liste complète des options : vzi -h
.
Si Canary est déjà lancé sans que le port de débogage distant soit ouvert, vous pouvez obtenir une erreur lorsque vzi demande une nouvelle page (c'est-à-dire /json/new
). Dans ce cas, quittez simplement Chrome et laissez vzi le lancer comme il le souhaite, ou rouvrez-le vous-même avec le port ouvert. Le port par défaut utilisé par vzi est 9222
, mais vous pouvez le spécifier à l'aide de l'option -p
.
La fenêtre du navigateur étant toujours ouverte, sur le tube stdin ouvert au navigateur, vous pouvez taper un message :
> hello, world!
Assurez-vous de saisir une nouvelle ligne à la fin, afin que la ligne soit complète. De retour dans la fenêtre ouverte du navigateur, vous devriez voir votre message dans le corps du document. Saisissez autant de lignes que vous le souhaitez, chacune met à jour le document. Lorsque vous avez terminé, fermez le tuyau en utilisant ^D
.
Si vous avez cloné le répertoire du dépôt vzi , vous pouvez essayer ceci depuis celui-ci :
$ bin/gen-yxz | vzi -m scatter -d c=2
Par défaut, vzi produira un seul document de rapport final sur stdout . Le canal exécuté par vzi (via Chrome ) définit ce qui arrive à l'état du navigateur à mesure que de nouveaux événements sont reçus.
Il existe trois manières d'indiquer à vzi comment exécuter son tube :
-c, --cli
-m, --module
$ cat events | vzi pipe.js
$ cat events | vzi -c '...'
$ cat events | vzi -m module
Si l'option -K, --keep-alive
est donnée, vzi ne tentera pas de fermer le navigateur. Les -OK
peuvent être utilisés ensemble pour une session silencieuse et interactive.
Si l'option -O, --no-output
est donnée, la sortie sera désactivée. Si l'option -o, --output
est donnée, vzi écrira son état de rapport dans le chemin de sortie après chaque lot d'événements. De cette façon, on peut surveiller les changements dans le fichier de sortie afin d'observer l'état récent du pipeline (par exemple lors d'une exécution sans tête). Si ni -o
ni -O
ne sont spécifiés, seul l'état final est écrit sur stdout .
$ cat events | vzi pipe.js -O
$ cat events | vzi pipe.js -o report.html
$ cat events | vzi pipe.js > report.html
On peut également contrôler le mécanisme utilisé par vzi pour restituer les événements en utilisant l'option -p, --port
. S'il est indiqué, le port est supposé parler le protocole filaire DevTools (par exemple un navigateur avec le débogage à distance activé). Si l'option -p
n'est pas donnée, vzi créera son propre navigateur pour le rendu.
$ cat events | vzi pipe.js
$ cat events | vzi pipe.js -p PORT
$ cat events | vzi pipe.js -p PORT > report.html
L'option -H, --headless
peut être donnée pour forcer vzi à créer un navigateur sans tête. Cela nécessite un navigateur capable de fonctionner sans tête (NB : Chrome Canary au moment d'écrire ces lignes).
$ cat events | vzi pipe.js -H
Courir sans tête est considéré comme un mode de fonctionnement plutôt avancé, même s’il fonctionne plutôt bien. En général, il existe 2 modes de fonctionnement du navigateur : attaché et détaché . Lorsque vous exécutez détaché (par défaut sinon sans tête), les choses sont un peu plus faciles et plus fluides pour démarrer. Surtout quand vous courez sans tête, puisque vous pouvez voir exactement ce qui se passe. En mode attaché, les interruptions finissent par tuer le navigateur, donc à moins que vous n'envoyiez un EOF approprié, vous n'obtiendrez pas de rapport de sortie. C'est toujours très bien sans headless, puisque vous voyez toujours la sortie dans le navigateur telle qu'elle est générée. Cependant, lorsque vous exécutez en mode sans tête, vous ne souhaitez généralement pas diffuser un flux infini. En effet, sans EOF, vous ne pourrez pas arrêter le processus correctement, vous ne verrez donc ni le résultat ni n'obtiendrez de rapport.
Certaines des options disponibles peuvent prêter à confusion sans une compréhension du fonctionnement de l'outil. La configuration globale est complexe mais simple. Une fois l'implémentation de DevTools connue, une page est ouverte et les événements sont envoyés via une couche au-dessus du protocole de débogage Chrome. Dans ce contexte, les fonctions du gestionnaire de tuyaux définies par l'utilisateur sont exécutées.
Il existe deux interfaces clés fournies par vzi . L’une est la spécification de la façon dont un rapport de sortie est produit. L'autre est l'environnement dans lequel les fonctions définies par l'utilisateur sont exécutées et les rappels utilisés. Nous appelons la logique définie par l'utilisateur qui s'exécute dans cet environnement le pipe . Le tube gère la logique de visualisation du tube Unix dans lequel il s'exécute.
L'interface pipe est actuellement définie dans index.js. Les meilleurs exemples sont les modules intégrés, répertoriés ici par ordre de complexité :
Voici quelques autres exemples rapides que vous pouvez essayer, en supposant que vous avez cloné le référentiel :
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)'