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.
В продолжение темы.