Закат эпохи Lotus


Сегодня (30.10.2018) ходил на мероприятие IBM Russia приуроченное к выходу Lotus Domino v10 и самолично наблюдал закат эпохи Lotus Notes. Сразу оговорюсь, сам продукт будет жить еще довольно долго, но тенденций к его использованию в России я не вижу.

Приглашение на мероприятие, содержало исключительно адрес, ни каких схем и рекомендаций в нем не было. На какой станции метро выходить, где именно находится литера «А».

Я спросил у охранника парковки и нашел здание, у которого как оказалось несколько входов, но я предположил, что мне нужен главный вход. Ни каких указателей, на то, что проводится важное для IBM мероприятие не имелось.

Я был в числе первых, по этому ни какой очереди при регистрации не наблюдалось, хотя выступление было задержано минут на 10 из за опаздывающих и видимо подошедших в последний момент.

Я поднялся на лифте и меня ни кто не встретил и не указал, где я могу раздеться, за стойкой сидели три барышни, на лицах которых читалось, что они мне не рады.

На регистрацию организаторы отвели 45 минут, нам включили ролики на английском языке с YouTube и указали где кулер с водой, ни какой раздатки, ни кофе, ни интересных презентаций, подготовленных сотрудниками IBM Russia, не было, все просто, смотрите по два три раза одни и те же видео и копались в собственных телефонах от скуки.

Хочу особо отметить работу Ивана Михалычева, доброжелательный, профессиональный, тактичный, внимательный.

Вот я сижу в полном зале людей которым искренне интересно узнать о Lotus Domino V10 и, что я вижу, практически каждому от сорока и больше, думаю 95% людей могли бы сказать, как и я сам, что разрабатывают на Lotus уже больше 20 лет. Главный докладчик Uffe Sorensen начинает доклад и в ходе доклада показывает ролики с интервью участников презентации Domino V10 в других странах и картина повторяется, это зрелые люди в возрасте. Где молодые разработчики, такие какими был я в 1995 году когда разработал свое первое приложение на Lotus 3.0.

Перерыв. Формат мероприятие предполагает живое общение как между участниками, так и с организаторами, но за всех отдувался Иван, остальные попрятались неизвестно куда.

Второй докладчик Luis Guirigay был на высоте, прекрасно провел презентацию и раскрыл тему. Большое ему спасибо. Огорчил тем, что русская версия Domino V10 появиться непонятно когда.

Партнерская серия докладов была ужасной, особенно Логика СЭД. Мы все собрались в офисе IBM на мероприятие посвященное Domino V10 и вместо того, чтобы рассказать с какими ситуациями и какие открытия они сделали при тестировании и миграции на Domino V10, мы выслушивали о функционале их бизнес продуктов, о которых мы и так много знаем, так как каждый имеет опыт по 20 лет в разработке Lotus и всех крупных игроков знаем на пересчет.

Понравился доклад ClevaDesk, все четко и по существу, но опять, тема Domino V10 не была раскрыта. Владимир Татаринцев из CYONE выступил уверенно, было познавательно, но опять, про Domino V10 было затронуто вскользь.

Завершение мероприятия не обошлось без сюрпризов, сразу после этого мероприятия, было организованно мероприятие для VIP партнеров и все докладчики со стороны IBM ушли на него, оставив приглашенных только с чаем и булочками (о которых я не хочу писать).

Я попытался уточнить информацию у девушек на ресепшене (три красавицы), но был послан в мягкой форме, то есть им было все равно, хотя вполне очевидно, что меня могли направить к куратору мероприятия (Ивану) и выразить сочувствие на лице и искреннюю озабоченность.

На мероприятии я представлял заказчика от государственных органов и хотел получить информацию от поставщика Domino, как мне купить этот продукт будучи государственным заказчиком и тут выяснилось, что сотрудники IBM Russia даже не подозревают, что государственные органы закупают совершенно по другой схеме, чем коммерческие организации, то есть они не осуществляют мониторинг российских законов и практик, а закон то действует с 2013 года, то есть за пять лет они ни разу не поддержали покупку Domino в государственный сектор.

Еще один факт вызвал удивление у сотрудников IBM Russia — это наличие аналогов отечественного ПО на российском рынке, о таких продуктах как CommuniGate Pro они не знали, хотя на сайтах этих компаний написано, что они конкурируют с Lotus (мое личное мнение, конечно им очень далеко до lotus, но они работают над этим), список партнеров из госсекторара очень впечатляющий.

Вывод:

Руководство HR отдела IBM Russia надо менять, безразличие и лень, других слов я не нахожу. Первое впечатление обычно бывает верным.

После этого мероприятия мне расхотелось использовать Domino и я решил отложить закупку, буду исследовать возможности использования других технологий, более динамичных и заинтересованных в партнерстве.

Сама концепция Domino и ее стабильность очень привлекательна, но мир движется вперед, а IBM не поспевает и самый большой просчет — это стремительно стареющие кадры.

 

Ссылки:

https://www.ibm.com/blogs/collaboration-solutions/tag/domino-v10/

https://www.ibm.com/collaboration/ibm-domino

https://www.ibm.com/collaboration/ibm-domino/buy-v10

 

Lotus Notes + Почта России


У Почты России имеется API для отслеживания посылок, регистрация для частного лица бесплатная, но в день можно сделать только 100 запросов. Хотите больше, надо заключать договор.

Техническое описание здесь https://tracking.pochta.ru/specification

Мне необходимо было организовать отслеживание отправлений непосредственно в Lotus Notes. Для этого я разработал агента на Java и запускал его на сервере, отправлений было не очень много, по этому я укладывался в рамки 100 запросов.

Из странного, трек который отдавал сервис не всегда совпадает с треком который выдается на сайте. Объяснение только одно, базы разные.

Пример можно скачать по ссылке: Download NSF

ActiveMQ and Lotus Notes


Использование сервиса очередей в приложениях Lotus Notes и Lotus Domino значительно упрощают жизнь разработчикам.

Это позволяет изолировать приложения друг от друга, а так же интегрировать с другими платформами. Надежность и отказоустойчивость тоже играют большое значение, вы перекладываете на очереди заботу о доставке и сохранности вашего послания/транзакции или факта наступления события.

Ниже я приведу пример демонстрационного приложения которое имитирует работу универсального нумератора. Предположим, у Вас есть три приложения которым требуется уникальная нумерация своих событий (регистрация писем, событий в логе и т.д.). Приложение, делает запрос в очередь со своим идентификатором, это сообщение считывается программой нумератором, она обрабатывает запрос и выдает номер, размещая ответ в другой очереди, приложение уже ждет ответа и слушает эту очередь, как только в нее появится ответ, приложение считывает его и использует для своих нужд.

Кажется, что это все сложно, но вы изолируете друг от друга две системы, приложению не требуется права на запись в файл не надо заботиться о миграции подсистем, вы всегда можете переместить нумератор на другой сервер изменив запись в DNS.

Рецепт быстрого приготовления:

Скачайте ActiveMQ и установите на свой компьютер или сервер.

В настройках Lotus Notes необходимо разрешить выполнять java приложения в файле C:\Program Files\IBM\Lotus\Notes\jvm\lib\security\java.policy в самый конец файла добавьте:

grant { permission java.security.AllPermission; };

Скопируйте библиотеку C:\activemq\activemq-all-5.15.3.jar в C:\Program Files\IBM\Lotus\Notes\jvm\lib\ext

Перезапустите Lotus Notes, для того, чтобы заработала новая политика и загрузилась библиотека

Скачайте пример на Lotus Notes numerator

  1. Откройте приложение
  2. Перейдите в представление «Apps»
  3. Выделите настройку приложения «App2»
  4. Запустите агента «Actions->App->set app.in» для загрузки запроса номера из центрального «нумератора»
  5. Запустите агента «Actions->GetAgent» — он считывает запрос из очереди «app.in» находит по идентификатору приложения настройку в которой храниться последний выданный номер, получает следующий номер и размещает его в очереди «app.out»
  6. Выделите настройку «App2» и запустите агента «Actions->App->get app.out» который  считывает из очереди запись и записывает полученный номер в настройку.

http://activemq.apache.org/

Convert Lotus Document to HTML vs RTF


Как получить HTML из Lotus Notes документа не используя HTTP сервер.

Первое, мы создаем форму с одним полем «body» формата NotesRichtextItem в эту форму бы будем помещать образ документа командой  doc.Rendertortitem(rtRTF), а потом преобразуем полученный документ в HTML используя класс NotesMIMEEntity.

Очень важно, перед конвертацией отключить преобразование в MIME командой session.Convertmime = false

Ниже приводится часть кода по преобразованию и записи документа Lotus Notes в файл HTML.

Если вы используете в документе вычисляемые поля, то перед рендерингом, необходимо вычислить эти поля и вписать в документ переменные с готовым результатом. Порядок такой:

  1. Создаем временный документ
  2. Переносим все поля
  3. Вычисляем все временные переменные и записываем результат во временный документ
  4. Преобразуем документ командой doc.Rendertortitem

 

Dim session As New NotesSession

Dim doc As NotesDocument

session.Convertmime = False

 

Dim RTF As NotesDocument

Set RTF = session.Currentdatabase.Createdocument()

Dim rtRTF As NotesRichTextItem

Set rtRTF = New NotesRichTextItem(RTF,<em>"Body"</em>)

Call doc.Rendertortitem(rtRTF)

Call doc.Copyallitems(RTF, false) 'копировать все пересенные

Call RTF.Converttomime(<em>2</em>) 'конвертируем документв в HTML

Call RTF.Computewithform(False, False)

Call RTF.save(True,False)

Dim mime As NotesMIMEEntity

Set mime = RTF.Getmimeentity()

If Not mime Is Nothing Then

If mime.Contenttype=<em>"multipart"</em> Then

Dim out As NotesStream

Set out = session.Createstream()

Dim sFile1 As String

sFile1 = <em>"c:\\temp\\"</em>+RTF.Universalid+<em>".txt"</em>

If Not out.Open(sFile1) Then

Print <em>"Не могу создать файл"</em>

Exit Sub

End If

Dim sFile2 As String

sFile2 = <em>"c:\\temp\\"</em>+RTF.Universalid+<em>".html"</em>

Dim child1 As NotesMIMEEntity

Dim child2 As NotesMIMEEntity

Set child1 = mime.Getfirstchildentity()

While (Not child1 Is Nothing)

Call out.Writetext(child1.Contentastext(), <em>0</em>)

If child2 Is Nothing Then

Set child2 = child1.getNextSibling()

If Not child2 Is Nothing Then

Set child2 = child2.getNextSibling()

End If

End If

Set child1 = child2

Wend

Call out.Close()

Call DecodeFile(sFile1, sFile2)

End If

End If

session.Convertmime = True

В коде используется вызов  Call DecodeFile(sFile1, sFile2) из библиотеки. libMD5

Save Lotus Notes Document to HTML


Сохранить документ Lotus Notes в формат HTML не открывая документ на просмотр оказалось задачей нетривиальной.

Первая очевидная проблема — наличие вычисляемого текста и полей вычисляемых при открытии документа. Имеется несколько способов конвертации документа стандартными средствами:

  1. Использовать DXL преобразование;
  2. Использовать команду notesDocument .RenderToRTItem( notesRichTextItem )
  3.  Использовать Domino сервер скачав документ по HTTP

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

Рассмотрим третий вариант, при доступе к документу по HTTP выполняются все вычисления, но тут тоже есть момент, агент выполняется от имени того, кто его подписал, а следовательно если есть секции или поля вычисляемые на основании роли пользователя, то документ будет отображать неверно. Обычно, если планируют использовать архивирование, то при проектировании закладывают роль [AdminArchiv] для разрешения этой проблемы.

Для решения задачи получения документа по HTTP мы пишем java библиотеку. Одним из плюсов, это возможность использовать логин и пароль, что позволяет получить документ под разными уровнями доступа.

import java.io.*;
import java.net.*;
import sun.misc.BASE64Encoder;

public class GetHTML {

public String getHTML(String urlToRead, String username, String password) {
URL url; // The URL to read
HttpURLConnection conn; // The actual connection to the web page
BufferedReader rd; // Used to read results from the web page
String line; // An individual line of the web page HTML
String result = ""; // A long string containing all the HTML
try {
url = new URL(urlToRead);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

String userpass = username + ":" + password;

BASE64Encoder encoder = new BASE64Encoder();
String encodedStr = encoder.encode(userpass.getBytes());

String basicAuth = "Basic " + encodedStr;
conn.setRequestProperty ("Authorization", basicAuth);

rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = rd.readLine()) != null) {
result += line;
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}

Далее пишем LotusScript агент

Use "GetHTML"

Sub Initialize
Dim js As JAVASESSION
Dim getHTMLClass As JAVACLASS
Dim getHTMLObject As JavaObject
Dim html As String
Dim url As String
Set js = New JAVASESSION
Set getHTMLClass = js.GetClass("GetHTML")
Set getHTMLObject = getHTMLClass.CreateObject

url = "http://server/replicid/0/" & doc.Universalid
html = getHTMLObject.getHTML(url, "UserName", "Password")

Dim fileNum As Integer
Dim fileName As String
fileName = "c:\\temp\\demo.html"
fileNum% = FreeFile()
Open fileName$ For Output As fileNum%
Print #fileNum%, html
Close fileNum%
End Sub

После получения HTML файла можно его преобразовать в PDF или отправить на хранение в архив.