Tuesday, December 30, 2008

Пример Java-приложения, построенного на Open Source решениях

Не смог придумать лучшего названия :)

Эту презентацию я готовил для девятой встречи JUG во Владимире, которая состоялась 25 декабря 2008. Запись презентации будет доступна чуть позже на сайте JUG, а пока я решил выложить слайды.

Рассматриваемое приложение - один из заказных проектов KeyIntegrity. Его особенность в том, что он полностью реализован на Java OpenSource-решениях. Вот лишь некоторые из них:

В презентации дается обзор архитектуры готового решения и разбирается дизайн проекта. В частности: общий дизайн web-приложения, подсистема доступа к данным, генератор отчетов и так далее. Кстати, предыдущий пост "Single Sign-On в интеграционных проектах IIS и Java" также относится к этому проекту.

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

Я бы отнес этот проект к категории "маленьких", но, несмотря на его размер, он оказался очень интересным в плане реализации.

Как обычно не обошлось без тонкостей использования OpenSource-решений в production. Например:
  • реализации JPA могут работать не стабильно если используется pool соединений (то есть почти всегда) и с приложением не работают более 8 часов (настройки MySQL по умолчанию), например, ночью когда нет активных пользователей;
  • использование AJP13 в Tomcat с настройками по-умолчанию через некоторое время приводит к отказу работы системы;
  • и другие.
Самое интересное, что в открытых источниках я не нашел решений этих проблем. Часть ответов я привожу в презентации (в слайдах или в записи). Но, к сожалению, большинство, все-таки, остается за кадром.

Часть вопросов по доступу к данным закрылось библиотекой keyintegrity-orm-jpa (небольшая обертка для JPA), которую пришлось написать для этого проекта. О ней также есть информация в слайдах. Скорее всего удастся выпустить эту библиотечку под Apache License v2, но это уже только в следующем году (обязательно напишу про это отдельную новость).

В общем я очень доволен как себя показала Tapestry5 с её встроенной поддержкой IoC. Всем рекомендую посмотреть этот Web Framework, тем более, что недавно вышел финальный релиз.

Также остались только хорошие впечатления от BIRT - в очередной раз удалось реализовать все, что нужно, включая русскую локализацию для Web Viewer'а.

Monday, September 22, 2008

Single Sign-On в интеграционных проектах IIS и Java

Описание проблемы


Для одного из наших проектов нужно было разработать несколько новых компонентов для существующего решения - web-портала.

Портал написан на ASP (даже не ASP.NET) с MS SQL Server 2000 и до сих пор поддерживается - периодически выходят новые версии.

Одним из требований заказчика была поддержка функции Single Sign-On между существующими и разрабатываемыми компонентами.

В этом посте я хочу рассказать о тем чем я руководствовался при разработке архитектуры решения и как в итоге был реализован механизм SSO. Забегая вперед, отмечу, что данное решение может подойти для интеграционных проектов, в которых есть необходимость организовать SSO между существующими web-приложениями (ASP/PHP) и вновь разрабатываемыми на Java EE компонентами.

Выбор инструмента


Платформа


Из соображений лицензионной чистоты и снижения лицензионных отчислений было принято решение разрабатывать новые компоненты с использованием стека Open Source решений и, в частности, на платформе Java. Если кому-то интересно почему Java - обращайтесь в комментарии - это не тема для данного поста :)

В последнее время мне очень нравится Open Source линейка OpenX, поддерживаемая открытым сообществом dev.java.net во главе с Sun Microsystems. Особенно привлекает NetBeans, который является по-настоящему мощной и, поправьте если я не прав, первой в мире и единственной бесплатной Open Source RAD для разработки Java-приложений (включая Java ME/SE/EE), чем не может похвастаться ни одна другая IDE (включая Eclipse и IDEA).

Eclipse, как IDE, мне нравится больше NetBeans, особенно JDT и его Java Editor, который в разы превосходит NetBeans по функциональности. Но Eclipse очень сильно проигрывает NetBeans в плане RAD. Многие знают, что на базе Eclipse есть разные реализации RAD (от IBM, ориентированная на линейку WebSphere; от SAP для NetWeaver), но все они платные и, поэтому, не идут ни в какое сравнение с NetBeans.

Что мне особенно нравится у NetBeans - это набор его WYSIWYG-редакторов GUI и различные мастера конфигураций, которые очень сильно сокращают время разработки. Именно этим мы и хотели воспользоваться.

Single Sign-On


На тот момент я был знаком лишь с одним фреймворком, поддерживающим SSO - это JOSSO.

JOSSO позволяет организовать SSO между веб-приложениями, физически расположенными в рамках одного сервера приложений. После того, как пользователь прошел аутентификацию в одном из "партнерских" приложений JOSSO, серверный агент JOSSO запоминает его логин и членство в ролях. При последующих обращениях пользователя к партнерским приложениям, агент автоматически пытается аутентифицировать пользователя, избавляя его от повторного ввода пароля. Эта схема работает на Tomcat. Существуют агенты и для других серверов приложений.

Но именно из-за того, что JOSSO не поддерживает Glassfish, я побоялся остановить на нем свой выбор - Glassfish еще слишком молодой и не имеет большой поддержки со стороны Open Source сообщества.

В линейке OpenX есть продукт Open SSO, поддерживающий Glassfish, но реализованного агента для IIS у этого продукта не было.

У JOSSO есть агент для IIS, но, как потом выяснилось, и JOSSO, в дополнение к вышесказанному, и Open SSO под Single Sign-On понимают немного другую схему аутентификации - схему основанную на токенах.

В этой схеме приложение, проводя процедуру аутентификации пользователя, получает у Identity Provider'а токен - сессионный ключ. Этот ключ может передаваться между партнерскими приложениями, например, через Cookies. В такой схеме, имея сессионный токен пользователя, приложение самостоятельно может запросить у централизованного сервиса права пользователя и провести процедуру авторизации.

В нашем случае это означало бы полностью переписать функции аутентификации и авторизации портала по новой схеме, что было бы крайне нежелательно, так как требовало бы больших усилий при разработке и применении новых обновлений портала. Кроме того ASP и MS SQL Server 2000 - это устаревшие технологии и никаких новых стратегических компетенций мы бы не получили с этого проекта.

Исходя из всего вышесказанного было принято решение в качестве сервера приложений выбрать Apache Tomcat - наиболее распространенный и широко поддерживаемый открытым сообществом Open Source сервер приложений (я знаю, что там только web-контейнер, нам больше не надо :). Решение было принято из расчета на то, что если и можно сделать SSO на Java, то на Tomcat это решение заработало бы с вероятностью 99.999%.

Описание решения


В основе найденного решения лежит The Apache Tomcat Connector - "мостик", который используется для запуска Tomcat за web-серверами, такими как Apache HTTPD и Microsoft IIS.

В этой схеме весь HTTP-трафик пользователя проходит через web-сервер (в нашем случае IIS) и передается Tomcat'у, который обрабатывает запрос и возвращает результат.

Это возможно за счет ISAPI-фильтра, который отвечает за перенаправление всех HTTP-запросов. Такое перенаправление возможно за счет поддержки Tomcat'ом бинарного протокола AJP13, по которому происходит эта передача. Возможно другие сервера также поддерживают AJP13 и для них можно организовать аналогичную схему - я не пробовал, но если у кого-то получится, большая просьба отметиться в комментариях.

Особенности решения


Аутентификация пользователей в портале ASP осуществляется путем сохранения информации об имени пользователя и его членства в ролях, которая сохраняется в объекте ASP Session (сессия приложения).

Если бы аутентификация осуществлялась стандартными средствами, например, HTTP Basic Authentication, то в Java EE приложении имя пользователя можно было бы получить через интерфейс HttpServletRequest.getRemoteUser(...).

Но так как сессия лежит за границами протокола HTTP, из Java непосредственно нельзя получить к ней доступ. Однако в HTTP-заголовках передаются Cookies, в которых сохраняются сессионные ключи приложений (JSESSIONID, PHPSESSIONID, ASPSESSIONIDxxx).

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

Реализация


Для этого в партнерское приложение достаточно добавить страницу sessioninfo.asp следующего содержания:

UserID=<%=Session("UserID")%>
UserType=<%=Session("UserType")%>


Соответственно, из Java приложения, чтобы получить информацию о пользователе (в данном случае это его идентификатор и тип, на основании которых можно сделать запрос к БД и получить всю дополнительную информацию, если это необходимо), достаточно обратиться по адресу, например, http://localhost/asp-portal/sessioninfo.asp и рас-parse-ить результат:

01: <%@ page contentType="text/html; charset=iso-8859-1" language="java" %>
02: <%@ page import="java.net.*"%>
03: <%@ page import="java.io.*"%>
04: <%@ page import="java.util.Properties"%>
05:
06: <%
07: Cookie[] cookies = request.getCookies();
08:
09: String value = "";
10:
11: for (int i = 0; i < cookies.length; i++) {
12: Cookie cookie = cookies[i];
13: value += cookie.getName() + "=" + cookie.getValue() + ";";
14: }
15:
16: URL url = new URL("http://localhost/asp-portal/sessioninfo.asp");
17:
18: URLConnection c = url.openConnection();
19:
20: c.setRequestProperty("Cookie", value);
21:
22: InputStreamReader in = new InputStreamReader(c.getInputStream());
23:
24: Properties p = new Properties();
25: p.load(in);
26:
27: in.close();
28: %>


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

Остается отметить, что чтобы браузер передавал Cookies Java-приложению они должны быть в одном домене (URL) с порталом. Для других проектов это может быть ограничением, но в нашем случае это было скорее требованием.

Источники информации


Инструкцию по настройке Tomcat и IIS можно найти здесь: How To Configure IIS 6.0 and Tomcat with the JK 1.2 Connector. Мне пришлось немного изменить описанный сценарий, моя установка отказалась принимать приведенный там в примере файл workers.properties и я написал свой, руководствуясь вот этой документацией.

Thursday, September 11, 2008

0xCAFEBABE

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

Думаю программистам будет интересно узнать, что сигнатура *.class-файла начинается с байтов 0xCAFEBABE :)



P.S.
Навеяно предыдущим постом :)

Get Her With Java



Hibernate порадовали :)

Wednesday, September 03, 2008

7 показателей эффективного управления личными финансами

Для начала небольшая предыстория вопроса.

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

Итак, прошло уже больше двух месяцев, как мы с Настей начали планировать домашний бюджет. За основу мы решили взять советы Макса Крайнова и его идею о "4 конвертах".

Почему именно ее? Потому что приблизительно в то время я наткнулся на блог Макса и попал на период, когда он только начал развивать идею с конвертами. Кажется это был апрель-май.

У меня заняло около месяца на знакомство с идеей 4 конвертов и вообще знакомством идеи ведения домашнего бюджета.

Еще через месяц появился его online-сервис www.4konverta.com, который стал эталонной реализацией идеи "4 конверта". При работе с этим сервисом я очень скоро уперся в его функциональные ограничения (в нем еще попросту не было нужных функций, некоторые и сейчас находятся на стадии активной разработки), не удивительно - ведь сервис еще только набирает обороты, привлекая все больше людей.

Этот момент совпал с нашим очередным переездом на новую квартиру, где у меня попросту не было интернета. У меня не было даже тех 30 секунд в день для заполнения ежедневных трат, про которые так часто говорит Макс.

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

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

Задолго до 4 конвертов мы с Настей пытались собирать чеки, чтобы хотя бы примерно попытаться построить прогноз - сколько мы тратим и на что. Но из-за того, что очень часто чеки либо терялись, либо мы просто забывали их брать этот прогноз получался очень неточным (около 30% месячного дохода терялось в неизвестном направлении). Логичным решением был отказ от сбора чеков и переход на 4 конверта, то есть заносить все траты непосредственно туда. Именно тогда у меня родилась идея написать приложение для своего мобильного телефона, через которое я бы смог заносить текущие траты непосредственно по факту их совершения.

Я написал это приложение за одни выходные. Идея мобильного клиента мне настолько понравилась, что я решил сделать его доступным для всех, выпустив его под бесплатной Open Source лицензией, чтобы каждый пользователь сервиса "4 конверта" смог решить для себя вопрос учета ежедневных трат раз и навсегда. Сегодня, после выхода последнего обновления (10 дней назад), мобильную версию 4 конвертов закачали около 100 человек и эта цифра постоянно растет!

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

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

О каком прогнозе идет речь? Для начала пара примеров, как мы жили раньше.

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

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

Сервис "4 конверта" позволил дать ответы на большинство этих вопросов. Как минимум он позволяет задуматься о положении дел!

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

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


В нижней части - учет движения денежных потоков, включая все плановые и фактические доходы и расходы, а также затраты на конверты, то есть на ежедневные траты.

Все наличные/безналичные деньги, которые не в резервном фонде я объединил под одним названием - подвижный остаток. Эти деньги я могу разложить по конвертам уже сегодня и хоть на год вперед. Исходя из плановых доходов и плановых расходов на конверты я всегда вижу какой минимальный подвижный остаток у меня будет на руках и когда я смогу уйти "в минус", если вдруг лишусь доходов или просто будет задержка в зарплате.

Кроме того, я всегда могу оценить размер своего капитала на каждый день на год вперед.

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

И еще одна функция, которая мне очень нравится в Excel - это анализ "Что-если".

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

А задействуя функцию "Что-если" я могу подобрать величину размера конверта по умолчанию таким образом, чтобы, например, мой минимальный подвижный остаток в течении года не был ниже 20000 рублей.

И если меня устраивает мой тренд, я могу смело руководствоваться величиной размера конверта по умолчанию как эталоном.

Собственно, вот эти 7 показателей на которые я смотрю строя прогнозы и принимая решения о тратах:

  1. Размер конверта по умолчанию - сколько мне можно тратить в неделю, чтобы сохранялся прогноз;

  2. Процент резервного фонда - какой процент от дохода я сразу же перечисляю в резервный фонд;

  3. Процент на дополнительный доход - какой процент от дополнительного дохода (премии и прочие нерегулярные доходы) я должен перечислить в резервный фонд;

  4. Минимальный остаток - минимальный подвижный остаток, начиная с сегодняшнего дня;

  5. Минимальный капитал - минимальный капитал, начиная с сегодняшнего дня;

  6. Обращения к резервному фонду - количество обращений к резервному фонду, когда подвижного остатка недостаточно для плановых трат;

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

В заключении хочу сказать, что вместо неопределенности в 30% по движению денег, последняя сверка (план-факт) показала точность прогноза в пределах 1-2%.

На этом на сегодня все. В качестве обзора моей текущей аналитики и показателей эффективности управления личными финансовыми потоками, и как пища для размышления Максу и команде сервиса "4 конверта", я думаю пока что вполне достаточно.

Буду рад любым отзывам и комментариям.

Tuesday, September 02, 2008

Скриншоты мобильной версии "4 конверта"


Сегодня я наконец-то выложил скриншоты мобильного клиента "4 конверта".

Там же доступна пошаговая инструкция по использованию клиента.

Эти скриншоты сделаны для Windows Mobile-клиента. Следует отметить, что он также будет работать на обычном персональном компьютере, для этого достаточно установить .Net Compact Framework 3.5 (собственно, скриншоты так и сделаны - на Windows Vista).

Java-версия содержит абсолютно идентичные экранные формы и набор функций, поэтому отдельно для него я не буду делать снимков. К тому же, в отличие от Windows Mobile-версии этот клиент распространяется бесплатно под Open Source лицензией, так что любой сможет скачать и посмотреть его вживую.

Sunday, August 31, 2008

Oracle на Волге

28 августа в отеле Ренессанс в Самаре компания TopS BI совместно с KeyIntegrity, Oracle и HP провела открытый семинар "Oracle на Волге", посвященный технологиям Oracle.





Мой доклад был в технической секции и я рассказывал про BI, способы организации хранилищ данных и про то, как это реализовано в Oracle BI Suite Enterprise Edition (ссылки на презентацию и тезисы доклада в конце поста).

Хочется отметить несколько понравившихся докладов.

Очень понравился доклад Александра Старыгина из HP об инфраструктуре ЦОД нового поколения и о позиционировании HP в этом направлении - предоставление ЦОДа информационной службой предприятия, в виде услуги собственному предприятию. Вообще в вопросах управления ИТ-услугами и виртуализации ЦОДов, которая всячески этому способствует, HP продвинулись очень далеко.

По смежной с моей тематике выступали два докладчика из TopS BI - это Даниил Климов с докладом об инструментарии Oracle по созданию хранилищ данных (у Oracle их целых три: Warehouse Builder, Data Integrator и BI Server) и Юрий Гапанюк с докладом на тему "Методы организации Hyperion с другими информационными системами". Оба доклада порадовали мелкими деталями и практическими примерами, которые позволили понять, как это работает в реальной жизни.

Андрей Гусаков, консультант по технологиям безопасности Oracle СНГ, рассказал об Oracle Identity Management - решению, позволяющему управлять привилегиями пользователей и контролем доступа пользователей к информационным ресурсам предприятия. В двух словах, этот framework, который будет входить в Oracle Fusion Middleware, позволяет построить корпоративный мета-реестр, который призван объединить одновременно все существующие роли всех приложений корпоративной информационной системы (всевозможные LDAP, AD и другие подобные источники), позволяя реализовать корпоративный SSO на своей основе (поправьте меня если я не прав). Помимо возможностей SSO, OIM позволяет, например, вести жизненный цикл учетных записей сотрудников, начиная с момента принятия их на работу и заканчивая их увольнением...

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

Sunday, August 24, 2008

Поддержать проекты / Donate

Выразите свою поддержку словами - напишите комментарий к этому сообщению!

Еще Вы можете сделать перевод на один из моих электронных кошельков:















  • E106267571334

  • R157472504481

  • U489309160087

  • Z135116474858


Сделать перевод




41001334106330



Сделать перевод



Жители России и СНГ могут отправить записку-послание в мою sms.копилку.




Если ни один из способов вам не подходит - можете кликнуть по любому понравившемуся баннеру на этой странице... а можете не кликать :)

Спасибо за проявленный интерес к проектам!

Список моих Open Source проектов:

  • AnjLab.SyncIT - Небольшое приложение, которое позволяет синхронизировать ваши системы управления проектами/заданиями (такие как Trac, Google Code, dotProject и даже 1С) с MS Outlook, позволяя вам централизованно управлять своим временем.

  • Мобильная версия "4 конверта" - Мобильный клиент для занесения трат в online-сервис www.4konverta.com, который позволяет держать руку на пульсе при ведении домашнего бюджета.


Более подробную информацию о проектах можно найти в этом блоге или на официальных сайтах проектов.

Saturday, August 23, 2008

Мобильный клиент "4 Конверта": Теперь и для Windows Mobile

Я уже писал о том, что решил пользоваться мобильным телефоном для учета затрат в online-сервисе "4 Конверта".

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

Для анализа я пользуюсь возможностями Excel'я, но это уже совсем другая история, о которой я напишу позже.

Сегодня, одновременно с новой версией Java-клиента вышла первая версия для Windows Mobile. Теперь счастливые обладатели телефонов и коммуникаторов с Windows Mobile также смогут воспользоваться преимуществами мобильного клиента.

Обе версии являются полными функциональными аналогами друг-друга. В новой версии, помимо возможности занесения затрат, появилась новая функция "Что в конверте?", которая позволяет просматривать содержимое конвертов: бюджет на день/неделю, сколько потрачено/осталось за день/неделю.

Пользователи Java-приложений могут бесплатно загрузить новую версию с сайта проекта.

Версия для Windows Mobile будет распространяться за деньги. Подробности о приобретении можно также прочитать на сайте в разделе Windows Mobile.

Friday, August 22, 2008

Получение номера ревизии SVN в bash

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

Утилита очень простая (была написана за день-два) и чтобы не настраивать для нее отдельную сборку на сервере было принято решение сборку делать на машине разработчика и комитить бинарник в SVN.

Но чтобы следить за тем, свежая ли сборка лежит в SVN, в название бинарника решили включить номер ревизии SVN, из которой он был собран.

Ну и собственно встал вопрос, как в bash получить номер ревизии SVN? Можно вот так:

01: # This package file compiles the c file from the source
02: # and also appends to it's name the number of revision
03:
04: # You should execute this script with the additional parameters:
05: # build job_id cups_host cups_port
06:
07: svn info|grep Revision > rev_input
08: split -b 10 rev_input rev_
09: gcc -o bin/cups-job-details.`cat rev_ab` cpp/cups-job-details.c -lcups
10: echo '$0'.`cat rev_ab` -query '$1' '$2' '$3' > bin/cups-job-details
11: chmod 744 bin/cups-job-details
12: rm rev_*

Чтобы вызывать полученный бинарник программно, нужно знать его имя файла, а так как оно может меняться взавимости от номера ревизии, мы решили создавать рядом файл с постоянным именем cups-job-details и в него записывать команду, которая вызывает нужную утилиту (строка №10).

P.S.
Как можно заметить вся работа выполняется через временные файлы с заданным префиксом rev_ (естественно, префикс можно поменять) и в строке 12 они все удаляются. Если будете пользоваться - будьте осторожны, не потрите полезные файлы ;)

Thursday, August 14, 2008

18 июля 2008

















































































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'а для тех фидов, где она доступна