среда, 20 января 2010 г.

Perl Hacks

Perl Hacks
chromatic, Damian Conway, Curtis "Ovid" Poe

Эта книга представляет из себя собрание остроумных рекомендаций и приёмов, которые вместе позволяют Perl-программистам делать свою работу более эффективно и изящно. Всего таких рекомендаций 101. Не смотря на то, что все они разбиты по категориям - группировка очень условная: каждая рекомендация, по сути, является небольшой самостоятельной статьёй и, как правило, почти никак не связана с остальным материалом.

Содержимое книги можно условно разделить на три части. К первой части можно отнести рекомендации по повышению продуктивности работы, к примеру, настройки редактора, полезные инструменты, автоматизация повторяющихся задач и т.д. В итоге, вещи которые раньше требовали ввода множества команд начинают выполнятся либо по нажатию пары кнопок либо и вовсе автоматически!

Ко второй части можно отнести полезные приёмы программирования, проектирования, отладки и тестирования. Тут же можно найти описание и примеры использования интересных Perl модулей, эффективные решения типовых задач.

Третью часть книги составляет откровенная экзотика - приёмы и технологии, которые могут потребоваться только для весьма специфичных задач.

В целом, видно, что почти за каждой статьёй стояла какая-то реальная задача для которой автор сумел найти яркое и поучительное решение. Часть материала пересекается с книгой Дамиана Конвея - Perl Best Practices. Вместе с тем, встречаются и статьи, мягко говоря, "высосанные из пальца". К примеру, в одном из советов предлагается использовать perl -wc для проверки успешности компиляции программы перед её запуском. Совет бесспорно дельный, но он скорее подходит для книги "Learning Perl", а не для "Perl Hacks". Возможно причина тому - издатель, который настоял на необходимом количестве рекомендаций: 101 и ни рекомендацией меньше!

В общем, "Perl Hacks" - увлекательное и полезное чтение для Perl-программиста практически любого уровня. Новички также могут почерпнуть в книге что-то полезное, но подавляющая часть материала всё-таки рассчитана на более опытную категорию программистов.

Оценка по шкале ИМХО: 5

воскресенье, 17 января 2010 г.

Запись и воспроизведение интерактивных shell-сессий

При работе в UNIX-среде часто возникает необходимость сохранить содержимое текущей shell-сессии для дальнейшего использования. К примеру, можно сохранить последовательность shell-команд в файл чтобы лихорадочно не вспоминать её когда она потребуется вновь. Этот файл может также послужить наброском для будущей статьи или какой-нибудь инструкции.

Самый очевидный способ - копирование всего ввода и вывода через буфер обмена. Хотя этот вариант и прост, он не особо удобен если данных очень много (чаще всего вывода). Отличная альтернатива - утилита script(1). Она запускает новую shell-сессию, весь ввод и вывод которой сохраняется в указанном файле (по умолчанию в текущей директории создаётся файл typescript):
script session.log
У программы script есть одна любопытная опция - -t Если она указана, то script выводит на STDERR временную информацию, иначе говоря, реальную скорость набора команд и получения их вывода. Имя под рукой содержимое shell-сессии и этот временной файл, сохранённую shell-сессию возможно "воспроизвести" подобно видеоролику (только консольному). Вот как это выглядит запись:
script session.log -t 2> session.time
А вот так можно воспроизвести сохранённый ролик (именно воспроизвести - сами команды, разумеется, заново не выполняются):
scriptreplay session.time session.log
Стоит отметить, что интерактивные программы, такие как top или mc также записываются и воспроизводятся без проблем. Однако есть один нюанс. Дело в том, что плеер не имеет понятия о том какого размера должно быть окно во время воспроизведения. Так, если сессия была записана на компьютере с 21-дюймовым монитором, причём окно псевдо-терминала было раскрыто на весь экран, то при воспроизведении на 19-м мониторе вывод таких интерактивных программ как top или mc исказится. То же произойдёт если во время записи менять размер окна псевдо-терминала. Другими словами, автоматически картинка не масштабируется.

В целом, запись и последующее воспроизведение shell-сессий вещь достаточно интересная, но область её применения довольно ограничена. Приведу одно из наиболее полезных применений для этой функции. Предположим вы хотите рассказать коллеге как выполнить ту или иную задачу. Объяснять это на словах не эффективно, а специально для этого писать статью - слишком долго. Как вариант, можно записать свой "мастер-класс" в виде консольного видеоролика и отдать его коллеге или коллегам для ознакомления.

В любом случае, даже если воспроизведение сессий не требуется, статическая запись всего ввода и вывода shell-сессий имеет массу полезных применений. Стоит отметить, что подобной функцией обладает и программа screen(1). Соответствующая команда называется C-a H.

Для записи и воспроизведения консольных роликов можно также попробовать пару программ ttyrec и ttyplay соответственно:
ttyrec tty.log
ttyplay tty.log
Программа ttyrec специально предназначена для записи интерактивных сессий. Временная информация и данные при этом сохраняются в одном файле.

Ссылки

понедельник, 11 января 2010 г.

Pipe Viewer - оценка скорости прохождения данных через pipe

При обработке очень больших файлов такими утилитами как tar, gzip, grep и др. порой возникает необходимость видеть ETA или по крайней мере скорость работы программы. Проблема в том, что большинство стандартных UNIX-утилит не отображает скорость обработки конкретного файла. В лучшем случае имеется ключ вида --verbose, при указании которого программа сообщает имя файла, который обрабатывается в настоящий момент. Ясно, что если файл очень большой и только один, то пользы от подобного ключа будет немного.

Однако, если программа умеет работать в режиме фильтра или по крайней мере читать данные со STDIN, то для оценки скорости её работы можно воспользоваться утилитой pv - Pipe Viewer. Она показывает скорость прохождения данных через pipe, а также ETA, если это возможно. Например:

pv very-big-file | gzip -c > very-big-file.gz
219MB 0:00:13 [16,3MB/s] [========> ] 34% ETA 0:00:24]

В данном примере pv действует аналогично утилите cat, считывая данные и передавая их дальше по конвейеру программе gzip. При этом, pv "знает" с какой скоростью gzip считывает входные данные со STDIN, размер файла также известен. Таким образом, можно достаточно точно получить ETA.

Ссылки