Выпуск 26. Апрель 2015
← Грамматики в Perl 6 | Содержание | Интервью с Виктором Турским →Обзор CPAN за март 2015 г.
Рубрика с обзором интересных новинок CPAN за прошедший месяц.
Статистика
- Новых дистрибутивов — 212
- Новых выпусков — 932
Новые модули
re::engine::GNU
re::engine::GNU
, как видно из названия, является движком регулярных выражений, основанный на библиотеке gnulib. Теперь для регулярных выражений становится возможно использовать синтаксис регулярных выражений emacs, egrep/grep, awk, sed и прочих вариаций, поддерживаемых в gnulib. Существует три альтернативных варианта записи регулярных выражений:
use re::engine::GNU;
# классический вариант
'test' =~ /\(tes\)t/;
# массив: синтаксис, шаблон
'test' =~ [ 0, '\(tes\)t' ];
# хеш: синтаксис, шаблон
'test' =~ { syntax => 0, pattern => '\(tes\)t' };
Time::Monotonic
Измерение периодов времени простым вычитанием показаний функции time()
может иногда быть абсолютно неточным, вплоть до получения отрицательных показаний. Причина в том, что часы компьютера могут быть изменены как вручную, так и утилитами, например, ntpdate. Запущенный ntpd хоть и не изменяет время скачками, но может замедлять или ускорять часы, что также приводит к неаккуратным подсчётам периодов времени.
Модуль Time::Monotonic
даёт доступ к показаниям источника монотонного времени, существующий на различных платформах, которое позволяет точно вычислять периоды времени.
List::Prefixed
List::Prefixed
позволяет создавать список строк-префиксов, который можно использовать, например, для создания регулярного выражения, которое совпадает с любой строкой из списка. Так, например, для списка строк
"Ba", "Bar", "Baz", "Foo", "Food", "Foot", "For", "Form", "Fu"
генерируется регулярное выражение, совпадающее с любой из этих строк
/(?:Ba(?:r|z)?|F(?:o(?:o(?:d|t)?|r(?:m)?)|u))/
Это можно использовать для создания тестов на вхождение слов в тексте, эффективной реализации автодополнения и даже сжатия.
Plack::Util::Load
Модуль Plack::Util::Load
позволяет загружать PSGI-приложение из файла, класса или URL. Экспортируемая функция load_app()
возвращает ссылку на код или генерирует исключение в случае ошибки.
# Загрузка приложения из файла
$app = load_app('app.psgi');
# Загрузка приложения по имени класса
$app = load_app('MyApp::PSGI');
# Загрузка по URL (приложение работает как прокси на базе HTTP::Tiny)
$app = load_app("http://example.org/");
Rapi::Fs
Rapi::Fs
— это Plack-приложение, созданное на основе фреймворка RapidApp, которое представляет собой файловый браузер. Веб-сервер запускается скриптом rapi-fs.pl
, которому передаётся в качестве параметра путь к каталогу. Получаем довольно функциональный файловый браузер, которым можно пользоваться в любом браузере.
Deep::Hash::Exists
Полезный модуль Deep::Hash::Exists
для проверки наличия глубоко вложенного ключа. Как известно, выражение
exists $hash_ref->{a}{b}{c}{d};
благодаря автовификации создаст все промежуточные элементы за исключением последнего ключа d
. Та же самая операция с помощью функции key_exists
key_exists( $hash_ref, [ qw(a b c d) ] );
не обладает таким побочным эффектом и может быть безопасно использована.
Plack::Middleware::GNUTerryPratchett
Модуль Plack::Middleware::GNUTerryPratchett
добавляет в PSGI-приложение HTTP-заголовок
X-Clacks-Overhead: GNU Terry Pratchett
Таким образом весь мир отдаёт дань памяти известному английскому писателю Терри Прачетту, который умер 12 марта 2015 года. Происхождение заголовка связано с сюжетом книги «Опочтарение», в котором присутствовали щёлкающие башни — семафоры (аналог телеграфа), которые передавали сообщения. Расшифровка кодов: G
— передача сообщения, N
— не вести лог сообщения, U
— отправить сообщение назад, если оно достигло конца линии. Соответственно сообщение, отправленное с кодом GNU
будет вечно циркулировать в линии. «Человек не умер, пока его имя произносится» говорится в прологе 4-й главы книги. Таким образом пытаются сохранить память о Терри Прачетте.
Crypt::Ed25519
Crypt::Ed25519
— это реализация алгоритма цифровой подписи EdDSA с использованием эллиптической кривой Twisted Edwards. Особенность данной эллиптической кривой — в высокой производительности операций и при этом высокой стойкости ко взлому. Как указано в описании модуля, стойкость получаемой подписи (512 бит) эквивалентна 3000 бит RSA или AES-128.
Обновлённые модули
Moo 2.001
Вышел второй мажорный релиз ООП-фреймворка Moo
. Основное несовместимое изменение — отказ от фатальных предупреждений. В этом отношении Moo стал соответствовать поведению Moose. Кроме того, раньше классы без атрибутов сохраняли все параметры, переданные в new()
, внутри объекта. Теперь этого не происходит — поведение приведено в соответствие с классами, которые имеют атрибуты. Попытка переопределить существующий конструктор или изменить тот, который был использован, теперь приводит к ошибке.
DBIx::Class 0.082820
Появилось обновление ORM DBIx::Class
с исправлениями ошибок и улучшениями в документации. DBIx::Class
теперь требует Moo
не ниже версии 2, чтобы обеспечить более предсказуемую и безопасную работу модуля.
HTTP::BrowserDetect 2.00
Вышел второй мажорный релиз модуля HTTP::BrowserDetect
для определения веб-браузера, версии и платформы по HTTP-заголовку User-Agent
. В новой версии стандартизирован интерфейс, добавлена информация о новых браузерах. Основное несовместимое изменение — методу user_agent
больше нельзя передавать параметр для задания строки веб-агента, для этих целей нужно использовать конструктор HTTP::BrowserDetect->new()
.
Raisin 0.58
В новом релизе микро-фреймворка Raisin
для создания REST API появилась поддержка спецификации Swagger 2.0.
Devel::PPPort 3.31
Вышло обновление модуля Devel::PPPort
для поддержки новых функции Perl API в старых версиях Perl. Релиз в частности содержит исправление функции SvPV_renew
, в которой параметр длины строки имел тип int
вместо size_t
, что потенциально могло быть источником проблем. Проблема была обнаружена сканером Coverity.
Rex 1.1.0
В марте вышел первый мажорный релиз Rex
— фреймворка автоматизации задач по администрированию. Ветка 1.0 объявлена как LTS-релиз и будет поддерживаться до марта 2017 года. В новом релизе произошёл переход от использования libssh2 (Net::SSH2
) к openssh (Net::OpenSSH
) по умолчанию, восстановлена совместимость с Perl 5.8.9, появилась поддержка команд PkgConf для запроса изменения конфигурации пакета (особенно полезно на Debian/Ubuntu). Также большое число багфиксов и других улучшений.
Net::OpenSSH 0.64
Новый стабильный релиз модуля Net::OpenSSH
содержит достаточно много внутренних изменений, и не исключены регрессии или новые баги. Будьте внимательны при обновлении.
Server::Starter 0.23
Обновлён модуль супердемона Server::Starter
. В новом релизе удалены все зависимости, которых нет в базовой поставке Perl. Появилась поддержка ipv6.
perl 5.21.10
Вышел новый релиз Perl ветки 5.21 для разработчиков. Основные изменения:
- Операторы в выражениях для экспериментальных расширенных классов символов
(?[...])
теперь следуют стандартным правилам приоритетов операций в Perl. Операция пересечения классов символов&
теперь имеет более высокий приоритет, чем другие бинарные операции. - Функции
utf8::native_to_unicode()
иutf8::unicode_to_native()
теперь оптимизированы для платформ ASCII. Написание кода, переносимого между ASCII и EBCDIC, теперь не будет испытывать пенальти в производительности. - Perl теперь корректно компилируется и работает на z/OS с кодовой страницей 1047 EBCDIC.
- Исправлена проблема, когда повторяемый глобальный поиск шаблона в скалярном контексте на больших tainted-строках приводил к экспоненциальному замедлению.
- Очередная пачка исправлений крахов Perl, найденных с помощью фаззера AFL.
- Исправлена регрессия в операторе readline, появившаяся после добавления нового оператора двойного бриллианта
<<>>
.
DBD::Firebird 1.19
В новом релизе DBI-драйвера СУБД Firebird помимо других исправлений ошибок исправлено переполнение буфера в dbdimp.c. Сообщения об ошибках помещаются с помощью sprintf в буфер фиксированной длины, который в некоторых ситуациях может оказаться слишком мал. Проблема получила идентификатор CVE-2015-2788.
← Грамматики в Perl 6 | Содержание | Интервью с Виктором Турским →