четверг, 28 октября 2010 г.

Eclipse полностью работоспособен c OpenJDK на Mac'ах


Сейчас в интернете активно обсуждается следующая тема: Apple отказывается от поддержки своей JVM. Ситуация интересна тем, что официальной Oracle JVM для MacOS X нет. Замечу, что ситуация несколько напоминает ситуацию, которая сложилась с Microsoft во времена JDK 1.2: корпорация зла распространяла свою версию JVM, которая в лучших традициях Microsoft была не совместима со стандартом. Apple точно так же разрабатывала свою версию JVM, которая со стандартом была совместима, однако имела некие "секретные API" для лучшего взаимодействия с графической подсистемой вендора.

Позиция Apple в целом понятна:
1. Убиваем JDK на платформе Mac.
2. Без JDK не работает Eclipse.
3. Соответственно не работает Android Development Tool.
4. ...
5. Profit!

Однако в данном вопросе Apple просчитались. Eclipse замечательно работает на OpenJDK port - SoyLatte без X11. Известный Eclipse и OSGi евангелист - Neil Bartlett приводит в доказательство скриншот:



Все дело в использовании SWT. Да, OpenJDK не имеет оптимизаций, которые есть в Apple JVM, однако они и не нужны, потому что SWT использует нативный код для отрисовки графики, а не Swing/AWT.

Соответственно, другие приложения, использующие SWT, например RSSOwl, точно так же будут полностью работоспособны, а вот гарантировать полную работоспособность NetBeans и IDEA не представляется возможным.

Понравилось сообщение - подпишитесь на блог

среда, 13 октября 2010 г.

ECF: Eclipse Communication Framework мигрировал на Git


Сегодня свершилось радостное событие: Eclipse Communication Framework полностью переведен на использование распределенной системы управления версиями исходного кода - Git. Напомню, что Git начал разрабатываться Линусом Торвальдсом для его проекта Linux, однако сейчас используется во многих Open Source (и, смею предположить, что не только Open Source) разработках.

Веб-интерфейс репозитория расположен по адресу: Eclipse Git. Сами репозитории, которые можно клонировать:

- git://git.eclipse.org/gitroot/ecf/org.eclipse.ecf.git
- ssh://git.eclipse.org/gitroot/ecf/org.eclipse.ecf.git
- http://git.eclipse.org/gitroot/ecf/org.eclipse.ecf.git

"Переведен на Git" подразумевает, что созданы указанные выше Git-репозитории, а официальный CVS-репозиторий проекта переведен в режим "Только для чтения (Read Only, R/O)". Синхронизация между Git и CVS настраиваться не будет, все новые коммиты будут идти только в Git!

На днях наша команда обновит официальный сайт ECF и пропишет везде вместо путей к CVS - пути к Git.

Преимущества использования Git вместо CVS те же, что и для разработки ядра Linux. Во-первых, теперь коммиттеры могут осуществлять коммиты более часто - в свои локальные репозитории и только после завершения работы над какой-либо новой функциональностью отправлять код в публичный репозиторий. Во-вторых, контрибъютеры могут размещать свой код, например, на GitHub, а после прохождения кодом IP-процесса, коммиттер легко смержит его с основным репозиторием ECF. При этом будет сохранена вся история правок. Уже есть пример такой работы, правда коммиттер мержил свой код с GitHub и официальный репозиторий. В-третьих, у ECF есть особенность - часть кода хранится не в официальном репозитории, а на GitHub, что раньше приводило к проблемам при сборке - приходилось часть кода подгружать из CVS, часть - из Git. Теперь весь код хранится в Git-репозиториях, что конечно же решит данную проблему. В-четвертых, теперь проще делать патчи для Bugzilla и, соответственно, их накатывать. В-пятых, стала доступна операция Code Review с помощью замечательного инструмента - Gerrit, который уже довольно активно используется для проекта EGit.

З.Ы. В отличие от большинства молодых Eclipse-related проектов, перешедших на Git или изначально разрабатывавшихся с использованием этой системы контроля версий, ECF - достаточно развитый проект с многолетней историей правок и разветвленной структурой проектов (порядка сотни бандлов, 30Мб исходников).

Понравилось сообщение - подпишитесь на блог

вторник, 12 октября 2010 г.

Введение в OSGi - Снова о доступности классов


Шпаргалка по механизму, обеспечивающему доступность классов в OSGi.

1. Один класслоадер на бандл

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

Данное решение имеет следствия:
- Classpath больше не линеен - у каждого бандла он свой.
- Классическая иерархия класслоадеров (Bootstrap -> Extension -> System) не работает.
- По-умолчанию в качестве родительского используется Bootstrap classloader, но данное поведение настраивается.

понедельник, 4 октября 2010 г.

Eclipse Foundation изнутри


В статье приведен обзор процесса разработки программного обеспечения с открытым исходным кодом, осуществляемый в рамках организации Eclipse Foundation. С некоторых пор Суровый является коммитером проекта Eclipse Communication Framework, знает процесс изнутри, поэтому может рассказать не только о формальной стороне дела, но и поделиться личными впечатлениями.

четверг, 2 сентября 2010 г.

Eclipse RCP: Целевые платформы Eclipse (Eclipse Target Platforms)


Начиная с Eclipse 3.3 существует удобная возможность управления бандлами, доступными при разработке плагинов/RCP-приложений с помощью Eclipse PDE. Речь идет о таком понятии, как "целевая платформа" (Eclipse Target Platform) - списке бандлов и параметров, которые будут доступны при компиляции, отладке и тестировании плагинов из рабочего пространства (Eclipse Workspace).

Зачем создавать собственные целевые платформы


По-умолчанию в качестве целевой платформы используется содержимое каталога plugins запущенного экземпляра Eclipse. Обычно в такой целевой платформе содержатся сотни бандлов (в моем Eclipse for RCP and RAP Developers их 467), что как правило очень много и вовсе не нужно для компиляции/отладки/тестирования RCP/RAP-приложения или плагина. Зачем тратить время (особенно при разработке, когда перезапускать приложение приходится довольно часто) на ожидание старта сотен бандлов, если их нужно от силы 20-30?

среда, 1 сентября 2010 г.

Взаимодействие c OSGi - Проблемы загрузки классов


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

вторник, 31 августа 2010 г.

Взаимодействие с OSGi - Уровни взаимодействия с OSGi


Известный OSGi-евангелист Neil Bartlett начал интересную серию статей о разработке библиотек, способных корректно работать в среде OSGi.

В принципе, многие библиотеки могут работать в OSGi среде, даже если они не предоставляют OSGi-дескриптора (т.е. файла MANIFEST.MF, содержащего поля Bundle-SymbolicName и т.д.), если только они не используют паттерны, создающие проблемы, такие как сканирование ClassPath и вызовы Class.forName(). Данные библиотеки Neil обозначает термином compliant. Другие фреймворки могут более глубоко интегрироваться с OSGi, например использовать сервисы, настраиваться через Config Admin и т.д.

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

пятница, 27 августа 2010 г.

Сервлеты и OSGi: разворачиваем бандлы на GlassFish v3


В ноябре 2008-го года тогда еще живая SUN Microsystems выпустила новую экспериментальную версию сервера приложений с открытым исходным кодом - GlassFish v3 Prelude. С тех пор вышло несколько стабильных версий данного сервера, последней из которых на сегодняшний день является 3.0.1. Отличительными чертами GlassFish v3 являются модульность и расширяемость, обеспечиваемые использованием технологии OSGi (в реализации Apache Felix). Соответственно, с одной стороны GlassFish v3 предоставляет сервлет-контейнер (как часть спецификации JavaEE 6.0), а с другой - OSGi-фреймворк (Apache Felix или Eclipse Equinox), что позволяет добавлять свои бандлы, в которых можно регистрировать сервлеты.

Подробно вопрос регистрации сервлетов с помощью сервиса HttpService рассматривался в предыдущих статьях серии, поэтому сейчас мы сконцентрируемся только на вопросах развертывания бандлов, содержащих сервлеты, на GlassFish v3.

четверг, 26 августа 2010 г.

Запускаем GlassFish v3 на OSGi-фреймворке Equinox


Введение


Одним из преимуществ сервера приложений GlassFish v3 является модульность, которая обеспечивается за счет использования технологии OSGi. По-умолчанию, в качестве OSGi-фреймворка для GlassFish используется Apache Felix, однако имеется возможность запускать данный сервер приложений и поверх другого популярного OSGi-фреймворка с открытым исходным кодом - Eclipse Equinox. Напомню, что на базе Eclipse Equinox построена широкоиспользуемая Java-разработчиками IDE Eclipse, да и вообще вся платформа Eclipse RCP/RAP.

Внимание! Из-за различий в лицензиях GlassFish и Eclipse Equinox сам фреймворк Equinox не поставляется вместе с сервером приложений. Нужно или скачать последнюю версию данного фреймворка или скопировать Jar-файл org.eclipse.osgi_3.x.x.vxxx.jar из имеющейся у вас поставки Eclipse в каталог $GlassFish_HOME/osgi/equinox.

Существует два способа заставить GlassFish запускаться на Equinox: использование переменной окружения GlassFish_Platform и использование опции JVM -DGlassFish_Platform. Рассмотрим эти способы подробнее.

среда, 18 августа 2010 г.

Настраиваем взаимодействие Eclipse - GlassFish v3


Сервер приложений GlassFish является Reference Implementation спецификации JavaEE 6 (так же известной под названием JSR-316), поэтому знакомство с ним будет полезно любому разработчику, планирующему использовать как весь стек JavaEE, так и некоторые его компоненты.

Интегрированная среда разработки Eclipse позволяет упростить взаимодействие с сервером приложений, в частности - автоматизировать создание специфичной для него структуры проекта, облегчить запуск/останов сервера и разворачивание на нем разрабатываемого приложения. Так же очень полезной функцией IDE является обеспечение горячего разворачивания приложения - возможности заменять классы и статический контент "на лету", т.е. непосредственно после компиляции, не прибегая каждый раз к сборке архивов модулей (war, ear, rar, jar) и переустановке приложения целиком. Данная возможность существенно ускоряет разработку и отладку приложения.

суббота, 17 июля 2010 г.

Об использовании возможностей платформы Eclipse из кода на Scheme


В предыдущей статье мы рассмотрели использование плагина к IDE Eclipse - SchemeScript - в качестве удобного и мощного средства для разработки на Scheme. В данной статье рассмотрим, как можно с помощью данного плагина использовать возможности платформы Eclipse, например с целью изучения языка Scheme.

В поставку SchemeScript входит компилятор Scheme-кода в Java-байткод под названием Kawa. Данный компилятор позволяет как вызывать из Java-кода участки программы, написанные на Scheme, так и в Scheme-коде использовать Java-классы. Таким образом обеспечивается полная интероперабельность между Java и Scheme.

пятница, 16 июля 2010 г.

SchemeScript: разрабатываем на языке Scheme в Eclipse



Введение


Scheme - функциональный язык программирования, один из двух наиболее известных в наше время диалектов языка Lisp. Гай Стил (Guy L. Steele) и Джеральд Сассмен (Gerald Jay Sussman) из Массачусетского технологического института (MIT) — создали его в середине 1970-х годов. Именно Scheme долгое время применялся в MIT для обучения программированию (сейчас заменен на Python) и именно на Scheme написаны примеры в знаменитой книге "Структура и интерпретация компьютерных программ" - библии всякого уважающего себя программиста.

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

суббота, 10 июля 2010 г.

Список заданий, которые могут предложить решить дома после собеседования


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

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

Итак задания:

четверг, 8 июля 2010 г.

47-й выпуск The Art of Programming: Реверансы в сторону Eclipse


Когда я был в городе-герое Москве, Виктор Гамов, ака gAmUssA пригласил меня записать подкаст, посвященный выходу новой версии замечательной IDE - Eclipse.

Основные темы подкаста:
- Временные понаехи в Нерезиновске
- Новое в Eclipse Helios: Marketplace, EGit, обновленный JDT.
- Интеграция Eclipse с операционными системами (с удивлением узнал, что хваленая Visual Studio из коробки этого не умеет).
- Новое в Eclipse Communication Framework.

Сам подкаст The Art of Programming слушаю с первого выпуска. Мне показалось, что сначала был выбран не самый удачный формат для программистского подкаста: все же диктовать и объяснять код - не самая лучшая идея. Но потом парни нашли свой формат. Получился очень интересный подкаст о Java, экосистеме Java, сопутствующих технологиях и в целом об IT. Так же нравятся интервью с известными программистами России. Считаю, что парни делают правильное дело.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

вторник, 6 июля 2010 г.

Как включить Mixed mode авторизацию в MS SQL Server 2008 R2 Express Edition


Так получилось, что на девелоперской машине я использую MS SQL Server. Недавно переезжал на своего "малыша" и необходимо было настроить окружение на нем. В частности - поставить MS SQL Server 2008 R2 Express Edition, создать в нем пользователя и настроить его подключение к серверу.

Сразу замечу, что в MS SQL Server 2008 все работало "из коробки", однако в MS SQL Server 2008 R2 настройки по-умолчанию оказались иными. Коротко суть проблемы: создан пользователь, которому указан тип авторизации SQL Server authentication:



При попытке войти этим пользователем в систему, даже если вводить правильную пару логин/пароль выскакивает ошибка:



суббота, 3 июля 2010 г.

Как соединить компьютер под управлением Windows 7 с Linux-машиной по Wi-Fi.


Будучи в городе-герое Москве, Суровый прикупил себе "малыша" - Lenovo X201, на котором установлена новая операционная система от Microsoft. Напомню, что у Сурового так же есть Lenovo T61, на котором установлен Gentoo Linux. Соответственно, возникла задача объединить эти компьютеры по сети, чтобы передавать файлы с одного на другой, а так же использовать на компьютере под управлением Windows 7 интернет-соединение, созданное на Linux-машине.

четверг, 24 июня 2010 г.

Знакомимся: Eclipse Marketplace - все популярные плагины в одном месте


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

Называется репозиторий - Eclipse Marketplace и располагается по адресу. В состав репозитория на сегодняшний день входит 847 утилит (плагинов), 89 приложений и 84 услуги.

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

среда, 23 июня 2010 г.

Вышел Eclipse 3.6 Helios


Сегодня Eclipse Foundation объявили о выходе Eclipse 3.6 Helios.



Помимо IDE для Java и средства разработки плагинов Eclipse PDE в состав релиза вошли 39 проектов среди которых WTP (JavaScript + HTML + CSS), среды разработки для C/C++ и PHP, средство моделирования бизнес процессов - Eclipse BPMN, утилиты для построения сервисно-ориентированных систем - Eclipse SOA Tools, конечно же Eclipse Communication Framework и Eclipse Rich Ajax Platform. Полный список проектов доступен здесь.

Основной новостью года стала поддержка распределенной системы контроля версий Git "из коробки" с помощью плагина EGit, что послужило толчком к переводу на Git некоторых Eclipse-проектов.

Еще одним интересным нововведением стал единый репозиторий популярных плагинов - Eclipse Marketplace. Сам Eclipse IDE содержит удобный клиент для Marketplace, позволяющий установить нужный вам плагин за 2-3 клика.

Официальная страница релиза находится здесь: Eclipse Helios, скачать же можно по адресу.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

вторник, 15 июня 2010 г.

Про моноиды (с примерами на F#)


Введение

Apocalips порадовал статьей, в которой четко и доходчиво объяснил что такое моноид применительно к алгебре над списками и теории категорий. В данной заметке представлен очень вольный перевод его статьи, снабженный примерами на F# (у Apocalips'a примеры на Scala).

Прежде всего рассмотрим обобщенное определение моноида:

  1. type IMonoid<'T> =

  2.    abstract member mempty : 'T

  3.     abstract member mappend : 'T * 'T -> 'T



Другими словами, моноид заданного типа 'T - это объединение двух элементов: функции mappend: 'T -> 'T -> 'T и значения mempty: 'T. Для моноида должны выполняться следующие правила:

1. Функция mappend должна быть ассоциативна, т.е. mappend (x, mappend(y, z)) == mappend(mappend(x, y), z).
2. Значение mempty должно быть единицей функции mappend, другими словами: mappend(x, mempty) == mappend (mempty, x) == x

понедельник, 7 июня 2010 г.

Впечатления сурового челябинского программиста от AgileDays Екатеринбург


Суровый челябинский программист в пятницу, четвертого июня, побывал на интересном IT-мероприятии, которое проводилось в славном городе Екатеринбурге. Организаторами выступали СКБ Контур и ScrumTrek, генеральным спонсором являлась компания Naumen. Фотографии, темы докладов и некоторая информация об основных действующих лицах доступна на официальном сайте конференции, не знаю, правда, будет ли выложено видео. Здесь же я хочу поделиться своими впечатлениями.

Во-первых, конечно, самое главное - доклады и информация. Лично я езжу на конференции редко и только за этим, хотя такую точку зрения разделяют далеко не все. Судя по твиттеру, основную массу народа больше беспокоило отсутствие WiFi. Мне как человеку от управления проектами далекому и с Agile, Scrum, прочими XP и TDD не работавшему было интересно, хотя информационная составляющая могла быть несколько получше. На конференции было представлено девять докладов (исключая вступительные слова и доклад Максима Гапонова, который не состоялся):

понедельник, 17 мая 2010 г.

Знакомимся: RSS/Atom парсер/генератор для Java - проект ROME


Введение


Форматы RSS/Atom активно используются для синдикации данных. Многие пользователи сети Интернет уже не представляют свою жизнь без использования RSS/Atom агрегаторов для чтения блогов, новостных лент, получения бизнес-информации и т.д. Даже архивы списков почтовых рассылок доступны с помощью RSS. Atom, в свою очередь, так же используется как один из форматов взаимодействия с RESTfull сервисами.

В связи с широкой распространенностью RSS и Atom лент необходимо программное обеспечение для их генерации и разбора (парсинга), причем желательно в некоторую объектную модель API работы с которой проще чем DOM. Для решения данной задачи в мире Java существует библиотека com.sun.syndication, которая так же называется проект ROME. Последняя версия библиотеки - 1.0 - выпущена в марте 2009-го года.

суббота, 15 мая 2010 г.

Сервлеты и OSGi: Equinox в сервлет-контейнере. Equinox Servletbridge


Наконец-то пришло время рассмотреть, как выполняется развертывание приложения, основанного на OSGi, в обычном, а не приспособленном специально для Equinox, сервлет-контейнере (или сервере приложений, в дальнейшем будем употреблять только термин "сервлет-контейнер"), таком как Tomcat, GlassFish, IBM WebSphere и т.д.

пятница, 14 мая 2010 г.

Eclipse RCP: Сборка и развертывание RCP-приложения. Понятие "Продукт"


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

Проект состоит из двух частей: файла с расширением product в котором хранятся все специфичные для приложения настройки (иконки и т.д.) и точки расширения org.eclipse.core.runtime.products с помощью которой продукт регистрируется в реестре. Рассмотрим подробно создание продукта с помощью встроенного в Eclipse PDE редактора и развертывание приложения с помощью соответствующего визарда. Все примеры приведены для Eclipse Helios, запущенного под ОС Gentoo GNU/Linux.

Знакомимся: EclipseLabs - новая инициатива от Eclipse Foundation и Google


Eclipse и Google анонсировали новую инициативу под названием EclipseLabs. Давайте познакомимся с ней подробнее.



Известно, что сообщество разработчиков для платформы Eclipse создало огромное количество как коммерческих, так и плагинов с открытым исходным кодом. В мире открытых исходников существует два пути создания проекта: подать заявку на официальный Eclipse-проект, который будет размещаться на сайте eclipse.org или создать проект на существующем сервере, предоставляющем хостинг проектов с открытым кодом, таком как Google Code, SourceForge или Codehaus. Создать проект на хостинге Eclipse сложно - нужно пройти довольно нудный IP-процесс. В то же время, есть большая вероятность, что проект на том же Google Code никто не заметит.

Теперь существует еще один способ, объединяющий преимущества двух вышеописанных. Можно создать проект на Google Code без необходимости проходить IP-процесс, но в то же время видимый всеми, интересующимися платформой Eclipse или ищущими плагин под эту замечательную IDE. Данный способ прост - разместить проект в специализированном репозитории Eclipse-проектов - Eclipse Labs.

воскресенье, 9 мая 2010 г.

Eclipse RCP: О понятии RCP Application


В прошлый раз я обещал написать про то, как деплоить OSGi-приложение в сервлет-контейнерах, отличных от Jetty. Для решения данной задачи используется Equinox ServletBridge, однако, прежде чем разбираться с данным механизмом, необходимо вникнуть в основы построения и деплоймента Eclipse RCP-приложений. О деплойменте поговорим чуть позже, а сегодня разберемся с тем, что такое "приложение" в терминах Eclipse RCP.

Приложением называется класс, реализующий интерфейс IApplication. В каком-то смысле приложение является точкой входа в Eclipse RCP и является аналогом метода main Java или C/C++ программы. В поставку Eclipse Plugins Development Environment включено несколько примеров приложений. Вот код класса, реализующего интерфейс IApplication из примера Hello RCP:

вторник, 27 апреля 2010 г.

Сервлеты и OSGi: будь проще и люди к тебе потянутся


Данную заметку можно рассматривать как продолжение предыдущей - О любви и дружбе между сервлетами и OSGi. Рассмотрим еще один способ регистрации сервлета в OSGi-контейнере - использование декларативных сервисов.

Использование декларативных сервисов обеспечивает следующее преимущество по сравнению с использованием точек расширения и сервис-трекера: OSGi контейнер в этом случае сам управляет жизненным циклом бандла. Имеется ввиду следующее: в декларативном сервисе определяются методы регистрации зависимостей и старта/останова сервиса. Пока все зависимости не будут удовлетворены - сервис не будет запущен. Таким образом гарантируется, что в момент запуска декларативного сервиса регистрации сервлета, сервис HttpService будет доступен. Данное обстоятельство позволяет существенно упростить код регистрации сервлета, сделать его короче и понятнее. К тому же, в случае использования декларативных сервисов, нам не нужен активатор бандла.

воскресенье, 25 апреля 2010 г.

ECF: Пишем SOAP-клиента на примере использования веб-сервиса "Аэрофлота"


В версии 3.2 Eclipse Communication Framework появилась возможность разрабатывать клиенты к SOAP-сервисам (до этого была возможность использовать только REST-сервисы), используя Remote Services API. Инкапсулирована данная возможность в бандле org.eclipse.ecf.remoteservice.soap.

Есть одно радикальное отличие в реализации ECF-клиента к SOAP веб-сервису от реализации клиентов к другим типам удаленных сервисов. Дело в том, что бандл org.eclipse.ecf.remoteservice.soap содержит лишь набор неких базовых классов, конкретный же контейнер, представляющий собой клиента к конкретному веб-сервису, придется писать самостоятельно. Точно так же самостоятельно придется реализовывать непосредственно логику обращения к веб-сервису, используя для этого такие библиотеки, как Axis, Axis 2 или XFire.

Давайте рассмотрим пример - реализуем бандл, name.samolisov.ecf.webservices.demo, который будет содержать удаленный сервис, инкапсулирующий обращение к некоторым методам веб-сервиса компании "Аэрофлот". WSDL-описание веб-сервиса компании "Аэрофлот" расположено здесь. Данный сервис предоставляет информацию об аэропортах, рейсах, предоставляет табло прилетов и табло вылетов. Мы реализуем обращение к следующим методам: AirportList - предоставляет список аэропортов, в/из которые/ых летают самолеты "Аэрофлота", AirportInfo - возвращает информацию об аэропорте по его коду и метод Arrival - принимает код эропорта, дату, поле по которому будет осуществляться сортировка и направление сортировки и возвращает табло прилетов для данного аэропорта на данную дату, отсортированное по указанным критериям. Мы реализуем обращение к данному методу, с сортировкой по аэропорту по возрастанию.

суббота, 17 апреля 2010 г.

Параллельный Reduce: математические основы и пример реализации на Java


В данной статье рассмотрены понятия свертки и ссылочного гомоморфизма, их взаимосвязь, приведен пример построения многопоточного Reduce и сравнение его скорости работы с однопоточным вариантом на примере анализа данных с сервера РТС. В дальнейшем планирую развить данную работу и реализовать MapReduce с помощью R-OSGi.

понедельник, 12 апреля 2010 г.

Сервлеты и OSGi: о любви и дружбе между сервлетами и OSGi


Как известно, одной из основных областей применения языка и платформы Java является разработка веб-приложений, по крайней мере в России, если ищут программиста на данном языке, то в описании вакансии как правило указывают J2EE, Servlets, JSP, JSF и прочие умные слова. В сферу моих интересов входит разработка модульных приложений с использованием технологии OSGi и у меня есть хорошая новость: сервлеты тоже могут быть модульными и могут интегрироваться с данной технологией.

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

воскресенье, 11 апреля 2010 г.

Об использовании динамических Proxy-классов в Java


Динамические прокси-классы


Сегодня мы поговорим о такой интересной особенности JVM, как динамические прокси-классы. Предположим, что у нас есть класс A, реализующий некоторые интерфейсы. Java-машина во время исполнения может сгенерировать прокси-класс для данного класса A, т.е. такой класс, который реализует все интерфейсы класса A, но заменяет вызов всех методов этих интерфейсов на вызов метода InvocationHandler#invoke, где InvocationHandler - интерфейс JVM, для которого можно определять свои реализации.

воскресенье, 4 апреля 2010 г.

Работаем с F# в Emacs


Сегодня мы поговорим о том, как использовать замечательный редактор Emacs для разработки на языке F# от одной небезызвестной корпорации.

Не секрет, что синтаксис языка программирования F# был чуть менее, чем целиком позаимстован с синтаксиса OCaml, поэтому, чтобы на нем было удобно программировать в Emacs - достаточно адаптировать режим для OCaml, добавив работу с отступами, потому что в F# как и в Python отступы имеют значение, и с интерпретатором fsi. К счастью работа по адаптации уже проведена: Laurent Le Brun создал fsharp-mode, который хостится на SourceForge. Проект сейчас находится в стадии alpha, однако умеет следующее:

1. Подсветку синтаксиса.
2. Работу с отступами: автоматическую расстановку отступов, сдвиги блоков кода влево-вправо и т.д.
3. Работу с интерпретатором F# - fsi.exe. Можно отправлять произвольные блоки кода на интерпретацию нажатием комбинации клавиш и видеть результат интерпретации в отдельном интерактивном буфере.

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

среда, 31 марта 2010 г.

Hibernate: это должен помнить каждый - 2


При определении идентификатора - первичного ключа - таблицы в Hibernate можно явно указать стратегию генерации его значения. Делается это в мэпинге с помощью тега generator, у которого указывается атрибут class. Например, так:

<id name="uid" column="uuid" type="string" length="32">

   <generator class="ru.naumen.bpm.commons.util.PrefixUUIDGenerator"/>

</id>


Помимо того, что можно определить свою стратегию генерации как класс, реализующий интерфейс org.hibernate.id.IdentifierGenerator, фреймворк содержит ряд уже готовых генераторов. Рассмотрим их подробнее.

суббота, 27 марта 2010 г.

Имитируем алгебраические типы данных в языке Java


Продолжаем тему внедрения элементов функционального программирования в процесс разработки на императивном языке Java. Сегодня мы поговорим о красоте такого понятия как алгебраический тип данных. Интуиция, лежащая при создании такого понятия, и его использование хорошо описаны в статье Евгения Кирпичева "Элементы функциональных языков", опубликованной в 3-м номере журнала Практика функционального программирования . Если вам интересно, то подробное математическое обоснование понятия "алгебраический тип данных" можно прочитать в статье Романа Душкина "Алгебраические типы данных и их использование в программировании", опубликованной во 2-м номере того же журанала. В дальнейшем, обещаю не использовать такие термины, как "размеченное объединение", "декартово произведение", "нотация Хоара" и т.д.

Моя же статья является упрощенным переводом Structural Pattern Matching in Java с некоторыми дополнениями.

понедельник, 22 марта 2010 г.

Впечатления от Computer Science E-days


С 19-го по 21-е марта в загородном учебном центре Аракуль на берегу одноименного озера прошла школа Computer Science E-days, организованная усилиями компаний СКБ-Контур, Яндекс и отделения Microsoft Research.

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

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

воскресенье, 28 февраля 2010 г.

Особенности создания и подвижения блога программиста


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

суббота, 20 февраля 2010 г.

Устанавливаем F# и FSharp.PowerPack под Mono


Суровому челябинскому программисту захотелось экзотики. А что у нас является экзотикой? Правильно - продукция маленькой и незаметной компании из Redmond'а. В частности - ее платформа .NET и набирающий популярность функциональный язык программирования F#. Вот об установке этого чуда под Mono - открытую реализацию CLR под *nix подобные ОС мы и поговорим.

Прежде всего следует установить сам Mono, причем версии 2.0 или выше. В дереве портежей сейчас присутствует версия 2.4.2.3, которая легко устанавливается следующей командой:

pavel> sudo emerge mono

Теперь нам нужно скачать последний Community Technology Review (CTP) языка F# по ссылке Download the F# CTP, расположенной на странице (как я понял для каждого нового CTP ссылка на него меняется, в частности февральский можно скачать отсюда). Не забываем, что скачивать нужно ZIP-архив.

четверг, 18 февраля 2010 г.

ECF: Пишем ICQ-бота с использованием Habra API


В статье Немного подробнее о проекте CaffeineIM и ICQLib я уже писал, что занимаюсь разработкой провайдера для Eclipse Communication Framework, реализующего работу с OSCAR/ICQ протоколом. Сейчас реализованы все основные API, в частности, ChatManager - часть Presence API, которая позволяет обмениваться сообщениями.

Реализация провайдера содержится в бандле org.eclipse.ecf.provider.oscar, код которого расположен в CVS-репозитории pserver://ecf1.osuosl.org/ecf (каталог plugins/org.eclipse.ecf.provider.oscar).

В качестве примера напишем ICQ-бота, который будет сообщать информацию о карме, хабрасиле и рейтинге пользователя. Так как ECF спроектирован очень грамотно и в нем абстракция (т.е. API) довольно хорошо отделена от реализации (контейнеров), то можно взять код написанного ранее Jabber-бота, реализующего те же функции.

суббота, 30 января 2010 г.

Используем Hibernate в OSGi-среде


В предыдущем посте суровый челябинский программист обещал рассказать про особенности использования Hibernate в OSGi-среде. Точнее в среде Equinox. Чтож, приступим.

Прежде всего давайте разберемся с тем, что мы хотим. Будем исходить из следующих требований:

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

2. Все дополнительные средства (c3p0, jdbc-драйвера, oscache, hibernate.cfg.xml) выносим в отдельные фрагментные бандлы. Это позволит заменять используемые средства при необходимости (например, вместо oscache использовать ehcache).

3. Хибернейтовская сессия должна быть доступна любому бандлу, импортирующему бандл с hibernate, поэтому мы ее выносим в сервис.

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

5. Должна быть реализована опциональная поддержка мэпинга на основе hibernate-annotations, т.е. должен быть реализован отдельный бандл, который инкапсулирует hibernate-annotations и ejb3-persistence, а также позволяет регистрировать аннотированные классы.

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

С требованиями разобрались, приступим к реализации. Создать бандл, инкапсулирующий хибернейт довольно просто - достаточно создать в бандле каталог lib и поместить туда следующие библиотеки:

- cglib-nodep.jar
- dom4j.jar
- hibernate3.jar
- jta.jar

Внимание: я описываю ситуацию для Hibernate 3.2.0 GA. Насколько я знаю, в новых версиях Hibernate есть изменения, в частности, касающиеся логера. Впрочем, эти изменения непринципиальны

пятница, 29 января 2010 г.

"Дружественные" бандлы или еще немного о расширении classpath в OSGi-приложениях


Продолжаем тему решения проблем с загрузкой классов в OSGi-приложениях. Рассмотрим такую ситуацию: у нас есть бандл A, где-то внутри которого используются классы из других бандлов. Причем, используются они по-разному, в том числе и производится загрузка этих классов по имени. Чтобы класс можно было загрузить, он должен присутствовать в classpath (подробнее про загрузку классов я писал в статье Пишем свой загручик java-классов). Classpath бандла формируется из двух частей: классы, присутствующие в самом бандле (задаются директивой Bundle-ClassPath) и классы, импортируемые из других бандлов (задаются директивами Import-Package и Require-Bundle). Так вот, проблема такая: мы хотим расширять возможности бандла A с помощью других, которые предоставляют ему свои классы. По понятным причинам мы не можем каждый такой дополнительный бандл добавлять в Import-Package/Require-Bundle бандла A. Вопрос: как быть?

Кстати, вы уже поняли к чему я клоню? Именно так используется Hibernate: есть один бандл, который содержит внутри себя Hibernate и какие-то механизмы его инициализации, а другие бандлы этот Hibernate используют. Но! Чтобы использовать Hibernate, он должен иметь возможность загружать классы сущностей, используемые в мэпингах и HQL-запросах. Понятно, что не хочется добавлять каждый бандл, использующий Hibernate в манифест хибернейтовского бандла, т.к. это убивает всю идею. модульности.

понедельник, 25 января 2010 г.

Расширяем ClassPath бандла с помощью фрагментов (на примере логирования)


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

Давайте рассмотрим следующую ситуацию: мы хотим использовать в нашем OSGi-приложении логирование с помощью log4j. Ситуация, кстати, не такая уж и редкая. В проект Orbit входит бандл org.apache.log4j, который инкапсулирует данную библиотеку и экспортирует ее packages. По идее, достаточно добавить данный бандл как зависимость (через Require-Bundle или Import-Package) и наслаждаться жизнью, но не тут то было. Дело в том, что log4j нужно конфигурировать, т.е. в корне classpath должен находиться файл log4j.properties, с примерно таким содержимым:

вторник, 19 января 2010 г.

Немного подробнее о проекте CaffeineIM и ICQLib


Здравствуйте, уважаемые читатели. Сегодня немного необычный пост: Суровый программист будет рассказывать не о том, что сделано другими, а о том, чем иногда занимается он сам. Конкретнее - речь пойдет о написанной исключительно Just for fun Java-библиотеке, предназначенной для создания ICQ-клиентов.

Библиотека называется ICQLib и ее исходники можно невозбранно взять на Google Code. В 2007-м году был сделан форк мертвой на тот момент JOscarLib, возможности которого были существенно расширены и добавлена работа с русским языком (в кодировках UTF-8/cp1251). Кстати, злая ирония судьбы: примерно год назад JOscarLib начал развиваться, а работа над нашей библиотекой заглохла (энтузиазм иссяк), но сейчас я решил возродить проект и продолжить работу над ним.

На текущий момент ICQLib обладает следующими возможностями:

- Дополнительные статусы QIP (депрессия, на работе, дома и т.д.)

- X-статусы. Полная реализация, аналогичная возможностям QIP.

- Корректная поддержка русского языка. Подразумевается: отправка-прием сообщений, содержащих кирилицу, информация о себе на русском, информация о контактах, запрос авторизации, x-статусы.

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

- Работа с мета-информацией. Реализованы все запросы метаинформации о контакте (About user).

воскресенье, 10 января 2010 г.

Как подключить Samsung i5700 (Spica) к Linux


По просьбам читателей публикую краткую инструкцию о том, как подключить Samsung i5700 (Spica) к компьютеру под управлением операционной системы GNU/Linux.

Данный процесс имеет два аспекта:

1. Подключаем телефон как флеш-накопитель
После подключения телефона к компьютеру с помощью переходника MicroUSB -> USB на панели уведомлений телефона появится надпись Подключение USB, которая затем пропадет и на панели останется только иконка USB-подключения. После этого можно войти в уведомления и выбрать Подключение USB. Появится диалоговое окошко с вопросом разрешить ли монтирование флеш-карты телефона. После нажатия кнопочки Монтировать телефон будет доступен как внешний флеш-накопитель. Файловая система флешки - FAT 32, поэтому ядро должно быть собрано с поддержкой данной системы.

Для упрощения процесса существует программа MountUSB, скачать которую можно отсюда.

Еще один момент. В отличие от подключения телефона к Windows-машине, галочка в настройках Сведения о телефоне -> Дополнительные параметры -> Запоминающее устройство может быть отключена.

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

1. Отключить в настройках телефона галочку Сведения о телефоне -> Дополнительные параметры -> Запоминающее устройство.

2. Включить в настройках телефона галочку Приложения -> Разработка -> Отладка USB.

3. Скачать патченный adb версии от июля 2009-го года по ссылке. Вообще, его делали для Galaxy, но он подходит и для Spica. Патченный adb можно поместить в <android-sdk>/tools/, предварительно сохранив имеющийся.

4. Создать файл /etc/udev/rules.d/51-android.rules с содержимым:

SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"

Данный файл нужно сделать исполняемым (chmod +x), после чего перезапустить udev (/etc/init.d/udev restart), чтобы новый конфиг был считан.

5. Сделать первое сканирование от root:
$ sudo ./adb devices

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

З.Ы. Если вдруг после манипуляций с телефоном (особенно с галочкой Приложения -> Разработка -> Отладка USB) adb перестает видеть устройство - необходимо перезапустить adb-server, выполнив следующие команды от root:

# ./adb kill-server
# ./adb devices

Как видим подключение телефона к машине с Linux даже проще, чем к Windows: как минимум не нужно устанавливать никакие драйвера и сторонние приложения.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

вторник, 5 января 2010 г.

Первые впечатления от Android и Samsung i5700 (Spica)


Прошли праздники (хотя, у кого - как, а у нас еще 5 дней каникул) и Суровый челябинский программист стал счастливым обладателем телефона Samsung i5700 на базе замечательной операционной системы Android 1.5, о чем собственно и хочется поговорить.

Сначала, почему Android? Прежде всего потому что это - открытая и динамично развивающаяся платформа. Причем развивается как сама платформа (к весне Samsung обещает обновления для i5700 на Android 2.0), так и появляются новые приложения под нее. Во-вторых, основным системным языком является Java, которым я довольно уверенно владею и который мне нравится, особенно по сравнению со всякими плюсами, а особенно - с урезаными версиями этих плюсов, использующимися в Symbian. В-третьих, наличие единого репозитория для приложений - Android Market, доступ к которому для России уже открыт (правда пока только к бесплатным программам, которых, впрочем, очень много).



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