С давним пор привык для "прибития" Lotus Notes использовать утилитку killnotes.exe
Но как-то наткнулся на прекрасную альтернативу внутри самого клиента - утилита NSD, которая служит для диагностики сбоев клиента.
просто запускаем её как "nsd.exe -kill" и готово - клиент прибит, библиотеки выгружены, в общем всё согласно документации:
"Runs NSD in a special mode that kills all Notes/Domino processes in the current "partition" (i.e. all processes that are accessing Notes shared memory and that are running from the same location as NSD). Output is limited to process lists (OS Process Table, and Notes Process Summary) and to status messages about the processes NSD forcefully terminated. The output log file follows the naming convention of kill_os_hostname_yyyy_mm_dd@hh_mm_ss.log and is saved to the data\IBM_TECHNICAL_SUPPORT directory."
ЗЫ: Если на рабочей станции запущен не только клиент Lotus Notes, но и сервер Lotus Domino, то сервер остаётся нетронутым.
ЗЫЫ: документация по NSD получается через "nsd.exe -help" :)
Показаны сообщения с ярлыком IBM. Показать все сообщения
Показаны сообщения с ярлыком IBM. Показать все сообщения
четверг, марта 7
суббота, декабря 22
Lotus. Динамический импорт RT-поля в открытый UI-документ
Для вставки внешних файлов в UI есть @-формула "@Command( [EditInsertFileAttachment])". Но бывает потребность вставить в UI через LotusScript вложения из RT-поля другого документа без сохранения и переоткрытия документа.
Вот для этого нам и пригодится недокументированный метод includeItem у класса NotesUiDocument.
Синтаксис метода: NotesUiDocument.includeItem(doc as NotesDocument, FieldName As String) *
* Применяется к текущему полю
Два варианта применения:
1) импорт файлов в уже открытом документе из другого документа
2) импорт файлов в новый документ без его предварительного сохранения.
Во вложенном файле приведены оба примера.
Первый пример в виде кнопки "Insert other document" на форме
Второй пример в виде кнопки "Create & Import" в представлении
файл-пример БД: скачать
UPD:
метод доступен начиная с версии 8.5. Если нужна поддержка версии ниже, то пример тут
Вот для этого нам и пригодится недокументированный метод includeItem у класса NotesUiDocument.
Синтаксис метода: NotesUiDocument.includeItem(doc as NotesDocument, FieldName As String) *
* Применяется к текущему полю
Два варианта применения:
1) импорт файлов в уже открытом документе из другого документа
2) импорт файлов в новый документ без его предварительного сохранения.
Во вложенном файле приведены оба примера.
Первый пример в виде кнопки "Insert other document" на форме
Второй пример в виде кнопки "Create & Import" в представлении
файл-пример БД: скачать
UPD:
метод доступен начиная с версии 8.5. Если нужна поддержка версии ниже, то пример тут
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
понедельник, декабря 5
Lotus @-формулы. задачки
Имеем на входе представление с 3-мя колонками:
1) список А (например пользователей)
2) список Б (например ролей)
3) список В (отношение пользователь-роль)
Задача: Выбрать уникальные роли из колонки Б, которые есть у всех пользователей из колонки А. При этом, если роль не встречается хотя бы у одного пользователя, то её отбрасываем.
в итоге родилось вот такое вот решение на @-формулах (переменные list, roles и users как бы результат выборки из представления):
Результат вычисления: role1
А теперь по порядку распишу каждую строчку:
создаём все возможные пересечения пользователь~роль
удаляем все пересечения, которые уже есть в list:
Преобразуем список t1 в список с пользователями и ролями отдельно в каждой "строке"
удаляем из списка t2 все роли, оставляя только пользователей
А теперь из списка t2 удаляем всех пользователей, полученных в списке t3. Тем самым мы получаем роли, которые не упоминались у каждого из пользователя в списке users
ну и завершающий аккорд - "инвертирование" списка t4, оставляя только те роли из списка roles, которые не попали в t4
UPD: Формулу можно сократить и привести к следующей:
1) список А (например пользователей)
2) список Б (например ролей)
3) список В (отношение пользователь-роль)
Задача: Выбрать уникальные роли из колонки Б, которые есть у всех пользователей из колонки А. При этом, если роль не встречается хотя бы у одного пользователя, то её отбрасываем.
в итоге родилось вот такое вот решение на @-формулах (переменные list, roles и users как бы результат выборки из представления):
list := "User1~role1":"User2~role3":"User2~role1":"User3~role1":"User3~role3":"User4~role1":"User4~role2";
roles:="role1":"role2":"role3";
users := "User1":"User2":"User3":"User4";
t0:=users*+"~"*+roles;
t1:=@Replace(t0; list; "");
t2:=@Explode(t1; "~");
t3:=@Replace(t2; roles; "");
t4:=@Unique(@Replace(t2; t3; ""));
result := @Unique(@Replace(roles; t4; ""));
result
Результат вычисления: role1
А теперь по порядку распишу каждую строчку:
создаём все возможные пересечения пользователь~роль
| t0:=users*+"~"*+roles; | User1~role1 User1~role2 User1~role3 User2~role1 User2~role2 User2~role3 User3~role1 User3~role2 User3~role3 User4~role1 User4~role2 User4~role3 |
|---|
удаляем все пересечения, которые уже есть в list:
| t1:=@Replace(t0; list; ""); | User1~role2 User1~role3 User2~role2 User3~role2 User4~role3 |
|---|
Преобразуем список t1 в список с пользователями и ролями отдельно в каждой "строке"
| t2:=@Explode(t1; "~"); | User1 role2 User1 role3 User2 role2 User3 role2 User4 role3 |
|---|
удаляем из списка t2 все роли, оставляя только пользователей
| t3:=@Replace(t2; roles; ""); | User1 User1 User2 User3 User4 |
|---|
А теперь из списка t2 удаляем всех пользователей, полученных в списке t3. Тем самым мы получаем роли, которые не упоминались у каждого из пользователя в списке users
| t4:=@Unique(@Replace(t2; t3; "")); | role2 role3 |
|---|
ну и завершающий аккорд - "инвертирование" списка t4, оставляя только те роли из списка roles, которые не попали в t4
| result := @Unique(@Replace(roles; t4; "")); | role1 |
|---|
UPD: Формулу можно сократить и привести к следующей:
t0:=users*+"~"*+roles;
t1:=@Replace(t0; list; "");
t2:=@Unique(@Right(t1;"~"));
result := @Trim(@Unique(@Replace(roles; t2; "")));
result
пятница, июля 22
вышел Notes/Domino 8.5.2 Fix Packs 3
а 18-го числа сего месяца IBM выпустила фикспак, почитать про который можно тут, а скачать тут.
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
четверг, марта 17
Lotus Notes/Domino & XStream
Настройка Lotus Domino для работы с библиотекой XStream.
1) копируем файлы xstream-{version}.jar и xpp3_min-{version}.jar (это на тот случай, если вместо DomDriver вы хотите использовать XppDriver) в каталог {DOMINO_BIN}/jvm/lib/ext
2) в файле {DOMINO_BIN}/jvm/security/java.policy в блоке "grant" дописываем строку (не наступите на грабли) :
Для возможности использования подсказок в Lotus Domino Designer на базе Eclipse, потребуется положить библиотеки и на рабочей станции разработчика в каталог {NOTES_BIN}/jvm/lib/ext и перезапустить клиента
ЗЫ: Если что-то настроено неправильно, то в логах буду сыпаться сообщения похожие на это:
ЗЫЫ: при разработке под Lotus Domino 8.x уже можно использоваться аннотации (в eclipse-based редакторе, при сохранении, будет предложено повысить версию java-проекта до 1.5 для компиляции)
1) копируем файлы xstream-{version}.jar и xpp3_min-{version}.jar (это на тот случай, если вместо DomDriver вы хотите использовать XppDriver) в каталог {DOMINO_BIN}/jvm/lib/ext
2) в файле {DOMINO_BIN}/jvm/security/java.policy в блоке "grant" дописываем строку (не наступите на грабли) :
3) перезагружаете сервер Lotus Dominogrant { ... permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; }
Для возможности использования подсказок в Lotus Domino Designer на базе Eclipse, потребуется положить библиотеки и на рабочей станции разработчика в каталог {NOTES_BIN}/jvm/lib/ext и перезапустить клиента
ЗЫ: Если что-то настроено неправильно, то в логах буду сыпаться сообщения похожие на это:
... Agent error: java.lang.ExceptionInInitializerError: Cannot access defaults field of Properties Agent error: java.lang.NoClassDefFoundError: com.thoughtworks.xstream.converters.collections.PropertiesConverter (initialization failure) Agent error: at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) Agent error: at com.thoughtworks.xstream.XStream.setupConverters(XStream.java:647) Agent error: at com.thoughtworks.xstream.XStream.(XStream.java:445) Agent error: at com.thoughtworks.xstream.XStream. (XStream.java:385) Agent error: at com.thoughtworks.xstream.XStream. (XStream.java:342) ...
ЗЫЫ: при разработке под Lotus Domino 8.x уже можно использоваться аннотации (в eclipse-based редакторе, при сохранении, будет предложено повысить версию java-проекта до 1.5 для компиляции)
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
понедельник, марта 14
Lotus Domino & java.policy
мелкие баги бывают такие разные и противные...
вот например, стабильно в консоли получал на любой "чих" ошибку "error: java.security.AccessControlException: Access denied (java.lang.RuntimePermission setContextClassLoader)"
Перековырял всё, а ошибка всё не уходит...
В какой-то момент осенило - проблема может быть не в нехватке прав, а в самом проблемном файле java.policy. Беру "эталонный" файлик с другого сервера, подставляю и вуаля - всё работает!
беглый анализ произошедшего нашел и виновника возникшей оказии: сервер расположен на Windows, файлик правился из Linux, в итоге в файле образовались иные "переносы строк" - вот на этом IBM JDK и запнулась и перестала и вовсе читать конфигурацию. А внешне файл выглядел нормально что в Windows (блокнот), что в Linux
вот например, стабильно в консоли получал на любой "чих" ошибку "error: java.security.AccessControlException: Access denied (java.lang.RuntimePermission setContextClassLoader)"
Перековырял всё, а ошибка всё не уходит...
В какой-то момент осенило - проблема может быть не в нехватке прав, а в самом проблемном файле java.policy. Беру "эталонный" файлик с другого сервера, подставляю и вуаля - всё работает!
беглый анализ произошедшего нашел и виновника возникшей оказии: сервер расположен на Windows, файлик правился из Linux, в итоге в файле образовались иные "переносы строк" - вот на этом IBM JDK и запнулась и перестала и вовсе читать конфигурацию. А внешне файл выглядел нормально что в Windows (блокнот), что в Linux
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
среда, августа 11
Firefox (NoScript) и IBM PartnerWorld = XSS скриптинг
В какой-то момент, понадобилось добраться до ПО, доступного по партнёрской программе.
Захожу на сайт IBM, авторизуюсь, перехожу в раздел PartnerWorld. Иду в раздел "поиск и загрузка ПО" и... "а с платформы говорят"... в общем, получаю ошибку 503.
Первая мысль - что-то не то с учетной записью. Позвонил в IBM - выяснили, что всё нормально.
Начинаю изыскания на своей стороне.
После непродолжительного анализа, выясняется, что серверов-то у IBM многа и при сёрфинге по сайту, мы "скачем" с одного на другой и в итоге получаем подозрение на XSS-атаку, которую успешно блокирует плагин NoScript.
Чтобы этого не возникало, достаточно в настройки NoScript в разделе XSS (Дополнительно>XSS) добавить правило "^https?://.+\.ibm\.com/*" и, хвала!, всё заработало!
Захожу на сайт IBM, авторизуюсь, перехожу в раздел PartnerWorld. Иду в раздел "поиск и загрузка ПО" и... "а с платформы говорят"... в общем, получаю ошибку 503.
Первая мысль - что-то не то с учетной записью. Позвонил в IBM - выяснили, что всё нормально.
Начинаю изыскания на своей стороне.
После непродолжительного анализа, выясняется, что серверов-то у IBM многа и при сёрфинге по сайту, мы "скачем" с одного на другой и в итоге получаем подозрение на XSS-атаку, которую успешно блокирует плагин NoScript.
Чтобы этого не возникало, достаточно в настройки NoScript в разделе XSS (Дополнительно>XSS) добавить правило "^https?://.+\.ibm\.com/*" и, хвала!, всё заработало!
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
четверг, марта 4
Не запускается Lotus Designer 8.5 (Eclipse)
Выдаёт ошибку "platform command processor has encountered a problem".
Удалите файл com.ibm.designer.domino.personality.config.xml в каталоге "%NOTES_DATA%\workspace\.metadata\.plugins\com.ibm.rcp.personality.framework\personalityWindowState"
источник + проверено на себе :)
Удалите файл com.ibm.designer.domino.personality.config.xml в каталоге "%NOTES_DATA%\workspace\.metadata\.plugins\com.ibm.rcp.personality.framework\personalityWindowState"
источник + проверено на себе :)
четверг, декабря 17
Подключение по JDBC к DB2 из Java-агента Lotus Domino
Для Universal JDBC доступа к DB2 серверу из Java-агента Lotus Domino понадобится:
Скопировать на сервер библиотеки драйвера:
Копируем в каталог "%DOMINO_DIR%/jvm/lib/ext" файлы db2jcc.jar и db2jcc_license_cu.jar. Взять их можно с самого сервера DB2 из каталога "%DB2%\SQLLIB\java"
Перезагружаем сервер Lotus Domino, дабы JRE оного сервера "подхватила" новые библиотеки
написать Java-библиотеку DBFactory:
Создаём Java Library для класса DBFactory. Я не буду здесь расписывать вариант с несколькими подключениями и пропишу "жесткие" параметры подключения через private-аттрибуты url, user и password.
Исходный код библиотеки:
произвести само подключение, используя DBFactory:
Создаём Java-агента с Security="Allow restricted operations", к которому подключаем нашу библиотеку DBFactory

после чего в агенте можно создать подключение к серверу:
теперь нам доступен объект Statement, позволяющий организовывать SQL запросы к серверу.
Скопировать на сервер библиотеки драйвера:
Копируем в каталог "%DOMINO_DIR%/jvm/lib/ext" файлы db2jcc.jar и db2jcc_license_cu.jar. Взять их можно с самого сервера DB2 из каталога "%DB2%\SQLLIB\java"
Перезагружаем сервер Lotus Domino, дабы JRE оного сервера "подхватила" новые библиотеки
написать Java-библиотеку DBFactory:
Создаём Java Library для класса DBFactory. Я не буду здесь расписывать вариант с несколькими подключениями и пропишу "жесткие" параметры подключения через private-аттрибуты url, user и password.
Исходный код библиотеки:
public class DBFactory {
private static final String url = "jdbc:db2://SERVER_NAME:SERVER_PORT/DATABASE";
private static final String user = "USERNAME";
private static final String password = "PASSWORD";
private Connection con;
private Statement stmt;
public DBFactory() {
try{
Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
con = DriverManager.getConnection(url, user, password);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Statement getStatement(){
return stmt;
}
}
произвести само подключение, используя DBFactory:
Создаём Java-агента с Security="Allow restricted operations", к которому подключаем нашу библиотеку DBFactory
после чего в агенте можно создать подключение к серверу:
Statement stmt = (new DBFactory()).getStatement();
теперь нам доступен объект Statement, позволяющий организовывать SQL запросы к серверу.
Подписаться на:
Сообщения (Atom)