Профессиональная разработка интернет приложений

Java, PHP, ROR…

В конце марта 2010 г. в Санкт-Петербурге пройдет первая в России конференция по Zend Framework

На днях закончился прием тезисов по планируемым докладам. Примечательно, что в состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей фрэймворка!

Участие в конференции планируется сделать бесплатным или за небольшую стоимость. На данный момент уже открыта предварительная регистрация на конференцию! Для решения ряда вопросов организаторам очень важно сейчас понять приблизительное количество человек, которые смогут посетить конференцию или каким-то иным образом принять участие в ней.

Каждый предстоящий доклад возможно обсудить на форуме ZF-сообщества. Ваше мнение очень важно для авторов!

Планируемые доклады

Жизненный цикл предложений (proposals) в проекте Zend Framework

Александр Веремьев (Zend Technologies, Core команда)

Zend_Search_Lucene в деталях

Александр Веремьев (Zend Technologies, Core команда)

Zend Framework и производительность

Александр Махомет (создатель сообщества ZendFramework.ru)

Zend Framework и MVC, «толстая» модель

Александр Стешенко (Norada Corporation, PHP-разработчик)


ФотоСтрана.ru: Прототипирование с использованием ZF (история боевого применения Zend Framework в highload-проекте)

Леонид Жаворонков (ФотоСтрана.ru, тимлид)

Использование очередей сообщений в повседневных проектах

Денис Баклыков (Обновление, веб-разработчик)

Zend Framework и Doctrine

Степан Танасийчук (руководитель веб-студии stfalcon.com)

Zend Framework и мультиязычность

Степан Танасийчук (руководитель веб-студии stfalcon.com)

История проекта e-Штаб

Анатолий Ларин (e-Легион, веб-программист)

Что нового несет нам Zend Framework 2.0?

Надежда Блинова (Wizartech, веб-программист), Георгий Туревич (Wizartech, ведущий веб-программист)

Интеграция Zend Framework c Javascript-фрэймворками jQuery и Dojo Toolkit

Георгий Туревич (Wizartech, ведущий веб-программист)

Смело обсуждайте доклады и регистрируйтесь!

За последними новостями можно следить здесь:
RSS-канал: feeds.feedburner.com/zfconf
Twitter: @zfconf
Группа Вконтакте: vkontakte.ru/club14951507

К участию также приглашаются информационные и финансовые спонсоры.

Связанные записи

История появления нулевой ссылки

Наткнулся на видео с конференции “QCon”, где рассказывается история появления нулевых ссылок из первых уст! Интересно посмотреть.

Связанные записи

BigDecimal вместо Float

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

Проведем простой эксперимент:

System.out.println(0.9f - 0.8f);

Можно ожидать, что приведенный код выведет на консоль “0.1″, но на самом деле мы видим “0.099999964″. Это число может быть выведено на страницу счета, что уже плохо. Но самое страшное, что в процессе округления, часть суммы может быть потеряна.

Класс позволяет производить округление с помощью различных алгоритмов:

RoundingMode:
UP          - округление от нуля
DOWN        - округление к нулю
CEILING     - округление в сторону +∞
FLOOR       - округление в сторону -∞
HALF_UP     - округление от нуля, если дробная часть >= 0.5
HALF_DOWN   - округление от нуля, если дробная часть = 0.5
HALF_EVEN   - как и ROUND_HALF_UP, только в случае эквивалентности расстояния
               до соседей - округление выполняется в сторону четного числа
UNNECESSARY - округление не производится

Часто, если округление производится в операциях по выплате денег клиентам, используют округление ROUND_DOWN и ROUND_UP для выставления счетов. Для продолжения вычислений с округленным числом используют ROUND_HALF_EVEN, так как этот алгоритм обеспечивает наибольшую точность.

Класс  - немодифицируемый, поэтому такие операции как setScale() - возвращают новый объект класса .

Пример округления значения:

System.out.println("UP: " + new (1.5f).setScale(0, RoundingMode.UP));
System.out.println("HALF_UP: " + new (1.5f).setScale(0, RoundingMode.HALF_UP));
System.out.println("HALF_DOWN: " + new (1.5f).setScale(0, RoundingMode.HALF_DOWN));
System.out.println("HALF_EVEN: " + new (1.5f).setScale(0, RoundingMode.HALF_EVEN));
Результаты:
UP: 2
HALF_UP: 2
HALF_DOWN: 1
HALF_EVEN: 2

Но не стоит расслабляться - привденный ниже код также возвращает “0.099999964237213134765625″, как и код, приведенный в начале:

System.out.println(new (0.9f).subtract(new (0.8f)));

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

System.out.println(new (0.9f).subtract(new (0.8f)).setScale(2, RoundingMode.UP));

И вот теперь мы можем взять у клиента эти 10 копеек!

Связанные записи

Доступ к компонентам Seam из фильтров

При попытке доступа к компонентам из фильтров web-приложения может возникнуть исключение: “javax.servlet.ServletException: java.lang.IllegalStateException: No active event context”. Для того, чтобы гарантированно получить нужный компонент, код необходимо выполнить в ContextualHttpServletRequest:

@Override
public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain)
		throws IOException, ServletException {

	new ContextualHttpServletRequest((HttpServletRequest) request) {
		@Override
		public void process() throws  {
			...
			MyComponent component = (Component) Component.getInstance(MyComponent.class);
			...
		}
	}.run();
	chain.doFilter(request, response);
}

Связанные записи

Безопасное включение/отключение фильтров в Hibernate

Иногда, при выполнении запроса, вам необходимо отключить некоторые фильтры . Для этого можно использовать методы сессии - disableFilter(String), enableFilter(String). Если фильтр по умолчанию включен, то сначала его отключают, потом выполняют запрос, а затем включают снова. Но если в промежутке между отключением и включением фильтра будет брошено исключение, то код снова включающий фильтр, выполнен не будет, и если исключение будет обработано таким образом, что выполнение программы не прекратится, то ее дальнейшее поведение может быть непредсказуемым. Запросы, зависящие от выключенного фильтра будут возвращать ненужные данные.

Чтобы избежать такой ситуации, вызов метода включающего фильтр, необходимо заключить в блок finally:

try {
    session.disableFilter("filterName");
    .....
} finally {
    session.enableFilter("filterName");
}

Связанные записи

Скриптовые языки, работающие на JVM стали быстрее

В JDK7 появились новые возможности по работе с динамически типизированными языками, работающими на . В этой статье описываются новые возможности . И приводятся примеры использования этих возможностей для JDK7.

Что же, ждем ускорения работы интерпритаторов скриптовых языков, работающих на .

Связанные записи

Влияние кризиса на открытые проекты

Андрей Лоскутов привел интересный граффиик, отображающий количество коммитов в проекты с открытым исходным кодом. На нем видно, что с конца 2008 года по настоящее время наметилась тенденция активного падения количества коммитов. Причем это наблюдается абсолютно по всем языкам. С большой вероятностью, причиной этого является мировой финансовый кризис.

Я думаю, что разработчики стали меньше коммитить в Open-source проекты, так как переместили свои приоритеты на проекты, работая над которыми можно заработать больше. А может быть это связано с уменьшением финансирования проектов, связанным с тем же финансовым кризисом.

Связанные записи

Впечатления от Seam

Вот уже как 2 месяца я работаю с Jboss . Хочу отметить несколько моментов, которые меня очень порадовали:

  1. Быстрый старт. Начать работать с очень просто. Я уже писал об этом. После создания скелета приложения, хватит одной только интуиции и небольшого опыта web-программирования, чтобы добавить несложный функционал.
  2. Высокая скорость разработки. Расширив класс EntityHome, вы получаете уже готовую часть программы, отвечающую за CRUD. Расширив класс EntityList, вы реализуете код, предназначенный для отображения списка объектов и навигации по нему.
  3. Новые возможности, реализуемые с помощью Conversations. Вам теперь не надо беспокоиться о передаче параметров, при реализации действия пользователя, состоящего из отображения нескольких страниц.

Связанные записи

Seam+JSF+Tomcat

Недавно я писал о проблемах, возникших при добавлении в приложение, использующее jsf и работающее на Tomcat. Наконец-то эти проблемы решены. Сиптомы:

  • Одно или несколько сообщений при старте приложения: “There should only be one phase listener per application”
  • Многократное срабатывание сеттеров, описанных в pages.xml
  • На некоторых серверах появление исключения:
SEVERE:  sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! null
	at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:212)
	at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:174)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.NullPointerException
	at com.sun.faces.config.processor.ApplicationConfigProcessor.addResouceBundle(ApplicationConfigProcessor.java:578)
	at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:245)
	at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:94)
	at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:119)
	at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:94)
	at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:132)
	at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:202)
	... 16 more

Проблема заключалась в том, что приложение использует одновременно RichFaces и MyFaces, от чего нельзя было отказаться, а папке WEB-INF/lib приложения содержалась библиотека jsf-impl-1.2_08.jar . После ее удаления - исключение больше не появлялось. Но осталось сообщение об уже запущенном экземпляре SeamPhaseListener. От этого сообщения я избавился исключив из faces-config.xml описание SeamPhaseListener. Скорее всего, экземпляр этого класса уже создавался при чтении faces-config.xml, лежащего в одной из библиотек .

Связанные записи

Важно вовремя успокоиться

Бывают такие часы, когда работается очень легко. Задачи решаются одна за другой. Чувствую, что поймал кураж и получаю огромное удовольствие от своего кода и решений, которые применяю. Так может пройти весь день, и с работы ухожу абсолютно счастливым человеком. Но во время такого куража может попасться сложная задача, требующая нестандартного решения или решения, которое не получилось увидеть сразу, и я начинаю понимать, что получение решения все больше и больше задерживается. Начинаю напрягаться. Ведь надо уже закончить с этой злосчастной задачей. Меня ждут другие, более интересные, а я вожусь все с этой. Ели решения так и не получается найти, это может перерасти в судорожные поиски помощи в интернете. В итоге, остается только небольшая вероятность найти правильное решение в таком состоянии. Нужен отдых, обращение внимания на что-то другое, не связанное с работой - переключение. И вот, после небольшого отдыха, я возвращаюсь на рабочее место и понимаю, что решение было практически под носом, но я его не замечал. Так почему же не устроить отдых намного раньше, когда только еще начинаешь осознавать, что задача затягивается! Забыв на некоторое время про задачу, можно вернуться к ней со свежей головой и новыми идеями, созревшими во время отдыха. А самый важный плюс такого подхода - экономия нервных клеток и времени!

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

Связанные записи