barbitoff programmer`s blog

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

среда, 3 августа 2011 г.

UDDI в WSO2GREG 4.0.0

Для включения UDDI необходимо запустить реестр с ключем "-Duddi=enable":

wso2server.bat -Duddi=enable

Если GREG запускается как служба, то в repository/conf/wrapper.conf необходимо добавить строчку (посмотрев предварительно, что 3ий параметр приложения ещё не занят, иначе поставить первую незанятую цифру):

wrapper.app.parameter.3=-Duddi=enable

У меня правда при запуске wso2greg как службы с таким параметром веб-сервис UDDI деплоится, вот только при попытке получить wsdl вываливается с исключением java.lang.ClassNotFoundException: com.sun.tools.ws.spi.WSToolsObjectFactory, решения пока не нашел. При запуске же напрямую, можно получить wsdl-ку для выполнения поисковых запросов к реестру по адресу https://localhost:9443/services/UDDIInquiryService?wsdl, или для публикации: https://localhost:9443/services/UDDIPublicationService?wsdl.
Потестировать фичу можно, открыв эту wsdl-ку, например, в soapUI (открывать правда нужно не скачанный файл, а прямо URL, т.к. содержит относительные ссылки на xsd).
Т.к. в реестре используется jUDDI, то подойтет туториал по последнему тут (с видео примерами): http://apachejuddi.blogspot.com/2011/05/getting-started-with-uddi-v3.html, я правда пока не нашел, где найти wsdl для security. 

java.lang.AbstractMethodError: org.slf4j.impl.Log4jMDCAdapter.getCopyOfContextMap()Ljava/util/Map при попытке связать WSO2ESB 4.0.0 и ActiveMQ 5.5.0

Проблема: При попытке настроить JMS-транспорт WSO2ESB 4.0.0 на работу с ActiveMQ 5.5.0, запуск ESB приводит к бесконечным исключениям "java.lang.AbstractMethodError: org.slf4j.impl.Log4jMDCAdapter.getCopyOfContextMap()Ljava/util/Map".
Причина: WSO2ESB 4.0.0 не умеет работать с клиентскими библиотеками ActiveMQ версии больше 5.4.1 (проверено экспериментально).
Решение: положить в  /repository/components/lib WSO2ESB клиентскую библиотеку ActiveMQ 5.4.1 (activemq-core-5.4.1.jar, скачать можно с официального сайта amq: http://activemq.apache.org/activemq-541-release.html). Клиент 5.4 работает без проблем с брокером ActiveMQ 5.5.0, так что брокер откатывать на более старую версию не нужно.

Запуск скриптов /etc/init.d/ от пользователя, отличного от root

Скрипты в /etc/init.d/ выполняются от root-а, что иногда совсем не нужно. Сменить пользователя через su, если у пользователя установлен пароль - тоже не вариант. Решается задача с помощью вынесения всей логики из init-скрипта в отдельный файл, и запуска этого скрипта в init-скрипте с помощью программы /sbin/start-stop-daemon, позволяющей сменить пользователя, из-под которого будет выполняться вызываемая программа / скрипт. start-stop-daemon, кроме смены пользователя, умеет также демонизировать (отправлять в фон) запускаемую программу. Вот пример вызова скрипта с демонизацией (ключ -b), сменой пользователя на "user1", выводом отладочных сообщений (-v) и передачей скрипту цели вызова init-скрипта (start/stop/status и т.п.):

/sbin/start-stop-daemon -S -v -b -x "$PATH_TO_MY_SCRIPT" --user user1 --chuid user1 -- "$1"

Вообще, параметры вызываемой программе передаются указанием их после двойного дефиса ("--"). Непосредственно за смену пользователя отвечает опция --chuid, что делает --user я до конца не понял (в контексте именно запуска, а не остановки чего-либо), но на всякий случай и там указал "user1".
Подробнее о  start-stop-daemon  написано тут: http://help.ubuntu.ru/wiki/start-stop-daemon

Отключение вывода команд при выполнении bat-файла


@echo off

Поиск файлов, принадлежащих пользователю в Linux

Например, для пользователя root:

find -user root

понедельник, 1 августа 2011 г.

Перехват вывода программы в bash-скрипте

Для того, чтобы перехватить вывод программы в переменную, используются обратные кавычки:

h2pid=`ps -A | grep h2.sh`

ВАЖНО: справа от "=" не должно быть пробелов, иначе интерпретатор посчитает, что вывод команды сам является командой и попробует её выполнить. Слева от "=" также не должно быть пробелов, т.к. в этом случае уже имя переменной будет воспринято как имя команды.

position: relative относительно родительского контейнера

Для установки абсолютного позиционирования элемента относительно родительского контейнера (а не относительно страницы вцелом), необходимо (помимо того, естественно, чтобы у самого элемента был поставлен position: absolute и заданы координаты css-свойствами top и left), чтобы у родителя был установлен position: relative или position: absolute. Вообще, при установке position: absolute у элемента его позиционирование осуществляется относительно его ближайшего предка с position: relative или position: absolute, или, если такого нет - относительно страницы.