Thursday, May 14, 2009

ИТ-Весна 2009


Не знаю что меня завлекло на этот форум. Наверное то, что в программе были заявлены разговоры об эффективности ИТ и о развитии Open Source в России.

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


Дело даже не в том, что я целый час искал нужный зал, потому что единственный указатель (нужно было очень постараться, чтобы его найти) указывал не туда. Поэтому, кстати, я пропустил доклад Криса ДиБона из Google.

Уже традиционно организаторы пригласили выступить на Форуме мировых гуру в области Open Source. Сейчас предложение представить ключевые доклады в рамках программы Форума рассматривают Брайен Фицжеральд, автор концепции OSS 2.0, и Мигель де Иказа, основатель проектов GNOME и Mono.


Возможно я не туда попал, но ни в программе конференции, ни очно, этих людей не было. А жаль, 50% из-за них я поехал.

Зато пока искал Синий зал второго павильона, по ходу посмотрел выставки литейщиков и связистов. Это единственное положительное впечатление. Нашел там вот такой вот экспонат:



По поводу участников. Не знаю как можно было приглашать за один круглый стол кодеров Open Source'овиков, евангелистов/менеджеров из Microsoft, депутата госдумы и замдиректора департамента по стратегии построения информационного общества министерства связям и массовым коммуникациям РФ... Каждый из них преследует свои цели, может быть поэтому конструктивного разговора не получилось.

Забегая вперед отмечу, что единственным адекватным человеком, на мой взгляд, оказался Дмитрий Комиссаров (советник гендиректора компании АйТи и гендиректор PingWin Software), который более менее реально смотрел на вещи и отдавал себе отчет в происходящем.

Отдельно порадовал Григорий Лабзовский из Sun Microsystems, который вроде как был под кайфом?.. или просто так сильно волновался, что постоянно всему удивлялся, потом сразу же улыбался самому себе, и мгновенно приходил в себя :) Позитивный молодой человек.

Было две больших темы. Первая - Open Source в России, который почему-то (по введенной нашими властями терминологии) называли СПО (свободное программное обеспечение). Майкрософт (генеральный спонсор форума), как обычно, не упустил возможности попиариться.

По вопросу Open Source мне понравилось только одно высказывание единственного в числе участников CIO - Бориса Славина (Союз ИТ-Директоров): "Для меня, как ИТ-директора, нет разницы - являются ли решения, Open Source или проприетарными. В любом случае придется платить. Главное, - предоставить возможность выбора. И чем разнообразнее он будет - тем лучше."

Вторая тема - о создании национальной программной платформы. Эта тема горячо обсуждалась около полугода назад в ЖЖ и на it-blogs.

Ключевой доклад представлял Илья Пономарев (депутат гос думы). Выступая с предложением о создании национальной ОС, он начал свое выступление с заметки, что во время войны в Абхазии из Google Maps исчезли карты региона военных действий, и что это не единственный пример. Например, в других войнах переставали работать GPS... Видимо это его испугало, или стало обидно, что Google может выключить свои карты, когда захочет, а нам даже выключить нечего. Или что, наши военные ориентируются на карты гугл в военных действиях? Не знаю к чему он это, но мысль о создании собственной российской ОС он представил именно с этих позиций.

Если честно я даже не понял, почему от идеи национальной программной платформы перешли к разговору об ОС. Насколько я понял, суть создания национальной программной платформы, со слов Пономарева и Иванова, была в том, чтобы поддержать российскую ИТ-индустрию. И проект с ОС должен, по мнению Пономарева, дать толчок в этом направлении. Не понятно только почему именно ОС нужно создавать?

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

Сам Пономарев отмечал, что не столько принципиально то, _что_ мы будем разрабатывать (и будем ли разрабатывать с нуля или возьмем какой-нибудь дистрибутив линукса за основу), сколько сам факт того, что _мы_ будем что-то разрабатывать, поднимая тем самым культуру разработки ПО в России. С другой стороны, он сказал, что создаваемым решением хочет конкурировать на рынке ОС в России с Майкрософт...

Вообще в речи Пономарева и особенно Сергея Иванова (зам из министерства) было много противоречий. Сложилось впечатление, что Иванов хорошо разбирается в гос. управлении, но в ИТ понимает очень слабо.

Обсуждая тему национальной ОС, несколько раз поднимали вопрос о целесообразности ее создания. Положительного ответа так и не прозвучало, если не считать ремарку Пономарева о Google Maps и гос. безопасности... смех. Разве карты гугл выключили потому что гугл работает на Windows?

Разве у нас в стране вообще есть проблемы с операционными системами? Взять хотя бы гос. структуры: разве был хоть один гос. тендер о поставке операционных систем? Зато вот тендеры на создание прикладных ИТ-решений - обычное дело. Так может быть лучше в этом направлении искать пути развития ИТ-индустрии и создании национальной программной платформы?

Посмотрите, например, как обстоит дело с бухгалтерией. Это единственная сфера деятельности любой компании, в которой можно наблюдать высокий уровень использования ИТ. По этому поводу у нас даже есть своя национальная платформа - 1С. И, кстати, она прекрасно работает на разных ОС (Windows/Linux) и с разными СУБД (MS SQL Server/Postgresql/...).

Я думаю, если поощрять (или даже навязывать) использование ИТ (электронных документов, и EDI вообще) хотя бы для начала в госструктурах, то начнут появляться и национальные решения a-la 1С, которые будут решать поставленные задачи. (Хотя, надо отметить, что такие движения уже есть, например, связанные с электронным рынком торговли электроэнергией.)

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

У меня так и не получилось задать этот вопрос Пономареву - закончилось время форума - но очень хотелось услышать его мнение по поводу создания национальной программной платформы, начиная не с ОС, а со специфических решений для госсектора.

P.S.
Кстати, только что узнал, что Пономарев ведет ЖЖ (http://ilya-ponomarev.livejournal.com), может быть он ответит здесь или напишет свои мысли у себя в журнале.

Wednesday, April 29, 2009

Использование Ghostscript для перевода PDF в JPEG

В одном из последних проектов я занимался пакетной обработкой pdf-документов: слияние (merge) документов и распознание 1D штрих-кодов (barcode recognition).

Хочу поделиться интересными, на мой взгляд, особенностями и ссылками на Open Source-проекты.

С первой задачей (merge документов) отлично справился PDFsharp - Open Source-проект со свободной лицензией и с достаточно простым и удобным API (.Net).

Со штрих-кодами оказалось немного сложнее. Дело в том, что основной формат документов для "читалок" - файлы изображений (jpeg, png, tiff и т.д.), а перевести PDF в картинку оказалось не так просто...

Мы решили эту задачу с помощью Ghostscript - Open Source (GPL License) интерпретатор языка PostScript и пакет для работы с PDF.

Вообще говоря, перевести PDF в картинку, используя Ghostscript, можно одной командой, примерно так:


c:\Temp>c:\dev\bin\gs\gs8.64\bin\gswin32c.exe -q -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r150 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dMaxStripSize=8192 -sOutputFile=page-%d.jpg mydocument.pdf


На выходе должно быть несколько файлов (по одному на страницу): в данном случае page-1.jpg, page-2.jpg и т.д.

Проблемы начинаются, если PDF-документ содержит экзотические шрифты (например, IDAutomationHC39M.ttf - шрифт штрих-кода Code39), или если документ был создан при помощи MS Reporting Services или другой программы, которая по тем или иным причинам не включает используемые шрифты в выходной PDF-файл (PDF fonts embedding).

Наш PDF был именно такой:



В результате во время рендеринга у меня возникла такая ошибка:


Error: /undefined in findresource
Operand stack:
--nostringval-- --dict:7/16(L)-- F14 10.0 --dict:5/5(L)-- --dict:5/5(L)-- TimesNewRoman,Bold --dict:11/12(ro)(G)-- --nostringval-- CIDFontObject --dict:6/6(L)-- --dict:6/6(L)-- Adobe-Identity
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1862 1 3 %oparray_pop 1861 1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval-- --nostringval-- 3 1 2 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- %loop_continue
Dictionary stack:
--dict:1156/1684(ro)(G)-- --dict:1/20(G)-- --dict:74/200(L)-- --dict:74/200(L)-- --dict:106/127(ro)(G)-- --dict:278/300(ro)(G)-- --dict:22/25(L)-- --dict:4/6(L)-- --dict:21/40(L)-- --dict:10/13(L)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 8.64: Unrecoverable error, exit code 1


Ошибка связана с тем, что у меня на компьютере нет шрифта TimesNewRoman,Bold.

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

Обратите также внимание на кодировку шрифта: Identity-H. Из того, что мне удалось выяснить, эта кодировка говорит о том, что используемый шрифт, вообще говоря, не существует, и в документе используются только коды символов. Для отображения символов, соответствующих этим кодам Ghostscript'у нужно "подсунуть" шрифт с аналогичной таблицей символов. Как это сделать описано в документации Ghostscript (см. CID Font Substitution).

В кратце, в файл c:\dev\bin\gs\gs.8.64\lib\cidfmap (этот файл не будет создан, если при установке вы не отметили галочку "Use Windows TrueType fonts for Chinese, Japanese and Korean"; в этом случае создайте его сами) нужно добавить инструкцию, которая будет указывать, какой шрифт использовать на самом деле вместо того, который указан в PDF.

У меня заняло некоторое время, чтобы подобрать параметры для этой инструкции. Дело в том, что нельзя заменить шрифт на любой другой (например, я не могу заменить мой английский шрифт на японский или корейский). Кроме как в исходниках я нигде больше не смог найти, что нужно подставить на место /CSI Ordering. В итоге получилась такая строчка:


/TimesNewRoman,Bold << /FileType /TrueType /Path (timesbd.ttf) /SubfontID 0 /CSI [(Unicode) 0] >> ;


Файл timesbd.ttf я взял из папки C:\Windows\fonts. Есть некоторые особенности использования абсолютных и относительных путей файла с использованием опции -dSAFER. Если указана эта опция, то путь к имени файла шрифта должен быть относительным. Поэтому я скопировал его в папку c:\dev\bin\gs\fonts (в моем случае именно она используется для поиска шрифтов по умолчанию).

Чтобы посмотреть детальные логи работы Ghostscript, нужно убрать опцию -q, и вот что мы увидим:


GPL Ghostscript 8.64 (2009-02-03)
Copyright (C) 2009 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
Substituting font Helvetica for IDAutomationHC39M.
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 2875432 1123207 25112624 23807796 3 done.
Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 2912216 1253685 25112624 23819376 3 done.
Loading NimbusRomNo9L-Medi font from %rom%Resource/Font/NimbusRomNo9L-Medi... 3069576 1402046 25132720 23832802 3 done.
Page 2
Substituting font Helvetica for IDAutomationHC39M.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 3166648 1539642 25152816 23854836 3 done.
Loading a TT font from C:\dev\bin\gs\fonts/timesbd.ttf to emulate a CID font TimesNewRoman,Bold ... Done.


Ошибка пропала, но при рендеринге штрих-кода вместо "правильного" шрифта использовался Helvetica. Это связано с тем, что Ghostscript не может использовать системные шрифты по-умолчанию. Эту проблему я решил копированием файлов шрифтов (IDAutomationHC39M.ttf и IDAutomationHC39M_0.ttf) в папку C:\dev\bin\gs\fonts и указанием ключика -sFONTPATH="C:\dev\bin\gs\fonts".

В результате получаем:


c:\Temp>c:\dev\bin\gs\gs8.64\bin\gswin32c.exe -sFONTPATH="C:\dev\bin\gs\fonts" -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r150 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dMaxStripSize=8192 -sOutputFile=page-%d.jpg mydocument.pdf

GPL Ghostscript 8.64 (2009-02-03)
Copyright (C) 2009 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
Scanning c:\dev\bin\gs\fonts for fonts... 3 files, 3 scanned, 2 new fonts.
Loading IDAutomationHC39M font from c:\dev\bin\gs\fonts/IDAutomationHC39M.ttf... 2868992 1068452 25189416 23882410 3 done.

Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 2885680 1201118 25209512 23896006 3 done.
Loading NimbusRomNo9L-Medi font from %rom%Resource/Font/NimbusRomNo9L-Medi... 3022944 1346357 25209512 23905928 3 done.
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 3120016 1438677 25531048 24170429 3 done.
Page 2
Loading IDAutomationHC39M font from c:\dev\bin\gs\fonts/IDAutomationHC39M.ttf... 3120016 1443415 25189416 23883485 3 done.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 3217088 1539692 25229608 23926657 3 done.
Loading a TT font from C:\dev\bin\gs\fonts/timesbd.ttf to emulate a CID font TimesNewRoman,Bold ... Done.


Хочется отметить еще одну полезную опцию Ghostscript: -r150. Если этот параметр не указывать, то рендеринг будет происходить в мастшабе по умолчанию, в результате чего из-за маленьких размеров не распознавался штрих-код. Увеличение размера до 150 пикселей на дюйм (-r150) это исправило.

Аналогично можно также уменьшать размер картинки, например, чтобы сделать thumbnails (см. заметки по качеству перевода PDF в JPEG).

Thursday, February 19, 2009

AddOne

Problem


Implement C# function int addone(int n) which will return n+1. You can NOT use any of the following arithmetical operations in the fuction body: + - * / ++ -- += -=.

Solution



using NUnit.Framework;

namespace Developer.Test.Net
{
[TestFixture]
public class TestModulus
{
[Test]
public void TestAddOne()
{
for (int i = -1000; i < 1000; i++)
{
Assert.AreEqual(i + 1, AddOne(i));
}

int j = int.MaxValue;

Assert.AreEqual(j + 1, AddOne(j));

j = int.MinValue;

Assert.AreEqual(j + 1, AddOne(j));
}

public static int AddOne(int n)
{
int position = 1;

while (position != 0)
{
if ((n & position) == position) {
n = n ^ position;
} else {
n = n | position;

break;
}

position = position << 1;
}

return n;
}
}
}

Wednesday, February 11, 2009

Использование Unit-тестов отдельно от TDD

В продолжение к этому комментарию.

> Если вам приходится тестировать приватные классы — значит у вас серьозные проблемы с архитектурой и пониманием TDD вообще.

Одно другому не мешает. Если я не использую TDD, что же мне теперь - на ощупь писать? :) Тесты сами по себе тоже полезны, независимо от TDD.

> Юнит-тест — это тест который помагает разрабатывать лаконичные и правильные внешние интерфейсы

Мы все прекрасно понимаем, что одними интерфейсами разработка не заканчивается - интерфейсы нужно еще реализовать :) И вот во время реализации часто возникает необходимость написать функцию в работе которой не уверен - у меня основной представитель такой неуверенности - ошибка на 1 (особенно в контексте indexOf, substr) и прочие мелочи (например, регулярные выражения) и т.д. и т.п. :)

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

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

Tuesday, February 10, 2009

TDD и покрытие кода тестами

Написал развернутый комментарий на тему "Юнит тесты и TDD" в блог bishop-it.ru, после чего он благополучно обрезался и половина пропала - наверное сработало ограничение на размер. Полный комментарий публику здесь.

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

--- Cut ---

Что значит 100% покрытие кода тестами? :)

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

TDD - это вовсе не о тестировании и не о покрытии кода тестами. Я вообще не понимаю откуда возникла цифра 100% - я много читал/смотрел/использовал TDD, но никогда не слышал о связи TDD и покрытии кода тестами.

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

TDD != тестирование.

Тем более тестирование GUI (и все что касается GUI вообще), которое я вообще считаю шаманством и даже не пытаюсь туда лезть :) Единственное, что я могу понять в тестировании GUI и действительно использую - это ручное тестирование (отредактировать, запустить, проверить UI). Я могу это делать сам (и делаю) или могу отдать специально обученному человеку (и отдаю), который проверяет работу системы по заранее написанным сценариям, составленным по ТЗ.

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

Типичный случай моего использования TDD - если нужно разработать интерфейс сервиса (или бизнес-логики или API, называйте кому как нравится) и проверить его работу.

Unit-тест - это не интеграционный тест (то есть мы уже не можем получить 100% покрытие функциональности; как я говорил выше есть еще тестирование GUI - также вычтите эту часть из 100%), но основные потоки использования сервиса (его интерфейс + usecase) описать и протестировать можно.

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

TDD позволяет придерживаться принципа KISS и он мне нравится уже только поэтому.

Unit-тест TDD - это тестирование логики как черного ящика, что опять же не дает 100% покрытия.

Одно замечание по поводу "кандалов" тестов. Я никогда не пишу тесты, которые бы мне было жалко удалить и переписать. Не нужно проектировать Unit-тесты - достаточно ограничиться рамками метода теста. В этом плане я считаю хорошей практикой написания Unit-тестов TDD подход Copy-Paste.

P.S.

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

Да, есть инструменты, которые позволяют измерить Code Coverage (например, Cobertura).

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

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

--- Cut ---

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'овый, там же на сайте можно скачать исходники и свободно использовать их для своих нужд.

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

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