vzi — духовный преемник viz
Командная строка vzi (теперь) реализована с использованием deno, а для рендеринга требуется протокол Chrome DevTools. vzi был протестирован только на Mac, хотя он должен нормально работать на Linux (просто укажите путь к двоичному файлу Chrome).
Многие из нас используют командную строку на протяжении десятилетий. Успех интерфейса командной строки тесно связан с идеей каналов Unix . Каналы дают нам возможность на лету составлять сложные функции, адаптированные к потребностям входных данных, которыми мы манипулируем. Для этой цели оболочка представляет собой механизм ввода с самой высокой пропускной способностью, который люди когда-либо изобрели для управления машинами.
И все же у нас нет хорошего способа передачи данных в другую высокодинамическую среду, в которой мы проводим много времени: в браузер. Цель 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
.
Пока окно браузера все еще открыто, в канале stdin , открытом для браузера, вы можете ввести сообщение:
> hello, world!
Обязательно введите новую строку в конце, чтобы строка была завершена. Вернувшись в открытое окно браузера, вы должны увидеть свое сообщение в теле документа. Введите столько строк, сколько хотите, каждая из которых обновляет документ. Когда вы закончите, закройте канал, используя ^D
.
Если вы клонировали каталог репо vzi , вы можете попробовать это изнутри:
$ bin/gen-yxz | vzi -m scatter -d c=2
По умолчанию vzi создаст единственный окончательный документ отчета на стандартном выводе . Канал, который выполняется 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
, в стандартный вывод записывается только конечное состояние.
$ cat events | vzi pipe.js -O
$ cat events | vzi pipe.js -o report.html
$ cat events | vzi pipe.js > report.html
Можно также управлять механизмом , который vzi использует для рендеринга событий, используя опцию -p, --port
. Если он указан, предполагается, что порт поддерживает проводной протокол 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, вы не получите выходной отчет. Это по-прежнему нормально без 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)'