На этом сайте я постарался собрать информацию, относящуюся к информационным технологиям в моей жизни. В частности, о проектах, которыми я занимался из интереса к Java в ее современных проявлениях. Поэтому предупреждаю о справочном характере страниц, собранных здесь =) Начать можно с этой странички …
В рамках развития информационной системы управления салоном красоты «МойСалон», уже около 10 лет успешно существующей и внедренной в десятки салонов России, его автором была выдвинута идея создания web-версии программы на базе одного из AJAX-фреймворков. Преследуя исследовательские и познавательные интересы, я занялся созданием макета и для начала разработал приблизительный проект прототипа, максимально независимый от конкретной библиотеки. В качестве двух возможных библиотек были выбраны Vaadin и SmartGWT. Развитие прототипа продолжилось с последней, поскольку именно она обеспечивает наибольшее кеширование страниц на стороне пользователя, максимально разгружая сервер от частых запросов.
Ядром исходной информационной системы является приложение на C++/MFC. Начальной задачей прототипирования было выбрано создание аналога журнала клиентов, одного из нескольких доступных пользователю журналов. Интерфейс журнала клиентов представлен ниже:
Очевидно, что основной элемент интерфейса – это список клиентов, который можно редактировать, а наиболее сложный элемент – это множество форм, доступных через различные закладки. Стоит отметить, что остальные журналы в той или иной степени следуют этому шаблону интерфейса.
В основу разработки был положен шаблон MVP «Model-View-Presenter», представляющий собой усовершенствованный вариант Model-View-Controller, в котором Model избавлена от функций хранения состояния интерфейса, а также может не участвовать в качестве обязательного посредника View-Controller(Presenter).
Создание объектов Model, View, Presenter было основано на шаблонах Factory Method и Abstract Factory, как показано на диаграммах ниже.
Иерархия классов для View (JournalAppGWT и EmployeeJournalApp – начальные классы для SmartGWT и Vaadin, соответственно):
Аналогичный подход использовался для создания объекта-модели. Инициализация модели, представления и объекта Presenter в коде GWT выглядит так:
//Создать подходящую модель
IModelFactory modelFactory = AbstractModelFactory.createModelFactory(AppTypes.getCurrentImpl());
IModel model = modelFactory.createModel(AppTypes.getCurrentType());
//Создать главное View
IViewFactory viewFactory = AbstractViewFactory.createViewFactory(AppTypes.getCurrentImpl());
IJournalView mainView = viewFactory.createMainView(AppTypes.getCurrentType(), model);
//Создать главный Presenter
JournalAppPresenter journalPresenter = new JournalAppPresenter(mainView, model);
//Поместить интерфейс на страницу
RootPanel.get("journalContainer").add((Widget)mainView.asWidget());
В данном коде учитывается разделение объектов по типу журнала (AppTypes.getCurrentType()) и по типу реализации интерфейса, то есть используемой AJAX-библиотеки (AppTypes.getCurrentImpl()). Конкретные объекты модели и представления размещены в соответствующих пакетах, например (SG = Smart Gwt):
com.mysaloon.ui.smartgwt.client.model.EmployeeModelSG
com.mysaloon.ui.smartgwt.client.view.EmployeeJournalViewSG
Абстрактные интерфейсы для model и view:
com.mysaloon.ui.core.view.IJournalView<T>
com.mysaloon.ui.core.model.IModel<T>
- параметризованы типом сущностей, отображаемых в основном списке журнала.
За обработку событий отвечает Presenter. Он реализует интерфейс EventHandler и посылает запросы на обновление View при обработке соответствующих событий. Например:
private void registerForEvents() {
EventBus.getInstance().addHandler(this, DataChangeEvent.class);
//... подписка на другие типы событий ...
}
public void handleEvent(Event e) {
if (e instanceof DataChangeEvent) {
onDataChange((DataChangeEvent)e);
} else if ... ...
private void onDataChange(DataChangeEvent e) {
mainView.refreshListFromModel(selectedItemIndex);
itemsCount = model.getItemList().size();
}
Диаграмма для Presenter’а и связанных с ним классов:
Серверная часть приложения реализована для варианта SmartGWT при помощи средств GWT для создания сервлета, обрабатывающего клиентские запросы. Вот фрагмент клиентского кода:
public class ModelSG<T extends Persistent> implements IModel<T>{
EmployeeDAO реализовано при помощи Hibernate …
Информацию о моей персоне можно почерпнуть из:
Резюме в формате .doc
[по-английски]
[по-русски]
Yury Yakovlev
Objective Java (Java EE) developer
Summary
- Profound knowledge and 6-year experience with Java. Sun Certified Java Programmer (March 2010, 98%, Java SE 6)
- Good knowledge of Java EE technologies (Servlets, JSP, EJB, JMS). Experience with Spring, Hibernate, SQL, JDBC. Design patterns.
- Extensive experience in the full cycle of a database application development, involving:
- conceptual and physical DB design(for MySQL, MS SQL, Oracle)
- DB schema creation and management(using SQL or Hibernate)
- DB access layer in the application
- Basic experience with Stripes MVC, Spring MVC, GWT
- Experience in development of software systems “from the scratch”(e.g. Coverage Data Finder for my PhD thesis, Supermarket Demo for my Java EE courses)
- Additional skills include C#, C/C++, Perl and other languages
See detailed skill information in the bottom of this document
Experience
12.2009-05.2010 Web startup project “Pozapisi.ru” Programmer
Projects | Programming languages and technologies | Tasks |
12.2009-04.2010
pozapisi.ru |
Java
Stripes MVC framework, servlets, JSP, Hibernate, Freemarker |
|
05.2010 Project design draft for web implementation of «MySaloon» application | Java
SmartGWT Hibernate |
|
01.2008-11.2010 Interactive Brokers Rus Programmer
Orders processing server (ccp) | C++, Perl |
|
02.2009-06.2009, 11.2010 Java EE tutor/consultant
Projects | Programming languages and technologies |
02.2009-06.2009
A course of 7 lecture/prac-tice blocks |
Java EE 5 technologies. Servlets, JSP, Application servers (Glassfish 2.1, JBoss 5), EJB 3.0, JPA, JMS, Security, Web Services, REST, CORBA
Courses site: |
11.2010
“Super-market” demo project |
EJB 3, JMS, Servlets/JSP, Spring, Spring MVC
The project is deployed online at: http://www.yyakovlev.ru:8081/status.jsp The source is at http://www.yyakovlev.ru/svn/supermarket The business layer (EJB 3) handles purchase requests, controls cash desks via JMS. Two web monitoring applications are based on Spring MVC and plain jsp/servlets. Multi-thread cash desk emulator is based on Spring. |
11.2006-12.2008 FutureTrade Rus (acquired in 2008 by Interactive Brokers) Programmer
FT Trading System support | Java, Ant, JUnit, Spring |
|
08.2003-10.2006 Siemens COM FN (Fixed Networks) Java programmer
Worked at hiR200 (Interactive Voice Responder) project. Developed the VoiceXML browser module including DTMF interpreter, implemented new features (content server redundancy, additional announcements functionality), performed faults corrections (thread unexpected locks, module interaction faults) for the modules of the IVR. Was responsible for production and installation scripts, configuration management (ANT, InstallShield, UNIX shell. ClearCase)
09.2003-06.2006 IFMO University – Postgraduate courses Postgraduate
Implemented Coverage data generation system in C# using ANTLR parser. It was the implementation of the improved methods of white-box test data generation, including Pascal source parsing, Control Flow graph and path construction, dynamic program execution and analysis.
09.2001-06.2003 Siemens Business Services , Russia Programmer
Worked in projects: “Skills Profile”, “Universal Data Access Manager”, “NLP Engine”. Developed DB structure, SQL queries, Java and C# components for interaction with DB.
01.2001-05.2001 Artificial Life Rus. Programmer
Worked in “Smart Bot Suite” project. Developed Java utilities; SQL queries for statistics reports.
09.2000–12.2001 Remote Education Center of IFMO university Programmer
- Remote Education System Development(Java: GUI, access to the Oracle database)
- Development of the Web-system for Remote System resources accounting (Perl, Postgres)
Education
2003 – 2006 IFMO postgraduate courses, PhD degree (Candidate of Technical Science).
Directions of investigation: automatic test-data generation for structural coverage in program testing
1997–2003 Saint-Petersburg Institute of Fine Mechanics and Optics (Technical University) – IFMO,
Faculty of Computer Technology, Computer Science department. Degree of Master of Technology.
2 years of studies of C/C++, 1 year of studies of Java at the University.
2000-2001 Programming Academy (Courses of Java – 0.5 years, Servlets, JSP, Design Patterns, Oracle – 0.5 years. Graduation project: was CORBA-based distributed application)
Computer skills
Programming, scripting and query languages knowledge:
Java SE 6, SQL, Oracle PL/SQL, C/C++ – advanced
MS Transact-SQL, C#, HTML, CSS, Javascript, PHP, Delphi, Perl – good
Frameworks, libraries and technologies:
Hibernate, Spring, Stripes, JSP, Servlets, JMS, EJB, JDBC – good
Application servers:
JBoss4/5, Glassfish 2.1, Tomcat 6.0
Version control and bug tracking:
SVN, CVS, ClearCase. Bugzilla, dotProject, Mantis, TeamCity
Build and testing tools:
Ant – advanced. JUnit – good.
OS experience (as a user):
Windows XP, UNIX-based systems: SunOS, Red Hat Linux, Ubuntu
DB experience (as application developer and database developer):
MySQL 5.0, Java DB (Derby), Oracle 8/8i, MS SQL Server 2000, 2005.
|
В 2009 году я подготовил и провел для одной из организаций курсы по базовым понятиям Java Enterprise Edition и некоторым сопутствующим темам. В программу вошли: HTML, CSS, Javascript, основы Java, сервлеты, JSP, EJB, Java Persistence API, web-сервисы (классические и REST), администрирование серверов приложений. Поскольку слушатели были программистами, то они быстро разобрались с материалом, самые заинтересованные успешно сделали все практические задания. Для курсов я подготовил сайт с материалами и учебными заданиями , а в дальнейшем - демо-проект по технологиям Java EE
На этапе раннего развития startup-проекта pozapisi.ru я принял участие в разработке и создал «главную страницу»(dashboard) – сейчас она называется «Личный кабинет», написал систему уведомлений по почте и на дешборде о прошедших событиях (запись клиентов – создание, изменения и т.д.), несколько форм (в частности, начальную версию редактирования профиля). Использовал Stripes , JSTL, Hibernate, Freemarker (для шаблонов уведомлений).
Вот описание проекта и информация о разработчиках
Свою диссертацию «МЕТОДЫ ОПРЕДЕЛЕНИЯ ВХОДНЫХ ДАННЫХ, ОБЕСПЕЧИВАЮЩИХ ЭФФЕКТИВНОЕ ТЕСТИРОВАНИЕ ПРОГРАММ» я защитил в июне 2006 года, готовил ее на кафедре Информатики и прикладной математики СПбГУИТМО. Здесь можно посмотреть полный текст и автореферат.
Работающий проект можно посмотреть по адресу: http://www.yyakovlev.ru:8081/status.jsp, его исходный текст – здесь. Проект стал дополнением к материалам моих курсов по Java EE.
Целью разработки проекта «Супермаркет» была демонстрация применения основных технологий Java EE 5 на практике: EJB-компоненты и их клиенты, JSP и сервлеты в рамках принципов MVC, JMS. Позднее я добавил Spring в основу приложения-клиента и Spring MVC для web-интерфейса по продуктам. Я начинал разработку, готовясь к последним лекциям своих курсов в 2009 году. На заключительном занятии я демонстрировал создание «с нуля» тогда еще прототипа будущего проекта, на базе Glassfish 2.1 и Netbeans 6.5. Эпизодически возвращаясь к разработке, я получил следующий результат.
В супермаркете имеется N касс (C.R. – cash registers), которые моделируются N потоками выполнения. Касса, запустившись, оказывается в состоянии бездействия (IDLE), затем в ответ на управляющую команду открывается (OPEN), через случайный промежуток времени начинает оформление покупки (SERVICE), добавляя произвольное количество продуктов, по завершении покупки снова оказывается в состоянии OPEN. В ответ на управляющую команду закрытия касса снова IDLE. Управляюшая команда реализуется как JMS-сообщение, отправляемое EJB CRMonitorBean.
Кассы являются удаленными EJB-клиентами, использующими следующие компоненты:
- CRMonitorBean – stateless EJB – получает от касс сообщения об их состоянии через Message-Driven Bean CRMonitorBeanMDB, обновляет и выдает по запросу внутреннюю таблицу состояний касс, и периодически (на основе сервиса EJB Timer) вычисляет, какие кассы должны изменить состояние (закрыться или, наоборот, открыться). Эти вычисления основываются на данных о текущем количестве покупателей в супермаркете. Количество покупателей меняется, когда через CRMonitorBeanMDB приходит новый CustomerEvent.
- PurchaseManagerBean – stateful EJB – выполняет базовые этапы покупки: создание новой покупки (open()), добавление продукта (add()), завершение покупки (close()), отмена (abort()). Данные о покупке накапливаются в полях бина и сохраняются в БД (em.persist()) только в методе close(), однако поле «Количество» для покупаемых продуктов уменьшается сразу в методе add(), чтобы другие кассы не могли «взять больше, чем есть». Во время отмены покупки все «заранее взятое» количество «возвращается назад».
- ProductManagerBean – stateless EJB – выполняет CRUD-операции для продуктов (Product) и их категорий (Category)
- CustomerManagerBean – stateless EJB – выполняет CRUD-операции для клиентов(Customer)
Общая схема обмена сообщениями показана на диаграмме:
Кассы построены на основе Spring с учетом требований:
- Автоматическое определение того, клиентом какого сервера приложений (JBoss или Glassfish) является приложение, на основе библиотек в classpath
- Ожидание в случае недоступности сервера (число попыток и интервал между ними конфигурируются)
- Все основные компоненты, в том числе потоки выполнения (cashRegisterThread, customerTrackerThread, leftIdleCustomerTrackerThread), описываются в файле конфигурации Spring – applicationContext.xml
Основной файл конфигурации applicationContext.xml
Spring-бины основного файла конфигурации перечислены ниже:
Файл конфигурации тестового приложения testApplicationContext.xml
Ниже приведена ER-модель базы данных. БД отражает состав покупок, данные о покупателях, количество и распределение продуктов по категориям. В качестве сервера БД использовался MySql 5.0.
Доступ к БД выполняют EJB, вызывая операции EntityManager’а для JPA-сущностей: Category, Product, Purchase, Purchaseproduct, Customer.
Web-интерфейс для осуществления CRUD-операций с продуктами и их категориями выполнен в 2 вариантах, оба варианта – на базе MVC.
В первом варианте в качестве контроллера выступает simple.controllers.SimpleControllerServlet, подготавливающий данные и осуществляющий перенаправление на одну из jsp в зависимости от параметров запроса:
category-list.jsp
category-add-edit.jsp
product-list.jsp
product-add-edit.jsp
Страница product-list.jsp поддерживает периодическое обновление данных о количестве продуктов и покупок, отправляя XMLHTTPRequest – запросы, принимая JSON-данные и динамически обновляя ячейки таблицы, то есть основана на AJAX.
Второй вариант выполнен на основе Spring MVC 2.5 (без аннотаций) и использует библиотеку тегов displaytag для отображения таблицы с поддержкой многостраничности. Созданные jsp-страницы располагаются в WEB-INF/jsps/springmvc/, а классы контроллеров – в src/java/springmvc/controllers . В данном варианте динамическое обновление данных не реализовано.
Web-интерфейс для отслеживания статуса касс и логов (status.jsp) основан на AJAX (подобно странице со списком продуктов), а цветное изображение касс получает через XSLT-преобразование данных о состоянии касс в формате XML.