Monday, July 14, 2008

Управление зависимостями при разработке UNO-компонентов для OpenOffice.org на Java

Дополнение к предыдущей статье "Создание Java-расширений для OpenOffice.org".

В прошлой статье я показал как создать простое расширение для OpenOffice.org на Java. Простое - потому что оно ничего не делало с интерфейсом пользователя и при его разработке не использовались функции и классы, реализованные в сторонних библиотеках (JAR'ах).

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

Следовательно, если вы используете сторонние библиотеки, вам нужно включить их в CLASSPATH для вашего расширения. Если этого не сделать, то при установке расширения возникнет стандартное java.lang.NoClassDefFoundError.

Есть несколько способов указать CLASSPATH для Java-приложений, но для OOo подходит только один - указать зависимости в манифесте JAR'а компонента. По крайней мере, по другому у меня не получилось.

Чтобы построить CLASSPATH, нужно прописать ссылки на все используемые JAR'ы в файле-манифесте. Но используя Maven2 вы можете облегчить себе эту работу, воспользовавшись plugin'ом Maven2 Assembly Plugin.

Этот plugin позволяет "готовить" различные сборки проекта по описанному файлу сборки. Среди преднастроенных дескрипторов сборки есть jar-with-dependencies. Этот дескриптор позволяет для проектов-библиотек (проекты со свойством packaging установленным в jar) сформировать на выходе один JAR, в котором будут упакованы все зависимые JAR'ы, включая классы и другие артефакты текущего проекта. Все помнят, что JAR - это обычный zip-архив? Так вот, сборка jar-with-dependencies распаковывает все зависимости и скомпилированные артефакты проекта во временную папку, а затем эту папку снова упаковывает в один JAR. А это как раз то, что нам нужно.

Чтобы подключить этот plugin в pom.xml в ветку project/build/plugins нужно прописать:

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>


Когда я собрал такой JAR и положил его в корень oxt-архива, мое расширение перестало устанавливаться. Процесс установки прерывался сообщением об ошибке: "Cannot determine registration class!".

Я так и не смог толком понять, почему в этом "большом" JAR'е OOo не мог найти мой регистрационный класс. Проблему удалось решить путем разделения "большого" JAR'а на два - в одном был код моего проекта, в другом - код зависимых JAR'ов. Для этого в процесс сборки проекта пришлось вставить ant:

<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>verify</phase>
<configuration>
<tasks>
<mkdir dir="target/oxt/skip_registration" />
<zip
destfile="target/oxt/skip_registration/${artifactId}-${version}-dependencies.jar">
<zipFileSet
src="target/${artifactId}-${version}-jar-with-dependencies.jar"
excludes="org/keyintegrity/ooo/**" />
</zip>
<zip destfile="target/${artifactId}-${version}.oxt">
<fileSet dir="." includes="README*, LICENSE*, NOTICE*" />
<fileSet dir="target" includes="${artifactId}-${version}.jar" />
<fileSet dir="target/oxt" includes="**/*" />
</zip>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>


Можно заметить, что в oxt-архиве JAR с зависимостями находится в папке skip_registration. OOo знает про эту папку и он не пытается зарегистрировать ее содержимое как компонент OOo.

Осталось добавить ссылку на этот JAR в CLASSPATH моего компонента и все снова заработало:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifestEntries>
<RegistrationClassName> org.keyintegrity.ooo.ActivityMonitor
</RegistrationClassName>
<Class-Path>
skip_registration/${artifactId}-${version}-dependencies.jar
</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>

Thursday, July 10, 2008

Учет затрат при помощи мобильного телефона


С прошлого месяца, когда был запущен online-сервис 4 конверта, мы с Настей пользуемся правилом 4 конвертов для планирования и учета ежедневных трат.

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

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

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

Приложение не предъявляет никаких сверх требований к мобильному телефону: главное - это наличие поддержки Java и настроенный интернет (например, GPRS).

Пользователи сервиса могут скачать приложение с сайта проекта (30 Кб).

Сам проект я выложил как Open Source'овый, там же на сайте можно скачать исходники и свободно использовать их для своих нужд.

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

Надеюсь это будет кому-то полезным.

Thursday, June 26, 2008

Firefox 3.0 стал хуже

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

Речь идет об элементах управления и горячих клавишах:

  • Пропала кнопка "Перейти" в адресной строке, которая была справа. Как мне теперь обновить страницу без повторной отправки данных? Заново перевести фокус ввода в адресную строку и нажать "Ввод"?



  • Перестала работать комбинация Shift+Ctrl+T. Как мне теперь открыть случайно закрытую вкладку? Посмотреть Историю?

Все альтернативы требуют большего количества действий, что начинает "подбешивать".

Со временем я уверен еще найдется что-то.

Вопрос к создателям Firefox: Зачем было удалять элементы интерфейса и горячие клавиши, которыми я пользовался и выработал у себя на них привычку?

Вопрос к читателям: Кто-то еще заметил, что ему приходится менять свои привычки в работе с Firefox 3.0?

Tuesday, June 17, 2008

ИТ-Бизнес-Металл 2008

На прошлой неделе (9-11 июня) в Москве прошла юбилейная X международная научно-практическая конференция ИТ-Бизнес-Металл 2008.

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

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

Три лучших доклада


Больше всего мне понравились доклады КАЗЦИНКа о внедрении ERP Oracle JD Edwards и о реализации KPI на одном из своих рудников. Вдвойне приятно было услышать, что ребята - мои земляки, тоже из Усть-Каменогорска :) Кстати говоря, оба этих доклада заняли первое и второе места в рейтинге всех трех дней.

Первый доклад о внедрении JD Edwards, мне кажется, запомнился всем и был принят бурными овациями. Особенно после того, как на вопрос просчитывалась ли эффективность внедрения и было ли это экономически выгодным последовал ответ: "Конечно нет. Не эффективно" :) Но зато предприятие решило вопросы с отчетностью и это внедрение позволило им выйти на лондонскую биржу.

Также вызвал большой интерес второй доклад - о внедрении ключевых показателей эффективности (KPI). На базе инструмента QRP сделали мониторинг ключевых показателей. Следует отметить, что у них получилось не стратегическое планирование, для которого изначально позиционируется QPR, а оперативный (на уровне смены) мониторинг показателей. Внедрение заняло 6 месяцев, при этом работал один программист (MSVS 2005) и около 10 человек, включая менеджера проекта.

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

Третье место занял Чепецкий механический завод, которые с 99-го года внедряют SAP (сейчас у них уже внедрено и работает порядка 10 модулей). Доклад был про систему сбалансированных показателей. Тема мне очень близкая и знакомая. Правда из доклада я не совсем понял, как из транзакционной системы данные попадают в хранилище (SAP BW), на основе которого строится ССП. Может быть докладчик был не в курсе, либо я чего-то не так понял - но ответ, что данные транзакционной системы хранятся в непосредственно в инфокубах хранилища не ложится в мое понимание хранилищ данных. Тем не менее доклад был очень интересным и это первое предприятие, о котором я слышал и которое целиком и полностью работает на SAP и всем довольно (в плане ИТ).

Другие интересные доклады


Кроме этого было еще несколько интересных на мой взгляд докладов.


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

Начальник отдела ИТ компании Полюс Золото, рассказал про свою компанию, которая занимается добычей золота (не каждый день такое слышишь :) и про несколько реализованных ИТ-проектов, среди которых он выделил "золотую жилу" - систему видео-конференц связи, которая очень привлекла руководство и окупилась в первые три месяца, благодаря снижению расходов на командировки руководства в Сибирь на рудники. В этом же докладе было чуть-чуть научного, что хоть как то оправдало статус конференции. Василий Сергеевич представил свою упрощенную математическую модель, которая послужила поддержкой в принятии решений по вопросу сопоставления реальной стоимости аутсорсинговых услуг и работы собственного ИТ-отдела.
Одним из реализованных проектов был проект по переходу с системы Oracle HR на 1С:Управление кадрами. По их расчетам лицензионные отчисления в Oracle и сама политика лицензирования (каждый год 20% стоимости) оказались неприемлемо велики.

Очень понравился доклад компании "ТендерПро" про то, как они организовали Web 2.0 проект поддержки электронных закупок для межкорпоративных систем (поддержка проведения тендеров). Ничего плохого не скажешь - отличная бизнес-модель и реализация. Масса преимуществ как для поставщиков, так и для покупателей. Остается только преклониться и снять перед ними шляпу. Молодцы ребята!

На конференции присутствовал президент "Ассоциации ИТ ГМК Украины", который призывал на базе Tender.Pro реализовать для металлургии стандарт, наподобие EDIFACT. Рано или поздно это будет реализовано, и не только в металлургии.

Нельзя не отметить доклад Avaya. Несмотря на то, что доклад читал не тот человек, который должен был (презентация и тезисы были написаны явно не под него), их взгляд на SOA мне показался очень интересным. Сейчас о SOA говорят все больше и каждый начинает применять сервисный подход для своей деятельности и Avaya не исключение. Под сервис-ориентированной архитектурой они подразумевают голосовые сервисы с распознаванием речи и интерактивным поведением бизнес-процессов, управляемых пользователем через трубку мобильного телефона.
Чтобы получить подробную информацию по данной теме нажмите "1", чтобы дождаться ответа оператора нажмите "0" :)
Сервисы по распознаванию речи в совокупности с коммуникационными технологиями уже сегодня позволяют организовывать двусторонний вербальный диалог пользователя с системой в нужное время в нужном месте, что будет дальше - время покажет, но я думаю будет интересно.

InterSystems



Я выделил InterSystems в отдельный раздел, потому что с ними у нас был более плотный диалог на протяжении всех трех дней конференции. Помимо приложений для медицинской сферы, эта компания предоставляет инструменты для разработчиков: производительную объектную базу данных Caché (читается "Кашэ" с ударением на последний слог) и интеграционную платформу Ensemble (читается Ансамбль) - аналог интеграционной шины (ESB, MS BizTalk, и т.д.).

Компания располагается в штатах и действует с 78-го года. За это время они смогли реализовать полностью, ни на кого не похожие, заведомо интегрированные между собой инструменты для построения информационных систем. У них есть все - начиная от собственного языка программирования, который одновременно является DDL для баз данных и применяется для описания сообщений в интеграционной шине и интегрирован в собственный язык web-программирования CSP, заканчивая самой шиной и XML-подобным языком описания бизнес процессов BPL (три буквы) со своей нотацией.

То есть получается такая монолитная система в которой реализованы все базовые технологии. Кроме того они предлагают собственную студию (IDE) со множеством мастеров, облегчающих проектирование и разработку.

В решениях InterSystems я не увидел ничего нового: на каждую технологию, реализованную в продуктах InterSystems, есть открытая спецификация, например, JSR или стандарт OASIS.

Меня здесь смущает три обстоятельства. Во-первых, эта система абсолютно закрытая. То есть, в случае чего прийдется обязательно обращаться в поддержку. Хотя, как заявили представители InterSystems, поддержка у них отменная и обучение группы специалистов занимает всего две недели, после чего они могут пользоваться платформой.

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

И, наконец, как эта монолитная система будет интегрирована в существующую ИС и участвовать в ее развитии? Средства интеграции с другими системами у Ensemble - довольно богатые и можно, например, опубликовать "хранимую процедуру" как веб-сервис, либо сделать web-сервисом точку входа в Workflow.

Здесь я вижу два выхода - либо целиком и полностью реализовывать всю ИС на базе решений InterSystems (вряд ли такое где-то когда-то будет), либо использовать ее как интеграционный инструмент для некоторых задач, и получить дублирование функциональных возможностей в своей системе. В этом случае нужно будет серьезно думать, когда решать интеграционную задачу стандартными средствами, которые уже могут быть в корпоративной ИС, а когда средствами Ensemble. Кроме того, за лишний функционал нужно платить и его нужно администрировать.

Организация мероприятия


Что касается организации, то я бы оценил ее на троечку по пятибальной шкале. Может быть это специфика данной конференции, но я нигде не видел, чтобы ведущий перебивал докладчика по середине выступления и начинал рассуждать недослушав, высказывая свое видение данного вопроса... Кроме того постоянно нарушался заявленный регламент, видимо потому что народу приехало гораздо меньше чем было заявлено (50-60 человек в первый день, вместо 190 как ожидалось; в последующие еще меньше). Возможно это было вызвано сменой руководителя конференции незадолго до начала. Хотя, судя по разговорам с теми, кто приезжает на конференцию не первый год - им организация понравилась больше, чем в предыдущие годы.

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

Ну и пару слов о месте проведения - это Торгово-Промышленная Палата РФ. Первый раз я делал доклад так близко к Красной площади да еще и за кафедрой, где выступают члены нашего правительства :)

После второго дня всех желающих по Москва-реке катал речной трамвайчик с бесплатным пивом и орешками :)) по маршруту от Красной площади мимо воробьевых гор и нового московского офиса Oracle :)

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

Только после выступления ко мне подошел украинский коллега и спросил нет ли у меня такой же презентации только с рисунками :)) Есть, вот они:

Friday, May 16, 2008

Я не я? :)



Я даже сам засомневался ))

Wednesday, April 23, 2008

Статистика в блогах. Feedburner и Google Reader


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

После бесплатной регистрации вы можете "зажечь" (зарегистрировать) свои feed'ы используя сервисы feedburner'а. Что это значит? Для каждого вашего feed'а feedburner сделает свой feed с аналогичным содержимым, но другим адресом. Именно под этим адресом вы должны публиковать свой feed, чтобы получить всю мощь статистики feedburner'а. У google есть список инструкций, составленный для многих популярных систем публикации, в которых содержится пошаговое описание того, что нужно сделать, чтобы быстро заменить старый адрес feed'а на новый (например, на blogger.com достаточно поменять всего одну настройку).

Что это дает? Возможность узнать:

  • Сколько у вас подписчиков
  • Какими RSS-читалками они пользуются
  • Количество просмотров для подкастеров
Но это далеко не все. Среди сервисов feedburner'а есть такой, который следит за web-посетителями вашего блога и считает:
  • Сколько их было
  • Из какого они города (география)
  • Каким браузером пользуются
  • На каком языке разговаривают (локализация браузера)
  • Какая у них операционная система и расширение экрана
  • Как посетители заходят на ваш блог
    • По прямой ссылке
    • Из поисковика, в этом случае видно строку поиска, по которой он нашел ваш блог
    • Либо с других сайтов с указанием ссылки
  • По каким ссылкам они щелкали на вашем блоге
Чтобы включить эту статистику нужно вставить в шаблон своего блога кусочек JavaScript, который предоставит feedburner.

Feedburner копит статистику в разрезе по дням и для каждого показателя может строить тренды. Таким образом вы можете посмотреть, какие посты были самыми популярными или узнать основные источники посетителей и т.д. Очень удобно для анализа посещаемости блога и открывает просторы для творчества при оптимизации контента.

Самую интересную на мой взгляд статистику я выделил жирным.

Особое внимание я хочу остановить на показателе "Какими RSS-читалками пользуются читатели". Средняя статистика по моему блогу показывает вот такую картину:

Как можно заметить - 71% читателей пользуются Google Reader'ом. Было бы интересно увидеть статистику других блоггеров, но мне кажется, что общая доля Google Reader'а будет >~ 50%.

Почему я заговорил про Google Reader, потому что недавно обнаружил, что Google Reader сам ведет статистику о feed'ах (нужно выбрать feed и нажать Show Details в панельке сверху).

Как видно эта статистика включает:
  • Среднее количество постов в неделю
  • Количество подписчиков
Я не знаю, как Google Reader получает эту статистику - либо анализируя свою базу, которую создают его подписчики, включая feed'ы к себе список (что наиболее вероятно), либо использует сервис feedburner'а (все помнят, что Google купила Feedburner?).

На основании этой информации можно вести рейтинги популярности разных блогов. Вот статистика по некоторым feed'ам, на которые я подписан (статистика от 23.04.2008):


Графа "Подписчики GoogleReader" - это то, что я вытащил из GoogleReader'а. И если учитывать, что эта RSS-читалка наиболее популярная, то на основании её можно сделать вывод об общем рейтинге feed'а, поэтому я не буду приводить общее количество подписчиков; чтобы представить себе это число - нужно умножить статистику GoogleReader'а как минимум на 1.5 (50%).

Следует отметить, что в этой статистике не учитываются web-посетители, а только RSS-подписчики. Полную статистику может дать feedburner. Так, например, официальная статистика Google Official Blog - это 476 тыс. читателей.


Кстати, эта картинка - также предоставляется сервисом feedburner и вы можете поставить себе на сайт такую же.

Надеюсь, что эта информация поможет сделать вам правильные выводы.

И еще очень хочется посмотреть, как будет выглядеть TOP 100 по этой версии. Поэтому если у вас есть feed'ы которые могут попасть в этот TOP (по числу подписчиков), то я был бы очень признателен, если бы вы оставили свои комментарии с информацией о статистике и ссылкой на feed и я обязательно включу их в этот список.

Обновление 25.04.2008

  1. Ни разу раньше не пользовался таблицами в постах. Оказывается blogger вставляет большие пробелы перед таблицами (по одному <br/> на каждый символ \n в формате кода таблицы). Чтобы от этого избавиться нужно таблицу обернуть в код:
    <style type="text/css">.nobrtable br { display: none }</style>
    <div class="nobrtable">

    Таблица здесь

    </div>


  2. Миша подсказал еще один feed, который на данный момент попадает на первое место - techcrunch.com

  3. Я решил добавить в таблицу статистику feedburner'а для тех фидов, где она доступна

Monday, April 21, 2008

Создание Java-расширений для OpenOffice.org

Продолжение здесь.

OpenOffice.org - это не только набор офисных программ, это еще и платформа для разработки приложений и расширений.

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

Хорошей отправной точкой для знакомства с программирование для OOo является книга OpenOffice.org 2.3 Developer's Guide (она же в PDF, 17 МБ), на основе которой я и сделал свою реализацию.

API SDK, которым мы будем пользоваться для создания нашего расширения, позволяет получить полный контроль (в том числе удаленно по сети) над офисными приложениями OOo. Достигается это за счет использования технологии компонентного программирования UNO (Universal Network Objects). На сегодняшний день API SDK доступно практически для всех языков программирования, включая Java, C++, CLI (C#, VB.NET), Python и других, включая встроенный скриптовый язык OOo Basic.

Мы будем пользоваться привязкой UNO к языку Java.

Для создания UNO компонентов разработчики OOo предлагают инструменты для интеграции с разными IDE, в частности, есть плагины для Eclipse и NetBeans. NetBeans я не смотрел, хотя в книге есть ссылки только на NetBeans, а вот для Eclipse плагин я посмотрел. Все, что он делает - это позволяет создавать простые компоненты, задействуя утилиты OOo для компиляции собственных IDL интерфейсов в java-классы.

В нашем случае эта возможность не потребуется - мы не будем создавать своих интерфейсов, вместо этого мы будем пользоваться готовыми интерфейсами SDK OOo, в частности com.sun.star.task.XAsyncJob, который позволит интегрировать в окружение OOo наш сервис, который подключится к шине обработчиков событий документов OOo.

Наше расширение мы будем создавать при помощи Maven2. Следует отметить, что у разработчиков OOo есть плагин для интеграции с Maven2 (maven-ooo-plugin), но:

  1. его нет в публичных репозиториях, а можно только скачать исходники из репозитория OOo и собрать плагин самому;
  2. он, также как и плагины для IDE, поддерживает только интеграцию с утилитами OOo, например, для компиляции IDL интерфейсов в java-классы;
  3. он все еще находится на стадии разработки и не поддерживает необходимые функции, например, сборку артефактов в готовый компонент *.oxt.
Вот, что у меня получилось в итоге (см. рисунок)

После запуска mvn clean verify на выходе мы получим готовую сборку расширения activity-monitor-service-1.0.oxt.

Файл oxt (OOo eXTension) представляет собой zip-архив со следующим содержимым:

activity-monitor-service-1.0.oxt \
META-INF \
manifest.xml
activity-monitor-service-1.0.jar \
META-INF \
MANIFEST.MF
org \ ...
description.xml
jobs.xcu

manifest.xml


Файл манифеста, который описывает содержимое этого oxt-архива. Здесь перечислены *.xcu и *.jar файлы.
<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest>
<manifest:file-entry
manifest:full-path="${artifactId}-${version}.jar"
manifest:media-type="application/vnd.sun.star.uno-component;type=Java" />
<manifest:file-entry manifest:full-path="jobs.xcu"
manifest:media-type="application/vnd.sun.star.configuration-data" />
</manifest:manifest>

activity-monitor-service-1.0.jar


В этом jar'е находятся классы реализации нашего расширения.

У нас, класс, который реализует интерфейс com.sun.star.task.XAsyncJob (org.keyintegrity.ooo.ActivityMonitor), также является регистрационным классом, то есть в нем реализованы два статических метода - фабрика сервиса и регистратор сервиса. Для их реализации в SDK входит два класса-помощника (первый, второй). Так как это статические методы, то они не могут быть навязаны каким-то интерфейсом, про них нужно просто помнить. Интерфейс com.sun.star.lang.XServiceInfo предоставляет OOo информацию о сервисах, которые предоставляет данный компонент.

MANIFEST.MF


Стандартный манифест jar-файла, в котором содержится указание на регистрационный класс нашего сервиса.

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: dmitrygusev
Build-Jdk: 1.5.0_06
RegistrationClassName: org.keyintegrity.ooo.ActivityMonitor

description.xml


Файл описания нашего расширения. Такая информация, как версия расширения, версия OOo, для которого оно было разработано и др. хранится здесь.
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://openoffice.org/extensions/description/2006"
xmlns:d="http://openoffice.org/extensions/description/2006"
xmlns:xlink="http://www.w3.org/1999/xlink">
<version value="${version}" />
<dependencies>
<OpenOffice.org-minimal-version value="2.4"
d:name="OpenOffice.org 2.4" />
</dependencies>
</description>

jobs.xcu


Конфигурационный файл, который регистрирует наш сервис, а именно подписывает его на события OnLoad, OnSaveDone, OnSaveAsDone и OnPrint. Сюда также можно включить конфигурационную информацию для сервиса - у нас это имя файла, где ведется журнал.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE oor:component-data SYSTEM "../../../../component-update.dtd">
<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office"
xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<node oor:name="Jobs">
<node oor:name="MonitorJob" oor:op="replace">
<prop oor:name="Service">
<value>org.keyintegrity.ooo.ActivityMonitor</value>
</prop>
<node oor:name="Arguments">
<prop oor:name="fileName" oor:type="xs:string"
oor:op="replace">
<value>c:/Temp/activity-monitor-service.log</value>
</prop>
</node>
</node>
</node>
<node oor:name="Events">
<node oor:name="OnLoad" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
<node oor:name="OnSaveDone" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
<node oor:name="OnSaveAsDone" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
<node oor:name="OnPrint" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
</node>
</oor:component-data>


Естественно, все не так просто, как кажется на первый раз. Если оставить в стороне сложности, связанные с разборками в API OOo (они хотя бы описаны в книге), то на первый фон выходит создание каркаса проекта для расширения OOo и его реализация с Maven2.

Во-первых, как оказалось для версии SDK 2.4.0 в открытых Maven2 репозиториях еще нет артефактов необходимых артефактов. Поэтому пришлось делать их самому. Здесь помог тот самый Eclipse плагин. При создании проектов с его помощью в CLASSPATH проекта вставляются ссылки на необходимые jar'ы. Как оказалось, они идут в поставке самого OOo (даже не SDK):

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="source"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="build"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/juh.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/jurt.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/officebean.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/ridl.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/unoil.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/unoloader.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

Именно из этих jar'ов я сделал артефакты и установил себе в локальный репозиторий.

В конце поста есть архив с готовыми артефактами; все что нужно - скопировать их себе в репозиторий.

Структура Maven2 проекта сделана таким образом, что все содержимое папки src/main/oxt будет скопировано в корень oxt-архива, который получается при сборке проекта. Эта папка является ресурсной папкой проекта и при сборке все содержимое фильтруется, так что в файлах конфигурации можно использовать выражения подстановки (например, ${version} в файле description.xml).

Я постарался сделать эту структуру как можно более универсальной, чтобы на ее основе каждый cмог сделать своё собственное расширение для OOo. Может быть кто-нибудь сделает из нее archetype?

Установка расширения в OOo


Чтобы установить расширение достаточно запустить *.oxt файл на выполнение (щелкнуть по нему два раза :), чтобы запустился Extension Manager OOo. Предварительно нужно закрыть все офисные приложения, иначе может быть поврежден реестр OOo.

Жмем OK и расширение установлено.

Примечание: Если устанавливать расширение повторно, то сначала нужно его удалить; в противном случае появится ошибка "Could not create java implementation loader". Правда, если попробовать еще раз - установка пройдет нормально.

Теперь можно проверить наш сервис в работе. Для этого откройте, сохраните или напечатайте какой-нибудь документ из любого приложения OOo. В файле журнала появятся записи, что-то вроде:

Mon Apr 21 00:19:35 MSD 2008 OnLoad file:///C:/Temp/ActivityMonitor.odt
Mon Apr 21 00:19:38 MSD 2008 OnSaveDone file:///C:/Temp/ActivityMonitor.odt
Mon Apr 21 00:19:45 MSD 2008 OnSaveAsDone file:///C:/Temp/ActivityMonitor-Modified.odt

Отладка расширения


Чему я всегда восхищался в отладчиках, так это возможности подключаться к любому процессу (локальному или удаленному). В Java это делается очень просто, благодаря JPDA.

При запуске OOo регистрирует все обработчики в своей шине событий на основании конфигурационных файлов (*.xcu). Когда очередное событие срабатывает оно идет по цепочке обработчиков и если очередной обработчик написан на Java, то OOo запускает JVM, в которую загружает этот обработчик.

Список виртуальных машин, доступных OOo, можно найти в меню Сервис | Параметры... ветка OpenOffice.org/Java.

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

-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n


Эти ключики можно вписать в окошке Параметры... конкретной JRE.

После этого к нашему сервису можно подключаться, например, из Eclipse. Для этого нужно выбрать Run | Open Debug Dialog... Создать новую конфигурацию в ветке Remote Java Application (дважды на ней щелкнуть). Параметры по умолчанию вновь созданной конфигурации подойдут, если в параметры JVM вы добавили точно такие строчки, как я показал выше.

Если нажать Debug, то Eclipse подключится к работающему экземпляру JVM OOo. Можно поставить точки останова, где нужно и ждать, пока вызов дойдет до нужной точки.

Примечание: Если при нажатии Debug Eclipse скажет "Connection refused" это значит, что OOo еще не загрузил экземпляр JVM, потому что наш обработчик еще не был ни разу вызван.


Примечание: В путях к OOo и SDK не должно быть пробелов. Для этих целей я пользуюсь утилитой junction, чтобы создавать символьные ссылки. Например, для OOo я сделал такую ссылку:

junction.exe c:\dev\bin\ooo-2.4 "c:\Program Files\OpenOffice.org 2.4"

Примечание: Все "раскрашенные" исходники я сделал с помощью Eclipse-плагина java2html и GNU Source-Highlight.

Файлы для загрузки


Файл проекта (исходники + собранный файл *.oxt) (13 КБ)
Maven2 артефакты SDK OOo 2.4 (1.4 МБ)

Примечание: Чтобы установить артефакты себе в локальный Maven2 репозиторий нужно распаковать архив в папку <userdir>/.m2/repository.

Примечание: Чтобы собрать проект и получить oxt файл, нужно выполнить mvn clean verify.

Примечание: Чтобы загрузить исходники в Eclipse, нужно предварительно выполнить mvn eclipse:eclipse. Затем в Eclipse File | Import... | Existing projects into Workspace | Next > выбрать папку с проектом и нажать Finish.

Thursday, April 03, 2008

AnjLab.SyncIT - все задачи в Microsoft Outlook

... в продолжение предыдущего поста.

Ввиду специфики моей деятельности (учеба, преподавание, работа/программирование, open source :) у меня каждый день копится очень много текущих задач, которые я не успеваю сделать за один день, а завтра вообще могу о них забыть и вспомнить в самый неподходящий момент.

Самый лучший способ этого избежать - это записать их себе в Outlook в виде задач.


Помимо прочих, в отдельную группу можно вынести те задачи, которые мне назначаются в процессе работы над проектами. Это могут быть, например, тикеты (bug'и, новые задачи и т.п.) в Trac'е, или задачи в dotProject, на которые я назначен ответственным.

В среднем за день приходит по 2-3 таких задачи. У меня все проекты настроены так, что при добавлении/изменении/удалении задачи мне на почту приходят уведомления и, чтобы планировать их вместе с остальными задачами приходится добавлять их ручками в список текущих задач Outlook.

Здесь есть несколько проблем, которые сводятся к тому, что следить за задачами в разных системах и ручками записывать себе детали каждой задачи - мягко говоря, лень :) Ни для кого не секрет, что программисты ленивые люди и рутина их вводит в уныние.

Чтобы перебороть эту лень :), у нас с Юрой возникла идея сделать приложение, которое бы следило за всеми моими задачами и автоматически синхронизировало их со списком моих текущих задач в Outlook.

На самом деле, поводом для этих двух постов об Outlook как раз и стал выход первого официального публичного релиза AnjLab.SyncIT - Open Source проекта, над которым мы работали последние 2 недели и который позволяет решить описанные проблемы.

Изначально планировалась только поддержка Trac'а, потому что и мы в keyintegrity и Юра в AnjLab используем Trac для ведения своих проектов (отсюда, кстати, и начальное название проекта - outlooktrac).

Так как хостинг outlooktrac располагается на Google Code, то второй системой, которую мы решили поддержать стал Google Code.

Ну и, наконец, поддержку dotProject'а я включил потому, что мы используем ее в keyintegrity для поддержки наших внутренних процессов.

Скачать последнюю версию, включая исходники, можно со страницы проекта.

Так же, если у вас есть системы, для которых вы бы хотели добавить поддержку синхронизации с Outlook - можете оставлять свои запросы здесь.

Мой Outlook

В Outlook'е есть две вещи, которые мне нравятся и которыми я пользуюсь каждый день - это календарь и задачи. Да, я не пользуюсь почтой в Outlook, потому что Gmail пока никто еще не победил :)

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

Кстати, к разговору о Gmail, у Google тоже есть календарь, но каких-то весомых преимуществ перед Outlook'ом я пока в нем не нахожу. Единственная польза, которую я из него извлек - это двухсторонняя синхронизация с Outlook'ом, благодаря которой я могу открыть свой календарь для Насти и подписаться на ее календарь, чтобы вместе планировать наше время.


Обычно, события, встречи и собрания в календаре задаются один раз и на пол года, и в течение этого времени практически не изменяются. Вся "текучка" - в задачах, о которых в следующем посте.

Wednesday, March 12, 2008

Lifetime Management with BPEL (Part III)

В июне 2006-го я начал этот блог чтобы делиться результатами своей деятельности в keyintegrity.

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

Хотелось делиться этой информацией и обсуждать ее, причем делать это с русскими. Чтобы мои сокурсники или хотя бы какие-то студенты из моего университета услышали про такие технологии, как BPEL. Было очень обидно когда никто, включая самых молодых преподавателей, не понимал, что ты делаешь и чем занимаешься, хотя бизнес-процессы, их описание и управление - были одним из главных направлений моей кафедры. Но дальше SADT-анализа и UML никто не видел/не хотел видеть/не хватало времени заниматься... Не с кем было поговорить и обсудить эти темы не только на английском (где они и где мы), но и на русском... Может быть это и стало одной из основных причин, почему я длительное время вообще ничего сюда не писал.

Чтобы хоть как-то исправить ситуацию я написал курсовую работу Webseller и даже "выбил" академическую лицензию дизайнера ActiveBPEL для кафедры (тогда он еще был платным). На следующий год, кстати, по ActiveBPEL были поставлены лабораторные работы... Было приятно :)

Кстати, сейчас похоже их линейка называется ActiveVOS...

Но это все лирика, начатое всеравно нужно завершать, поэтому я назвал этот пост - Lifetime Management with BPEL (Part III), чтобы наконец-то закончить эту серию. Я не буду писать на английском и не буду здесь представлять законченного примера использования этого паттерна. Я даже не буду писать на BPEL, просто опишу словами то, что хотел.

Чтобы реализовать то, о чем я писал в предыдущей части нужно процесс (или его часть/scope, в которой определено состояние, например, содержимое корзины) заключить в контейнер Pick с несколькими обработчиками сообщений, среди которых должны быть:
  1. обработчики onMessage, которые меняют состояние процесса (например, изменяют наполнение корзины);
  2. обработчики onMessage, после которых процесс выйдет из scope'а (например, товары из корзины пойдут на оформление заказа);
  3. обработчик onAlarm, который определяет время жизни состояния, после которого состояние должно сброситься.
Действие обработчиков 1 и 2 должны заканчиваться асинхронным вызовом этого же процесса. Изюминка заключается в том, что эти вызовы нужно выравнять при помощи correlationSet с контейнером Pick, чтобы последующие вызовы обработчиков этого процесса работали с той же корзиной. Это позволяет после каждого изменения состояния корзины продлевать время ее жизни на интервал, указанный в onAlarm.

В correlationSet в данном случае можно передавать, например, идентификатор корзины, по которому можно найти ее в БД.

Вот собственно и все. Лучше поздно, чем никогда :)

P.S.
Второй причиной, почему английский язык плох для ведения блога - потому что он не родной для меня и сковывает меня в красноречии :)

Кстати, этот же вывод я сделал по опыту разработок в нашей компании. Программисты не пишут комментарии... Это относится и к коду, и к документации (я имею в виду javadoc) и к комментариям к комитам...

Правилом хорошего тона является английский язык в комментариях - ведь код будут читать другие, особенно если это open source проект... Но всеже лучше что-то, чем совсем ничего... После того, как мы стали использовать русский язык в наших проектах, производительность заметно повысилась (как минимум один живой пример этому есть - это я :). И уже не лень и не напрягает написать пару лишних строк в описании метода, которые иллюстрируют примеры его использования и т.д. и т.п.

Практика сложилась так, что наши (русские) программисты умеют лучше читать и понимать английский, чем писать на нем и им разговаривать.

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

С одной стороны меня греет то, что русский open source от этого только выиграет, по крайней мере я так думаю :)

А с другой стороны есть правило - комментарии писать на языке заказчика. Так что делайте выводы сами.

Thursday, February 28, 2008

Социальные сервисы укрепляют корни :)

Благодаря одноклассникам.ru я нашел очень много знакомых, друзей и родственников. С некоторыми я не виделся уже больше 10 лет, после того как переехал в Россию. Это замечательно, что спустя столько лет можно возобновить общение и поддерживать контакты.

Недавно я зарегистрировал в одноклассниках свою маму :) У нее вообще вызвало неописуемый восторг, после того как она нашла знакомых с которыми не виделась больше 30 лет!

Но помимо знакомых, оказалось, что у нас очень много родственников, причем, о которых я даже и не подозревал. Точнее я всегда знал, что родственников у нас много и что кто-то живет за границей (в Европе, в Штатах), кто-то в СНГ, а кто-то по России... И у меня давно была мысль построить генеалогическое дерево, чтобы узнать - сколько же всетаки у нас в роду человек, где они живут/жили, как их зовут, кто они есть, чем занимаются, ну и так далее... Я думаю, я не один такой - интересно же :)

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

Пока на прошлой неделе не набрел на отличный сервис - kindo.ru. За каких то пару часов я завел 100 (!) человек и до сих пор в голове есть те, которых я знаю и которые на очереди туда попасть... :)

И в основном это заслуга интерфейса - он очень удобный и радует глаз своей красотой и динамикой (Flash во всей своей красе :). Чтобы добавить родственника - нужно просто щелкнуть на том, с кем у него есть родственная связь и выбрать один из вариантов:

Мама, папа, братья, сестры, дяди, тети, бабушки и их родственники - сразу же всплывут в памяти :)

Кроме того, если у кого-то из родственников есть Интернет и он умеет им пользоваться (Настя, привет :) то можно отправить им приглашение и они будут вместе с вами заполнять ваше семейное древо!

Сервис еще достаточно молодой, хотя уже переведен на 12 (поправьте меня, если я не прав) языков, включая русский и даже китайский :) Хотя, потенциал у него, мне кажется , огромный. Конечно, это всего лишь поделка по сравнению с настоящими генеалогическими системами, с которыми работают ученые генеалогии, но социальный аспект наряду с простотой использования могут сыграть здесь свое дело.

Тем более, что для начала ничего больше и не надо, а, чуть погодя, создатели обещают добавить функции экспорта древа в формат GEDCOM, от которого можно будет сделать следующий шаг, если кого-то потянет на более серьезные исследования :)

P.S.
В команде Kindo есть русские :)

Sunday, February 17, 2008

Yandex is a Russian feed aggregator

Сегодня в статистике FeedBurner появился новый RSS-агрегатор Yandex Blog Search

Напомню, что с первого июня 2007 FeedBurner принадлежит Google, и врятли в Google не знают, что такое Яndex...

Но для Google Яndex всего лишь русский RSS-агрегатор :)

Friday, February 15, 2008

Top 100 living geniuses

Наткнулся сегодня на список ста ныне живущих гениев от The Daily Telegraph

Wednesday, January 16, 2008

16-го января 2008 - День покупок

Сегодня Oracle купила, наконец-таки, BEA. Рано или поздно этого следовало ожидать.

И еще одна, уже неожиданная для меня новость. В блоге MySQL появился пост о том, что Sun хочет купить MySQL. Очень интересно будет понаблюдать за этой ситуацией.

Friday, December 21, 2007

Проблемы с консолью Windows

Если в Java-приложении на консоль выводится информация на русском языке (например при запуске тестов через Maven2), то Windows все русские символы по умолчанию выводит как абракадабру:



Раньше я не обращал особо на это внимание, потому что всеравно отладку делаю в Eclipse, где все нормально. Давно надо было уже пофиксить - вот здесь рассказывается как (меняем кодовую страницу chcp 1251 и ставим шрифт Lucida Console).

Обновление 04.05.2008
Опять столкнулся с этой проблемой, только теперь в установке Oracle BI. При установке можно было выбрать на каком языке выводить сообщения сервера. Я выбрал русский и в консоль опять полезла абракадабра.

После установки Oracle BI OC4J запускается автоматически при запуске Windows (в реестре делается соответствующая запись со ссылкой на oc4j.cmd). Я сделал свой командный файл и обновил запись в реестре, чтобы она указывала на мой файл. Вот что в этом файле:


TITLE oc4j-bi
CHCP 1251
"E:\OracleBI\oc4j_bi\bin\oc4j.cmd" %1

При первом запуске нужно зайти в свойства окошка консоли и выбрать шрифт Lucida Console и при сохранении свойств выбрать "Применить настройки для всех окон с таким заголовком".


Проблема номер два, но это уже скорее к Windows, чем к консоли.
В очередной раз наткнулся на проблему с превышением длинны командной строки (8Кб максимум). Причиной стал JPOX Enhancer, который строит слишком длинную строку для запуска своей утилиты. Пришлось делать workaround.

Все это про Windows XP, не знаю, изменилось ли что-то в Vista?

Идентификация сервисов SOA от IBM

Пришла сегодня рассылка от IBM developerWorks Россия "Моделирование SOA: Часть 1. Идентификация сервисов".

Это перевод статьи, а оригинал датируется вторым октября 2007.
Интересно, что в этот же день я читал доклад на семинаре, в котором затрагивалась эта же тема.
Разница лишь в том, что IBM иллюстрирует подход на примере UML и семействе продуктов IBM® WebSphere® (в частности Business Modeler), а я использовал BPMN для этих целей.

Saturday, November 24, 2007

SOA в корпоративной информационной системе

Написал черновик статьи, в которой попытался собрать различные высокоуровневые методологии/технологии (SOA, бизнес-процессы, автоматизация, OLTP, OLAP и т.д.) в единую информационную систему.
Получилось довольно размыто, обзорно и, естественно, туда поместилось не все, что хотелось. Но для закрепления определенного этапа - я думаю достаточно.

SOA в корпоративной информационной системе (161 КБ)

Обновление 25.04.2008

Статья опубликована: Вестник филиала Всероссийского заочного финансово-экономического института в г. Владимире. Выпуск 2. - Владимир, 2007. - 218 с. ISBN 5-89368-767-1 стр. 109-113