31 октября 2008
DarkStar: разарботка MMORG ( онлайн игр ) на Java
Проект Darkstar это программное обеспечение, которое призвано упростить разработку и эксплуатацию массово масштабируемых онлайн игр(MMORG), виртуальных миров, и социальных сетей. Darkstar сам позаботиться об организации связей , обработке событий, слежением за целосностью данных и многое другое. Использование Darkstar вам позволит сконцентрироватся непосредственно на разработке игры.
И теперь главный плюс - это опен сорс проект, под GPL лицензией, так что вы можете получить его бесплатно. С использованием этого SDK разработка вашей игры может ускорится во много раз.
Так, расскажу немного о внутренностях. В целом это стандартный клиент сервер, который берёт на себя задачу управления. Основное понятие используемое в Darkstar проекте - это задача - Task. Любое действие можно описать с помощью задачи. Пример:
Атака (один игрок атакует - наносит удар другому игроку).
Итак происходит обращение к Task менеджеру с вызовом соотвующей задачи с указанными параметрами. TaskManager в свою очередь лезет в базу данных достаёт необходимые параметры (количество жизни у врага, мощность брони; мощность, ти оружия и т.д.) - за работу с базой данных отвечает PersistanceManager. На основе извлечённых данных производиться рассчёт силы удара и результат - нанесённое повреждение: опять обращение к PersistanceManager и сохранение в БД. Осталось разослать эту информацию игрокам участвующим в схватке - не проблема - TaskManager обращается к ChanelManagerу и обновлённые данные получают все игроки. Итак три слона держащие мир Darkstar это TaskManager , PersistanceManager и ChanelManagerу , можно и свой написать, но это только в очень искушённых проектах.
Подробности на сайте сообщества. Там много примеров, хорошая документация и всё что нужно для разработки.
Try it now.
Links:
About
Project Darkstar community
И теперь главный плюс - это опен сорс проект, под GPL лицензией, так что вы можете получить его бесплатно. С использованием этого SDK разработка вашей игры может ускорится во много раз.
Так, расскажу немного о внутренностях. В целом это стандартный клиент сервер, который берёт на себя задачу управления. Основное понятие используемое в Darkstar проекте - это задача - Task. Любое действие можно описать с помощью задачи. Пример:
Атака (один игрок атакует - наносит удар другому игроку).
Итак происходит обращение к Task менеджеру с вызовом соотвующей задачи с указанными параметрами. TaskManager в свою очередь лезет в базу данных достаёт необходимые параметры (количество жизни у врага, мощность брони; мощность, ти оружия и т.д.) - за работу с базой данных отвечает PersistanceManager. На основе извлечённых данных производиться рассчёт силы удара и результат - нанесённое повреждение: опять обращение к PersistanceManager и сохранение в БД. Осталось разослать эту информацию игрокам участвующим в схватке - не проблема - TaskManager обращается к ChanelManagerу и обновлённые данные получают все игроки. Итак три слона держащие мир Darkstar это TaskManager , PersistanceManager и ChanelManagerу , можно и свой написать, но это только в очень искушённых проектах.
Подробности на сайте сообщества. Там много примеров, хорошая документация и всё что нужно для разработки.
Try it now.
Links:
About
Project Darkstar community
25 октября 2008
Java презентации
Обнаружил тучу Java презентаций на сайте parleys.com . В презентациях охватывается большинство тем связанных с javа : от fundamentals до java ee фреймворков.
Взяты презентации из популярнейших Java конференций : JavaPolis, BeJUG, SpringOne, JaZoon, JavaZone and EclipseCon
У сайта есть также свой подкаст : parleys.libsyn.com где можно прослушать доклады по презентациям в mp3 формате.
Наслаждайтесь.
P.S. Всё оформлено очень красиво и по взрослому: в одном окне слайды презентации , во втором видно докладчика...как будто сам присутствуешь на конференции. Особенно удобное их десктоп приложение, которое скачивается на этом же сайте.
Взяты презентации из популярнейших Java конференций : JavaPolis, BeJUG, SpringOne, JaZoon, JavaZone and EclipseCon
У сайта есть также свой подкаст : parleys.libsyn.com где можно прослушать доклады по презентациям в mp3 формате.
Наслаждайтесь.
P.S. Всё оформлено очень красиво и по взрослому: в одном окне слайды презентации , во втором видно докладчика...как будто сам присутствуешь на конференции. Особенно удобное их десктоп приложение, которое скачивается на этом же сайте.
JAD : Java декомпилятор
Jad - java декомпилятор, программа которая читает один или больше Javaклассов и преобразует их в исходный код(по личной практике сообщу, чтокод получается почти такой же как и до компиляции), который можно будетповторно скомпилировать.
Jad написан на чистом С++, поэтому работает в несколько раз быстрее чем декомпиляторы написаны на Java.
Использовать просто:
jad example1.class
Но , jad по умолчанию выдает декомпилированным файлам расширение jad, что бы избежать этого , можно использовать опцию -s :
jad -sjava example1.class
Если надо декомпилировать набор классов, можно воспользоваться командой:
jad -o -r -sjava -dsrc tree/**/*.class
(**) - значит что декомпиляция будет производиться во всех поддиректориях папки tree.
JAD
Jad написан на чистом С++, поэтому работает в несколько раз быстрее чем декомпиляторы написаны на Java.
Использовать просто:
jad example1.class
Но , jad по умолчанию выдает декомпилированным файлам расширение jad, что бы избежать этого , можно использовать опцию -s :
jad -sjava example1.class
Если надо декомпилировать набор классов, можно воспользоваться командой:
jad -o -r -sjava -dsrc tree/**/*.class
(**) - значит что декомпиляция будет производиться во всех поддиректориях папки tree.
JAD
20 октября 2008
Spring Security : хранение пользователей в БД. часть 2
Предварительно прочитать:
SS: хранение пользователей в БД. часть 1
В этой части мы рассмотрим возможность объеденения ORM фреймворка (например hibernate) вместе со Spring Security. При этом будут использоваться аннотации.
Итак, lets go.
Если вы желаете хранить пользователей в своих таблицах, а не предлагаемых SS-ом и желаете обращатся к ним с помощью hibernate? тогда вам надо:
1) Реализовать интерфейс UserDetailsService, в котором аж одна функция loadUserByUsername. У меня этот интерфейс обращается к моим dao классам , с помощью которых и извлекает информацию о пользователях, например:
@Component
@Transactional
public class UserServiceImpl implements UserDetailsService {
@Autowired
UserDao userDao;
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
return userDao.get(username);
}
}
Особенность, обратите внимание , что функция loadUserByUsername возвращает не абы-шо , а некий объект UserDetails. Это между прочим тоже интерфейс.
2) Реализовать интерфейс UserDetails. SS рекомендует воспользоватся стандартным классом org.springframework.security.userdetails.User , в котором уже реализован этот интерфейс, но этот вариант далеко не всем подойдёт.
Если таки не подойдёт, надо реализовать несколько простых стандартных функций не представляющих большой интерес, аля: getUsername, getPassword, isEnabled, isCredentialsNonExpired, isCredentialsNonExpired, isAccountNonExpired. Причём последние 4 возвращают ложь или правду. Гораздо интересней функция getAuthorities(), а точнее то что она возвращает, а возвращает она массив GrantedAuthority... это между прочим тоже интерфейс, который нам придётся реализовывать :).
3) Реализовать интерфейс GrantedAuthority. Что это за интерфейс , и что это за единственная функция getAuthority() , которую надо реализовать? GrantedAuthority - это привилегия, роль, полномочие, ограничение которое получает пользователь на выполнение того или иного действия. Как задавать набор действий для каждой определённой роли в общем рассматривалось в первой заметке по SS , и более подробно будет рассматриватся в дальнейшем.
Основные используемые роли :
ROLE_ADMINISTRATOR, ROLE_USER, ROLE_SUPERVISOR, ROLE_WE_DONT_HAVE, ROLE_TELLER, ROLE_ANONYMOUS
Каждый пользователь может обладать не менее чем одной ролью. Поэтому в бд лучше всего иметь одну таблицу для данных пользователя и вторую для ролей. Первая таблица связана со второй в отношении один ко многим.
4) Последний штрих. Все классы написаны, осталось только настроить конфигурацию, для того, что-бы использовался нужный сервис получения пользователей. Это можно сделать в applicationContext-security.xml сделующим образом:
Регистрируем бин с классом реализующем UserDetailsService интерфейс:
<beans:bean id="myUserDetailsService" class="path.to.UserServiceImpl" />
В authentication-provider указываем какой сервис использовать для получения данных о пользователях:
<authentication-provider user-service-ref='myUserDetailsService'/>
Это всё.
SS: хранение пользователей в БД. часть 1
В этой части мы рассмотрим возможность объеденения ORM фреймворка (например hibernate) вместе со Spring Security. При этом будут использоваться аннотации.
Итак, lets go.
Если вы желаете хранить пользователей в своих таблицах, а не предлагаемых SS-ом и желаете обращатся к ним с помощью hibernate? тогда вам надо:
1) Реализовать интерфейс UserDetailsService, в котором аж одна функция loadUserByUsername. У меня этот интерфейс обращается к моим dao классам , с помощью которых и извлекает информацию о пользователях, например:
@Component
@Transactional
public class UserServiceImpl implements UserDetailsService {
@Autowired
UserDao userDao;
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
return userDao.get(username);
}
}
Особенность, обратите внимание , что функция loadUserByUsername возвращает не абы-шо , а некий объект UserDetails. Это между прочим тоже интерфейс.
2) Реализовать интерфейс UserDetails. SS рекомендует воспользоватся стандартным классом org.springframework.security.userdetails.User , в котором уже реализован этот интерфейс, но этот вариант далеко не всем подойдёт.
Если таки не подойдёт, надо реализовать несколько простых стандартных функций не представляющих большой интерес, аля: getUsername, getPassword, isEnabled, isCredentialsNonExpired, isCredentialsNonExpired, isAccountNonExpired. Причём последние 4 возвращают ложь или правду. Гораздо интересней функция getAuthorities(), а точнее то что она возвращает, а возвращает она массив GrantedAuthority... это между прочим тоже интерфейс, который нам придётся реализовывать :).
3) Реализовать интерфейс GrantedAuthority. Что это за интерфейс , и что это за единственная функция getAuthority() , которую надо реализовать? GrantedAuthority - это привилегия, роль, полномочие, ограничение которое получает пользователь на выполнение того или иного действия. Как задавать набор действий для каждой определённой роли в общем рассматривалось в первой заметке по SS , и более подробно будет рассматриватся в дальнейшем.
Основные используемые роли :
ROLE_ADMINISTRATOR, ROLE_USER, ROLE_SUPERVISOR, ROLE_WE_DONT_HAVE, ROLE_TELLER, ROLE_ANONYMOUS
Каждый пользователь может обладать не менее чем одной ролью. Поэтому в бд лучше всего иметь одну таблицу для данных пользователя и вторую для ролей. Первая таблица связана со второй в отношении один ко многим.
4) Последний штрих. Все классы написаны, осталось только настроить конфигурацию, для того, что-бы использовался нужный сервис получения пользователей. Это можно сделать в applicationContext-security.xml сделующим образом:
Регистрируем бин с классом реализующем UserDetailsService интерфейс:
<beans:bean id="myUserDetailsService" class="path.to.UserServiceImpl" />
В authentication-provider указываем какой сервис использовать для получения данных о пользователях:
<authentication-provider user-service-ref='myUserDetailsService'/>
Это всё.
Spring Security : хранение пользователей в БД. часть 1
В предыдущей заметке по Spring Security (SS) я рассмотрел пример использования SS. Пример был примитивный, ориентированный исключительно на знакомство с SS.
Теперь более подробно рассмотрим вопрос хранения данных о пользователях. В первом примере эти данные были забиты раз и навсегда в xml файл и как либо оперировать ними было невероятно трудно. Более привычный способ хранения пользователей - это база данных.
В SS реализован UserDetailsService, который позволяет получать информацию о пользователях посредством jdbc подключения к базе данных, для этого достаточно в конфигурации зарегистировать бин:
<bean id="userDetailsService" class="org.springframework.security.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
Где в качестве dataSource используется бин настроек подключения к бд, например:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
При это в базе данных должна существовать следующая схема: таблицы users и authorities, а также внешний ключ.
CREATE TABLE users (
username VARCHAR(50) NOT NULL PRIMARY KEY,
password VARCHAR(50) NOT NULL,
enabled BIT NOT NULL
);
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL
);
ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users(username);
В общем случае этот вариант вполен пригоден для использования, но что делать если вы используете какой то высокоуровневый фрэймворк, или если у вас уже есть свои таблицы для хранения пользователей... тогда читайте следующую заметку
Теперь более подробно рассмотрим вопрос хранения данных о пользователях. В первом примере эти данные были забиты раз и навсегда в xml файл и как либо оперировать ними было невероятно трудно. Более привычный способ хранения пользователей - это база данных.
В SS реализован UserDetailsService, который позволяет получать информацию о пользователях посредством jdbc подключения к базе данных, для этого достаточно в конфигурации зарегистировать бин:
<property name="dataSource" ref="dataSource"/>
</bean>
Где в качестве dataSource используется бин настроек подключения к бд, например:
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
При это в базе данных должна существовать следующая схема: таблицы users и authorities, а также внешний ключ.
CREATE TABLE users (
username VARCHAR(50) NOT NULL PRIMARY KEY,
password VARCHAR(50) NOT NULL,
enabled BIT NOT NULL
);
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL
);
ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users(username);
В общем случае этот вариант вполен пригоден для использования, но что делать если вы используете какой то высокоуровневый фрэймворк, или если у вас уже есть свои таблицы для хранения пользователей... тогда читайте следующую заметку
18 октября 2008
Пример использования Spring Security в Web приложениях
Вступление
Не так давно Spring анонсировала свою новую разработку Spring Security. Это модуль для услуг безопасности, который должен заменить Acegi Security для всех Spring приложений.
Acegi очень популярный фреймворк для безопасности, обладающий обширной функциональностью:
- аутентификация и авторизация пользователей
- контроль доступа
Spring Security унаследовало всё лучшее от Acegi, а также обзавелось новыми фичами(features) :
- совместимость с OpenID, NTLM, LDAP аутентификация;
- поддержка аннотаций согласно стандарту JSR-250;
- упрощения в использовании;
- поддержка дополнительных языков;
и многие другие.
Пример
Что бы показать на сколько просто использовать Spring Security рассмотрим простой пример.
Для начала вам понадобиться любое простое Spring MVC веб приложение. В одном из более ранних постов я приводил примеры туториалов. Хотя, идеальной подойдёт пример petclinic , который поставляется в zip архиве spring-framework with dependencies.
Также нам понадобиться zip архив Spring Security 2.0.X , а точнее библиотеки из него.
Из которого надо в WEB-INF\lib скопировать следующие библиотеки:
spring-security-core-2.0.4.jar
spring-security-core-tiger-2.0.4.jar
spring-security-acl-2.0.4.jar
spring-security-taglibs-2.0.4.jar
И ещё одна библиотека от apache:
commons-codec-1.3.jar
Ещё необходимо создать конфигурационный файл для Spring Security в папке WEB-INF :
<!-- applicationContext-security.xml -->
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<!-- alot of config will be here -->
</beans:beans>
Шаг следующий - настройка web.xml , где мы должны подключить конфиг для Spring Security:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
Здесь же в web.xml сразу после закрытия тега /context-param добавляем фильтр:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
И последний шаг - настраиваем доступ к страницам, указываем для SpringSecurity на какие странице можно заходить анонимно, а на которые доступ получат только авторизированные пользователи. Добавляем в aplicationContext-security.xml следующий код:
<http auto-config="true">
<intercept-url pattern="/*.do" access="ROLE_USER" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</http>
В этом же файле создадим парочку пользователей:
<authentication-provider>
<password-encoder hash="md5"/>
<user-service>
<user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
<user name="dianne" password="65d15fe9156f9c4bbffd98085992a44e" authorities="ROLE_USER,ROLE_TELLER" />
</user-service>
</authentication-provider>
Можно тестировать. Запускаем сервер и пытаемся открыть домашнюю страницу, ваш запрос должен быть перехвачен и вместо данных вывестись форма с предложением ввести свои данные. Вы можете попробовать ввести
логин: rod , пароль: koala
либо
логин: dianne , пароль: emu
и увидеть ожидаемую страницу.
Ещё не помешает добавить кнопку для выхода из аккаунта, лучше всего в шаблон, например в header :
<table class="header">
<tr>
<td><a href="<c:url value="/welcome.do"/>">Home</a></td>
<td align="right"><a href="<c:url value="/j_spring_security_logout"/>">Logout</a></td>
</tr>
</table>
Оригинал: статья 1 , статья 2.
17 октября 2008
Open Source - сборники народных сказок
Решил поискать в истории некоторые аналоги для "open source" и os сообщества. И такой аналог нашёлся - народный фольклор: песни, танцы, музыка, притчи, истории, баллады и многое другое то что народ копил многие годы, передавая от родителей к детям. И творили люди свои шедевры не за деньги, а потому что им по настоящему нравилось то что они делают. Гениальные произведения мало вероятно, что удастся найти среди народных, но много хорошего, приятного для души очень много. Хорошо что кроме творящих ещё находятся люди, которые собирают эти произведения воедино, только благодаря ним к нам доходят сборники сказок, притч, песен ... творчества народа.
В опен сорсе наблюдается кое что аналогичное, только вот слово народ заменили более модным "комьюнити". А сборники народного творчества в опен сорсе пользуются особой популярностью. И что-бы некоторым пост не показался абсолютно бесполезным, размещу ка я ссылки на такие народные опен-сорс сборники:
http://sourceforge.net/
http://koders.com/
http://code.google.com/
http://java2s.com/
http://java-source.net/
http://www.exampledepot.com/
http://www.planet-source-code.com/
http://www.codebeach.com/
http://www.osalt.com/
Ну, думаю достаточно.
P.S. Жаль только что в список не попал не один славянский сайт, хоть люди у нас далеко не последние творят , а получается как и с народным фольклором - за-рубежом считается что русская народная музыка - это хор Красной армии.
В опен сорсе наблюдается кое что аналогичное, только вот слово народ заменили более модным "комьюнити". А сборники народного творчества в опен сорсе пользуются особой популярностью. И что-бы некоторым пост не показался абсолютно бесполезным, размещу ка я ссылки на такие народные опен-сорс сборники:
http://sourceforge.net/
http://koders.com/
http://code.google.com/
http://java2s.com/
http://java-source.net/
http://www.exampledepot.com/
http://www.planet-source-code.com/
http://www.codebeach.com/
http://www.osalt.com/
Ну, думаю достаточно.
P.S. Жаль только что в список не попал не один славянский сайт, хоть люди у нас далеко не последние творят , а получается как и с народным фольклором - за-рубежом считается что русская народная музыка - это хор Красной армии.
16 октября 2008
Бесплатные тесты от Sun по Java
The following pre-assessments will assist you in determining whether you have acquired the knowledge taught in each of the Sun Microsystems' training courses listed below each pre-assessment. Sun offers each free pre-assessment to help you determine which course is best suited to your current level of skill and knowledge.
- Sun Certified Associate for the Java Platform, Standard Edition, Exam Version 1.0 (CX-310-019)
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (CX-310-055)
- Sun Certified Business Component Developer for the Java Platform, Enterprise Edition 5 (CX-310-091)
- Sun Certified Mobile Application Developer for the Java 2 Platform, Micro Edition, Version 1.0 (CX-310-110)
- Sun Certified Developer for Java Web Services (CX-310-220)
Подписаться на:
Комментарии (Atom)