Friday, December 21, 2007

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

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



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

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

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


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

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


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

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

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

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

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

Saturday, November 24, 2007

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

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

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

Обновление 25.04.2008

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

Обращение к private-элементам в Java (Java Reflection)

Недавно у нас с Ивом состоялся разговор о private-элементах Java (приватные классы, поля и т.д.)
Он был уверен, что если класс объявлен как приватный - его экземпляр нельзя создать где-либо еще, кроме как из класса, в котором он был объявлен. То же самое с приватными полями - если поле описано с модификатором доступа private, то к нему нельзя получить доступ если нет соответствующих getter/setter-методов.

На самом деле, механизм Java Reflection позволяет сделать с кодом все, что угодно и получить доступ к любой информации о коде и к состоянию объектов.

PublicClass.java

01
02 public class PublicClass {
03
04
/**
05
* Значение этой переменной нельзя непосредственно установить из Java-кода
06 * оператором присваивания, но, как будет видно дальше, это значение можно
07 * изменить при помощи механизма рефлексии.
08 */
09 private int a = 0;
10
11 public int getA() {
12 return a;
13 }
14
15 /**
16 * Это приватный класс. Дальше в примерах мы создадим экземпляр этого класса
17 * и вызовем на нем метод <code>toString()</code>.
18 *
19 * Этот класс может существовать только в контексте экземпляра
20 * {@link PublicClass}; мы увидим, как можно установить контекст для нового
21 * экземпляра {@link PrivateInnerClass}.
22 *
23 * @author dmitrygusev
24 *
25 */
26 @SuppressWarnings("unused")
27 private class PrivateInnerClass {
28 @Override
29 public String toString() {
30 return "Hello from PrivateInnerClass instance!";
31 }
32 }
33
34 }


TestAccessPrivateMembers.java

01 import static org.junit.Assert.assertEquals;
02
03 import java.lang.reflect.Constructor;
04 import java.lang.reflect.Field;
05 import java.lang.reflect.Member;
06
07 import org.junit.Test;
08
09 public class TestAccessPrivateMembers {
10
11 /**
12 * Получим список объявленных конструкторов. Методы
13 * <code>java.lang.Class.getDeclaredXXX()</code>, например,
14 * {@link Class#getDeclaredConstructors()}, возвращают список всех
15 * объявленных элементов ({@link Member}), а не только
16 * <code>public</code>.
17 *
18 * Если нужно получить только <code>public</code> элементы, то можно
19 * воспользоваться методами <code>java.lang.Class.getYYY()</code>
20 * (например, {@link Class#getConstructors()}).
21 *
22 * @see java.lang.reflect.Member
23 * @see java.lang.Class
24 * @see java.lang.reflect.Field
25 * @see java.lang.reflect.Method
26 * @see java.lang.reflect.Constructor
27 */
28 @Test public void accessPrivateMembers() throws Exception {
29 /*
30 * В данном случае у нас лишь один inner-класс - PrivateInnerClass
31 */
32 Class<?> clazz = PublicClass.class.getDeclaredClasses()[0];
33
34 /*
35 * Получим его конктруктор по умолчанию
36 */
37 Constructor<?> constr = clazz.getDeclaredConstructors()[0];
38
39 /*
40 * Установим признак доступности этого конструктора, чтобы его можно
41 * было вызвать
42 */
43 constr.setAccessible(true);
44
45 /*
46 * Создадим класс-контекст для внутреннего класса
47 */
48 PublicClass pc = new PublicClass();
49
50 /*
51 * Создадим экземпляр внутреннего класса, передав класс-контекст в
52 * качестве параметра конструктору
53 */
54 Object o = constr.newInstance(pc);
55
56 /*
57 * Вызовем метод toString() на внутреннем классе
58 */
59 assertEquals("Hello from PrivateInnerClass instance!", o.toString());
60
61 /*
62 * Прочитаем значение private-переменной через соответствующий
63 * getter-метод
64 */
65 assertEquals(0, pc.getA());
66
67 /*
68 * Изменим значение этой private-переменной. Для этого нужно получить
69 * соответствующий объект java.lang.reflect.Field, у которого есть метод
70 * Field.set(object, value).
71 */
72 Field fieldA = pc.getClass().getDeclaredField("a");
73
74 fieldA.setAccessible(true);
75
76 fieldA.set(pc, 2);
77
78 /*
79 * Прочитаем значение private-поля - оно должно быть равно 2
80 */
81 assertEquals(2, pc.getA());
82 }
83
84 }

Tuesday, November 06, 2007

Сувениры Java

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

Постер JavaPolis 2007


Прислали сегодня приглашение на JavaPolis 2007, в конверте был постер конференции. Пока что это эксклюзив, его видели меньше 3000 человек в мире :) Точнее те из них, кто также запросил подтверждение о регистрации на конференции :)

Резиновый Duke

На Sun Tech Days 2006 в Москве и Sun Tech Days 2007 в Питере ведущий (не помню, как его зовут... Джефри?), который объявлял спикеров, да и все спикеры, включая Джеймса Гослинга, во время выступлений кидали в зал резиновых Duke'ов, футболки с логотипами Duke/Sun/Java и прочие сувениры.
Этот Duke с STD2007, его поймала моя Настя :) Стоит сейчас у нас дома на компьютерном столе.

Monday, November 05, 2007

Семинар Keyintegrity "Основы Java"

В середине октября 2007 я с моими коллегами Павлом Чурсиным и Алексеем Солодовниковым провели многодневный обучающий семинар по теме "Основы Java" в ТатАСУНефть.

Семинары состояли из двух дней лекций, и одного дня лабораторных работ.

Некоторые вопросы, рассмотренные в рамках лекций:

  1. Введение в Java
    1. Историческая справка
    2. Платформы Java ME/SE/EE
    3. Версии платформы Java
    4. JRE/JDK и JVM
  2. HelloWorld
    1. Точка входа в приложение, аргументы командной строки, код возврата
    2. Из чего состоят, как компилируются и запускаются приложения Java
  3. Поддержка ООП в Java
    1. Классы в Java
      1. Атрибуты класса
        • Имя
        • Модификаторы класса
        • Поля
        • Методы
        • Конструктор
        • Инициализатор
      2. Вложенные, Анонимные и Абстрактные классы
    2. Наследование и полиморфизм
    3. Интерфейсы
    4. Статический контекст
  4. Пакеты
  5. JavaBean и POJO
  6. Синтаксические конструкции языка
    1. Основные конструкции
    2. Потоки выполнения
      1. Исключительные ситуации
      2. Иерархия исключительных ситуаций
    3. Аннотации
    4. Generics
  7. Collections API (java.util.*)
    1. Collections, List, Set, Queue
    2. Vector, Stack
    3. Map
  8. Многопоточность
    1. Thread/Runnable
    2. Concurrency API (java.util.concurrency.*)
  9. I/O Streaming API (java.io.*)
    1. Serializable
    2. Input/OutputStream и иерархия
  10. И др.
На третий день были запланированы две лабораторные работы:
  • потоковый ввод/вывод и Collections API
  • многопоточное приложение и ООП
Мы также подготовили методические указания для выполнения работ в Eclipse IDE (1,3 МБ). Там же можно найти текст заданий к лабораторным работам.

Лабораторная работа №1

Цель работы:

Ознакомиться со средой разработки Eclipse JDT. Закрепить навыки создания и отладки простых консольных приложений на Java. В этой работе используются:

  • стандартные пакеты для работы с потоковым вводом/выводом,
  • сериализация объектов,
  • разбор параметров командной строки,
  • Java Collections API,
  • определение простых классов (JavaBeans),
  • сортировка списка объектов из этих классов по заданным критериям.

Лабораторная работа №2

Цель работы:

В этой предполагается создание утилиты для работы с файловой системой. Основными особенностями являются:

  • Использование возможностей ООП в Java: работа с интерфейсами и абстрактными классами, перегрузка методов;
  • Использование рекурсии для работы с файловой системой;
  • Создание многопоточного приложения с разделением общих объектов и синхронизацией потоков.

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


Решения для лабораторных работ можно скачать здесь (15 КБ).

Отдельно хочется отметить BlueJ - отличная вещь для преподавания ООП и Java.

Семинар Keyintegrity "Сближая бизнес и IT: методология и инструментарий BPM для эффективного управления бизнес-процессами предприятия"

Второго октября 2007 компания Keyintegrity провела бесплатный семинар в г. Набережные челны по теме "Сближая бизнес и IT: методология и инструментарий BPM для эффективного управления бизнес-процессами предприятия".

Я читал доклад о взаимосвязи SOA, BPMN и BPEL (презентация прилагается, 173 КБ).

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

На демонстрации разбирался пример, опубликованный в одном из предыдущих постов, реализованный на Intalio|BPMS.

Особенно хочется отметить роль Open Source'овых продуктов. Известно, что внедрение SOA рекомендуется начинать постепенно, с "маленьких" бизнес-процессов, потихоньку на практике знакомясь с особенностями применения данной методологии. Закупать для этих целей полнофункциональные продукты уровня Enterprise, такие как, например, семейство продуктов WebSphere (ESB, Process Server, и т.д.) - слишком дорогое удовольствие, а применение бесплатных Open Source аналогов может быть вполне оправданным.

Функциональных возможностей Open Source аналогов может быть вполне достаточно и для их дальнейшего использования в production, а если возникнет необходимость в переносе уже реализованного функционала на коммерческие продукты, то этот процесс не займет больших усилий:

  1. С одной стороны благодаря поддержке открытых стандартов - для переноса возможно нужно будет поменять только схемы деплоймента (BPEL, WS, Java EE и т.д.);
  2. С другой стороны это связано с одной из моделей коммерческого Open Source. Производители коммерческого ПО выносят базовую функциональность своих продуктов в Open Source, оставляя в коммерческой версии функции, необходимые для применения в production. В этом случае все проекты смогут работать в коммерческой версии "как есть".

Saturday, November 03, 2007

Java-, WS- и XML-технологии в проекте WebSeller

Проект WebSeller, который я делал в магистратуре в рамках курсовой работы/проекта в 2005 году.

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

Аннотация
Цель данного учебного проекта – получить навыки разработки распределенных программных систем на платформе J2EE. В качестве основной архитектуры рассматривается сервис-ориентированная архитектура (Service-Oriented Archi-tecture, SOA) на основе web-служб. Рассмотрены основные технологии разра-ботки web-служб, в частности – JAX-RPC и язык описания бизнес процессов на основе web-служб – BPEL, а также разработаны две web-службы с использова-нием рассмотренных технологий.
В проекте используются, в основном, продукты Apache Software Foundation и другие open source проекты. Дается краткое описание использованных техноло-гий и приемы работы с ними.
Так же уделяется внимание унифицированному процессу RUP, как подходу к проектированию подобных учебных проектов.
В приложениях на компакт диске представлены исходные коды в виде проекта для IDE Eclipse 3.1; набор разработанных артефактов RUP для проекта, а также дистрибутивы использованных программных технологий.

Табл.: 2; Ил.: 15.

Скачать проект (2 МБ):
  • Пояснительная записка
  • Плакаты
  • Артефакты RUP
  • Проект WebSeller для Eclipse 3.1.1

Tuesday, October 02, 2007

Запускаемый BPMN

Пример простого BPMN процесса PurchaseOrder для Intalio|BPMS Designer 5.x
Ссылка на архив проекта здесь.


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

Условный переход выставлен так, чтобы всегда проходить по бОльшей ветке.

С русскими названиями были проблемы, так что пришлось воспользоваться атрибутами Technical Name активностей, а русские оставить только в качестве описания (Label).

P.S.
В продолжение темы.

Thursday, June 15, 2006

Lifetime Management with BPEL (Part II)

It's time now to explain to the reader what I mean using the term "Lifetime Management".

The basic idea is handling the timeouts as they were previously defined before (see Lifetime Management with BPEL (Part I) with BPEL Peek example).

Standard BPEL allows us to handle duration or deadline timeouts by defining how much time should elapse before the timeout event will occur or by specifying the deadline date and time for the deadline (onAlarm's for and until attributes accordingly).

The new way I'd like to declare the process timeout expression is so that onAlarm can handle an automatic duration prolongation in the case when some of the duration expression conditions were changed. It's important to notice that you can not just change onAlarm's expression via, say, Assign activity (at least I couldn't found the way how to do that, so please inform me if you know the way).

Lets take an example of how to use this functionality.

Imagine a web shop that keeps a personal shopping cart for each of its customers.

A user may surf through the web shop, put some products in the cart and make an order.

One of usecases for this web shop may be the following:

  • Customer wants to buy everything he placed in the cart (the good one :). In this case the system calculates an order and starts the process of billing and delivery of the products to the user;
Another possible usecase is:
  • Customer leaves the webshop page (doesn't matter how - by navigating to another URL or just closes the browser window).
What should become with a customer's shopping cart and all the goods that he placed into it in the last scenario? Should we release all the items from the cart immediately? But what if the user will return to the page and act as in the first use case? Then he would have to navigate the site once again and take all the stuff he already did few time ago - bad usability.

On the other hand if we left the items in the cart forever then no one other would be able to buy the stuff that is in the other user's cart since it's already reserved.

So we need to specify the cart lifetime somehow so that all the items were released and the cart were cleared after the specified time.

The typical solution for a web shop here nowadays is using HTTP session but as we are talking about Web Services the HTTP session is not suitable for that. So we may use BPEL that can give us the functionality we need at the higher level of abstraction.

Why not just use BPEL onAlarm duration (the for attribute)? Since, as I already said above, it is not possible to change the duration expression at runtime while this is required to set the new cart lifetime after each cart update (say after adding new item to cart).

In the next part we'll see how to implement this example using BPEL and discuss some key aspects that you should pay attention for while using BPEL here...

Lifetime Management with BPEL (Part I)

Here we go...

I'd like to show you an example of BPEL (read BEEPLE :) that allows to implement some kind of a lifetime management using web-services.

This implementation is based on BPEL's Pick activity, and right before we start I'd like to introduce readers in what this activity is need for. Those who familiar with that may freely skip this part.

So, as I already said, BPEL have the Pick activity that is like widely known Switch/Case language construction in programming languages (Java, C++ or Pascal Case/Of). Those constructions have a possibility of redirecting control flow based on some expression, for instance (Java):

switch (directionExpression) {
case LEFT:
moveLeft();
break;
case RIGHT:
moveRight();
break;
case UP:
moveUp();
break;
case DOWN:
moveDown();
break;
default: // Hold
}
In BPEL the Pick activity is the analog of the Switch statement. Pick's OnMessage statements are like Switch's case statements.

To be true to the reader I'd like to say that BPEL have the Switch activity too. The main thing that distinguish Pick from Switch constructions is that Pick is a blocking activity, that means that the expression that manages the process control flow is a message that BPEL process instance is waiting for to receive, and the flow would be frozen until this message arrives, while in Switch we already have this expression defined as a process variable and the alternative flow may be picked up without any delay.

Now I'd like you to mention the default statement. Pick has the analog of this statement that corresponds the situation when no message were arrived to the Pick activity during some time period (or by deadline) - the timeout; and the activity that is responsible to handle such timeouts is Pick's OnAlarm.


So the BPEL code using Pick may looks like:
<pick>
<onMessage operation="approve">
<!-- TODO Implement OnApprove -->
</onMessage>
<onMessage operation="reject">
<!-- TODO Implement OnReject -->
</onMessage>
<!-- Timeout will occur in one minute -->
<onAlarm for="&quot;PT1M&quot;">
<!-- TODO Implement OnTimeout -->
</onAlarm>
</pick>


to be continued...

References

Tuesday, June 13, 2006

Dynamic HTML Forms Code Snippet

I'm sure that there are a lot of examples in the Internet of how to implement it so I'm just paste my own snippet "as is" without any explanation of how its works.

Copy-Paste it to see how it works.


<html>
<head>
<script type="text/javascript">
var id = 0;

function addElement(container) {
id++;

var htmlId = "id" + id;

container.innerHTML += "\n<div id=\"" + htmlId + "\">"
+ "\n I'm number " + id
+ "\n <button onclick=\"removeElement('" + htmlId + "')\">Remove</button>"
+ "\n</div>";
}

function initContainer() {
addElement(document.getElementById("container"));
}

function removeElement(id) {
document.getElementById("container").removeChild(document.getElementById(id));
}
</script>
</head>
<body>
<form id="container">
<script type="text/javascript"> initContainer(); </script>
</form>
<button onclick="addElement(document.getElementById('container'))">Add</button>
</body>
</html>


More Information
Dynamic Content with DOM-2

Hello World

My first blog, my first blog entry... :)

I just don't know where else I can write my thoughts and my researches which is why I created it.

As you may notice by the title of this entry I'm a software developer and the majority of posts would be about programming and IT, and everything related to that.

I think I will publish my resume somwere near here later so that readers (if anybody would read this blog :) can see the area of my interests.