barbitoff programmer`s blog

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

пятница, 23 декабря 2016 г.

Birt: определение числа строк в DataSet'е

Задача

Необходимо определить число строк в некотором DataSet'е, чтобы затем использовать это значение в скрипте.

Решение

Как вариант - создаем JS-переменную, равную 0, и в обработчике onFetch нужно датасэта выполняем ее инкремент.

воскресенье, 18 декабря 2016 г.

WSO2 ESB: как отключить динамическую регулировку числа потоков, слушающих JMS-очередь

Есть прокси-сервис, слушающий JMS-очередь. Работа в несколько потоков для него настроена параметрами transport.jms.ConcurrentConsumers и transport.jms.MaxConcurrentConsumers (см. http://axis.apache.org/axis2/java/transports/jms.html). Однако, каким бы ни было значение transport.jms.ConcurrentConsumers, в "состоянии покоя", т.е. когда в очереди-источнике сообщений нет, на очереди висит только 1 получатель. По мере появления сообщений в очереди число получателей растет вплоть до указанного в transport.jms.MaxConcurrentConsumers ограничения. Затем, после опустошения очереди, получатели начинают отключаться, пока снова не остается только 1 получатель.
Объясняется такое поведение вот чем. Изначально шина создает для очереди столько слушателей, сколько указано в параметре transport.jms.ConcurrentConsumers. Каждый получатель начинает цикл опроса очереди, при этом на каждой итерации он ожидает получения сообщения в течение некоторого промежутка времени, заданного параметром transport.jms.ReceiveTimeout (по-умолчанию 1000мс). После определенного числа "холостых" итераций, в результате которых таймаут вышел, а сообщение так и не было получено, слушатель самозавершается. Число итерацией определяется параметром transport.jms.IdleTaskLimit и по-умолчанию равно 10. В итоге, через примерно 10 секунд завершаются все слушатели кроме одного "дежурного", который не завершается ни при каких обстоятельствах.
Данная ситуация не во всех случаях может устраивать, иногда нужно, чтобы очередь всегда слушало фиксированное число слушателей (например, при использовании группировки сообщеий). Тут варианта 2:
  1. Устанавливаем очень большое значение параметра transport.jms.IdleTaskLimit (т.к. бесконечное значение установить нельзя, можно поставить, к примеру, 2147483647)
  2. Устанавливаем бесконечный таймаут ожидания получателем сообщения путем установки параметра transport.jms.ReceiveTimeout в -1

среда, 30 ноября 2016 г.

пятница, 25 ноября 2016 г.

Бесследное удаление КриптоПРО JCP 2.x

Под Windows:
  • Сносим JDK
  • Удаляем из реестра HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs\ru\/Crypto/Pro
Под Linux:
  • Сносим JDK
  • Удаляем /root/.java/
  • Удаляем /var/opt/cprocsp/
  • Если /usr/java/default не совпадает с только что снесенной JDK, то нужно удалить из нее .java/.systemPrefs/.ru (т.к. эта папка создается JCP почему-то именно в этой JDK, а не в той, куда ставится JCP)

четверг, 24 ноября 2016 г.

PostgreSQL: игнорирование вставки записей в таблицу средствами СУБД

Задача

Средствами СУБД заблокировать вставку записей, удовлетворяющих некоторому критерию, в определенную таблицу. При этом соотв. INSERT-запросы не должны возвращать ошибок, просто строки не должны вставляться.

Решение

Создаем триггерную функцию, блокирующую вставку записи (блокировка вставки выполняется посредством возврата NULL из триггерной функции):
CREATE OR REPLACE FUNCTION nop()
RETURNS trigger AS
$BODY$
BEGIN
RETURN NULL;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;
Теперь вешаем эту функцию как триггер на таблицу, прописывая нужное условие, например, равенство значения определенной колонки определенной строке:
CREATE TRIGGER suppress_tr1code_rows
BEFORE INSERT ON mytable
FOR EACH ROW
WHEN (new.code = 'TR1')
EXECUTE PROCEDURE nop();
Профит! 

TortoiseHG: сохраняем логин/пароль для работы с репозиторием

Задача

Для работы с некоторым репозиторием нужно сохранить логин/пароль, чтобы он не запрашивался при каждом pull'е / push'е.

Решение

В домашней директории создаем файл .hgrc и в нем прописываем:
[auth]
myrepo.prefix = https://myrepo/repo/
myrepo.username = myusername
myrepo.password = MyPa$$W0Rd