barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком github. Показать все сообщения
Показаны сообщения с ярлыком github. Показать все сообщения

вторник, 25 февраля 2014 г.

jQuery: очередь ajax-запросов

Задача:

Ajax-запросы, выполняемые с помощью jQuery, выполнять по одному и в строгой последовательности.

Решение:

Помнится, когда-то давно, когда стояла аналогичная задача с использованием YUI2, я писал очередь сам. Теперь же мне стало лень, и я, после недолгих поисков, нашел готовое решение: https://github.com/Foliotek/ajaxq. Просто, элегантно. Мне правда не хватило 2 вещей: ограничения на максимальную длину очереди и возможности вызвать hook непосредственно перед отправкой очередного запроса (для актуализации его полезной нагрузки), но это оказалось несложно допилить руками. Будет время - форкну проект на гитхабе и выложу свои доработки в общий доступ.

суббота, 26 января 2013 г.

jQuery: блокировка элементов управления

Когда-то писал про блокировку элементов страницы при помощи dojo, теперь возникла аналогичная задача, но в jQuery. Здесь поможет плагин BlockUI, он имеет множество параметров для настройки. Единственное, что показалось мне неудобным (не помню, было ли поведение dojo-виджета таким, или нет): overlay блокирует клики (и вообще весь интерактив) по объектам внутри контейнера, к которому применен,  но не клики по самом контейнеру. Т.е. если у нас есть какая-то кнопка (просто <button/> или же <div/> с обработчиком onClick), и мы к ней применили метод block(), кликнуть по ней все равно будет можно. Так что приходится в обработчике клика проверять дополнительно, заблокирована ли кнопка, или нет. Надо будет как-нибудь сделать бранч на гитхабе и допилить этот плагин =)

вторник, 10 апреля 2012 г.

Java: Валидация цепочки сертификатов с использованием расширения CRL Distribution Point с возможностью кэширования CRL

Java PKI API, а точнее, его реализация под названием PKIX, не имеет функционала по работе с расширением CRL Distribution Point (далее - CRL DP). Возможность проверки сертификатов по CRL есть, включается она следующим кодом:
builderParams.setRevocationEnabled(true);
, где builderParams - объект параметров построителя цепочки сертификатов PKIXBuilderParameters. Однако CertPathBuilder (или CertPathValidator) извлекают при этом эти самые CRL не по URL`у, указанному в CRL DP сертификата, а из т.н. CertStore.
Работа с CRL DP осуществляется уже на уровне реализации PKIX. Например, для Sun-овской реализации использование CRL DP при получении CRL включается следующим образом:
System.setProperty("com.sun.security.enableCRLDP", "true");    
Для реализации IBM устанавливаемое свойство имеет другое имя. 
Не знаю как в реализации от IBM, но в таковой от Sun я не нашел возможности как-либо управлять кэшированием CRL. Без кэширования использование проверки цепочки сертификатов в высоконагруженном веб-приложении практически невозможно: каждый запрос к приложению приводит к запросу CRL с Distribution Point (а если в цепочке сертификатов между проверяемым сертификатом и доверенным несколько сертификатов - то к нескольким CRL), что крайне негативно сказывается на производительности. Более того, каждый раз загружать CRL попросту не нужно (уж по крайней мере по несколько раз в минуту - точно).
Для решения этой проблемы можно воспользоваться открытой библиотекой jTrust: http://code.google.com/p/jtrust/. У неё тоже есть несколько минусов: во-первых, она жестко завязана на криптопровайдер Bouncy Castle, что особенно неудобно, когда в приложении уже используется другой криптопровайдер. Во-вторых, спроектирована библиотека таким образом, что предполагается её использование в качестве полной замены стандартному Java PKI API, а не как дополнение к нему, поэтому просто взять оттуда функционал по кэшированию CRL не получится. К тому же, реализация кэширования в ней имхо не вполне адекватная: для хранения CRL в кэше в памяти используются SoftReference, что приводит к очистке кэша сборщиком мусора, что, как минимум, не является ожидаемым поведением для кэша. В дополнение к этому, время жизни кэша отсчитывается почему-то не от момента загрузки CRL, а от момента времени, указанного в thisUpdate в самом CRL. Да ещё и устанавливать время жизни кэша можно только в часах. 
Подумав надо всем этим, я написал свою реализацию кэширующего репозитория для jTrust, код чуть позже выложу на github. А интегрировал в свое приложение библиотеку jTrust я следующим образом: строится и валидируется цепочка сертификатов средствами PKIX, а, точнее, его sun`овской реализации (неявно, т.к. эта реализация, как я понял, используется томкатом). При этом флаг revocationEnabled установлен в false, чтобы выполнялись все проверки, за исключением CRL. После успешного построения и валидации цепочки она дополняется trusted-сертификатом в конце (т.к. PKIX формирует цепочку, завершающуюся сертификатом, выданным доверенным субъектом, а jTrust оперирует цепочками, оканчивающимися непосредственно сертификатом самого доверенного субъекта), и используется CrlTrustLinker для проверки валидности каждой связи в цепочке (а в качестве репозитория CRL этот линкер использует мою самописную имплементацию интерфейса CrlRepository).

четверг, 22 марта 2012 г.

gRaphaël piechart: баг, связанный с игнорированием настройки "colors" при наличии единственного сектора

Ещё один баг gRaphaël piechart: если чарт содержит только один сектор, занимающий все 360 градусов, то библиотека игнорирует настройку colors, делая круг синего цвета. Покопавшись в исходниках (g.pie-min.js) я дейтсвительно нашел, что заливка устаналивается в 2 разных местах (видимо, для случая цельного круга и нескольких секторов). И если в случае с несколькими секторами используется выражение:
o.colors&&o.colors[y]||c.colors[y]||"#666"
, которое пытается найти цвет в конфигурации, а затем - в цветах по-умолчанию, то для цельного круга видим:
fill:c.colors[0]
, т.е. сразу берется цвет по-умолчанию. Исправление этого фрагмента на:
fill:o.colors&&o.colors[0]||c.colors[0]
решает проблему.
UP: посмотрел github проекта, соответствующее issue висит уже 2 года:  https://github.com/DmitryBaranovskiy/g.raphael/issues/24. 
Исправленная мной версия кода тут: https://raw.github.com/barbitoff/g.raphael/master/g.pie.js (не минимизированный файл) и тут: https://raw.github.com/barbitoff/g.raphael/master/min/g.pie-min.js (минимизированный).