Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Новые подходы к автоматизации с применением современных средств (типа заметок)
Пользователь: S-presso (IP-адрес скрыт)
Дата: 02, November, 2016 15:00

Немного запоздало, но всё же выполняю обещание, данное в конце Школы ИРБИС в Крыму и выкладываю ссылку на новую разработку, а также некоторые заметки по её применению и в целом по вопросам автоматизации в форме тезисов. К тому же, наконец дошли руки до частичного воплощения давнишней идеи по использованию имеющихся на сегодняшний день средств для генерации текста (в частности, отчётов), что также нашло отражение в функционале программы и в тезисах. Итак...




Так уж исторически сложилось, что автоматизация библиотек в наших реалиях в своём технологическом аспекте наряду с использованием современных компьютерных и информационных средств, как программных, так и аппаратных, характеризуется применением ряда практик, уходящих своими корнями в более ранние этапы освоения вычислительной техники и являющихся по сути пережитками той эпохи. Среди задач, прежде всего возникающих перед администратором библиотеки, автоматизированной средствами ИРБИС64, такими реликтовыми практиками отмечаются, к примеру, выполнение задач по глобальной корректировке библиотечной БД и, например, генерации отчётов на основе данных библиографических записей. В настоящей статье мы хотим предложить Вашему вниманию альтернативную разработку – некое приложение, созданное с целью попытки решения подобных задач на основе более актуальных на данный момент программных средств и технологий.
Сразу же отметим, что мы ни в коем случае не настаиваем на необходимости использовании именно данного программного решения. Оно скорее служит демонстрационным целям и призвано показать, как некоторые процессы библиотечной автоматизации вообще могут быть реализованы с использованием более современных и популярных вычислительных технологий. Для удобства пользователей приложение реализовано в качестве оконной утилиты для современных версий Windows, которую можно настроить для совместного использования с АРМ «Каталогизатор» ИРБИС64.
Исходный текст проекта располагается по адресу https://github.com/S-presso/IrbisRecordsProcessing/, а файлы, необходимые для использования готового приложения, – в каталоге проекта Usage/. Для успешного его использования с АРМ «Каталогизатор» в файл справочника доступных выходных форм PFTW.MNU для всех требуемых баз данных установленной на сервере системы ИРБИС64 необходимо добавить следующие две строчки:

ProcRecs
Пользовательская обработка записей

а в подкаталог Deposit/ рабочей папки ИРБИС64 скопировать из соответствующей папки файл ProcRecs.pft со следующим содержимым:

if &unifor('SA')='0' then 'DBN:', &unifor('+D'), '<br> ', &unifor('S1') fi,  
'MFN:', MFN, 
&unifor('!'),

Можно также скопировать в папку irbiswrk/ на стороне клиента из одноимённой папки проекта файл @@temp.irp. Теперь при выборе из меню АРМ «Каталогизатор» пункта «Сервис»«Печать» можно будет в появившемся окне из вкладки «Списки» выбрать пункт «ProcRecs – Пользовательская обработка записей» и при выборе файла в качестве выходного носителя указать на нужный файл, например @@temp.irp. Будет сгенерирован файл со следующим содержимым:

DBN: <Текущая БД>
MFN: <Первый из отмеченных номеров записей>
…
MFN: <Последний из отмеченных номеров записей>

Следующая задача – это установление связи между генерацией выходной формы и запуском на выполнение соответствующей утилиты. Самый простой способ заключается в установлении в системе клиента ассоциации соответствующего расширения файла, например .IRP (Irbis Records Processing), с приложением IrbisRecordsProcessingRunShell.exe из подкаталога Working directory/ каталога Usage/. Теперь в ответ на диалоговое окно АРМ «Каталогизатор» с предложением просмотреть сохранённую выходную форму будет открываться новое окно:

http://i.imgur.com/DTR0ufr.png

Нажатием кнопки «Открыть» мы запускаем наше приложение.
Более нестандартным решением для осуществления связи АРМ «Каталогизатор» с внешним приложением для пакетной обработки записей может быть установка на клиентской машине виртуального принтера, передающего управление нужной утилите. Для этой цели можно использовать проект с открытым исходным кодом под названием Printer++. Правда, к моменту подготовки данной публикации сайт http://www.printerplusplus.com/ не функционировал – там висел анонс запуска нового сайта проекта. В данный момент 64-разрядную версию драйвера виртуального принтера можно загрузить здесь: http://printer-64bit.updatestar.com/en. При установке нужно ввести следующее имя для принтера: IrbisRecordsProcessing, затем по окончании установки скопировать в каталог C:\PrinterPlusPlus все файлы из папки Working directory/ и добавить следующий ключ к секции <processors> файла конфигурации PrinterPlusPlus.exe.config:

<processors>
…    
<add key=" IrbisRecordsProcessing" value=" IrbisRecordsProcessing.Processor, IrbisRecordsProcessing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</processors>

Необходимо будет также скачать архив по ссылке http://www.verydoc.com/ps2txt.zip и скопировать его содержимое в папку C:\ps2txt. Таким образом будет подключаться внешнее консольное приложение для преобразования содержимого файла PostScript, генерируемого виртуальным принтером, в текстовое представление.
После выполнения вышеописанных действий применение действия «Печать» в диалоговом окне выходных форм АРМ «Каталогизатор» с последующим выбором из списка принтеров IrbisRecordsProcessing должно будет также приводить к запуску нужной нам утилиты. При этом в качестве выходного носителя можно выбрать и «бумагу» (конечно, тоже виртуальную в данном случае) и обойтись без записи результатов генерации формы в файл.
Однако следует отметить, что в данный момент существуют определённые технические проблемы с установкой виртуального принтера Printer++, особенно в новых системах Windows 8 и 10, что может послужить препятствием для выполнения приведённой инструкции. Надо надеяться, что с переходом на новый сайт проект PrinterPlusPlus также обновится и с точки зрения функциональности. А до этого времени стандартным решением является, как уже было сказано, регистрация в реестре Windows нужного расширения файла с сопоставлением ему приложения IrbisRecordsProcessingRunShell.exe, из которого уже вызывается DLL-библиотека IrbisRecordsProcessing.
Теперь перейдём к описанию самого DLL-расширения. Для его успешной работы необходимо отредактировать нужным образом ключ "connection-string" секции <appSettings> конфигурационного файла IrbisRecordsProcessing.dll.config:

<appSettings>
    <add key="connection-string" value="host=127.0.0.1;port=6666;user=1;password=1;db=IBIS;" />
    …
</appSettings>

Как нетрудно заметить, здесь содержится строка настройки параметров подключения к серверу ИРБИС64.
После выполнения утилиты мы увидим окно с тремя текстовыми полями для задания условий отбора записей, полей и подполей соответственно, а ниже – 4 вкладки, из которых по умолчанию выбрана «Замена». Данный режим работы позволяет нам задавать текстовое выражение для поиска и соответствующей замены, производимых над текстовым содержимым всех (или отобранных по нужному условию) полей всех предварительно отобранных записей (как изначально – из нашего списка MFN, так и далее – с возможностью уточнения путём использования подходящего условия).

http://i.imgur.com/lKFnr4j.png

В качестве языка сценариев используется JavaScript в связке с библиотекой ManagedClient.dll для взаимодействия с сервером ИРБИС64, а в текстовых выражениях для поиска и замены можно применять регулярные выражения.
Рассмотрим простейший пример использования данного режима. Допустим, мы хотим произвести замену по всем полям дефиса, по краям которого расположены пробелы, на тире. Зададим в качестве маски для поиска « - », а для замены: « – ». Запустим программу на обработку. В ходе её выполнения на экран будет выводиться таблица со всеми обнаруженными вхождениями таких подстрок, а по окончании обработки пользователю будет дана возможность подтвердить или отменить каждый из случаев замены. Отметим, что стандартное приложение для глобальной корректировки таких возможностей не предоставляет.
Приведём более интересный случай. Например, в нашей консерваторской базе данных есть журнал «Музыкальная академия», который до 1992 г. включительно выходил под названием «Советская музыка». Внося в базу старые выпуски журнала, в какой-то момент возникла необходимость во избежание путаницы разделить «Музыкальную академию» и «Советскую музыку». «Музыкальная академия» была ранее зарегистрирована с шифром ‘М274725’, а вновь зарегистрированное издание «Советская музыка» получило шифр ‘С261109475’. Встала задача для всех номеров журнала до 1992 г. в соответствующих полях исправить ‘М274725’ на ‘С261109475’.
Итак, вводим в качестве условия для записей:
Record.FM('933') == "М274725" && parseInt(Record.FM('934')) <= 1992

(если в поле 933 содержится значение "М274725", а числовое значение поля 934 не превышает 1992)
а для полей:

Field.Tag == '933' || Field.Tag == '903'

(обрабатываем только поля с тегами 933 и '903)
Маска для поиска будет ‘М274725’, для замены – ‘С261109475’.
Таким образом, некоторый необходимый минимум знаний по работе с JavaScript и использованию ManagedClient позволяет достаточно просто решать разнообразные более или менее простые задачи по корректировке базы данных.
Вкладка «Поиск» активирует похожий режим, в котором осуществляется лишь поиск (без замены). Результатом работы данного режима будет сохранение файла, содержащего список MFN всех отобранных записей, который точно также можно будет открыть при сопоставлении его с нужным приложением. К сожалению, мы не можем заставить АРМ «Каталогизатор» вывести нам список отобранных записей, т.е. произвести действие, обратное отметке записей в Каталогизаторе для последующей их передачи нашему расширению.
Более сложные варианты обработки записей реализованы во вкладке «Сценарий». Здесь мы можем задавать конкретные пользовательские сценарии на языке JavaScript для обработки записей в целом, а также их полей и подполей соответственно, также предусмотрены сценарии инициализации и завершения всей пользовательской обработки или отдельных записей. В инициализирующей части мы можем, например, объявлять переменные, а в завершающей части сценария для отдельных записей приводить код для сохранения данной записи в БД.
Остановимся подробнее на последней вкладке и соответствующем режиме работы – «Генераторе шаблонов». Следует сказать, что в настоящее время генерация текстовых шаблонов, в том числе отчётов, на основе отобранных записей производится в системе ИРБИС64 посредством традиционного языка форматирования. Этот язык, так же, как и язык пакетной корректировки, несёт в себе тяжёлое наследие времён ISIS. Если синтаксис первого отягчён сокращёнными мнемоническими названиями команд, выбранными когда-то вследствие необходимости экономии каждого байта свободной памяти (и сохранившимися в прежнем виде и сейчас, когда эти ограничения давно уже не актуальны), то синтаксис языка форматирования обременён тяжеловесными, лишёнными наглядности и удобства чтения конструкциями, которые для соответствия современным задачам по автоматизации вдобавок были к тому же ещё разбавлены столь же трудно запоминаемыми и усваиваемыми расширениями UNIFOR.
Вместе с тем современный уровень развития паттернов дизайна и программирования предоставляет хороший выбор удобных технологий генерации текстовых шаблонов, реализованных, в частности, в средствах для создания динамических Web-страниц, используемых в таких фреймворках, как ASP.NET. Это в первую очередь такие средства генерации кода, как T4 (Text Template Transformation Toolkit) и Razor. Их синтаксис сочетает в себе представление разметки страниц в «чистом виде» (WYSIWYG) с удобными приёмами инъекций (т.е. включения) в нужных местах требуемого программного кода. Краткое сравнительное описание синтаксиса T4 и Razor можно получить, например, здесь: https://zyqandrey.wordpress.com/2011/04/27/%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9-%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA-%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-asp-net-razor/
Однако не всем известно, что T4 и Razor можно использовать не только на этапе построения приложений, но и в ходе их выполнения, да и в целом область их применения не ограничивается исключительно ASP.NET и вообще Web-страницами. Никто не мешает нам, к примеру, задавать с помощью данного синтаксиса отчёты в формате RTF.
Рассмотрим технологию создания шаблонов с использованием Razor на примере задачи построения текстового файла со списком изданий, содержащим их шифр, краткое библиографическое описание и перечисление инвентарных номеров. Для этого перейдём на вкладку «Генератор шаблонов» нашего приложения и введём в среднее поле для шаблонов следующий текст:

@{  string code;
	if (!String.IsNullOrEmpty(Model.record.FM("906"))) {
		code = Model.record.FM("906");
	}
	else if (!String.IsNullOrEmpty(Model.record.FM("675"))) {
		code = Model.record.FM("675");
	}
	else
	{
		code = Model.record.FM("903");
	}
@code
@EoL
}
@Model.client.FormatRecord("@BRIEF", Model.record)
@EoL
Инвентарные номера:
@EoL
@foreach (var field in RemObjectUtils.GetField(Model.record, "910")) { 
	@field.GetFirstSubFieldText('B')
	@EoL
}
@EoL
@EoL
--------------------
@EoL
@EoL

Запускаем программу на обработку и получаем диалоговое окно с предложением сохранить файл.
Отметим, что поскольку синтаксис Razor ориентирован главным образом на генерацию HTML-разметки, нам пришлось произвести некоторые ухищрения для того, чтобы иметь возможность выводить в нужном месте символ перевода строки. В данном случае в исходном тексте приложения IrbisRecordsProcessing мы добавили в начало вывода текстовой строки для шаблона Razor такую строчку с объявлением переменной, содержащей символ перевода строки:

@{ String EoL = Environment.NewLine; }

Первое и третье текстовые поля вкладки «Генератор шаблонов» позволяют нам задавать начальные и конечные обрамления для генерируемых шаблонов, таким образом мы можем задавать сигнатуру требуемых форматов файлов, таких как HTML и RTF.
Предвидя возможные возражения, в частности, о том, что данную технологию, как и используемую в ней программную библиотеку ManagedClient.dll, можно применять только в связке с .NET Framework, что само по себе требует некоторых знаний языка C# или аналогичного ему, отмечу, что существуют действующие проекты по переносу Razor на TypeScript и JavaScript, т.е. в мир уже чисто веб-разработки, такие как http://www.inversionofcontrol.co.uk/porting-razor-to-typescript-part-0-introduction/ и https://github.com/dmeijboom/razor-view-engine. Остаётся надеяться, что разработка средств взаимодействия браузерного кода JavaScript с TCP/IP сервером ИРБИС64 – тоже лишь вопрос времени. Это помогло бы, в частности, не только предложить достойную альтернативу нынешнему языку форматирования, но и позволит разрабатывать удобные пользовательские сценарии для автоматизации, которые можно будет отлаживать непосредственно в браузере. Место с трудом читаемых конструкций UNIFOR займут функции JavaScript для всех необходимых действий, а неочевидные средства генерации текста, используемые в файлах с расширением .PFT, будут легко заменяться на привычный для современной технологии разработки программного обеспечения синтаксис. При этом, конечно, все уже созданные форматы по-прежнему можно будет использовать. Таким образом, приобретаемые новые навыки по автоматизации библиотек не пропадут даром, а смогут с лёгкостью применяться и в других сферах администрирования и разработки ПО. Однако всё это уже тема для отдельной серии публикаций.



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.