К основному контенту

Сообщения

Модульное тестирование для LotusScript, статья на Хабре и прочее

Ох, давно не брал я в руки шашку! По крайней мере в блоге. Пора немного наверстать упущенное. Модульное тестирование, DUnit Несколько раз мне приходила в голову мысль, что было бы не плохо иметь покрытие модульными (unit) тестами систем под IBM Notes/Domino, написанных на LotusScript. Код некоторых становится достаточно сложным, а количество вариантов прохождения неподъемным для прогона после каждого изменения. Т.к. готового инструмента вообще говоря нет, пришлось его создать самому. Так появился DUnit . Это фреймворк для написания и выполнения unit тестов для кода на языке LotusScript. Сам он тоже написан на нем же. Фреймворк свободный, с открытым кодом. Доступен на GitHub . Там же подробная документация о том, как писать и запускать тесты. Проект был так же размещен на OpenNTF.org Статья на Хабре Написание DUnit стало для меня некоторым вызовом. Нет, не в плане кода, а в плане подхода к реализации. Я изначально планировал реализовать как отдельный самостоятельный продук...

XPages. Как сделать тур (Feature Tour) по приложению

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

OpenNTF Domino API (ODA). Тест производительности

Сто лет назад анонсированный тест производительности ODA. Обзорно что такое ODA, как ее использовать, какие возможности и преимущества можно почерпнуть из презентации . Основное. на чем я бы хотел остановиться, это обращение с View (слайды 25, 26), а именно - не только удобства написания кода, но сравнение производительности разных подходов к обходу view.

Итоги второго лучного сезона

Лук Стреляя из Samik Polaris думал о том, куда же двигаться дальше в плане снаряжения. Есть проблема еще в том, что я левша и попробовать какой-то лук у другого стрелка является несколько проблематичным. В магизине потягал те же Hoyt - не понравилось. На одном из летних 3D турниров увидел лук компании Border - Black Douglas. Попробовав, понял что хочу! Но...вот незадача - никто не возит, да и цена кусается. Прокручивая как-то форум, хорошо известный лучникам - Лукомания , заглянул в раздел Витрина мастров, а именно к Евгению Ревину (на форуме Ksavr). Моим первым удивлением было - не сколько одна из его моделей похожа на тот самый Border. Списались, сказал, что и правда похож, подсказал, где можно посмотреть его лук, оказалось у знакомых - в " 10 ярдах ". Лук понравился, заказал. Очередь не маленькая - 3 месяца. Получил лук в декабре. Что сказать - лук сразу притягивает взгляд своим внешним видом: красивое исполнение, большая рекурсия. Лук скоростной - гораздо быстр...

FAQ. Domino Designer. Поиск строки с ошибкой

Думаю, все, кто работает с Eclipse-версией редактора LotusScript, который появился с 8-ой версии сталкивался с проблемой, что номер строки в сообщении об ошибке ну никак не совпадает с тем, что есть на самом деле. Речь идет о коде, который написан в разделе Declarations таких элементов, как скриптовые библиотеки, агенты, Database Script. Т.е. по сути - о классах. В версиях 7 и ниже была проблема найти метод или класс, а теперь (когда дизайнер научился отображать классы и методы в дереве элементов) проблема найти строку с ошибкой :) Полагаю, так же не секрет формула вывода нужной строки: берем количество строк в Options, складываем с тем, что выдала ошибка и получаем строку, которую нужно искать перейдя в просмотр кода всей библиотеке. Та-да-м! Недавно, зачем-то рылся в пунктах меню и наткнулся на...кнопку спасения! - Go to Erl Line.... До чего же было мое удивление. Давно ее добавили, я много проспал? :) В общем, чтобы ей воспользоваться, нужно перейти в Declarations (просто ...

Oracle Lib - библиотека для работы с Oracle для LotusScript

LS_Oracle_Lib - свободно распространяемая библиотека на языке LotusScript с открытым исходным кодом для работы с базами данных Oracle. Библиотека поставляется "как есть". Вы можете использовать ее на свой страх и риск. Автор не несет ответственности за последствия использования библиотеки. При использовании библиотеки автор не ограничивает изменение кода библиотеки под свои нужды. Тем не менее, рекомендуется переопределение классов и методов в соответствии с принципами ООП. Библиотека использует OLE-объект OracleInProcServer.XOraSession для работы с Oracle. Это объект из OLE Objects For Oracle (OO4O). Используется родные Oracle OLE-объекты, поскольку дают больше возможностей, чем стандартные LC классы LotusScript. Например, стандартные классы не дают возможности вернуть результат выполнения хранимой процедуры. Механизм несколько устаревший, поскольку на серверах х64 dll регистрируется не корректно и объект OracleInProcServer.XOraSession не удается создать. В дальнейшем пл...

LS_ActiveDirectory_Lib. Документация и примеры использования. Часть 2. ADObject

Продолжении документации по открытой библиотеке LS_ActiveDirectory_Lib . Первая часть доступна здесь . Часть 3

LS_ActiveDirectory_Lib. Документация и примеры использования. Часть 1. ADConnector

LS_ActiveDirectory_Lib - свободно распространяемая библиотека на языке LotusScript с открытым исходным кодом. Библиотека поставляется "как есть". Вы можете использовать ее на свой страх и риск. Автор не несет ответственности за последствия использования библиотеки. При использовании библиотеки автор не ограничивает изменение кода библиотеки под свои нужды. Тем не менее, рекомендуется переопределение классов и методов в соответствии с принципами ООП. Библиотека  LS_ActiveDirectory_Lib предоставляет интерфейс взаимодействия с Microsoft Active Directory (MS AD) для IBM Notes/Domino. Взаимодействия происходит по протоколу LDAP. Для подключения используется OLE-объект ADODB.Connection. Часть 2 и Часть 3 документации.

Перезапуск Active Directory Lib

Выпустил новую версию Active Directory Lib - библиотеку для Notes/Domino на LotusScript для работы с Active Directory. Кардинально отличается от предыдущего публичного варианта. Можно сказать это полный перезапуск библиотеки. Распространять будут через BitBucket. Ссылка:  https://bitbucket.org/livescripts/active-directory/overview В репозитории будет лежать DXL, который можно импортировать, и просто текстовое представление в формате *.lss Оставляйте свои комментарии, bug-репорты, пожелания здесь или на BitBucket. Можете так же присоединиться к разработке.

Опыт общения с АСВ

Таки пришлось воспользоваться услугами АСВ в связи с закрытием одного банка. Сумма была не под потолок, потому решил забрать наликом. На все ушло минут 15 с момента входа в отделение и выхода из кассы с нужной суммой. И это при том, что выплаты производил Сбербанк. Справедливости ради, надо сказать, что очереди не было. При этом мне предложили открыть вклад и получив ответ "Не хочу открывать просто потому что не хочу", кажется, обиделись :) Выплаты были полностью, с учетом набежавших процентов по вкладу вплоть до отзыва у банка лицензии.

Детская математика. Задачке все возрасты покорны

Задачек подобной этой - множество, так случилось, что мне прислали именно эту. Взята из учебника для 6-го класса: Мне теперь вдвое больше лет, чем было тогда, когда мой брат был в моем возрасте. Когда мне будет столько лет, сколь теперь брату, то нам вместе будет 98 лет. Сколько лет каждому? Задачка трудна только тем, что несколько путает наличие сложных взаимосвязей в условии. Но это не беда. Начнем аккуратно анализировать условия. Итак, мы понимаем, что речь идет о том, что было раньше (момент времени "Тогда"), о том, что есть сейчас и о том, что будет. Запишем возраста в каждый временной промежуток и свяжем их между собой на основании условий. 1. Тогда (в прошлом) Пусть мне было: m лет, брату было n лет. 2. Теперь (в настоящем) Мне в 2 раза больше лет, чем в момент времени "тогда". Это мы берем из условия "Мне теперь вдвое больше лет, чем было тогда", а значит мне 2*m лет. Сколько брату? Очевидно, что прошло с момента времени ...

Детская математика. Волшебные преобразования

Недавно на просторах соц. сетей увидел вот такую забавную картинку: Понятно, что никакой магии тут нет, поэтому давайте разберемся. Возраст не имеет значения Ну действительно, можем взять любой возраст (любое двузначное число) и получим после указанных преобразований предполагаемый результат. Это значит, что нужно обратить внимание на сами манипуляции. Они простые - умножить исходной число сначала на одно, затем на другое. Как известно, a * b * c = a * (b * c), вычислим b * c и посмотрим на него: 7 * 1443 = 10101. Тут можно было бы и закончить, но доведем до конца, чтобы стало совсем очевидно. Столбики Умножим, скажем 39 на 10101, но не при помощи калькулятора, а столбиком, который даст на визуальное понимание происходящего:    10101 х     39 --------    90909 + 303030 --------   393939 При умножении первой цифры (9) на 1 - получаем себя же, а при умножении на 0 - 0. Умножая 2ую цифру получаем аналогичный резул...

XPages. Диалог с пользователем. dGrowl уведомления. Часть 2

В первой части , посвященной dGrowl сообщениям, рассмотрели как подключать и вызвать dGrowl-уведомления из клиентского скрипта. Сегодня рассмотрим, как это сделать со стороны сервера, например из Java-кода.

XPages. Диалог с пользователем. dGrowl уведомления. Часть 1

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

Замена текста в NotesRichTextItem и сохранение стиля

Задача: заменить текст в RichTextItem. Например, есть какой-то шаблон с тегами, в котором динамически происходит подстановка значений. Поиск и замену всех тегов указанного значения можно выполнить вот в таком цикле: Dim rtRange As NotesRichTextRange Dim rtNav As NotesRichTextNavigator Set rtRange = rtItem.Createrange() Set rtNav = rtItem.Createnavigator() While rtNav.Findfirststring(TAGKEY) //Замена значения Set rtRange = rtItem.Createrange() Set rtNav = rtItem.Createnavigator() Wend , где rtItem - переданный NotesRichTextItem. Саму замену можно произвести вот так: Call rtRange.Setbegin(rtNav) Call rtRange.Setend(rtNav) Call rtRange.Remove() Call rtItem.Begininsert(rtNav) Call rtItem.Appendtext(VALUE) //Добавляем текстовое значение. Call rtItem.Endinsert() НО . В таком случае при выполнении rtRange.Remove() мы теряем стилевую информацию и вставка происходит со значениями по-умолчанию. Перенос rtRange.Remove() не помогает. Нужно вместе с этим сохранить стиль....

Записки начинающего лучника. Краткие итоги первого сезона

1. Лук и стрелы Пока что пользуюсь луком (рукоять), который купил еще в самом начале - SF Optimo+ . Сменил на ней 2 пары плечей, сейчас на постоянной основе использую 3и. 1 и 2 пары были родные от SF на 26# и 34#. Нынешние плечи на 40# от лука-близнеца -  Samik Polaris . Что могу сказать? - по мне  так отличный лук для начала. Неприхотлив, прост, достаточно качественен. Тем более я стреляю интуитивно и обвеса на нем нет. Сейчас уже хочется чего-то по-интереснее, поэтому нахожусь в поиске. Начинал стрелять самыми дешевым дубовым карбоном. На 26# хватало. Как перешел на более сильные плечи, сменил стрелы на алюминий: Easton Jazz 1916 . Стрелы я немного апгрейдил под свой стиль стрельбы. Немного писал об этом тут . На самом деле через некоторое время я пошел еще дальше в этом плане и сменил 3 пера на 4, взяв перья несколько по-меньше. Все хотел, но как-то не собрался описать свой опыт. Может чуть позже. При смене плечей на 40# подошли эти же стрелы. так что использ...

XPages. Диалог с пользователем. Собственные уведомления

Итогом полученных ограничений, которые получились в итоге  стало появление "собственной" системы сообщений. Итак, по-порядку: 1. FlashScope Сегодняшняя работа будет очень тесна связана в возможностью показать сообщение после редиректа страницы. Поэтому с механизма, который позволит это сделать и начнем. Метод, позволяющий отображать сообщения (речь идет о FacesMessage) после смены страницы описан тут . Но будем использовать, в некотором смысле, более универсальный механизм, который позволит передавать параметры между запросами и не занимать sessionScope или applicationScope - это  FlashScope . Я использую немного не эту реализацию, а реализацию от  Jesse Gallagher . Еще нужно в faces-config.xml прописать: <managed-bean>   <managed-bean-name>flashScope</managed-bean-name>   <managed-bean-class>java.util.HashMap</managed-bean-class>   <managed-bean-scope>session</managed-bean-scope> </mana...

XPages. Диалог с пользователем. Уведомления с помощью FacesMassage. Часть 2

В прошлой части я дал некоторую теоретическую подоснову о том, что такое FacesMessage в JSF и показал, как можно добавить и отобразить сообщение для пользователя, используя FacesContext.addMessage и компонент xp:messages. Сегодня продолжим: поработаем над отображением сообщений.

XPages. Применяем Bootstrap

Ранее я уже описывал некоторые аспекты, касательно добавления и применения Bootstrap в отношении xPages. Речь идет о Extension Library и Bootstrap  и Bootstrap для XPages в действии . Хотел бы еще раз вернутся к теме применения Bootstrap в проектах и уточнить кое-какие моменты. Как я писал, начиная с ExtLib 9.0.1 (build v00_10.20141105-0922) , уже непосредственно в состав ExtLib включена поддержка Bootstrap для xPages. Это значит, что никаких дополнительных плагинов (как я ошибочно указал тут , в настройках) ставить не нужно. Достаточно несколько простых шагов, чтобы сменить тему: 1. В настройках Xsp Properties , на вкладке General , Application Theme выбрать из доступных Bootstrap3.2.0 или Bootstrap3.2.0_flat . 2. Там же на закладке Page Generation выставить HTML doctype: HTML5 и галку Force content type to application/xhtml+xml 3. Единственная библиотека, которая должна (достаточно для работы bootstrap) быть подключена - com.ibm.xsp.extlib.library . Я проде...