вторник, 17 мая 2011 г.

Конвертируем HTML в PDF

Предыстория
Есть некое веб-приложение(на Perl), в котором нужно было добавить определенный набор отчетов. Отчеты должны иметь два представления - HTML и PDF.

Для решения этой задачи, естественно, можно было бы воспользоваться модулями типа PDF::Reuse, PDF::API2, PDF::API2::Simple, но:
1. Это лишние временные затраты (изучение API, написания дополнительного кода)
2. Это усложнение сопровождения отчетов. Необходимо дублировать логику HTML-шаблонов в PDF и постоянно поддерживать это в актуальном состоянии.

Поэтому, было выбрано другое решение - использовать конвертор HTML в PDF. Сразу оговорюсь, что было это года 3-4 назад. Для PHP, вроде как, на то время уже существовал dompdf(рендеринг написан на php), а для Perl ничего такого не было.

Провал HTMLDOC
После долгих поисков нашел такую тулзень как HTMLDOC. Но она была далеко не идеальна:
1. В HTMLDOC нет поддержки Unicode, поэтому приходилось предварительно перекодировать HTML в cp1251.
2. Шрифты, которые идут с HTMLDOC не поддерживают кириллических символов. Но в интернетах был найдет комплект шрифтов с поддержкой кириллицы. Главное после установки HTMLDOC не забыть заменить шрифты :)
3. Поддержка только базового HTML(про CSS забудьте). Пришлось довольствоваться чем было.

В добавок на прошлой неделе мне пришли жалобы, что в отчетах съедаются диактрические символы(типа всякие умляуты в немецком и так далее) и я начал искать решение.

Первой попыткой было использовать  HTMLDOC 1.9 (нестабильный релиз),  там добавили базовую поддержку Unicode. После 8-го segfault с 10 попыток конвертации, было решено вернуться к предыдущей версии(без поддержки  Unicode)

Вторая попытка была заменять не CP1251 символы на escape-последовательности вида "&#xxxx;", но после 3-4 последовательностей в файле, HTMLDOC их просто переставал преобразовывать в нужные символы.

Триумф WKHTMLTOPDF
Я начал искать новый конвертор. И каково было ж мое удивление, когда я нашел такого зверя, как  WKHTMLTOPDF :)

WKHTMLTOPDF - это консольный конвертор, который использует Webkit для рендеринга HTML, следовательно PDF документы будут максимально приближены к оригинальному HTML. И это реально так, можете смело использовать CSS-стили. WKHTMLTOPDF сконвертит HTML практически любой сложности!!!

пятница, 15 апреля 2011 г.

Mojolicious 1.16: Экстренный релиз, Всем обновляться!!!

Час назад стало известно про серьезную уязвимость в Mojolicious, которая позволяет вычитать любой файл с файловой системы.
Баг уже исправлен, к сожалению баг был опубликовал в твиттере перед тем как передан Себастьяну.
Все срочно обновляемся!!!! Но учтите, что новый релиз не сразу попадет на все зеркала CPAN, лучше качайте прямо с официального сайта.

Если обновление слишком накладно, то настройте веб сервер, чтобы он пропускал только валидные роуты.

Дополнительная информация:

понедельник, 28 марта 2011 г.

Mojoliciuos - Производительность Mojo::JSON

Mojo::JSON VS JSON::PP
Решил проверить производительность Mojo::JSON
Интересовала, естественно, производительность в сравнении с JSON::PP.
Колоссальная производительность JSON::XS лишает смысла сравнивать его с перловыми реализациями.

Результаты
Тестирование показало, что Mojo::JSON в 1.5 раза быстрее чем JSON::PP при сериализации и в почти в 3 раза быстрее при десериализации. Очень даже неплохо.
Естественно, JSON::XS вне конкуренции, он в 40 раз быстрее чем Mojo::JSON при сериализации и в 30 раз быстрее при десериализации.

Если мы посмотрим на абсолютные цифры производительности Mojo::JSON, то 3-5 тыс вызовов в секунду хватит для большинства проектов. Кроме того, в тесте использовалась достаточно сложная структура данных.  Ну и всегда можно переключится на JSON::XS

вторник, 22 марта 2011 г.

Guttman-Rosler Transform. Часть 1: Описание преобразования.

Уже наверное больше года хочу написать про GRT(Guttman-Rosler Transform) и наконец-то дошли руки. Вернее, наткнулся на Sort::External::Cookbook, который и взял за основу своего поста. Повествование решил разбить на две части. Первая с описанием, вторая с результатами тестирования.

Собственно сабж.
Думаю многие знакомы с преобразованием Шварца, которое позволяет повысить эфективность сортировки за счет предварительной подготовки сортируемых данных. Преобразование Гутмана-Рослера это еще один способ повышения эфективности сортировки.

Perl имеет очень удобную в использовании функцию sort. Когда мы хотим нестандартный порядок сортировки, то мы использует колбек, который передаем в функцию sort.
Например, sort {$b <=> $a } @array;

Идея GRT заключается в том, чтобы преобразовать входные данные так, чтобы мы могли сортировать без использования дополнительного колбека( "sort @transformed_array;" )

Тогда вся сортировка будет происходить на уровне C, что даст нам выигрышь в скорости.

воскресенье, 27 февраля 2011 г.

Встречайте Mojolicious::Plugin::Gravatar

Написал небольшой плагин для Mojolicious - Mojolicious::Plugin::Gravatar . Добавляет хелперы для работы с Gravatar.com.  Думаю многие знакомы с этим сервисом( его используют cpan и github ), но кто не знаком - обратите внимание.

Для отображения аватарки  - <%= gravatar $email %>
Для получения url аватарки - <%= gravatar_url $email %>

Плагин уже на GitHub и на CPAN 

понедельник, 21 февраля 2011 г.

Mojolicious - интервью с Себастьяном Риделем( Sebastian Riedel )

Мой перевод интервью ActiveState с Себастьяном Риделем( Sebastian Riedel ), создателем веб-фреймворка Mojolicious. Это достаточно свободный перевод, но я старался не потерять суть.

14.02.2011 Себаcтьян зарелизил Mojolicious 1.1 - Perl веб-фреймворк следующего поколения. В связи с этим и состоялось интервью.

Tara: Почему ты занялся созданием Mojolicious?

Sebastian: По большому счету это случилось случайно. Стартовал Mojolicious в конце 2008 под названием Mojo, как фреймворк для  разработчиков веб-фреймворков. Он должен был решить многие проблемы архитектуры Catalyst и подразумевался как замена для его устаревающих внутренностей. Но когда текущие мейнтейнеры Catalyst отказались от использования Mojo, то я решил показать его ценность, создав но его основе пример  веб-фреймворка.
Затем этот пример под названием Mojolicious превысил все ожидания, и я никогда не пожалел о случившемся.

Tara: Какие уроки приобретенные во время работы над Catalyst, оказались полезными при создании Mojolicious?

Sebastian: Я полагаю, что наиболее важным уроком, который я выучил, было искусство построения сообщества. Активное сообщество является наиболее ценным активом для любого фреймворка и является основной его популярности. И хотя  Mojolicious очень молодой проект, но у нас уже второе по размеру сообщество среди всех веб-фреймворков на Perl, мы идем сразу за Catalyst.

Tara: Есть ли какие-то примеры действующий проектов на Mojolicious? Какого рода проекты создаются при помощи Mojolicious?

воскресенье, 20 февраля 2011 г.

Как устроены сессии в Mojolicious?!

В этом посте я не буду рассказывать про API для работы с сессиями, это можно найти в документации к Mojolicious, а постараюсь объяснить как устроены сессии внутри.

Mojolicious использует сookies для хранения сессий. И это достаточно важный момент. Такой подход позволяет нам следовать REST идеологии. Мы можем отказаться от лишних состояний на стороне сервера, нам не нужно обеспечивать общего пространства для доступа к сессиям с разных серверов.

Но имеется несколько важных нюансов:
  1. Старайтесь не делать сессии большими, поскольку эти данные будут передаваться при каждом запросе, а максимально безопасный размер cookie - 4кб.
  2. Вопрос авторства данных.
С первым пунктом все ясно, а относительно второго, то это решается либо шифрованием либо подписью cookies. Mojolicious использует подписанные(signed) cookies.

Что должна обеспечивать подпись?
Начнем с того, что любая подпись (включая подпись ручкой на бумаге) должна обеспечить следующие две вещи:
  1. Идентифицировать автора подписи.
  2. Гарантировать, что после того, как документ подписали, он не изменялся.
Подписанный документ не подразумевает того, что он должен быть зашифрован. Соответственно подписанные cookies не обязаны быть зашифрованными.
Мы оставляем документ в открытом виде и лишь добавляем к нему подпись(цифровую или ручкой на бумаге)