Выпуск 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 — объектного представления трассировки вызовов. В новом релизе присутствует несколько несовместимых изменений (удалены некоторые устаревшие методы).

В ноябре был обновлён модуль Pithub для доступа к API Github. В новом релизе много исправлений ошибок и несколько полезных оптимизаций. В частности, за счёт использования условных запросов и кеширования снижается сетевая нагрузка и ускоряется обработка запросов.

Новый релиз DBI содержит несколько исправлений, включая исправление уязвимости в модуле DBD::File. DBD::File, несмотря на атрибут f_dir, первоначально искал файл относительно текущего каталога. Это также затрагивает все модули, использующие DBD::File, например, DBD::CSV. Также в документацию DBD::Proxy и DBI::ProxyServer добавлено предупреждение о том, что их использование небезопасно, поскольку для сериализации данных используется модуль Storable, который небезопасно использовать с недоверенными источниками.

Вышел первый мажорный релиз модуля Minion для управления очередями задач. На данный момент он уже не является экспериментальным и поддерживает два бекенда: файлы и PostgreSQL.

Вышло обновление 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)
Нас уже 1393. Больше подписчиков — лучше выпуски!

Комментарии к статье