Выпуск 22. Декабрь 2014
← DBIx::Class. Сборник рецептов | Содержание | Интервью с Олафом Алдерсом (Olaf Alders) →Обзор CPAN за ноябрь 2014 г.
Рубрика с обзором интересных новинок CPAN за прошедший месяц.
Статистика
- Новых дистрибутивов — 222
- Новых выпусков — 782
Новые модули
Ещё одна XS-реализация клиента Redis. Модуль находится в стадии активной разработки, но судя по представленным бенчмаркам имеет превосходство над всеми существующими реализациями (Redis
, Redist::Fast
, Redis::hiredis
).
Обилие веб-сервисов, предоставляющих REST API, требует рутинного создания типовых REST-клиентов для этих API. Модуль Rest::Client::Builder
предоставляет магический инструмент для простого создания подобных REST-клиентов в полном соответствии с ООП-парадигмой:
package My::Magic::API;
use base qw(Rest::Client::Builder);
sub new {
bless $_[0]->SUPER::new( {
on_request => sub { "@_" }
}, 'http://example.com/api' ), $_[0]
}
my $api = My::Magic::API->new();
print $api->foo(1)->bar->get('baz=qux');
# GET http://example.com/api/foo/1/bar baz=qux
print $api->blah->post('postData');
# POST http://example.com/api/blah postData
Нередко в тестах требуется создавать временные каталоги. Модуль Test::TempDir::Tiny
предоставляет функцию tempdir()
удобную для использованию именно в процессе тестирования. Каждый тест (файл *.t) получает свой временный корневой каталог. Если тест падает, то временный каталог не удаляется, предоставляя возможность просмотреть файлы в этом каталоге. При последующем запуске теста существующий временный каталог теста предварительно удаляется. Если все тесты успешно пройдены, корневой временный каталог удаляется. Модуль Test::TempDir::Tiny
имеет зависимости только от core-модулей (что и означает суффикс Tiny).
С помощью модуля recommended
можно загружать другие модули, если они доступны на момент запуска. В целом это аналог use
, но без фатальной ошибки в случае отсутствия модуля.
use recommended 'Foo::Bar', {
'Bar::Baz' => '1.23',
'Wibble' => '0.14',
};
# Действия, если Foo::Bar был загружен
if ( recommended->has('Foo::Bar') ) {
...
}
Qstruct
— это ещё один бинарный формат сериализации данных. В отличие от Storable/Sereal/CBOR этот формат требует схему, что делает его похожим на ASN.1 или ProtocolBuffers. Многие идеи Qstruct были позаимствованы из формата Cap’nProto. Основная идея — приблизить скорость работы к скорости работы struct в языке C, что достигается за счёт того, что формат хранения данных в памяти совпадает с форматом, хранимым на диске или передаваемым по сети. При этом формат является максимально переносимым (выбрано little-endian представление на всех платформах).
Plack::Debugger
— это удобный отладчик для ваших PSGI-приложений. Отладчик подключается как middleware, после чего в выводимый html-контент перед закрывающим тегом </body>
добавляется код панели отладчика, в которой можно посмотреть временны́е характеристики генерации страницы, потребляемую память, предупреждения. Также можно отслеживать все ajax-запросы, выполняемые приложением. Отладчик сохраняет всю собранную информацию о запросах в виде json-файлов для последующего анализа.
Модуль Database::Sophia
представляет собой байндинг к базе данных Sophia. Sophia — это встраиваемая база данных для хранения ключей-значений. Судя по представленным бенчмаркам, Sophia обходит в производительности схожую по принципам работы LevelDB.
Очередной высокопроизводительный Plack-сервер с красивым названием Gazelle
. Представлены сравнительные бенчмарки, сравнивающие количество обрабатываемых запросов в секунду у Gazelle со Starman и Starlet. Gazelle
демонстрирует почти в два раза большую производительность чем конкуренты, а на тесте с выдачей hello world
приближается к скорости отдачи статики в nginx.
Утилита implode
позволяет запаковать Perl-приложение со всеми его зависимостями в один исполняемый Perl-скрипт. Принцип работы достаточно прост: при помощи carton на основе cpanfile загружаются все зависимости приложения во временный каталог, затем этот каталог архивируется (tar) и упаковывается (bzip2). Полученный архив вносится внутрь скрипта после секции __END__
, а в начале скрипта добавляется секция BEGIN
, которая отвечает за распаковку архива во временный каталог и добавления путей в PATH
и PERL5LIB
.
Regexp::Lexer
— это завершающий компонент для Perl::Lint
, призванный заменить Regexp::Parser
, предназначенный для лексического разбора регулярных выражений.
Panda::URI
— это альтернатива модулю URI
, написанная на языке C. Утверждается, что в некоторых операциях она превосходит в скорости URI на два порядка.
Обновлённые модули
- Devel::StackTrace 2.00
Вышел новый мажорный релиз модуля Devel::StackTrace
— объектного представления трассировки вызовов. В новом релизе присутствует несколько несовместимых изменений (удалены некоторые устаревшие методы).
- Pithub 0.01028
В ноябре был обновлён модуль Pithub
для доступа к API Github. В новом релизе много исправлений ошибок и несколько полезных оптимизаций. В частности, за счёт использования условных запросов и кеширования снижается сетевая нагрузка и ускоряется обработка запросов.
- DBI 1.632
Новый релиз DBI
содержит несколько исправлений, включая исправление уязвимости в модуле DBD::File
. DBD::File
, несмотря на атрибут f_dir
, первоначально искал файл относительно текущего каталога. Это также затрагивает все модули, использующие DBD::File
, например, DBD::CSV
. Также в документацию DBD::Proxy
и DBI::ProxyServer
добавлено предупреждение о том, что их использование небезопасно, поскольку для сериализации данных используется модуль Storable
, который небезопасно использовать с недоверенными источниками.
- Minion 1.02
Вышел первый мажорный релиз модуля Minion
для управления очередями задач. На данный момент он уже не является экспериментальным и поддерживает два бекенда: файлы и PostgreSQL.
- YAML-LibYAML 0.54
Вышло обновление XS-реализации парсера языка разметки YAML. Данный релиз исправляет ошибку в безопасности библиотеки libyaml. При разборе специального сформированного YAML-файла может произойти вызов assert()
, что приведёт к аварийному завершению программы по сигналу SIGABRT
. Например:
$ perl -MYAML::XS -e 'eval { Load qq! x: "\n"x! };'
perl: scanner.c:1113: yaml_parser_save_simple_key:Assertion `parser->simple_key_allowed || !required' failed.
Как видно, программа завершится аварийно, что может быть использовано для DoS-атак против систем, использующих libayml при разборе данных в YAML-формате.
← DBIx::Class. Сборник рецептов | Содержание | Интервью с Олафом Алдерсом (Olaf Alders) →