<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3305916983903342544</atom:id><lastBuildDate>Thu, 20 Mar 2014 01:40:12 +0000</lastBuildDate><category>программирование</category><category>java</category><category>seam</category><category>jboss</category><category>maven</category><category>unit-тест</category><category>администрирование</category><category>opensuse</category><category>иркутск</category><category>кодировка</category><category>apache</category><category>dbf</category><category>eclipse</category><category>error</category><category>firefox</category><category>jug</category><category>microsoft</category><category>oracle</category><category>outofmemory</category><category>postgre</category><category>sun</category><category>tomcat</category><category>windows</category><category>доклад</category><category>интеграционное тестирование</category><category>код</category><category>лицензирование</category><category>настройка</category><category>обучение</category><category>сравнение</category><category>язык</category><category>.net</category><category>1c</category><category>alsa</category><category>ant</category><category>appliaction server</category><category>arquillian</category><category>awt</category><category>ci</category><category>context</category><category>cookie</category><category>develop</category><category>embededded</category><category>emeralds</category><category>equals</category><category>example</category><category>foxpro</category><category>gc</category><category>geekfest</category><category>grid</category><category>hibernate</category><category>hsqldb</category><category>ide</category><category>ie</category><category>iforge</category><category>jasperreports</category><category>junit</category><category>jvm</category><category>level</category><category>liquibase</category><category>log</category><category>logger</category><category>management</category><category>memory</category><category>migrate4j</category><category>mysql</category><category>nexus</category><category>opencsm</category><category>php</category><category>pulse</category><category>redmine</category><category>rememberme</category><category>request</category><category>rfs</category><category>richfaces</category><category>scope</category><category>session</category><category>slf4j</category><category>software</category><category>spring</category><category>sql</category><category>svn</category><category>test</category><category>utf-8</category><category>vfs</category><category>vingrad</category><category>vista</category><category>war</category><category>web</category><category>webdav</category><category>wiki</category><category>Жизнь</category><category>авторизация</category><category>авторитет</category><category>алгоритм</category><category>английский</category><category>архитектура</category><category>архитектура по</category><category>аутентификация</category><category>аутизм</category><category>бд</category><category>безопастность</category><category>визуализация</category><category>выбор</category><category>выступление</category><category>данные</category><category>дао</category><category>для взрослых</category><category>древность</category><category>звук</category><category>идиоты</category><category>интеллект</category><category>интернет</category><category>карго-культ</category><category>картинка</category><category>классификация</category><category>клиент</category><category>конференция</category><category>мозг</category><category>мудаки</category><category>награда</category><category>нижний</category><category>ноутбук</category><category>обсуждения</category><category>общение</category><category>озу</category><category>орфография</category><category>отчет</category><category>ошибка</category><category>ошибки</category><category>параметры</category><category>пароль</category><category>перевод</category><category>по</category><category>поле</category><category>понимание</category><category>презентация</category><category>проект</category><category>прототип</category><category>путь</category><category>работа</category><category>работает</category><category>развитие</category><category>раскопки</category><category>расслоение</category><category>регистр</category><category>репозиторий</category><category>россия</category><category>русский</category><category>сервис</category><category>синхронизация</category><category>структура</category><category>субд</category><category>таблица</category><category>танцы с бубном</category><category>тесты</category><category>тренер</category><category>уровни</category><category>установка</category><category>холивар</category><category>хорошо</category><category>шаманство</category><category>шрифт</category><title>Топор войны</title><description>Рабочий блог Java программиста</description><link>http://tech.intr13.ru/</link><managingEditor>noreply@blogger.com (intr13)</managingEditor><generator>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-1185529601406280374</guid><pubDate>Wed, 23 Mar 2011 08:00:00 +0000</pubDate><atom:updated>2011-04-24T19:34:22.233+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">level</category><category domain="http://www.blogger.com/atom/ns#">log</category><category domain="http://www.blogger.com/atom/ns#">logger</category><category domain="http://www.blogger.com/atom/ns#">slf4j</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Уровни логирования</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-1IEtz1LWMSE/TbP42WPeIkI/AAAAAAAABPw/KLMYJOE3XQw/s1600/slf4j-logo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-1IEtz1LWMSE/TbP42WPeIkI/AAAAAAAABPw/KLMYJOE3XQw/s1600/slf4j-logo.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Уровни логирования на примере slf4j и описание ситуаций их использования.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;FATAL - очень критичная ошибка в приложении, приложение не может работать после данной ошибки, останов приложения или среды исполнения, реакция на сообщение должна быть максимально быстрой.&lt;/li&gt;&lt;li&gt;SERVE - критичная ошибка в приложении, данная ситуация является внештатной (ни в коем&amp;nbsp;случае&amp;nbsp;не&amp;nbsp;должна&amp;nbsp;быть по мнению разработчиков), но приложение может работать дальше, реакция на сообщение должна быть максимально быстрой.&lt;/li&gt;&lt;li&gt;ERROR - ошибка в приложении, приложение может работать дальше без всяких проблем, возможно проблема с неправильными входными данными или доступом к внешним сервисам (БД, legacy), данная ошибка предусматривалась при разработке.&lt;/li&gt;&lt;li&gt;WARN - некритичная ошибка, приложение может работать дальше без всяких проблем, данная ошибка предусматривалась при разработке, возможно одна из функций приложения дала сбой, который можно исправить.&lt;/li&gt;&lt;li&gt;INFO - важная информация о работе приложения, например запуск остановка приложения или использование конфигурационных файлов или аутентификация пользователя в системе.&lt;/li&gt;&lt;li&gt;DEBUG - отладочная информация работы приложения, например техническая информация полученная при работе в внешними системами, или информация о вызове методов объектов, со списком параметров.&lt;/li&gt;&lt;li&gt;TRACE - трассировка выполнения приложения, например информация о вызываемых методах и времени их работы, также на данном уровне пишется информация о времени вызова внешних сервисов (БД, legacy).&lt;/li&gt;&lt;/ul&gt;</description><link>http://tech.intr13.ru/2011/03/logging-level.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-1IEtz1LWMSE/TbP42WPeIkI/AAAAAAAABPw/KLMYJOE3XQw/s72-c/slf4j-logo.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-3991999718392796607</guid><pubDate>Thu, 30 Sep 2010 15:00:00 +0000</pubDate><atom:updated>2011-04-24T01:48:36.447+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">архитектура</category><category domain="http://www.blogger.com/atom/ns#">безопастность</category><category domain="http://www.blogger.com/atom/ns#">дао</category><category domain="http://www.blogger.com/atom/ns#">древность</category><category domain="http://www.blogger.com/atom/ns#">идиоты</category><category domain="http://www.blogger.com/atom/ns#">код</category><category domain="http://www.blogger.com/atom/ns#">мудаки</category><category domain="http://www.blogger.com/atom/ns#">награда</category><category domain="http://www.blogger.com/atom/ns#">ошибка</category><category domain="http://www.blogger.com/atom/ns#">раскопки</category><category domain="http://www.blogger.com/atom/ns#">расслоение</category><category domain="http://www.blogger.com/atom/ns#">уровни</category><title>Epic fail - xor для энтузиастов</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-GrHuq3C9wpY/TbMCVDzvSkI/AAAAAAAABNg/qHfyTRu6Kkk/s1600/sun.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://1.bp.blogspot.com/-GrHuq3C9wpY/TbMCVDzvSkI/AAAAAAAABNg/qHfyTRu6Kkk/s320/sun.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Я горд, получить признание от компании Sun на втором году (2005 год) программистской жизни это круто. Не каждый может&amp;nbsp;поучаствовать&amp;nbsp;в подобном. Конечно, я тогда был всего лишь рядовым&amp;nbsp;исполнителем (Java Developer)&amp;nbsp;и не стоял за штурвалом, но и это многого стоит. Но это лишь видимая сторона медали.&lt;br /&gt;&lt;br /&gt;Так уж сложилось, что мне довелось сопровождать данный программный продукт до сегодняшних дней (Система управления содержимым сайта iPortal, и построенная на её базе Система дистанционного обучения iLogos). Благо остальные &quot;ядреные&quot; члены команды канули в другие проекты и&amp;nbsp;жизненные&amp;nbsp;события. Но качество кода в этом проекте довольно неплохое, хотя в любом коде есть ошибки. И сейчас я об одной расскажу :)&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Буквально недавно вылезла замечательная ошибка с&amp;nbsp;сохранением&amp;nbsp;пользователя, после пяти минут сервер вываливался с 500 ошибкой. Выяснилось, что&amp;nbsp;проблема&amp;nbsp;возникает при назначении прав пользователя на редактирование остальных пользователей системы (и на на другие объекты). Простейший count выдал что на данный момент в БД находится 32 тысячи пользователей, в 63 подразделениях. Ранее на 20 тысячах пользователей и меньшем количестве подразделений все работало.&lt;br /&gt;&lt;br /&gt;После непродолжительных&amp;nbsp;раскопок&amp;nbsp;было выявлено, что собака зарыта в хитрой модели&amp;nbsp;безопасности. Право на конкретный узел&amp;nbsp;рассчитывалось&amp;nbsp;как применение логической функции xor ко всем правам до корня&amp;nbsp;иерархии&amp;nbsp;конкретного типа объектов. То есть бралось право на объект, и права на все родительские объекты до корня, и потом глобальный xor делал свое жуткое дело. Правда страшно?&lt;br /&gt;&lt;br /&gt;Но есть еще более страшная штука, установка права на объект вызывала необходимость обойти все&amp;nbsp;дочерние&amp;nbsp;объекты и пересчитать для них эффективные права. То есть мы устанавливаем новое право на объект, но при этом эффективные права на дочерние объекты должны остаться неизменными.&lt;br /&gt;&lt;br /&gt;В общем, спасибо нашему тогдашнему тимлиду, хотя мы как девелоперы сами повели себя как редкостные идиоты. Хотя кто же мог знать?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;А мораль довольно простая:&lt;/strong&gt; не всегда старшие товарищи предлагают более адекватное решение, и почти всегда надо думать, желательно головой!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;И мораль номер два:&lt;/strong&gt; пишите код хорошо, не пишите код плохо. А то ведь и поддерживать его придется лет через пять, а то и больше. Кстати, из-за грамотного расслоения на&amp;nbsp;уровни&amp;nbsp;я изменил модель безопасности довольно быстро. &lt;del datetime=&quot;2010-10-01T15:50:00+00:00&quot;&gt;&lt;/del&gt;&lt;br /&gt;И нефиг было издеваться надо мной, когда я предлагал слоить систему. &quot;Серега и его &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%94%D0%B0%D0%BE&quot; target=&quot;_blank&quot;&gt;дао&lt;/a&gt;&quot;, ха! Не зря я был упрямый&amp;nbsp;:)&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Ну и самое главное, прошло мое&amp;nbsp;время, я больше не занимаюсь поддержкой данной системы. Хотя, никогда не говори никогда :)&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Фотографии наградных табличек в более высоком качестве - &lt;a href=&quot;http://dl.dropbox.com/u/2168804/sun1.jpg&quot; target=&quot;_blank&quot;&gt;раз&lt;/a&gt; и &lt;a href=&quot;http://dl.dropbox.com/u/2168804/sun2.jpg&quot; target=&quot;_blank&quot;&gt;два&lt;/a&gt; :)</description><link>http://tech.intr13.ru/2010/10/epic-fail-xor.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-GrHuq3C9wpY/TbMCVDzvSkI/AAAAAAAABNg/qHfyTRu6Kkk/s72-c/sun.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-2509871315172282016</guid><pubDate>Thu, 23 Sep 2010 15:00:00 +0000</pubDate><atom:updated>2011-04-24T01:55:31.163+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">appliaction server</category><category domain="http://www.blogger.com/atom/ns#">arquillian</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">jboss</category><category domain="http://www.blogger.com/atom/ns#">junit</category><category domain="http://www.blogger.com/atom/ns#">test</category><category domain="http://www.blogger.com/atom/ns#">unit-тест</category><category domain="http://www.blogger.com/atom/ns#">интеграционное тестирование</category><category domain="http://www.blogger.com/atom/ns#">работает</category><title>JBoss Arquillian. Интеграционное тестирование.</title><description>&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-hpSw_dolKgQ/TbMD_DBdQhI/AAAAAAAABNo/heBsYB2qiIU/s1600/arquillian_ui_error_256px.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-hpSw_dolKgQ/TbMD_DBdQhI/AAAAAAAABNo/heBsYB2qiIU/s1600/arquillian_ui_error_256px.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;td&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-KCU4EvYviz0/TbMD7g_BLNI/AAAAAAAABNk/XQodB13BC1o/s1600/arquillian_ui_success_256px.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-KCU4EvYviz0/TbMD7g_BLNI/AAAAAAAABNk/XQodB13BC1o/s1600/arquillian_ui_success_256px.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;Тестирование разрабатываемого кода штука безусловно полезная и нужная, особенно если применяется в нужное время, и в нужном месте. Но к сожалению обычные &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot; target=&quot;_blank&quot;&gt;unit-тесты&lt;/a&gt; не позволяют проверить работу приложения в целом. А это иногда очень надо, например для проверки что приложение успешно стартует на сервере приложений и даже немного работает.&lt;br /&gt;&lt;br /&gt;Особенно актуальна проблема с запуском таких тестов (&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot; target=&quot;_blank&quot;&gt;интеграционные тесты&lt;/a&gt;) в java enterprise разработке, для проверки отдельных компонентов работающих под управлением сервера приложений. И тут на помощь приходит технология &lt;a href=&quot;http://jboss.org/arquillian&quot; target=&quot;_blank&quot;&gt;JBoss Arquillian&lt;/a&gt;, которая не смотря на название позволяет запускать интеграционные тесты не только на &lt;a href=&quot;http://jboss.org/jbossas/&quot; target=&quot;_blank&quot;&gt;JBoss AS&lt;/a&gt; (5.0, 5.1, 6.0), но и на: &lt;a href=&quot;http://tomcat.apache.org/&quot; target=&quot;_blank&quot;&gt;Tomcat&lt;/a&gt; (6.0), &lt;a href=&quot;http://jetty.codehaus.org/jetty/&quot; target=&quot;_blank&quot;&gt;Jetty&lt;/a&gt; (6.1, 7.0), &lt;a href=&quot;https://glassfish.dev.java.net/&quot; target=&quot;_blank&quot;&gt;Glassfish&lt;/a&gt; (3.0). Причем для некоторых серверов приложений можно есть поддержка embedded запуска (без использования внешнего сервера).&lt;br /&gt;&lt;br /&gt;Конечно есть и другие способы решения данной проблемы, но сейчас мы посмотрим как работает JBoss Arquillian на JBoss Application Server 6.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 19px; font-weight: bold;&quot;&gt;Подготовка&lt;/span&gt;&lt;br /&gt;Нам понадобится:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/index.html&quot; target=&quot;_blank&quot;&gt;Java версии 1.6&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://jboss.org/jbossas/downloads.html&quot; target=&quot;_blank&quot;&gt;JBoss AS версии 6.0.0.M4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://maven.apache.org/download.html&quot; target=&quot;_blank&quot;&gt;Apache Maven версии 2.2.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://bitbucket.org/intr13/jboss.arquillian.junit.example/src&quot; target=&quot;_blank&quot;&gt;Исходный код тестового проекта&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Для начала поставим Java и проверим что она прописалась в путях. То есть работает команда - &quot;java -version&quot;.&lt;br /&gt;&lt;br /&gt;Далее устанавливаем Apache Maven и проверяем что он тоже прописан в путях. То есть работает команда - &quot;mvn --version&quot;.&lt;br /&gt;&lt;br /&gt;Потом разархивируем дистрибутив JBoss AS в рабочую директорию и запускаем его &quot;[папка где лежит jboss]/bin/run.sh&quot; или &quot;[папка где лежит jboss]/bin/run.bat&quot; (это зависит от вашей Религии).&lt;br /&gt;&lt;br /&gt;Обычно &quot;чистый&quot; JBoss AS в default конфигурации запускается 50 секунд, и в конце своего запуска пишет в консоль:&lt;br /&gt;&lt;blockquote&gt;22:17:49,301 INFO  [org.jboss.bootstrap.impl.base.server.AbstractServer] JBossAS [6.0.0.20100721-M4 &quot;Neo&quot;] Started in 45s:101ms&lt;/blockquote&gt;&lt;h3&gt;Запуск тестового проекта&lt;/h3&gt;Перейдем в директорию с исходным кодом проекта и запустим его при помощи команды - &quot;mvn clean test &quot;. И после того как maven скачает все необходимые библиотеки (это может занять очень продолжительное время), он запустит  наш тест на выполнение. В итоге мы увидим в консоли примерно следующее:&lt;br /&gt;&lt;blockquote&gt;...&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;T E S T S&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;Running ru.intr13.jboss.arquillian.arquillianJunit.MyServiceTestCase&lt;br /&gt;Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.843 sec&lt;br /&gt;&lt;br /&gt;Results :&lt;br /&gt;&lt;br /&gt;Tests run: 1, Failures: 0, Errors: 0, Skipped: 0&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] BUILD SUCCESSFUL&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Total time: 1 minute 2 seconds&lt;br /&gt;[INFO] Finished at: Thu Sep 23 22:21:20 ULAT 2010&lt;br /&gt;[INFO] Final Memory: 75M/179M&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;/blockquote&gt;Что означет успешный запуск теста на сервере приложений.&lt;br /&gt;&lt;br /&gt;Также в консоли сервера мы увидим строчки:&lt;br /&gt;&lt;blockquote&gt;22:21:15,427 INFO  [org.jboss.profileservice.management.upload.remoting.DeployHandler] invoke, payload: {DeploymentTargetID=names=[test.war], clientAddress=/127.0.0.1}, parameter: start&lt;br /&gt;22:21:16,384 INFO  [org.jboss.ejb3.deployers.Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@19346892{vfs:///D:/work/arquillian/jboss-6.0.0.20100721-M4/server/default/deploy/test.war}&lt;br /&gt;22:21:16,384 INFO  [org.jboss.ejb3.deployers.Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@19346892{vfs:///D:/work/arquillian/jboss-6.0.0.20100721-M4/server/default/deploy/test.war}&lt;br /&gt;22:21:16,402 WARN  [org.jboss.ejb3.interceptor.InterceptorInfoRepository] EJBTHREE-1852: InterceptorInfoRepository is deprecated&lt;br /&gt;22:21:17,014 INFO  [org.jboss.ejb3.deployers.JBossASKernel] Created KernelDeployment for: test.war&lt;br /&gt;22:21:17,018 INFO  [org.jboss.ejb3.deployers.JBossASKernel] installing bean: jboss.j2ee:jar=test.war,name=MyService,service=EJB3&lt;br /&gt;22:21:17,019 INFO  [org.jboss.ejb3.deployers.JBossASKernel]   with dependencies:&lt;br /&gt;22:21:17,019 INFO  [org.jboss.ejb3.deployers.JBossASKernel]   and demands:&lt;br /&gt;22:21:17,028 INFO  [org.jboss.ejb3.deployers.JBossASKernel]     jboss.ejb:service=EJBTimerService; Required: Described&lt;br /&gt;22:21:17,047 INFO  [org.jboss.ejb3.deployers.JBossASKernel]   and supplies:&lt;br /&gt;22:21:17,050 INFO  [org.jboss.ejb3.deployers.JBossASKernel]     jndi:MyService&lt;br /&gt;22:21:17,051 INFO  [org.jboss.ejb3.deployers.JBossASKernel]     jndi:MyService/local-ru.intr13.jboss.arquillian.arquillianJunit.IMyService&lt;br /&gt;22:21:17,051 INFO  [org.jboss.ejb3.deployers.JBossASKernel]     jndi:MyService/local&lt;br /&gt;22:21:17,051 INFO  [org.jboss.ejb3.deployers.JBossASKernel]     Class:ru.intr13.jboss.arquillian.arquillianJunit.IMyService&lt;br /&gt;22:21:17,057 INFO  [org.jboss.ejb3.deployers.JBossASKernel] Added bean(jboss.j2ee:jar=test.war,name=MyService,service=EJB3) to KernelDeployment of: test.war&lt;br /&gt;22:21:18,057 INFO  [org.jboss.ejb3.session.SessionSpecContainer] Starting jboss.j2ee:jar=test.war,name=MyService,service=EJB3&lt;br /&gt;22:21:18,064 INFO  [org.jboss.ejb3.EJBContainer] STARTED EJB: ru.intr13.jboss.arquillian.arquillianJunit.MyService ejbName: MyService&lt;br /&gt;22:21:18,092 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:&lt;br /&gt;&lt;br /&gt;MyService/local - EJB3.x Default Local Business Interface&lt;br /&gt;MyService/local-ru.intr13.jboss.arquillian.arquillianJunit.IMyService - EJB3.x Local Business Interface&lt;br /&gt;&lt;br /&gt;22:21:18,827 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] deploy, ctxPath=/test&lt;br /&gt;22:21:19,219 INFO  [org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher] Skipping CDI injections. Either beans.xml is not present or the BeanManager could not be located in JNDI.&lt;br /&gt;22:21:19,451 INFO  [org.jboss.profileservice.management.upload.remoting.DeployHandler] invoke, payload: {DeploymentTargetID=names=[test.war], clientAddress=/127.0.0.1}, parameter: stop&lt;br /&gt;22:21:19,456 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] undeploy, ctxPath=/test&lt;br /&gt;22:21:19,491 INFO  [org.jboss.ejb3.session.SessionSpecContainer] Stopping jboss.j2ee:jar=test.war,name=MyService,service&lt;br /&gt;=EJB3&lt;br /&gt;22:21:19,501 INFO  [org.jboss.ejb3.EJBContainer] STOPPED EJB: ru.intr13.jboss.arquillian.arquillianJunit.MyService ejbName: MyService&lt;br /&gt;22:21:19,982 INFO  [org.jboss.profileservice.management.upload.remoting.DeployHandler] invoke, payload: {DeploymentTargetID=names=[test.war], clientAddress=/127.0.0.1}, parameter: remove&lt;/blockquote&gt;&lt;h3&gt;Что это было?&lt;/h3&gt;JBoss Arquillian собрал приложение и запустил его на сервере приложений, что видно по логу сервера приложений. При этом он задеплоил &lt;a href=&quot;http://ru.wikipedia.org/wiki/Enterprise_JavaBeans&quot; target=&quot;_blank&quot;&gt;Enterprise Java Bean (EJB)&lt;/a&gt; - MyService, и произвел запуск тестов в контексте сервера приложений. Далее была произведена &quot;зачистка&quot; и apache maven отрапортовал&amp;nbsp;что все тесты прошли успешно.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Важное замечание!&lt;/strong&gt; Код теста запускался не локально, а на сервере приложений. Потому чтобы отлаживать тесты требуется запуск сервера приложений в debug режиме.&lt;br /&gt;&lt;h3&gt;Что мы тестировали?&lt;/h3&gt;У нас был EJB &lt;a href=&quot;http://bitbucket.org/intr13/jboss.arquillian.junit.example/src/tip/src/main/java/ru/intr13/jboss/arquillian/arquillianJunit/MyService.java&quot; target=&quot;_blank&quot;&gt;MyService&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;@Stateless&lt;br /&gt;@Local(IMyService.class)&lt;br /&gt;public class MyService implements IMyService {&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String getMessage(String data) {&lt;br /&gt;return data;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;с локальным интерфейсом -&amp;nbsp;&lt;a href=&quot;http://bitbucket.org/intr13/jboss.arquillian.junit.example/src/tip/src/main/java/ru/intr13/jboss/arquillian/arquillianJunit/IMyService.java#&quot;&gt;IMyService&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;public interface IMyService {&lt;br /&gt;&lt;br /&gt;String getMessage(String data);&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;У которого мы вызывали метод getMessage.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Важное замечание!&lt;/strong&gt; Мы деплоили наш EJB на сервер приложений при запуске тестов, хотя могли его заранее задеплоить в другом модуле, а потом просто получить его из InitialContext.&lt;br /&gt;&lt;h3&gt;Как мы тестировали?&lt;/h3&gt;&lt;a href=&quot;http://bitbucket.org/intr13/jboss.arquillian.junit.example/src/tip/src/test/java/ru/intr13/jboss/arquillian/arquillianJunit/MyServiceTestCase.java#&quot; target=&quot;_blank&quot;&gt;Код теста&lt;/a&gt; прост (использовался &lt;a href=&quot;http://www.junit.org/&quot; target=&quot;_blank&quot;&gt;junit&lt;/a&gt; как фреймворк для тестирования):&lt;br /&gt;&lt;blockquote&gt;@RunWith(Arquillian.class)&lt;br /&gt;public class MyServiceTestCase {&lt;br /&gt;&lt;br /&gt;@Deployment&lt;br /&gt;public static JavaArchive createDeployment() {&lt;br /&gt;return ShrinkWrap.create(JavaArchive.class, &quot;test.jar&quot;).addClasses(&lt;br /&gt;IMyService.class, MyService.class);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void myTest() throws Exception {&lt;br /&gt;&lt;br /&gt;InitialContext context = new InitialContext();&lt;br /&gt;&lt;br /&gt;IMyService myService = (IMyService) context.lookup(&quot;MyService/local&quot;);&lt;br /&gt;&lt;br /&gt;Assert.assertEquals(myService.getMessage(&quot;kva&quot;), &quot;kva&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;Где в методе createDeployment мы говорим что надо задеплоить EJB MyService на сервер приложений, а в методе myTest получаем задеплоенный EJB и проверяем его.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Важное замечание!&lt;/strong&gt; По умолчанию JBoss Arquillian создает &lt;a href=&quot;http://en.wikipedia.org/wiki/WAR_(Sun_file_format)&quot; target=&quot;_blank&quot;&gt;web application arсhive (WAR)&lt;/a&gt; в который размещает наш виртуальных архив созданный в методе createDeployment. Но есть возможность задеплоить свой виртуальный &lt;a href=&quot;http://en.wikipedia.org/wiki/EAR_(file_format)&quot; target=&quot;_blank&quot;&gt;enterprise application arсhive (EAR)&lt;/a&gt;, в который кстати будет автоматически помещен WAR JBoss Arquillian.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Еще одно важно замечание!&lt;/strong&gt; Так как код теста выполняется на сервере приложений, то возникает потребность в классе теста внутри виртального модуля (и возможно наличие других тестовых библиотек). В приведенном примере JBoss Arquillian автоматически добаляет класс MyServiceTestCase в свой war. Но иногда требуется вручную указывать необходимые классы (при ручном формировании WAR или EAR).&lt;br /&gt;&lt;h3&gt;Как это работает?&lt;/h3&gt;В целом работает все это следующим образом:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Мы запускаем тест который использует библиотеки JBoss Arquillian.&lt;/li&gt;&lt;li&gt;JBoss Arquillian получает у теста виртуальный JAR архив с EJB компонентами (метод createDeployment). Для этого используется технология &lt;a href=&quot;http://jboss.org/shrinkwrap&quot; target=&quot;_blank&quot;&gt;ShrinkWrap&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;JBoss Arquillian создает WAR архив в который размещает свои библиотеки, класс теста который мы запускаем (вот такая рекурсия) и созданный нами виртуальный JAR архив.&lt;/li&gt;&lt;li&gt;JBoss Arquillian деплоит WAR архив на запущенный JBoss AS.&lt;/li&gt;&lt;li&gt;JBoss AS разворачивает WAR архив со всем его содержимым. В этот момент происходит деплой нашего EJB компонента на сервере приложений.&lt;/li&gt;&lt;li&gt;WAR запускает тест.&lt;/li&gt;&lt;li&gt;После запуска тестов в вызывающее приложение передается результаты выполнения тестов и происходит удаление WAR архива с сервера приложений (зачистка).&lt;/li&gt;&lt;li&gt;Вывод результатов тестирования.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Ложки дегтя!&lt;/h3&gt;И все было бы хорошо, но есть пара&amp;nbsp;проблем&amp;nbsp;которые мешают нормально жить:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;По умолчанию в OS Windows есть ограничение на длину выполняемой команды (порядка 8 тысяч символов). И в связи с тем что мы подключаем библиотеки JBoss (при помощи apache maven), возникает &lt;a href=&quot;http://eclipsecoding.wikidot.com/faq#launchError&quot; target=&quot;_blank&quot;&gt;проблема с запуском тестов в Eclipse IDE&lt;/a&gt;. Конечно можно уменьшить classpath или пути до&amp;nbsp;исполняемых&amp;nbsp;файлов и файлов проекта, но осадок остался. Кстати при запуске через консоль в windows такой&amp;nbsp;проблемы&amp;nbsp;нет, также в IDEA IDE тоже решили данную проблему.&lt;/li&gt;&lt;li&gt;Разработчики JBoss Arquillian говорят что в тестах можно &lt;a href=&quot;http://docs.jboss.org/arquillian/reference/latest/en-US/html_single/#d0e964&quot; target=&quot;_blank&quot;&gt;автоматически инжектить EJB&lt;/a&gt;. То есть описывать в тесте поле с аннотацией @EJB, но это не работает. А если быть точным то работает в очень редких случаях при правильном именовании EJB и их интерфейсов. Лучи позора разработчикам, но писать без говнокода сложно (&lt;a href=&quot;http://github.com/arquillian/arquillian/blob/1.0.0.Alpha4/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java&quot; target=&quot;_blank&quot;&gt;класс EJBInjectionEnricher&lt;/a&gt; метод lookupEJB).&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;&lt;h3&gt;Что еще?&lt;/h3&gt;К сожалению я опустил вопросы:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Запуск интеграционных тестов для уже&amp;nbsp;разработанных&amp;nbsp;приложений (JASS, classpath).&lt;/li&gt;&lt;li&gt;Создание виртуальных EAR &amp;nbsp;приложений.&lt;/li&gt;&lt;li&gt;Автоматический запуск интеграционных тестов на CI сервере.&lt;/li&gt;&lt;/ul&gt;Но скорее всего я еще вернусь к данной теме :)&lt;br /&gt;&lt;h3&gt;Заключение&lt;/h3&gt;На данный момент я работаю над группой EAR приложений которые запускаются более 3 минут, передеплой занимает 2 минуты. И чтобы не ждать мы разбили приложение на небольшие EAR модули для базовых написали интеграционные тесты. Их запуск занимает 10-15 секунд, передеплой базовых модулей занимает 30-40 секунд. То есть мы рады и немного счастливы. Спасибо разработчикам &lt;a href=&quot;http://jboss.org/arquillian&quot; target=&quot;_blank&quot;&gt;JBoss Arquillian&lt;/a&gt; за полезную штуку :)&lt;br /&gt;&lt;h3&gt;Ссылки&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://jboss.org/arquillian&quot; target=&quot;_blank&quot;&gt;Сайт проекта JBoss Arquillian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://community.jboss.org/wiki/Arquillian&quot; target=&quot;_blank&quot;&gt;Краткое описание, статус проекта и ссылки по JBoss Arquillian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://docs.jboss.org/arquillian/reference/latest/en-US/html_single/&quot; target=&quot;_blank&quot;&gt;Немного документации по JBoss Arquillian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://community.jboss.org/wiki/ArquillianContainerInjectionSupportMatrix&quot; target=&quot;_blank&quot;&gt;Таблица с возможностями JBoss Arquillian и поддержкой у различных серверов приложений&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://github.com/arquillian/arquillian/tree/1.0.0.Alpha4/examples/&quot; target=&quot;_blank&quot;&gt;Тестовые примеры JBoss Arquillian на github&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://bitbucket.org/intr13/jboss.arquillian.junit.example/src&quot; target=&quot;_blank&quot;&gt;Исходный код тестового проекта&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>http://tech.intr13.ru/2010/09/jboss-arquillian.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-hpSw_dolKgQ/TbMD_DBdQhI/AAAAAAAABNo/heBsYB2qiIU/s72-c/arquillian_ui_error_256px.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-7780880772438464901</guid><pubDate>Fri, 06 Aug 2010 15:00:00 +0000</pubDate><atom:updated>2011-04-24T01:29:15.864+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">geekfest</category><category domain="http://www.blogger.com/atom/ns#">аутизм</category><category domain="http://www.blogger.com/atom/ns#">выступление</category><category domain="http://www.blogger.com/atom/ns#">доклад</category><category domain="http://www.blogger.com/atom/ns#">конференция</category><category domain="http://www.blogger.com/atom/ns#">презентация</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">развитие</category><category domain="http://www.blogger.com/atom/ns#">тренер</category><category domain="http://www.blogger.com/atom/ns#">хорошо</category><title>Презентация от программиста. Черновик.</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-f0xGa8MbuCU/TbL9lWsAKqI/AAAAAAAABNc/NftJTBe5rMM/s1600/geekfest.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;http://2.bp.blogspot.com/-f0xGa8MbuCU/TbL9lWsAKqI/AAAAAAAABNc/NftJTBe5rMM/s320/geekfest.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Профессия накладывает отпечаток на личность. И это важно, без профессиональной деформации сложно понимать коллег, нужен общий знаменатель. Но программистский аутизм отнюдь не способствует эффективному общению. И требуются усилия для преодоления стеклянной стены между программистами. Предполагается, что этим занимается хороший менеджер. Но где вы видели хороших менеджеров?&lt;br /&gt;&lt;br /&gt;Получается, что спасение утопающих - это дело рук самих утопающих. И программистам надо учиться общаться без катализатора, то есть развивать свои коммуникативные навыки. Для этого можно: вести свой блог,  пойти на курсы ораторского искуства, читать умные книги или просто больше общаться. Но в большинстве перечисленных способов есть проблема обратной связи, а также проблемма переносимости полученого опыта в рабочую среду.&lt;br /&gt;&lt;br /&gt;По моему скромному мнению, для развития навыков общения нужно выступать с докладами на айти-конференциях. Если там вы будете пороть чушь, то вас точно поправят. Да и контекст конференции очень похож на контекст презентации своих идей в рабочей среде. Но для типичного программиста-аутиста сделать подобный доклад очень сложно. Потому, сейчас мы попробуем на примере рассмотреть, как сделать хороший доклад.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Исходные данные:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://intr13.moikrug.ru/&quot; target=&quot;_blank&quot;&gt;Senior Developer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Профессиональная деформация.&lt;/li&gt;&lt;li&gt;Небольшой опыт выступлений.&lt;/li&gt;&lt;li&gt;Тема про которую должен узнать мир.&lt;/li&gt;&lt;li&gt;Желание развиваться.&lt;/li&gt;&lt;li&gt;Региональная айти-конференция &lt;a href=&quot;http://geekfest.ru/&quot; target=&quot;_blank&quot;&gt;GeekFest&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://golodnyj.ru/&quot; target=&quot;_blank&quot;&gt;Адекватный тренер&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Важные мысли:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;«В первую очередь важна эмоциональная составляющая.»  - Чуди из ярр студии.&lt;/li&gt;&lt;li&gt;«Никогда не читайте то что написано на слайдах. Никогда!» - Голодный подкастер.&lt;/li&gt;&lt;li&gt;«Не надо считать людей за идиотов и все разжевывать, кому надо разберется или спросит.»  -  Голодный подкастер.&lt;/li&gt;&lt;li&gt;«Технический доклад скучен и очень сильно сужает аудиторию. И большому количеству технических подробностей не место в хорошем докладе.» - Голодный подкастер.&lt;/li&gt;&lt;li&gt;«Хороший доклад лежит на грани, между умным занудством и веселой чепухой.» - Я.&lt;/li&gt;&lt;/ul&gt;Итак, в один прекрасный день я встретился с одним голодным подкастером. И он сказал что надо. Кто если не я, что-нибудь расскажет и покажет на очередном GeekFest. Я стал отпираться и говорить, что я рассказываю очень скучно и нудно, и люди при этом засыпают. Но Родина в опастности! И кто если не мы. К тому же он сказал что над моим выступлением мы плотно поработаем. Как наивен я тогда был.&lt;br /&gt;&lt;br /&gt;У нас был месяц на подготовку, и за первую неделю я должен был сделать презентацию. Чем я и занимался по вечерам после работы. В итоге через полторы недели получилась первая версия презентации. И мой тренер сказал что ее надо выкинуть, чуть менее чем полностью.&lt;br /&gt;&lt;br /&gt;Основные замечания к первой версии презентации:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Плохое название для доклада.&lt;/li&gt;&lt;li&gt;Очень много текста на сладайх.&lt;/li&gt;&lt;li&gt;Непонятно как я буду рассказывать презентацию, и как будут осуществлятся переходы между слайдами.&lt;/li&gt;&lt;li&gt;Очень сложные и непонятные схемы на слайдах.&lt;/li&gt;&lt;li&gt;Плохие картинки на слайдах, надо очищать их от стороннего текста.&lt;/li&gt;&lt;li&gt;Некрасивый шрифт.&lt;/li&gt;&lt;/ul&gt;Кстати, первую версию презентации вы можете увидеть &lt;a href=&quot;https://docs.google.com/fileview?id=0By2zUzN6lpLsYWRmMTIyMmItMmJmMi00ODE3LWJkNDQtNTdiOTBkNjk1MGZh&amp;amp;hl=en&amp;amp;pli=1&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В итоге мы поправили несколько первых слайдов, и он подробно рассказал мне все, что думает про остальные. И погоревав несколько дней, я начал делать вторую версию, которую закончил за полторы недели до доклада. По второй версии замечаний практически не было, лишь шрифт был немного кривой. Но и эту проблему я победил, в последней версии используется кошерный Gills Sans из MacOS.&lt;br /&gt;&lt;br /&gt;В итоге получилось &lt;a href=&quot;https://docs.google.com/fileview?id=0By2zUzN6lpLsY2U2ZmRiZTQtNzUzNS00Y2Q2LThiOGEtZWUxMTMyZGFhYzI3&amp;amp;hl=en&quot; target=&quot;_blank&quot;&gt;следующее&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Но хорошо. Перезентация - это одно, но без выступления она не имеет смысла. И за неделю до выступления мы договорились встретиться и потренироваться. К этому времени я должен был написать и потренировать выступление сам. Чем я занялся, и даже написал речь на две с половиной страницы текста. И даже немного ее проговорил.&lt;br /&gt;&lt;br /&gt;Первую версию моей речи можно найти &lt;a href=&quot;https://docs.google.com/document/edit?id=1MvpAPhbt8z9NxEGXmecu3osR7Icb86bYP9RhZrTx4rc&amp;amp;hl=en&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Итак, ровно к 12 часам солнечного воскреченья, я прибыл к голодному подкастеру в апартаменты. Целый час мы беседовали на филосовские темы. И ровно в час дня мы начали мою тренировку. Я рассказал свой доклад и это заняло ровно 19 минут. И по выражению лица тренера я понял что это фейл.&lt;br /&gt;&lt;br /&gt;Основные замечания к первой версии выступления:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Скучно и нудно.&lt;/li&gt;&lt;li&gt;Очень много слов, которые затягивают слушателей в объятья морфея.&lt;/li&gt;&lt;li&gt;Нет динамики в выступлении.&lt;/li&gt;&lt;li&gt;Очень плохо проработаны переходы между слайдами.&lt;/li&gt;&lt;li&gt;Нет ввода в тематику моей работы.&lt;/li&gt;&lt;li&gt;Нет сопричастности.&lt;/li&gt;&lt;li&gt;Очень слабо и вяло&amp;nbsp;рассказано&amp;nbsp;о&amp;nbsp;проблемах.&lt;/li&gt;&lt;li&gt;И еще много всяких замечаний.&lt;/li&gt;&lt;/ul&gt;После этого я отдохнул пятнадцать минут и повторил выступление. Стало намного лучше, но это не была история успеха, и это самое главное замечание второго выступления. Также мы проработали переходы между слайдами и пасхальные яйца в выступлении. И на третий раз получилось очень даже достойно, причем я уложился в 14 минут.&lt;br /&gt;&lt;br /&gt;Потом я был отправлен домой с наставлением все повторить и потренироваться еще раз в четверг по скайпу. Но в четверг мы того не сделали. Наверное я очень сильно утомил своего тренера и его уже мутило от моего доклада. Но я рассказал все своей жене и ей понравилось. Только она сказала что надо больше улыбаться, а то я какой-то мрачный.&lt;br /&gt;&lt;br /&gt;И вот настал великий день - пятница! Конечно я волновался и переживал, но по моему скромному мнению у меня получилось. Но судит конечно вам, благо велась видеозапись и &lt;a href=&quot;http://vimeo.com/13901203&quot; target=&quot;_blank&quot;&gt;тут ее можно увидеть&lt;/a&gt;. Также вы можете посмотреть мое предыдущее &lt;a href=&quot;http://intr13.ru/2010/06/06/569&quot; target=&quot;_blank&quot;&gt;выступление&lt;/a&gt; (оно скучно и немного нудно).&lt;br /&gt;&lt;br /&gt;Несколько важных моментов:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Рассказывать доклад одному человеку намного сложнее чем выступать перед большой аудиторией. Он тебя оценивает и может говорить болезненные гадости.&lt;/li&gt;&lt;li&gt;Если вы волнуетесь перед презентацией, то можно воспользоваться волшебной фляжкой с успокаивающим напитком. Что я и сделал.&lt;/li&gt;&lt;/ul&gt;В результате получилось:&lt;br /&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;225&quot; src=&quot;http://player.vimeo.com/video/13901203?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;400&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href=&quot;http://vimeo.com/13901203&quot;&gt;miniGeekFest 30072010 01 timetable min&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user1433551&quot;&gt;golodnyj&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com/&quot;&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;Ссылки:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://vimeo.com/13901203&quot; target=&quot;_blank&quot;&gt;Мое выступление&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://intr13.ru/2010/06/06/569&quot; target=&quot;_blank&quot;&gt;Мое предыдущее выступление&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.google.com/fileview?id=0By2zUzN6lpLsYWRmMTIyMmItMmJmMi00ODE3LWJkNDQtNTdiOTBkNjk1MGZh&amp;amp;hl=en&amp;amp;pli=1&quot; target=&quot;_blank&quot;&gt;Первая версия моей презентации&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.google.com/fileview?id=0By2zUzN6lpLsY2U2ZmRiZTQtNzUzNS00Y2Q2LThiOGEtZWUxMTMyZGFhYzI3&amp;amp;hl=en&quot;&gt;Вторая версия моей презентации&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.google.com/document/edit?id=1MvpAPhbt8z9NxEGXmecu3osR7Icb86bYP9RhZrTx4rc&amp;amp;hl=en&amp;amp;pli=1#&quot; target=&quot;_blank&quot;&gt;Первая версия моей речи&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=CVUcbmB8ifc&quot; target=&quot;_blank&quot;&gt;Демонстрация которую я показывал на выступлении&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://golodnyj.habrahabr.ru/blog/95455/&quot; target=&quot;_blank&quot;&gt;Статья голодного подкастера о том как сделать хорошее выступление&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://rusich.podfm.ru/pod/&quot; target=&quot;_blank&quot;&gt;Подкаст своими руками&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://geekfest.ru/&quot; target=&quot;_blank&quot;&gt;Сайт GeekFest&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://blog.golodnyj.ru/2010/08/minigeekfest.html&quot; target=&quot;_blank&quot;&gt;Фотографии с мероприятия&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://spreadsheets0.google.com/viewform?formkey=dFB1SVhKTTdPV1l6QmVQQU13WnNlTEE6MQ&quot; target=&quot;_blank&quot;&gt;Анонимный&amp;nbsp;опрос для тех кто видел мое выступление&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.formspring.me/intr13&quot; target=&quot;_blank&quot;&gt;Задать мне анонимный вопрос&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</description><link>http://tech.intr13.ru/2010/08/presentation.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-f0xGa8MbuCU/TbL9lWsAKqI/AAAAAAAABNc/NftJTBe5rMM/s72-c/geekfest.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5954329976339738584</guid><pubDate>Sat, 05 Jun 2010 15:00:00 +0000</pubDate><atom:updated>2011-04-24T01:37:06.636+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">unit-тест</category><category domain="http://www.blogger.com/atom/ns#">архитектура по</category><category domain="http://www.blogger.com/atom/ns#">доклад</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Мой доклад на GeekFest про архитектуру ПО и unit-тесты</title><description>Так случилось, что уговорил меня&amp;nbsp;товарищ &lt;a href=&quot;http://golodnyj.ru/&quot; target=&quot;_blank&quot;&gt;golodnyj&lt;/a&gt; выступить на Иркутском мероприятии - &lt;a href=&quot;http://geekfest.ru/&quot; target=&quot;_blank&quot;&gt;GeekFest 2010&lt;/a&gt;. И собравшись с духом, я что то придумал, и что то рассказал :) Что из этого получилось судить не мне. Потому если будет желание, то можете поглядеть все непотребство &lt;a href=&quot;http://vimeo.com/12129812&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Итак: Расслоение системы на уровни или когда работают unit-тесты.&lt;br /&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;225&quot; src=&quot;http://player.vimeo.com/video/12129812?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;400&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href=&quot;http://vimeo.com/12129812&quot;&gt;GeekFest2010 07 unit&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user1433551&quot;&gt;golodnyj&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com/&quot;&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Презентация лежит &lt;a href=&quot;http://dl.dropbox.com/u/2168804/%D0%A0%D0%B0%D1%81%D1%81%D0%BB%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-%D0%BD%D0%B0-%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B8-%D0%B8%D0%BB%D0%B8-%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%82-unit-%D1%82%D0%B5%D1%81%D1%82%D1%8B.pdf&quot;&gt;тут&lt;/a&gt;, а &lt;a href=&quot;http://vimeo.com/tag:geekfest2010&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; есть еще немного видео с мероприятия.&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Мне на самом деле не очень понравилось как я выступил, есть еще много над чем надо работать...</description><link>http://tech.intr13.ru/2010/06/geekfest.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5759190163531173480</guid><pubDate>Sat, 27 Feb 2010 16:00:00 +0000</pubDate><atom:updated>2011-04-24T01:39:48.241+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">карго-культ</category><category domain="http://www.blogger.com/atom/ns#">код</category><category domain="http://www.blogger.com/atom/ns#">понимание</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">танцы с бубном</category><category domain="http://www.blogger.com/atom/ns#">холивар</category><category domain="http://www.blogger.com/atom/ns#">шаманство</category><title>Карго-культ в программировании</title><description>&lt;blockquote&gt;Культ карго или карго-культ (англ. cargo cult — поклонение грузу), также религия самолётопоклонников или культ Даров небесных — термин, которым называют группу религиозных движений в Меланезии. В культах карго верят, что западные товары (карго, англ. груз) созданы духами предков и предназначены для меланезийского народа. Считается, что белые люди нечестным путём получили контроль над этими предметами. В культах карго проводятся ритуалы, похожие на действия белых людей, чтобы этих предметов стало больше.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%BB%D1%8C%D1%82_%D0%BA%D0%B0%D1%80%D0%B3%D0%BE&quot; target=&quot;_blank&quot;&gt;Источник Википедия&lt;/a&gt;.&lt;/blockquote&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Недавно я стал безработным программистом и стал искать новую работу. Сейчас я уже нашел один интересный вариант, но когда я его искал, то столкнулся с рядом компаний и людей, которые были поклонникам Карго-культа. Особенно трепетное отношение я увидел к unit-тестированию, у многих unit-тесты отсутствуют как класс, и они думают что если у них появятся unit-тесты, то произойдет чудо и &quot;кузнечик запиликает на скрипке&quot;.&lt;br /&gt;&lt;br /&gt;Когда я работал в предыдущей компании, то я тоже видел подобных клиентов (компания немного занималась офшорным программированием). И тогда меня это удивляло, ведь процесс превозносился в пику пользы. А я то наивный верил, что процесс нужен лишь как средство :)&lt;br /&gt;&lt;br /&gt;Конечно, &quot;правильные&quot; подходы в Карго-культах важны. Иногда они позволяют чего то достичь, но истинные достижения невозможны без понимания плюсов и минусов. Надо знать когда процесс не работает, чтобы его успешно применять.&lt;br /&gt;&lt;br /&gt;И напоследок ряд ссылок на почитать (самое интересное порой в комментариях):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://bishop-it.ru/2010/02/shuhari/&quot; target=&quot;_blank&quot;&gt;Shu-ha-ri для программистов&lt;/a&gt; - об уровнях понимания&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.eldar.com/node/271&quot; target=&quot;_blank&quot;&gt;МИМУКРАПП - Методология Использования Методологий для Ускорения Карьерного Роста и Акселерации Прозводства Программ&lt;/a&gt; - о командных плясках с бубном вокруг костра разработки и том что не все вещи работают.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://gaperton.livejournal.com/32772.html&quot; target=&quot;_blank&quot;&gt;Читай код&lt;/a&gt; - о том что надо понимать что ты делаешь, и тренировать свое понимание.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://victorronin.com/2010/02/27/ocherednaya-solyanka-sbornaya/&quot; target=&quot;_blank&quot;&gt;Очередная солянка сборная&lt;/a&gt; - рекомендую прочитать комментарии о документировании исходного кода.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://itspeciality.blogspot.com/2010/02/blog-post.html&quot; target=&quot;_blank&quot;&gt;О божественном знании&lt;/a&gt; - немного об опыты айтишников, &lt;a title=&quot;Бритва Оккамы&quot; href=&quot;http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0&quot; target=&quot;_blank&quot;&gt;Бритва Оккамы&lt;/a&gt; штука полезная.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.codeinstructions.com/2008/10/styles-of-programming.html&quot; target=&quot;_blank&quot;&gt;Programming Styles&lt;/a&gt; - о стилях программирования, и программистах Карго-культа. Осторожно, там немного специфический юмор.&lt;/li&gt;&lt;/ul&gt;И давайте думать, прежде чем делать.&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;К сожалению, не могу найти еще одну ссылку на холивар: о чтении умных книг неподготовленными людьми. Например когда студенты, читают книги о шаблонах рефактиринга или шаблонах проектирования, а потом не помыв руки лезут править код. Да порой это плохо и вредно, но путь без ошибок не бывает. Кстати и учится порой не у кого, есть только книги.</description><link>http://tech.intr13.ru/2010/02/cargo-cult.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-1303500984670539156</guid><pubDate>Fri, 29 Jan 2010 16:00:00 +0000</pubDate><atom:updated>2011-04-24T00:51:45.086+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ant</category><category domain="http://www.blogger.com/atom/ns#">ci</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">maven</category><category domain="http://www.blogger.com/atom/ns#">nexus</category><category domain="http://www.blogger.com/atom/ns#">redmine</category><category domain="http://www.blogger.com/atom/ns#">svn</category><category domain="http://www.blogger.com/atom/ns#">unit-тест</category><category domain="http://www.blogger.com/atom/ns#">wiki</category><category domain="http://www.blogger.com/atom/ns#">мозг</category><category domain="http://www.blogger.com/atom/ns#">общение</category><category domain="http://www.blogger.com/atom/ns#">отчет</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">проект</category><category domain="http://www.blogger.com/atom/ns#">репозиторий</category><category domain="http://www.blogger.com/atom/ns#">тесты</category><title>Практики которые я возьму с собой</title><description>Я имею довольно небольшой опыт работы в сфере разработки программного обеспечения (всего 6 лет), но я уже накопил ряд полезных и правильных практик, которые можно использовать при создании программного обеспечения.&lt;br /&gt;&lt;br /&gt;Только прежде чем читать, учтите&amp;nbsp;тот факт, что я работаю в области разработки приложений на Java, потому буду рекомендовать средства учитывающие данную специфику. Также учтите, что это пока черновик, и ваши замечания (в том числе по орфографии и пунктуации) будут полезны :)&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;В конце рабочего дня подведение краткого итога, и письменный ответ на три вопроса: что было сделано, какие проблемы возникли, что планируется сделать.&lt;/strong&gt; Также неплохо предоставить данную информацию всей команде (электронная почта, внутренний блог), и если у них будет интерес, то они могут прочитать данный отчет. Полезность данной практики неоценима, каждый кто составляет отчет задумывается в конце дня над вопросом: а что он сегодня полезного сделал. И ради ответа на данный вопрос уже стоит использовать данную практику. Кстати, некоторые заметят что данная практика писутствует в &lt;a href=&quot;http://ru.wikipedia.org/wiki/Scrum&quot; target=&quot;_blank&quot;&gt;Scrum&lt;/a&gt; методологии. Но я первый раз увидел ее на Иркутском Авиационном заводе, мне о ней рассказал один очень интересный человек.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Все материалы по проекту должны быть сосредоточенны в одном месте.&lt;/strong&gt; Например, ссылки на логи общения с заказчиком или URL, для репозиториев исходного кода. Порядок никогда не бывает лишним, а порой очень сильно способствует повышению производительности.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Надо управлять требованиями заказчика.&lt;/strong&gt; Что понимается под таким общим утверждением? Все просто, все запросы на изменея вносимые в проект от заказчика должны быть зафиксированны в электронном виде. В тяжелых случаях заказчик должен ставить подпись под каждым своим требованием. Да это бюрократия, да интереснее писать код, но без этого ваш проект имеет очень высокую вероятность провала. Хотя тут многое зависит от.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;После получения задания от заказчика надо объяснить своими словами что он хочет.&lt;/strong&gt; Данная вещь очень важна, без нее очень часто реализовываются вещи которые хочет разработчик, а не заказчик. Хоть это и звучит дико, но тут надо искать компромис, ведь разработчик тоже не дурак и понимает к чему приведет реализация странных требований.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Повесить на общее обозрение диаграмму описывающую архитектурные особеннности проекта.&lt;/strong&gt; В идеале рядом с ней повесить диаграмму с ходом движения работ по проекту. Это позволит поднять уровень коммуникации между членами команды на принципиально иной уровень. Главное не забывать тыкать пальцем в элементы диаграмм при обсуждении проекта.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Исходный код проекта должен хранится в системе контроля версий.&lt;/strong&gt; Особенно это важно когда код пишет более одного человека, хотя я уже не представляю себе как можно писать код без системы контроля версий. Наверное у меня комплекс, но мне нужен хотя бы &lt;a href=&quot;http://subversion.tigris.org/&quot; target=&quot;_blank&quot;&gt;SVN&lt;/a&gt; для комфортной работы.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Должна быть инструкция для настройки рабочего окружения по работе над проектом.&lt;/strong&gt; Если данного документа нет, то получается истинный хаос при подключении нового человека в проект. Да и передача дел значительно затрудняется. Вики по проекту это идеальный вариант.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Использование системы управления задачами.&lt;/strong&gt; Наличие данной системы позволит более продуктивно исправлять различные проблеммы и не забывать про них. Не забывать это хорошо. Кстати, я рекомендую обратить внимание на &lt;a href=&quot;http://www.redmine.org/&quot; target=&quot;_blank&quot;&gt;Redmine&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Наличие описания сборки проекта.&lt;/strong&gt; Если каждый раз сборка проекта это череда магических пасов, и собрать проект может только единственный гуру в команде, то это бардак. Если будет описание процеса сборки приложения хотя бы в текстовом виде это значительно упростит работу работу всех членов команды, и избавит от ряда глупых вопросов. Идеальный вариант когда процесс сборки приложения автоматизирован (например при помощи &lt;a href=&quot;http://ant.apache.org/&quot; target=&quot;_blank&quot;&gt;Ant&lt;/a&gt; или &lt;a href=&quot;http://maven.apache.org/&quot; target=&quot;_blank&quot;&gt;Maven&lt;/a&gt;), тогда счастье разработчиков поистине безгранично.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Разработка unit-тестов.&lt;/strong&gt; Это очень противоречивая практика, иногда unit-тесты разрабатывать нецелесообразно, да и не все можно протестировать в рамках отведенного бюджета. Но когда unit-тесты есть и написанны правильно это очень сильно повышает уверенность разработчиков в устойчивости исходного кода. Тесты можно писать на &lt;a href=&quot;http://www.junit.org/&quot; target=&quot;_blank&quot;&gt;JUnit&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Использование системы непрерывной интеграции.&lt;/strong&gt; Возможно вам это и не надо, но меня очень уж радует факт того, что каждый день происходит сборка системы, и возможно проходят все тесты. Это значительно повышает уверенность в разрабатываемой вами системе. Я рекомендую обратить внимание на системе непрерывной интеграции&amp;nbsp;&lt;a href=&quot;https://hudson.dev.java.net/&quot; target=&quot;_blank&quot;&gt;Hudson&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;С опаской относится к независящим от вас системам.&lt;/strong&gt; Например ставить mvn-proxy репозиторий (я рекомендую &lt;a href=&quot;http://nexus.sonatype.org/&quot; target=&quot;_blank&quot;&gt;Nexus&lt;/a&gt;), и пользовать его, а то вдруг глобальные репозитории упадут. Интернет ненадежная штука.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Быть готовым к изменениям.&lt;/strong&gt; Не все изменения одинаково полезны, но надо быть готовым принять разумные вещи и использовать их в своих целях. Я рекомендую использовать мозг.&lt;/li&gt;&lt;/ul&gt;Все вышеприведенные практики были полезны для меня лично и если они будут полезны вам, то я буду рад. Кстати, данные практики в основном описывают что необходимо делать для поддержки процесса программирования, но не затрагивают процесс планирования хода работ. Сам процесс программирования и полезные плюшки для него (например расслоение системы на уровни, использование шаблонов проектирования) я пока решил опустить, но к ним я еще вернусь :)&lt;br /&gt;&lt;br /&gt;И напоследок: не забывайте думать, прежде чем делать!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;UPDATE 2010-06-09:&lt;/strong&gt; &lt;a href=&quot;http://habrahabr.ru/blogs/arbeit/83289/&quot; target=&quot;_blank&quot;&gt;причесанная версия данного текста на хабре&lt;/a&gt;.</description><link>http://tech.intr13.ru/2010/01/best-practices.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-3382095773715360988</guid><pubDate>Tue, 03 Nov 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-24T01:11:15.727+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">eclipse</category><category domain="http://www.blogger.com/atom/ns#">ide</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">management</category><category domain="http://www.blogger.com/atom/ns#">pulse</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Импульс для Eclipse</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-bPupM8b-0eE/TbL3Vj5k5ZI/AAAAAAAABMA/R9DKckYKGK4/s1600/pulse2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-bPupM8b-0eE/TbL3Vj5k5ZI/AAAAAAAABMA/R9DKckYKGK4/s1600/pulse2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Я не фанат &lt;a href=&quot;http://eclipse.org/&quot; target=&quot;_blank&quot;&gt;Eclipse&lt;/a&gt;. Но среди разнообразных IDE, Eclipse наиболее подходит для меня лично. Во первых , в нем интуитивно понятный для меня интерфейс (или это просто дело привычки). И во вторых, его можно собирать под определенную задачу. То есть для каждой задачи делать свою сборку Eclipse, что позволяет получить идеально отточенный (производительный и удобный) инструмент для каждой конкретной задачи.&lt;br /&gt;&lt;br /&gt;Но сейчас мы не будем устраивать священную войну по поводу правильности моего подхода к приготовлению и использованию IDE. &amp;nbsp;Сейчас мы посмотрим на очень интересный продукт - &lt;a href=&quot;http://www.poweredbypulse.com/&quot; target=&quot;_blank&quot;&gt;Pulse&lt;/a&gt;, который позволяет очень удобно управлять сборкой Eclipse. Также в конце я приведу список интересных плагинов,&amp;nbsp;большинство&amp;nbsp;из которых есть в стандартном репозитории Pulse.&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;strong&gt;Возможности&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Есть три версии поставки Pulse:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Community edition&lt;/li&gt;&lt;li&gt;Freelance team&lt;/li&gt;&lt;li&gt;Private label&lt;/li&gt;&lt;/ul&gt;Среди такого многообразия нас интересует версия Pulse Community edition, потому что она бесплатна:)&lt;br /&gt;&lt;br /&gt;Итак, Community edition:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Бесплатна.&lt;/li&gt;&lt;li&gt;Позволяет создавать свои сборки Eclipse. Причем это делается через удобный GUI. &amp;nbsp;Есть довольно большой каталог&amp;nbsp;проверенных&amp;nbsp;плагинов для Eclipse.&lt;/li&gt;&lt;li&gt;Хранит профили сборок Eclipse у себя на сервере, что позволяет использовать один и тот же профиль на разных компьютерах.&lt;/li&gt;&lt;li&gt;Имеет локальный кэш плагинов. То есть скачав плагин один раз, его не&amp;nbsp;придется&amp;nbsp;скачивать повторно для другого профиля.&lt;/li&gt;&lt;/ul&gt;Другие версии Pulse тоже интересны, и добавляют большой набор функций, но лично мне пока хватает Community edition. Более подробно о различиях написано &lt;a href=&quot;http://www.poweredbypulse.com/products_win.php&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;, или на следующей картинке:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-yWcsoIbJ3vE/TbL3cvWV4ZI/AAAAAAAABME/mFKqj2ZxHeQ/s1600/features.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-yWcsoIbJ3vE/TbL3cvWV4ZI/AAAAAAAABME/mFKqj2ZxHeQ/s1600/features.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Загрузка&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Для установки и использования Pulse вам нужен Интернет. Если его нет, то Pulse вы пока не можете использовать. Вообщем, придумайте что нибудь:)&lt;br /&gt;&lt;br /&gt;Итак, чтобы установить Pulse, для начала надо загрузить версию под свою операционную систему. Сделать это можно &lt;a href=&quot;http://www.poweredbypulse.com/all_os.php&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;, на данный момент поддерживаются: Linux, Mac и Windows. Кстати, есть даже 64-битные версии, но их пользовать мне не довелось.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Установка&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;После загрузки Pulse его надо запустить, и он начнет скачивать недостающие компоненты, после загрузки которых, он предложит продолжить установку:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-a1NO9m1HAP8/TbL3h7DGddI/AAAAAAAABMI/0e5pIS1G944/s1600/install-next.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-a1NO9m1HAP8/TbL3h7DGddI/AAAAAAAABMI/0e5pIS1G944/s1600/install-next.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;После нажатия кнопки &quot;Next&quot; мы увидим выбор из трех вариантов дальнейших действий:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-dF57gYdTuIY/TbL3pPO5aFI/AAAAAAAABMM/Y-Xfv6oZ6BA/s1600/install-choice.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-dF57gYdTuIY/TbL3pPO5aFI/AAAAAAAABMM/Y-Xfv6oZ6BA/s1600/install-choice.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;В данном случае Pulse предлагает:&amp;nbsp;зарегистрироваться, &amp;nbsp;запустится от имени анонимного пользователя, или произвести запуск от уже&amp;nbsp;зарегистрированного&amp;nbsp;пользователя. Мы&amp;nbsp;выберем&amp;nbsp;первый пункт и&amp;nbsp;зарегистрируем&amp;nbsp;нового&amp;nbsp;пользователя:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-gGIkAADQGjE/TbL3vrT3iKI/AAAAAAAABMQ/ppB5KgxYPYg/s1600/install-register.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-gGIkAADQGjE/TbL3vrT3iKI/AAAAAAAABMQ/ppB5KgxYPYg/s1600/install-register.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Дальше Pulse все поставит, настроит и запустит. И мы увидим примерно следующее:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-bgVXCdBSuF8/TbL308EIHqI/AAAAAAAABMU/UpomxyY8dYA/s1600/main.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-bgVXCdBSuF8/TbL308EIHqI/AAAAAAAABMU/UpomxyY8dYA/s1600/main.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Кстати, если вы не заметили - Pulse сам построен на базе Eclipse :)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Сборка Eclipse&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Теперь мы можем сделать сборку Eclipse с нужными нам плагинами. Мы будем делать сборку на базе стандартного Eclipse с плагином для редактирования property-файлов.&lt;br /&gt;&lt;br /&gt;Для этого мы переходим в пункт &quot;Ready to Use Profiles&quot;, подпункт &quot;Popular&quot;. Выбираем там - &quot;Eclipse 3.5 IDE &amp;nbsp;for Java&quot;, и щелкнув правой кнопкой мыши говорим: &quot;Add to my Profiles...&quot;.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-GkOsMl7Hb28/TbL37X7cCWI/AAAAAAAABMY/NHMrt6bslh0/s1600/add.JPG&quot; /&gt;&lt;/div&gt;&lt;br /&gt;Далее мы вводим имя нашего профиля:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ZljDxfX4kho/TbL4B8qerVI/AAAAAAAABMc/VrROud7Sy08/s1600/name.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-ZljDxfX4kho/TbL4B8qerVI/AAAAAAAABMc/VrROud7Sy08/s1600/name.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;И через некоторое время (все зависит от скорости вашего интернет&amp;nbsp;соединения)&amp;nbsp;видим новый профиль в списке наших профилей:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-qYJTEB1r_2c/TbL4HHjx0jI/AAAAAAAABMg/jDBQ9TXGqJ0/s1600/profile.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-qYJTEB1r_2c/TbL4HHjx0jI/AAAAAAAABMg/jDBQ9TXGqJ0/s1600/profile.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Переходим на&amp;nbsp;созданный&amp;nbsp;нами профиль и через некоторое время (тут важно терпение, если у вас медленный интернет) видим список компонентов которые используются в нашем профиле:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-WgaN3Uw6F8w/TbL4raUlmNI/AAAAAAAABMk/5Bmpq6qxwWE/s1600/profile-main.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-WgaN3Uw6F8w/TbL4raUlmNI/AAAAAAAABMk/5Bmpq6qxwWE/s1600/profile-main.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Теперь нам надо добавить плагин для редактирования property-файлов. Тут тоже все просто, надо нажать на зеленый плюсик в правой верхней части и сказать: &quot;Open the Add-on Software catalog&quot; (есть возможность добавления&amp;nbsp;компонентов&amp;nbsp;через udate сайт):&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-NR2x6RN2yyg/TbL41d6GZNI/AAAAAAAABMo/R2s3nACWkXM/s1600/add-plugin1.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-NR2x6RN2yyg/TbL41d6GZNI/AAAAAAAABMo/R2s3nACWkXM/s1600/add-plugin1.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Далее в окне поиска (расположено в правой верхней области) вводим слово - &quot;property&quot; и&amp;nbsp;нажимаем&amp;nbsp;Enter. После этого в результатах поиска выбираем компонент - &quot;Properties Editor&quot;, и щелкнув правой кнопкой мыши, говорим: &quot;Add to Profile...&quot;:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-5afI3OHvivw/TbL5BV3K6cI/AAAAAAAABMs/FXk--T-H-Cw/s1600/add-to-profile.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-5afI3OHvivw/TbL5BV3K6cI/AAAAAAAABMs/FXk--T-H-Cw/s1600/add-to-profile.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;После этого выбираем наш профиль и нажимаем кнопку Ok:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-47Sxu0ECHJI/TbL5HBXtK8I/AAAAAAAABMw/i4hblzjTOUY/s1600/add-profile.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-47Sxu0ECHJI/TbL5HBXtK8I/AAAAAAAABMw/i4hblzjTOUY/s1600/add-profile.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Потом ждем некоторое время, пока компонент не добавится в наш профиль и не появиться окно (для некоторых компонентов&amp;nbsp;появляется&amp;nbsp;окно выбора частей компонента, которые можно дополнительно установить):&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-F_wZ7OpWpTo/TbL5N8zCmwI/AAAAAAAABM0/-9dyfeaVMsI/s1600/add-added.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-F_wZ7OpWpTo/TbL5N8zCmwI/AAAAAAAABM0/-9dyfeaVMsI/s1600/add-added.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Далее переходим в наш профиль, и видим, что список компонентов нашего профиля пополнился:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-euV1Sa2W1KQ/TbL5Sghw7vI/AAAAAAAABM4/kTdY86CVlRI/s1600/profile-full.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-euV1Sa2W1KQ/TbL5Sghw7vI/AAAAAAAABM4/kTdY86CVlRI/s1600/profile-full.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Итак, мы настроили список компонентов нашего профиля, и мы можем приступить к сборке. Но перед сборкой нам необходимо настроить наш профиль. Для этого щелкаем правой кнопкой на нашем профиле и говорим: &quot;Edit Progile Branding...&quot;. Далее в появившемся окне устанавливаем свойство &quot;Workspace name&quot; равным &quot;TestEclipseProfile&quot; (это свойство предназначено для именования папки с нашим профилем):&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-KhELHIK39b4/TbL5Z6Zd57I/AAAAAAAABM8/tsh-WQwzWZ8/s1600/property-branding.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-KhELHIK39b4/TbL5Z6Zd57I/AAAAAAAABM8/tsh-WQwzWZ8/s1600/property-branding.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Потом настраиваем свойства Java для запуска нашего нового Eclipse. Щелкаем правой кнопкой на нашем профиле, и говорим: &quot;Edit Launch Arguments...&quot;. Далее в появившемся окне устанавливаем свойство &quot;VM arguments&quot; равным &quot;-Xms256m -Xmx512m -Dfile.encoding=UTF-8&quot; (минимально и максимальное количество памяти для Java, кодировка по умолчанию):&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-3Vc-2ECWJ2I/TbL5h_ozNaI/AAAAAAAABNA/T24eYLJAduQ/s1600/property-launch.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-3Vc-2ECWJ2I/TbL5h_ozNaI/AAAAAAAABNA/T24eYLJAduQ/s1600/property-launch.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Теперь, когда мы сделали список компонентов-плагинов и настроили нашу сборку, мы можем собрать и запустить ее. Для этого щелкаем правой кнопкой мыши на нашем профиле и говорим: &quot;Install then Run...&quot;:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-yKI1OoSy8lQ/TbL5nSP4MwI/AAAAAAAABNE/xZwcofATyug/s1600/build-start.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-yKI1OoSy8lQ/TbL5nSP4MwI/AAAAAAAABNE/xZwcofATyug/s1600/build-start.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;И видим процесс проверки профиля, который может занять продолжительное время:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-aiNw73q2jmA/TbL5uBLlFfI/AAAAAAAABNI/W6TbLVtiJ5w/s1600/build-verification.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-aiNw73q2jmA/TbL5uBLlFfI/AAAAAAAABNI/W6TbLVtiJ5w/s1600/build-verification.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;В конце процесса мы видим окно для принятия или непринятия лицензионных соглашений:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-oDvz1dXX4ac/TbL52Vvr8WI/AAAAAAAABNM/CLrh9w-NhGs/s1600/build-licenses.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-oDvz1dXX4ac/TbL52Vvr8WI/AAAAAAAABNM/CLrh9w-NhGs/s1600/build-licenses.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Если вы приняли лицензионные соглашения, то вы&amp;nbsp;увидите окно, которое предваряет загрузку дополнительных компонентов. На котором мы увидим, что нам требуется загрузить 68,1 мегабайт данных:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-FRMJtwL3g-U/TbL57_4emuI/AAAAAAAABNQ/WVSm7bh0vCQ/s1600/build-download.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-FRMJtwL3g-U/TbL57_4emuI/AAAAAAAABNQ/WVSm7bh0vCQ/s1600/build-download.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;И теперь, если мы нажмем кнопку &quot;Install&quot;, то мы увидим окно загрузки данных. И если в нем мы скажем: &quot;Show transfer details&quot;, то увидим окно дополнительных сведений о загрузке:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ASrsCQfS81o/TbL6BFebjYI/AAAAAAAABNU/C9lr6M5b9D0/s1600/download.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-ASrsCQfS81o/TbL6BFebjYI/AAAAAAAABNU/C9lr6M5b9D0/s1600/download.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Кстати, если в процессе загрузки появится странное окно с предложением ввести имя пользователя и пароль, то смело&amp;nbsp;нажимайте&amp;nbsp;отмена. Просто некоторые репозитории с компонентами требуют аутентификацию, и нажав отмена, мы автоматически переключимся на более лояльный репозиторий :)&lt;br /&gt;&lt;br /&gt;После загрузки компонентов-плагинов у нас запустится наша сборка Eclipse и мы можем писать код. Также стоит отметить, что Pulse подменяет стандартное средство автоматического обновления плагинов и все работает более гладко и предсказуемо. В дальнейшем запускать нашу сборку можно через Pulse или через исполняемый файл Eclipse в каталоге - &quot;[папка где установлен pulse]\Profiles\[папка с нашим профилем]\&quot;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Дополнительные плагины&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;У Eclipse довольно много интересных плагинов, которые вы тоже можете поставить в профиль. Вот мой список:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Properies editor&lt;/strong&gt; - плагин для редактирования property файлов. Автоматически преобразует текст на русском языке в ascii-код. Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Subversive&lt;/strong&gt; - плагин для работы с SVN репозиторями. Он есть в стандартном репозитории Pulse. При его установке возникает предложение установить дополнительные компоненты, например SVN коннектор (я рекомендую использовать SVNKit). Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Maven Integration for Eclipse&lt;/strong&gt; - плагин для поддержки Apache Maven. Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;JBossTools&lt;/strong&gt; - набор плагинов от JBoss. Например, там есть плагины для удобной работы с Hibernate, JBossSeam и т.д. &amp;nbsp;Плагина нет в стандартном репозитории Pulse, но можно установить его через Update-сайт (список Update-сайтов находится &lt;a href=&quot;http://www.jboss.org/tools/download&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PMD&lt;/strong&gt; - плагин для поиска потенциальных проблем в коде. Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Classpath checker&lt;/strong&gt; - плагин для поиска дублирующихся классов в Classpath. Помогает лечить JAR Hell. Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;FindBugs&lt;/strong&gt; - плагин для поиска багов в коде. Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Checkstyler&lt;/strong&gt; - плагин для проверки кода на&amp;nbsp;соответствие&amp;nbsp;стандартам (их можно настроить). Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Aptana Studio&lt;/strong&gt; - плагин для удобного редактирования HTML и JavaScript. Есть поддержка автоматического форматирования html кода. Плагин есть в стандартном репозитории Pulse.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Заключение&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Pulse удобное средство для управления сборками Eclipse, что позволяет делать отдельную сборку под задачу. Конечно спорен вопрос: &quot;А надо ли оно (отдельная сборка под задачу)?&quot; Но на моем медленном ноутбуке это спасает. Кстати, у меня порядка 10 различных сборок:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-WXFR4PEVtGc/TbL6G855fSI/AAAAAAAABNY/_63_YFIyL7A/s1600/my.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-WXFR4PEVtGc/TbL6G855fSI/AAAAAAAABNY/_63_YFIyL7A/s1600/my.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description><link>http://tech.intr13.ru/2009/11/eclipse.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-bPupM8b-0eE/TbL3Vj5k5ZI/AAAAAAAABMA/R9DKckYKGK4/s72-c/pulse2.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-816209366700153270</guid><pubDate>Fri, 16 Oct 2009 15:00:00 +0000</pubDate><atom:updated>2011-04-24T00:37:20.754+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">1c</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">jug</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">иркутск</category><category domain="http://www.blogger.com/atom/ns#">обучение</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">работа</category><category domain="http://www.blogger.com/atom/ns#">язык</category><title>Эксплуататоры программистов в Иркутске. Взгляд со стороны программиста.</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-7adPB0PFd2A/TbLgOoZhu4I/AAAAAAAABLw/FdAGDW0MV90/s1600/eat-286x300.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-7adPB0PFd2A/TbLgOoZhu4I/AAAAAAAABLw/FdAGDW0MV90/s1600/eat-286x300.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Жизнь в небольшом городе на окраине нашей страны имеет как свои преимущества, так и недостатки. Основное преимущество - это родное окружение, вокруг тебя - друзья и родственники, которые всегда помогут и поддержат. Недостаток тоже существенен - это отсутствие интересной и высокооплачиваемой работы. Сложно быть профессионалом, когда хочется кушать:)&lt;br /&gt;&lt;br /&gt;Но в последнее время этот недостаток начал нивелироваться, крупные компании стали открывать свои филиалы, а местные компании стали испытывать потребность в профессиональных программистах. Правда не все так гладко в датском королевстве, но и никто не говорил что будет легко:) Ладно, оставим философские вопросы для встреч друзей, и посмотрим что творится на рынке разработки программного обеспечения в городе Иркутске.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Кстати, я постарался, чтобы приведенное ниже мнение было не только моим. Мне помогали следующие эксперты:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Кирилл Лебедев&lt;/li&gt;&lt;li&gt;Антон Черноусов&lt;/li&gt;&lt;li&gt;Максим Пензин&lt;/li&gt;&lt;/ul&gt;Также огромное спасибо:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Константину Бурову&lt;/li&gt;&lt;li&gt;Александру Петровскому&lt;/li&gt;&lt;li&gt;Павлу Ситникову&lt;/li&gt;&lt;li&gt;Григорию Ткачуку&lt;/li&gt;&lt;li&gt;И всем другим, которые пожелали остаться неизвестными:)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Итак, начнем?&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Для начала давайте посмотрим, а кто вообще пользуется услугами программистов в городе Иркутске. &lt;a href=&quot;http://spreadsheets.google.com/pub?key=tveNn0OV6VuWUWClReiunag&amp;amp;output=html&quot; target=&quot;_blank&quot;&gt;Список эксплуататоров можно найти здесь&lt;/a&gt;. Список конечно не полный и в нем есть ряд неясностей, но все же он говорит о том, что:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Программисты в Иркутске имеют место быть, и их порядка 150 человек.&lt;/li&gt;&lt;li&gt;Основные используемые языки программирования: 1С, PHP, Java, Delphi, C, SAP/R3 (скорее всего в порядке убывания популярности).&lt;/li&gt;&lt;li&gt;Средний размер команды 7 человек (от 1 до 40 человек).&lt;/li&gt;&lt;li&gt;Средняя зарплата для опытного программиста находится в рамках 25-50 тысяч рублей, а для программиста среднего уровня в районе 15-30 тысяч рублей. Хотя тут как повезет:)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Если у вас есть замечания по списку или по моим скомпилированным выводам, то пишите комментарии, будем обсуждать:)&lt;br /&gt;&lt;br /&gt;Ладно, хватит цифр и сомнительных выводов, давайте пообщаемся с нашими экспертами. Я подготовил для них список вопросов, а они уделили свое драгоценное время, и ответили на них:)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Максим Пензин.&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Что вы можете рассказать о себе?&lt;/strong&gt;&lt;br /&gt;ФИО - Пензин Максим Юрьевич, сайт-визитка - &lt;a href=&quot;http://www.penzin.ru/&quot; target=&quot;_blank&quot;&gt;www.penzin.ru&lt;/a&gt;, род деятельности - работаю по контрактам, руковожу группой разработки ПО Иркутского Онкодиспансера.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://maxp.moikrug.ru/&quot; target=&quot;_blank&quot;&gt;Максим&lt;/a&gt; очень интересный человек, один из самых посещаемых сайтов Иркутска - &lt;a href=&quot;http://angara.net/&quot; target=&quot;_blank&quot;&gt;angara.net&lt;/a&gt;, который посвящен туризму (в том числе экстремальному), это его детище. Также по мнению многих он является гуру во многих вопросах посвященных программированию.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Давно вы занимаетесь разработкой программного обеспечения?&lt;/strong&gt;&lt;br /&gt;Первую программу на заказ сделал в 1988 году (ПЭВМ Искра: CGA монохром, односторонний флоппи 160кб, ТурбоПаскаль 2.0) :)&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;В 20 лет написать первую программу на заказ, и особенно если учесть что это был 1988 год, это круто:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Почему вы решили стать программистом?&lt;/strong&gt;&lt;br /&gt;С детства мечтал стать конструктором, а компьютерная среда как нельзя лучше подходит для этого.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Как изменилась ситуация на рынке разработки программного обеспечения за последние 5 лет?&lt;/strong&gt;&lt;br /&gt;Сложно ответить.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Что будет на рынке разработки программного обеспечения через 5 лет?&lt;/strong&gt;&lt;br /&gt;Сложно ответить.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Вы или ваши знакомые ищут программистов? Если да, то какие программисты им нужны? &lt;/strong&gt;&lt;br /&gt;Умеющие самостоятельно ставить задачи и решать их не кидаясь из&lt;br /&gt;стороны в сторону, работающие на результат, и в срок. Одновременно с этим не забывающие о самообразовании.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Есть такая формула: книги + программисты = деньги. Я считаю что настоящий программист никогда не забывает о самообразовании, и не ждет когда его вынудят обстоятельства:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Что нужно делать, чтобы стать востребованным на рынке разработки программного обеспечения?&lt;/strong&gt;&lt;br /&gt;Необходимо учиться смотреть со стороны клиентов/пользователей/и т.п. Понимать особенности цикла жизни ПО и требуемых ресурсов на разных этапах его разработки. А только потом решать, что круче или что концептуально правильнее.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ваше пожелание, совет для программистов города Иркутска?&lt;/strong&gt;&lt;br /&gt;Перестать искать документацию на русском языке :)&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Также писать комментарии на английском языке при выгрузках в систему контроля версии.&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Антон Черноусов.&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Что вы можете рассказать о себе?&lt;/strong&gt;&lt;br /&gt;ФИО - Черноусов Антон Владимирович, сайт - &lt;a href=&quot;http://golodnyj.ru/&quot; target=&quot;_blank&quot;&gt;golodnyj.ru&lt;/a&gt;, работаю в ИСЭМ СО РАН Начальником Научно-технического центра информационно-вычислительных сетей. Самый голодный java-разработчик города Иркутска. Обожаю опасные бритвы.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://golodnyj.moikrug.ru/&quot; target=&quot;_blank&quot;&gt;Антон&lt;/a&gt; это вообще нечто феерическое, это уникальная смесь профессионализма с желанием учить других людей правильному и хорошему:) На его лекциях никогда не бывает скучно, он вовремя может разбавить скуку резким словцом или интересной байкой. Да, кстати он преподает в ИрГТУ. Также он ведет аудио-подкаст о программировании - &lt;a href=&quot;http://taop.rpod.ru/&quot; target=&quot;_blank&quot;&gt;The Art Of Programming&lt;/a&gt;. И самое главное - он &lt;a href=&quot;http://osum.sun.com/profile/golodnyj&quot; target=&quot;_blank&quot;&gt;кампус амбассадор в ИрГТУ&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Давно вы занимаетесь разработкой программного обеспечения?&lt;/strong&gt;&lt;br /&gt;С начала 2000 года, но тогда это было ужасно примитивно.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Начинать профессиональный путь программиста на втором курсе университета, это самое правильное. Главное начать, а дальше уж не отвертитесь:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Почему вы решили стать программистом? &lt;/strong&gt;&lt;br /&gt;Прежде всего, практическая необходимость и тесная связь с системным администрированием заставили заняться этим не самым благодарным делом. Потом втянулся, процесс и результаты приводили меня в восторг. Как-то так незаметно и стал разработчиком.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Он притворяется, он очень хороший программист. Хотя и системное администрирование ему удается:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Как изменилась ситуация на рынке разработки программного обеспечения за последние 5 лет?&lt;/strong&gt;&lt;br /&gt;Хороший вопрос. Сделаем уточнение, на каком рынке? На Иркутском! Все как обычно: тихо как на кладбище, только падальщики (1С-разработчики) могут находить заказчиков. А в целом рынок стало более цивилизованным. Меньше кидалова. Больше умных заказчиков. Положительная динамика на лицо, несмотря на кризис.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Действительно рынок становится все более интереснее и цивилизованнее. Уже потенциальные заказчики начинают понимать, что и как им нужно. Например, я недавно общался с заказчиком, который требовал грамотно составленный лицензионный договор на разработанное в моей компании ПО.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Что будет на рынке разработки программного обеспечения через 5 лет?&lt;/strong&gt;&lt;br /&gt;Глупо загадывать. Думаю Java и .Net платформы будут как и сейчас в значительной степени  востребованы. Возрастет востребованность outsource-разработчиков. Кросплатформенные и мобильные приложения будут занимать большую долю чем сейчас.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Действительно в последнее время количество outsource-проектов значительно возросло.  Уже сейчас есть несколько компаний, для которых основной источник дохода - это outsource-разработка.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Вы или ваши знакомые ищут программистов? Если да, то какие программисты им нужны? &lt;/strong&gt;&lt;br /&gt;Дело в том, что хороших сотрудников всегда мало. Нужны как всегда:&lt;br /&gt;ответственные, грамотные, активные. К сожалению, материальное вознаграждение в России всегда хромало. И здесь, я думаю, если что-то и измениться то только после того, как на нашем рынке пропадут откаты. А это не произойдет в скором времени.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Действительно откаты - это бич современной России, тем более, работа в откатном проекте демотивирует. Цель не сделать проект, а заработать как можно больше бабла. В итоге проигрывают все кроме тех, кто распределяет откатные средства:) А про то,  кто нужен работодателю можно &lt;a href=&quot;http://taop.rpod.ru/125435.html&quot; target=&quot;_blank&quot;&gt;послушать здесь&lt;/a&gt; и &lt;a href=&quot;http://local.joelonsoftware.com/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D1%8C%D1%8E&quot; target=&quot;_blank&quot;&gt;почитать тут&lt;/a&gt;:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Что нужно делать, чтобы стать востребованным на рынке разработки программного обеспечения?&lt;/strong&gt;&lt;br /&gt;Считаю, что хороший программист обладает двумя важными качествами - головой и жопой: головой он думает, а с помощью жопы доводит дело до конца!&lt;br /&gt;&lt;strong&gt;От себя добавлю: &lt;/strong&gt;&lt;br /&gt;Точка зрения Антона очень хорошо коррелирует &lt;a href=&quot;http://local.joelonsoftware.com/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D1%8C%D1%8E&quot; target=&quot;_blank&quot;&gt;с мнением Джоела Спольски&lt;/a&gt;. Но в целом все именно так и есть! :)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ваше пожелание, совет для программистов города Иркутска? &lt;/strong&gt;&lt;br /&gt;Учите английский язык.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Особых вариантов нет:)&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Кирилл Лебедев.&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Что вы можете рассказать о себе?&lt;/strong&gt;&lt;br /&gt;ФИО - Кирилл Сергевич Лебедев, в &lt;a href=&quot;http://www.istu.edu/&quot; target=&quot;_blank&quot;&gt;ИрГТУ&lt;/a&gt;, начальник Центра Интернет-технологий и начальник учебной части МОЦ &lt;a href=&quot;http://aptech.istu.edu/&quot; target=&quot;_blank&quot;&gt;Aptech-ИрГТУ&lt;/a&gt;.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://kirilllebedev.moikrug.ru/&quot; target=&quot;_blank&quot;&gt;Кирилл&lt;/a&gt; - это просто кладезь разной полезной информации, нет вопросов на которые он не знает или не придумает ответ.  Он как рентген видит потенциальные проблемы в любых проектах и очень хорошо оценивает риски. Балуется преподаванием в ИрГТУ, ведет там технологии программирования. Имеет сертификат архитектора программного обеспечения от компании Tekama. И самое главное, он забавный зануда:) Но с ним можно долго, продолжительно и интересно разговаривать на АйТи темы:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Давно вы занимаетесь разработкой программного обеспечения?&lt;/strong&gt;&lt;br /&gt;Около 10 лет.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Благодаря Кириллу я начал свою плавание в океане профессионального программирования. Спасибо тебе Кирилл, хотя ты не всегда прав:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Почему вы решили стать программистом?&lt;/strong&gt;&lt;br /&gt;Семейные традиции + особый склад мышления, требующий использование системного подхода к решению задач и поиска нетривиальных решений.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;Первый раз я увидел человека, у которого один из родителей занимается программированием, хотя скоро подобных традиций станет больше:) А мышление действительно важная штука, я например,  неосознанно тренировал его при помощи огромного количества книг:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Как изменилась ситуация на рынке разработки программного обеспечения за последние 5 лет?&lt;/strong&gt;&lt;br /&gt;В Иркутске никак, а в мире  появилось веб-программирование, как конкурент десктопа. Причем именно конкурент, а не дополнение. Соответственно сильно изменились как подходы к созданию ПО, так и взгляды на то, когда и что надо использовать.&lt;br /&gt;&lt;strong&gt;От себя добавлю: &lt;/strong&gt;&lt;br /&gt;Действительно веб-программирование стремительно наступает на рынке разработки программного обеспечения. Но тут надо без фанатизма, иногда обычные десктоп приложения более эффективны.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Что будет на рынке разработки программного обеспечения через 5 лет?&lt;/strong&gt;&lt;br /&gt;Все больше Интернета и гридов. Все больше будет уменьшаться роль программиста как самостоятельной единицы, так как объем информатизации все увеличивается, что требует большей предсказуемости процесса создания ПО. Программист - это аналог конструктора в машиностроении. Вот девиз развития отрасли в России.&lt;br /&gt;&lt;strong&gt;От себя добавлю: &lt;/strong&gt;&lt;br /&gt;Вряд ли когда-нибудь будут требоваться только программисты-конструкторы приложений. Без разумных и творческих людей индустрия разработки ПО не обойдется. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Вы или ваши знакомые ищут программистов? Если да, то какие программисты им нужны? &lt;/strong&gt;&lt;br /&gt;1С - специалисты. Универсальные верстальщики и PHP-кодеры.&lt;br /&gt;&lt;strong&gt;От себя добавлю: &lt;/strong&gt;&lt;br /&gt;На самом деле в Иркутске иногда нужны .Net и Java программисты. Можете пройтись по &lt;a href=&quot;http://spreadsheets.google.com/pub?key=tveNn0OV6VuWUWClReiunag&amp;amp;output=html&quot; target=&quot;_blank&quot;&gt;списку&lt;/a&gt;:)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Что нужно делать, чтобы стать востребованным на рынке разработки программного обеспечения?&lt;/strong&gt;&lt;br /&gt;Иметь хорошее портфолио, опыт разработки проектов (желательно крупных), хорошие связи (правда для многих программистов это прямо скажем задача просто непосильная). Жить в Москве или Питере.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;На данный момент все большую популярность набирает удаленная разработка. Например, на &lt;a href=&quot;http://odesk.com/&quot; target=&quot;_blank&quot;&gt;odesk.com&lt;/a&gt; есть много Заказчиков, правда за заказ придется немного повоевать:) &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ваше пожелание, совет для программистов города Иркутска?&lt;/strong&gt;&lt;br /&gt;Группироваться и объединяться. Индусы и китайцы берут массовостью. Мы должны тоже работать не по одному. Было бы классно, если бы я мог сказать, что знаю большинство программистов из Иркутска хотя бы в лицо. В целом нашей отрасли в Иркутске не хватает открытости.&lt;br /&gt;&lt;strong&gt;От себя добавлю:&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://istuinosum.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Тут&lt;/a&gt; иногда публикуются планируемые встречи программистов. Также в ближайшее время будут новые встречи Иркутской JUG.&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Итого: &lt;/strong&gt;хорошие программисты всегда нужны и важны, и потребность в них постоянно повышается, но ведь не каждый программист хорош. Да и технологии развиваются довольно стремительно. Поэтому надо постоянно развиваться, учиться, пробовать и самое главное решать Проблемы. Писать код может каждый, а вот решать проблемы заказчика штука сложная. И самое главное не стоит забывать про Английский язык. И да пребудет с вами сила...</description><link>http://tech.intr13.ru/2009/10/programmers-on-irkutsk.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-7adPB0PFd2A/TbLgOoZhu4I/AAAAAAAABLw/FdAGDW0MV90/s72-c/eat-286x300.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-2489369039056944237</guid><pubDate>Sat, 12 Sep 2009 15:00:00 +0000</pubDate><atom:updated>2011-04-24T00:35:18.917+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">example</category><category domain="http://www.blogger.com/atom/ns#">hibernate</category><category domain="http://www.blogger.com/atom/ns#">hsqldb</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">maven</category><category domain="http://www.blogger.com/atom/ns#">spring</category><category domain="http://www.blogger.com/atom/ns#">unit-тест</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Тестирование Spring приложений. Транзакции в тестировании.</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-IyNYE_2QiJI/TbLh193BauI/AAAAAAAABL0/AJMZXFlBlfA/s1600/spring-overview-300x231.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-IyNYE_2QiJI/TbLh193BauI/AAAAAAAABL0/AJMZXFlBlfA/s1600/spring-overview-300x231.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Про полезность подхода TDD (&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot; target=&quot;_blank&quot;&gt;разработка через тестирование&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot; target=&quot;_blank&quot;&gt;test driven development&lt;/a&gt;) не слышал только ленивый &lt;span style=&quot;text-decoration: line-through;&quot;&gt;или глухой&lt;/span&gt;. Но сегодня мы не будем обсуждать всю его полезность и красоту&lt;span style=&quot;text-decoration: line-through;&quot;&gt;, а также проблемы и недостатки&lt;/span&gt;. Сегодня мы попробуем посмотреть, как разрабатывать unit-тесты для spring приложений. Также мы немного тронем ручное управление транзакциями в unit-тестах.&lt;br /&gt;&lt;br /&gt;Небольшое замечание: иногда тесты spring приложений это не совсем unit-тесты, потому что мы можем в них поднять и задействовать очень сложное окружение (БД, WebService и так далее). &amp;nbsp;Подобные тесты это скорее &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot; target=&quot;_blank&quot;&gt;интеграционные тесты&lt;/a&gt;&lt;span style=&quot;text-decoration: line-through;&quot;&gt;, но я думаю что сейчас философские вопросы мы поднимать не будем&lt;/span&gt;.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Для начала предлагаю согласовать некоторые термины и понятия.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Unit-тест&lt;/strong&gt; - тест, который проверяет поведение небольшой части приложения. Эта часть может быть одним классом, одним методом или набором классов, который реализуют какое-то архитектурное решение, и это решение необходимо проверить на работоспособность. За подробностями обращайтесь &lt;a href=&quot;http://wiki.agiledev.ru/doku.php?id=tdd&quot; target=&quot;_blank&quot;&gt;сюда&lt;/a&gt; или &lt;a href=&quot;http://www.agiledata.org/essays/tdd.html&quot; target=&quot;_blank&quot;&gt;туда&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Application context config&lt;/strong&gt; - конфигурационный файл в xml формате для описания структуры spring приложения. Про spring читаем &lt;a href=&quot;http://www.javaportal.ru/java/articles/spring.html&quot;&gt;тут&lt;/a&gt; или &lt;a href=&quot;http://www.springsource.org/about&quot; target=&quot;_blank&quot;&gt;там&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DAO&lt;/strong&gt; - объект доступа к данным или data acess object&lt;span style=&quot;text-decoration: line-through;&quot;&gt;, хотя некоторым нравится употреблять данный термин в значении &quot;путь&quot;&lt;/span&gt;. Основное предназначение этого шаблона проектирования: связать вместе БД и наше приложение. За подробностями идем &lt;a href=&quot;http://www.java-course.ru/students/part14.html&quot; target=&quot;_blank&quot;&gt;сюда&lt;/a&gt; или &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_access_object&quot; target=&quot;_blank&quot;&gt;туда&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Транзакция&lt;/strong&gt; - группа последовательных операций, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Про транзакции читаем&amp;nbsp;&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F&quot;&gt;тут&lt;/a&gt; или&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Database_transaction&quot; target=&quot;_blank&quot;&gt;там&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Все остальные термины и понятия стандартны и давно устоялись или их описание тут некритично&lt;span style=&quot;text-decoration: line-through;&quot;&gt;, а если нет, то у нас есть простор для &lt;/span&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A5%D0%BE%D0%BB%D0%B8%D0%B2%D0%B0%D1%80&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;text-decoration: line-through;&quot;&gt;hollywar&lt;/span&gt;&lt;/a&gt;. Например, такое понятие как IoC (&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F&quot; target=&quot;_blank&quot;&gt;инверсия управления&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Inversion_of_control&quot;&gt;inversion of control&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Совсем забыл, про написание unit-тестов для spring-приложений я пишу не первый, немного есть &lt;a href=&quot;http://samolisov.blogspot.com/2008/07/spring-junit.html&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; и &lt;a href=&quot;http://static.springsource.org/spring/docs/2.5.6/reference/testing.html&quot; target=&quot;_blank&quot;&gt;там&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Итак, у нас стоит &lt;strong&gt;цель: протестировать поведение класса в spring-приложении, дополнительно необходимо вручную управлять транзакциями&lt;/strong&gt;. Для этого мы создадим простое spring-приложение и напишем unit-тест. Наш unit-тест при запуске будет инициализировать application context config нашего spring приложения и после этого вызывать методы у тестируемого нами класса. Также мы разработаем отдельный тест, в котором будем управлять транзакциями вручную.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Технологии в приложении&lt;/strong&gt; будут следующие:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Средство сборки и компиляции - &lt;a href=&quot;http://maven.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Maven&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;База данных - &lt;a href=&quot;http://hsqldb.org/&quot; target=&quot;_blank&quot;&gt;HSQLDB&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Средство для отображения классов в базу данных (Object relation mapping) - &lt;a href=&quot;http://www.hibernate.org/&quot; target=&quot;_blank&quot;&gt;Hibernate&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Средство для конфигурирования приложения - &lt;a href=&quot;http://www.springsource.org/&quot; target=&quot;_blank&quot;&gt;Spring framework&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Средство для создания unit-тестов - &lt;a href=&quot;http://www.junit.org/&quot; target=&quot;_blank&quot;&gt;JUnit&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;Конечная &lt;strong&gt;структура файлов в приложении&lt;/strong&gt; будет выглядеть следующим образом:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-6bV5dXsdIrc/TbLh-SJVnDI/AAAAAAAABL4/c-xNS9_g-dg/s1600/structure.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://3.bp.blogspot.com/-6bV5dXsdIrc/TbLh-SJVnDI/AAAAAAAABL4/c-xNS9_g-dg/s320/structure.JPG&quot; width=&quot;268&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Кстати вы можете &lt;a href=&quot;http://intr13-examples.googlecode.com/svn/springTransactionalTest/tags/2009-09-12-23-50/&quot; target=&quot;_blank&quot;&gt;загрузить себе (из SVN)&lt;/a&gt; и &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/&quot; target=&quot;_blank&quot;&gt;посмотреть в браузере&lt;/a&gt; исходные коды работающего приложения.&lt;br /&gt;&lt;br /&gt;Начнем?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Во первых&lt;/strong&gt;, нам надо создать pom.xml в котором мы опишем сборку и компиляцию приложения (про maven читать &lt;a href=&quot;http://ru.wikipedia.org/wiki/Apache_Maven&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; или &lt;a href=&quot;http://maven.apache.org/&quot; target=&quot;_blank&quot;&gt;там&lt;/a&gt;). &amp;nbsp;В данном &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/pom.xml&quot; target=&quot;_blank&quot;&gt;конфигурационном файле&lt;/a&gt; мы пропишем все зависимости от используемых нами библиотек. Также на данном шаге мы создадим все директории нашего приложения.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Во вторых&lt;/strong&gt;, мы создадим java persistente entity класс - &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/main/java/ru/intr13/example/springTransactionalTest/Data.java&quot; target=&quot;_blank&quot;&gt;ru.intr13.example.springTransactionalTest.Data&lt;/a&gt;. Данный класс у нас будет описывать модель данных и при помощи библиотеки hibernate он будет отображаться в БД (будет автоматически создана таблица в базе данных). Также на этом шаге мы создадим файл &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/main/resources/hibernate.cfg.xml&quot; target=&quot;_blank&quot;&gt;hibernate.cfg.xml&lt;/a&gt;, где сделаем ссылку на разработанный нами класс.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;В третьих&lt;/strong&gt;, мы создадим интерфейс - &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/main/java/ru/intr13/example/springTransactionalTest/DataDao.java&quot; target=&quot;_blank&quot;&gt;ru.intr13.example.springTransactionalTest.DataDao&lt;/a&gt;. В котором опишем основные методы для работы с нашей БД. Методы checkpoint и shutdown предназначены для работы с hsqldb и их наличие связано с особенностью работы данной БД (подробности &lt;a href=&quot;http://hsqldb.org/web/hsqlFAQ.html#FAQ&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;В четвертых&lt;/strong&gt;, мы создадим реализацию разработанного нами интерфейса - &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/main/java/ru/intr13/example/springTransactionalTest/DataHibernateDao.java&quot; target=&quot;_blank&quot;&gt;ru.intr13.example.springTransactionalTest.DataHibernateDao&lt;/a&gt;. Где реализуем все методы описанные в интерфейсе DataDao. &amp;nbsp;Стоит отметить, что данный класс наследуется от класса org.springframework.orm.hibernate3.support.HibernateDaoSupport, который в свою очередь является часть библиотеки Spring Dao и в нем уже реализованы методы для удобной работы с БД.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;В пятых&lt;/strong&gt;, мы создадим &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/main/resources/applicationContext.xml&quot; target=&quot;_blank&quot;&gt;application context config файл&lt;/a&gt; для конфигурирования нашего приложения. В котором мы опишем:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Источник данных (&lt;strong&gt;dataSource&lt;/strong&gt;), в котором мы опишем параметры подключения к нашей hsqldb базе данных.&lt;/li&gt;&lt;li&gt;Фабрику для работы с подключениями к базе данных и для отображения нашей модели в БД (&lt;strong&gt;sessionFactory&lt;/strong&gt;). &amp;nbsp;При конфигурировании фабрики мы укажем ссылку на файл hibernate.cfg.xml, где описаны все классы нашей модели. Также мы пропишем параметры создания и работы с базой данных, ссылку на источник данных.&lt;/li&gt;&lt;li&gt;Разработанный нами&amp;nbsp;сервис (&lt;strong&gt;dataDao&lt;/strong&gt;). При конфигурировании мы укажем ссылку на &lt;strong&gt;sessionFactory&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Менеджер транзакций (&lt;strong&gt;transactionManager&lt;/strong&gt;). При конфигурировании которого мы укажем ссылку на &lt;strong&gt;sessionFactory&lt;/strong&gt; и также укажем: на какие методы нам надо начинать новую транзакцию.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;В шестых&lt;/strong&gt;, создадим &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/main/java/ru/intr13/example/springTransactionalTest/Main.java&quot; target=&quot;_blank&quot;&gt;тестовое приложение&lt;/a&gt;, которое проинициализирует application context config и немного поработает с разработанным нами сервисом. Результаты работы сохраняться в нашу локальную БД, что можно наблюдать в файле &lt;strong&gt;data/test.db.script:&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE SCHEMA PUBLIC AUTHORIZATION DBA&lt;br /&gt;CREATE MEMORY TABLE DATA(ID BIGINT NOT NULL PRIMARY KEY,TEXT VARCHAR(255))&lt;br /&gt;CREATE MEMORY TABLE HIBERNATE_SEQUENCES(SEQUENCE_NAME VARCHAR(255),SEQUENCE_NEXT_HI_VALUE INTEGER)&lt;br /&gt;CREATE USER SA PASSWORD &quot;&quot;&lt;br /&gt;GRANT DBA TO SA&lt;br /&gt;SET WRITE_DELAY 10&lt;br /&gt;SET SCHEMA PUBLIC&lt;br /&gt;INSERT INTO DATA VALUES(1,&#39;one&#39;)&lt;br /&gt;INSERT INTO DATA VALUES(2,&#39;two&#39;)&lt;br /&gt;INSERT INTO DATA VALUES(3,&#39;three&#39;)&lt;br /&gt;INSERT INTO HIBERNATE_SEQUENCES VALUES(&#39;Data&#39;,1)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Итак, &lt;strong&gt;тестовое приложение создано и теперь надо разработать unit-тест&lt;/strong&gt;. &amp;nbsp;Для этого мы создаем класс &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/test/java/ru/intr13/example/springTransactionalTest/DataDaoTest.java&quot; target=&quot;_blank&quot;&gt;ru.intr13.example.springTransactionalTest.DataDaoTest&lt;/a&gt;. &amp;nbsp;Данный класс является наследником класса org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests, что позволяет при запуске тестов поднимать application context config. &amp;nbsp;Делается это при помощи аннотации для класса-теста: @ContextConfiguration(locations = { &quot;/applicationContext.xml&quot; }).&lt;br /&gt;&lt;br /&gt;Но для полноценного тестирования нам требуется чтобы у нашего теста была возможность получить разработанный нами сервис. Для этого мы прописываем в нашем тесте поле со ссылкой на сервис и ставим для этого поля аннотацию - @Autowired:&lt;br /&gt;&lt;code&gt; @Autowired&lt;br /&gt;private DataDao dataDao;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Теперь при запуске тестов в данное поле будет установлена ссылка на разработанный ранее сервис.&lt;br /&gt;&lt;br /&gt;И в конце остается написать текст unit-теста:&lt;br /&gt;&lt;code&gt;@Test&lt;br /&gt;public void simpleTest() {&lt;br /&gt;String text = UUID.randomUUID().toString();&lt;br /&gt;dataDao.save(new Data(text));&lt;br /&gt;Collection result = dataDao.find(text);&lt;br /&gt;Assert.assertEquals(1, result.size());&lt;br /&gt;Assert.assertEquals(text, result.iterator().next().getText());&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Данный тест создает объект Data, сохраняет его в БД, и потом ищет объект Data по содержимому.&lt;br /&gt;&lt;br /&gt;Я думаю ничего особо сложного в вышеприведенном нет&lt;span style=&quot;text-decoration: line-through;&quot;&gt;, и этим даже можно пользоваться&lt;/span&gt;, но иногда в подобных тестах требуется организовать &lt;strong&gt;ручное управление транзакциями&lt;/strong&gt; (то есть, декларативно совершать откат или сохранение транзакции, стартовать новую транзакцию). Как это делать описано&amp;nbsp;&lt;a href=&quot;http://static.springsource.org/spring/docs/2.5.6/reference/testing.html#testing-tx&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;, но сейчас мы рассмотрим небольшой пример.&lt;br /&gt;&lt;br /&gt;Для ручного управления транзакциями в тестах&lt;span style=&quot;text-decoration: line-through;&quot;&gt;, и не только&lt;/span&gt;, нам нужно получить описанный в application context config менеджер транзакций (transactionManager), что делается через создание поля в нашем тесте:&lt;br /&gt;&lt;code&gt;@Autowired&lt;br /&gt;private PlatformTransactionManager transactionManager;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Далее мы просто создаем новую транзакцию:&lt;br /&gt;&lt;code&gt;TransactionStatus transaction = transactionManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;и потом делаем для нее commit (сохранение):&lt;br /&gt;&lt;code&gt;transactionManager.commit(transaction);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;или rollback (откат):&lt;br /&gt;&lt;code&gt;transactionManager.rollback(transaction);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Зная все выше приведенное, мы можем написать следующий тест, который создает несколько транзакций вручную:&lt;br /&gt;&lt;code&gt;@Test&lt;br /&gt;public void comlexTest() {&lt;br /&gt;TransactionStatus transaction = transactionManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));&lt;br /&gt;String text = UUID.randomUUID().toString();&lt;br /&gt;dataDao.save(new Data(text));&lt;br /&gt;transactionManager.commit(transaction);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt; transaction = transactionManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));&lt;br /&gt;Collection result = dataDao.find(text);&lt;br /&gt;Assert.assertEquals(1, result.size());&lt;br /&gt;Assert.assertEquals(text, result.iterator().next().getText());&lt;br /&gt;transactionManager.rollback(transaction);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Конечный вариант теста можно посмотреть &lt;a href=&quot;http://code.google.com/p/intr13-examples/source/browse/springTransactionalTest/tags/2009-09-12-23-50/src/test/java/ru/intr13/example/springTransactionalTest/DataDaoTest.java&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Итого: мы создали тестовое приложение на базе spring framework (исходные коды лежат &lt;a href=&quot;http://intr13-examples.googlecode.com/svn/springTransactionalTest/tags/2009-09-12-23-50/&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;). Был продемонстрирован способ тестирования отдельных сервисов в spring framework. Также был показан способ ручного управления транзакциями в unit-тестах. В результате мы увидели что создание простых unit-тестов для spring framework довольно простая задача. Вопрос о целесообразности и необходимости разработки подобных тестов рассмотрен не был, это тема для отдельной беседы.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Внимание!&lt;/strong&gt; Это черновик, который я решил опубликовать в своем блоге. Тут наверно много ошибок :)&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;С &lt;a href=&quot;http://minkomsvjaz.ru/news/xPages/entry.9025.html&quot; target=&quot;_blank&quot;&gt;праздником&lt;/a&gt; вас творцы!&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Картинка найдена &lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/images/spring-overview.png&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;. &amp;nbsp;Кстати внимательный человек заметит одну забавную вещь:)</description><link>http://tech.intr13.ru/2009/09/testing-spring-application.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-IyNYE_2QiJI/TbLh193BauI/AAAAAAAABL0/AJMZXFlBlfA/s72-c/spring-overview-300x231.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5259068983717751713</guid><pubDate>Fri, 28 Aug 2009 15:00:00 +0000</pubDate><atom:updated>2011-04-24T00:32:51.416+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">алгоритм</category><category domain="http://www.blogger.com/atom/ns#">визуализация</category><category domain="http://www.blogger.com/atom/ns#">данные</category><category domain="http://www.blogger.com/atom/ns#">для взрослых</category><category domain="http://www.blogger.com/atom/ns#">картинка</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">структура</category><title>Визуализация для программистов. Красно-черные деревья.</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-Iz4ekN2B9gg/TbLr1bzjnDI/AAAAAAAABL8/gTiBJYxRO3A/s1600/rbt-300x261.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-Iz4ekN2B9gg/TbLr1bzjnDI/AAAAAAAABL8/gTiBJYxRO3A/s1600/rbt-300x261.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Все любят картинки, особенно их любят программисты. Но иногда взрослый контент утомляет, и интересно взглянуть на что то другое :) Поэтому все дружно смотрим на &lt;a href=&quot;http://rain.ifmo.ru/cat/view.php/vis&quot; target=&quot;_blank&quot;&gt;визуализацию различных алгоритмов, структур данных и тому подобное&lt;/a&gt;. Меня лично позабавила визуализация &lt;a href=&quot;http://rain.ifmo.ru/cat/view.php/vis/trees/red-black-2002&quot; target=&quot;_blank&quot;&gt;Красно-черного дерева&lt;/a&gt; (&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE-%D1%87%D1%91%D1%80%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&quot; target=&quot;_blank&quot;&gt;подробности из википедии&lt;/a&gt;). &amp;nbsp;Так что всем преподавателям программирования я рекомендую взять ресурс на заметку, и показывать студентам красивые картинки :)</description><link>http://tech.intr13.ru/2009/08/red-black-trees.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Iz4ekN2B9gg/TbLr1bzjnDI/AAAAAAAABL8/gTiBJYxRO3A/s72-c/rbt-300x261.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5572949317361620239</guid><pubDate>Sun, 21 Jun 2009 15:00:00 +0000</pubDate><atom:updated>2011-04-23T23:16:58.888+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">liquibase</category><category domain="http://www.blogger.com/atom/ns#">migrate4j</category><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">windows</category><category domain="http://www.blogger.com/atom/ns#">администрирование</category><category domain="http://www.blogger.com/atom/ns#">бд</category><category domain="http://www.blogger.com/atom/ns#">нижний</category><category domain="http://www.blogger.com/atom/ns#">поле</category><category domain="http://www.blogger.com/atom/ns#">регистр</category><category domain="http://www.blogger.com/atom/ns#">сравнение</category><category domain="http://www.blogger.com/atom/ns#">таблица</category><title>MySQL &amp; Windows</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-uvI4nUwy5y8/TbLfME8lIxI/AAAAAAAABLs/-qcB-X-3DTY/s1600/mysql-296x300.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-uvI4nUwy5y8/TbLfME8lIxI/AAAAAAAABLs/-qcB-X-3DTY/s1600/mysql-296x300.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;В последнее время развлекаюсь обновлением системы, которая использует MySQL. В основном приходиться обновлять структуру БД. Причем скрипт сравнения охота делать в правоверной MS Windows XP и потом применять на всяких линуксах. Но по умолчанию, в Windows версии MySQL, имена полей и таблиц преобразуются в нижний регистр. Вообщем исправить такое досадное недоразумение можно следующим образом.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;ol&gt;&lt;li&gt;Заходим в файл &lt;strong&gt;[место где установлен MySQL]\my.ini&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;В секцию&amp;nbsp;&lt;strong&gt;[mysqld] &lt;/strong&gt;добавляем строку:&lt;strong&gt; set-variable=lower_case_table_names=0&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Перезапускаем MySQL.&lt;/li&gt;&lt;/ol&gt;Кстати, если мы добавим мы скажем:&amp;nbsp;&lt;strong&gt;set-variable=lower_case_table_names=1&lt;/strong&gt;, то все будет как было таблицы с полями будут в нижнем регистре. Это типа парметр по умолчанию:)&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Нашел неплохой &lt;a href=&quot;http://www.sqlmanager.net/en/products/mysql/dbcomparer&quot; target=&quot;_blank&quot;&gt;comparer для MySQL&lt;/a&gt; баз данных, но он вроде денег стоит:) Поэтому, буду использовать &lt;a href=&quot;http://liquibase.org/&quot; target=&quot;_blank&quot;&gt;liquibase&lt;/a&gt; или &lt;a href=&quot;http://migrate4j.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;migrate4j&lt;/a&gt;. О чем возможно поведаю отдельно:)&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Картинка найдена &lt;a href=&quot;http://www.citris-uc.org/files/imce-u10/mysql.png&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.</description><link>http://tech.intr13.ru/2009/06/mysql-windows.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-uvI4nUwy5y8/TbLfME8lIxI/AAAAAAAABLs/-qcB-X-3DTY/s72-c/mysql-296x300.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-3778791019933518212</guid><pubDate>Sat, 04 Apr 2009 15:00:00 +0000</pubDate><atom:updated>2011-04-24T00:31:08.378+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">iforge</category><category domain="http://www.blogger.com/atom/ns#">jug</category><category domain="http://www.blogger.com/atom/ns#">английский</category><category domain="http://www.blogger.com/atom/ns#">иркутск</category><category domain="http://www.blogger.com/atom/ns#">классификация</category><category domain="http://www.blogger.com/atom/ns#">перевод</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">путь</category><category domain="http://www.blogger.com/atom/ns#">русский</category><category domain="http://www.blogger.com/atom/ns#">язык</category><title>Матрица для оценки уровня программиста. Черновик</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-UaQk2x4XcOQ/TbLdgPS97LI/AAAAAAAABLo/iAXTeqxB4Zg/s1600/progr-150x150.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-UaQk2x4XcOQ/TbLdgPS97LI/AAAAAAAABLo/iAXTeqxB4Zg/s1600/progr-150x150.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Недавно на &lt;a href=&quot;http://www.developers.org.ua/&quot; target=&quot;_blank&quot;&gt;developers.org.ua&lt;/a&gt; промелькнула ссылка на довольно интересную &lt;a href=&quot;http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm&quot; target=&quot;_blank&quot;&gt;классификацию компетенций абсолютно сферического программиста в вакууме&lt;/a&gt;. Я недолго думая решил попробовать переложить данную классификацию на русский язык. На данный момент есть &lt;a href=&quot;http://docs.google.com/Doc?id=dd4r9xvv_65dp6zxxfs&quot; target=&quot;_blank&quot;&gt;черновик в гуглдоках&lt;/a&gt;, и если у Вас есть замечания, то я буду рад их услышать :)&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Если вас заинтересовала данная тема, то вы можете взглянуть и на &lt;a href=&quot;http://joelonsoftware.com/articles/ladder.html&quot; target=&quot;_blank&quot;&gt;другую классификацию&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;А еще есть &lt;a href=&quot;http://buffer-overflow.org.ua/wp-content/uploads/2009/03/Programmer%20competency%20matrix.htm&quot; target=&quot;_blank&quot;&gt;перевод данной классификации на украинский язык&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Данный перевод осуществляется в рамках развития сообщества программистов Иркутской области (JUG Иркутск, iForge).&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Картинка взята &lt;a href=&quot;http://www.caseclub.ru/img/progr.jpg&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.</description><link>http://tech.intr13.ru/2009/04/matrix.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-UaQk2x4XcOQ/TbLdgPS97LI/AAAAAAAABLo/iAXTeqxB4Zg/s72-c/progr-150x150.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-7690356694003485842</guid><pubDate>Sat, 21 Mar 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-23T23:06:01.904+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">awt</category><category domain="http://www.blogger.com/atom/ns#">jasperreports</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">авторитет</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">шрифт</category><title>Проблема с JasperReports или сомневайтесь в авторитетных мнениях</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-fJJUH62RKhc/TbLcn1hpZGI/AAAAAAAABLk/NIoe5GiAfXE/s1600/jasperreports.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-fJJUH62RKhc/TbLcn1hpZGI/AAAAAAAABLk/NIoe5GiAfXE/s1600/jasperreports.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Так уж исторически сложилось, что я практически не работал с &lt;a href=&quot;http://jasperforge.org/&quot; target=&quot;_blank&quot;&gt;JasperReports&lt;/a&gt;. Конечно мне приходилось строить отчеты, но обычно хватало генерации HTML из Velocity-шаблонов. И на этой неделе судьба мне подкинула шанс устранить пробелы в моем опыте :) Возникла проблема с генерацией pdf-отчетов: на одном компьютере все работало, а на другом отчет искажался. В итоге проблема была решена установкой шрифта: arial.ttf, в операционную систему.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Причем данная проблема напомнила следующую историю: у меня есть один друг, который когда-то посоветовал воткнуть два сетевых кабеля в сервер, с двумя сетевыми картами. По его мнению: так сеть на сервере стала бы работать в два раза быстрее :) Мы после этого убили неделю, на поиски причин постоянного пропадания сети на данном сервер, а авторитет моего друга казался непререкаемым: у него был большой опыт администрирования сетей, а мы были студентами с 6 месячным опытом работы :) Проблема тогда решилась банально и просто: я вытащил один сетевой кабель и все заработало :) Но сейчас речь о JasperReports :)&lt;br /&gt;&lt;br /&gt;Так вот, еще один мой друг сказал, что для генерации отчета JasperReports достаточно положить файл со шрифтом в CLASSPATH и прописать в отчете ссылку на данный файл. И все, этого достаточно :) Но в итоге на одном компьютере итог генерации отчетов был один, а на другом другим (обрезались слова в генерируемых отчетов). Были совершены различные шаманские действия: обновлена версия Apache Tomcat, изменена версия Java; но результата не было. Гугление ничего не показало и тогда я решил проверить русское сообщество на знание данной проблемы &lt;a href=&quot;http://community.livejournal.com/ru_java/783497.html&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; и &lt;a href=&quot;http://www.rsdn.ru/forum/message/3329420.flat.aspx&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В итоге и сообщество не дало мне ответ на мой вопрос... ...и тогда я решил отладить JasperReport и найти причину данной ошибки. Было написано тестовое приложение и была запущена удаленная отладка его на одном из серверов где наблюдалась проблема. Кстати про удаленную отладку можно прочитать &lt;a href=&quot;http://aectann.wikidot.com/java-remote-debug&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;И после отладки и анализа простого исходного кода JasperReports был найден следующий код из класса net.sf.jasperreports.engine.fill.TextMeasurer:&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;LineBreakMeasurer&lt;/strong&gt; lineMeasurer = new &lt;strong&gt;LineBreakMeasurer&lt;/strong&gt;(paragraph, FONT_RENDER_CONTEXT);&lt;br /&gt;measuredState.textOffset = lastParagraphStart;&lt;br /&gt;boolean rendered = true;&lt;br /&gt;boolean renderedLine = false;&lt;br /&gt;while (lineMeasurer.getPosition() &amp;lt; paragraph.getEndIndex() &amp;amp;&amp;amp; rendered)&lt;br /&gt;{&lt;br /&gt;rendered = &lt;strong&gt;renderNextLine&lt;/strong&gt;(lineMeasurer, paragraph);&lt;br /&gt;renderedLine = renderedLine || rendered;&lt;br /&gt;}&lt;/blockquote&gt;И также интересно немного кода из метода renderNextLine:&lt;br /&gt;&lt;blockquote&gt;int lineStartPosition = lineMeasurer.getPosition();&lt;br /&gt;TextLayout layout = &lt;strong&gt;lineMeasurer.nextLayout(formatWidth)&lt;/strong&gt;;&lt;br /&gt;float newTextHeight = measuredState.textHeight + &lt;strong&gt;layout.getLeading()&lt;/strong&gt; + lineSpacing * &lt;strong&gt;layout.getAscent()&lt;/strong&gt;;&lt;/blockquote&gt;А теперь я попытаюсь объяснить что это за код:) В первом куске кода создается замечательный объект &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/awt/font/LineBreakMeasurer.html&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;java.awt.font.LineBreakMeasurer&lt;/strong&gt;&lt;/a&gt;. Данный класс позволяет вычислить основные характеристики шрифта для отображаемого текста и разбить текст на сегменты. Кстати во втором куске кода, который вызывается из первого, мы видим два основных метода для получения характеристик шрифта. Более подробно про эти методы можно почитать в описании класса &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/awt/font/TextLayout.html&quot; target=&quot;_blank&quot;&gt;java.awt.font.TextLayout&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Получилось немного сумбурно, но вывод прост: JasperReports использует AWT для генерации отчетов, а AWT в свою очередь использует шрифты операционной системы, так как шрифт из CLASSPATH&amp;nbsp; не передается в LineBreakMeasurer . И если вдруг такого шрифта в операционной системе нет, то используется первый подходящий шрифт. Например, у меня вышеприведенная проблема была связана с тем, что шрифта Arial не было в операционной системе, и брался наиболее подходящий шрифт - Arial Bold, а ширина букв в Arial Bold больше чем в Arial :)&lt;br /&gt;&lt;br /&gt;Во-общем проверяйте авторитетные мнения, и ставьте шрифты для генерации отчетов в операционную систему :)&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Кстати, &lt;a href=&quot;http://voituk.kiev.ua/intro-jasper-reports/&quot; target=&quot;_blank&quot;&gt;тут есть цикл статей о JasperReports&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Картинка украдена с официального сайта JasperReports.</description><link>http://tech.intr13.ru/2009/03/jasperreports.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-fJJUH62RKhc/TbLcn1hpZGI/AAAAAAAABLk/NIoe5GiAfXE/s72-c/jasperreports.gif" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-6669570631583107336</guid><pubDate>Sun, 08 Mar 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-24T00:28:37.266+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">emeralds</category><category domain="http://www.blogger.com/atom/ns#">Жизнь</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Эмеральды среди нас</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-RvczPN6x2kI/TbLXXYPnrfI/AAAAAAAABLg/gk3hBqLepkk/s1600/lango_silver.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-RvczPN6x2kI/TbLXXYPnrfI/AAAAAAAABLg/gk3hBqLepkk/s1600/lango_silver.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Вначале был хаос. Из хаоса родилась идея. Идея трансформировалась в новый Мир. Мир где живут злобные существа, где они поедают друг-друга. Где нет ни дня, ни ночи. Тут нет эмоций, есть только холодный расчет. И лишь избранный уничтожит все и всех...&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;А теперь по существу:)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Предыстория:&lt;/strong&gt; &lt;a href=&quot;http://golodnyj.blogspot.com/&quot; target=&quot;_blank&quot;&gt;golodnyj&lt;/a&gt; и &lt;a href=&quot;http://intr13.ru/&quot; target=&quot;_blank&quot;&gt;intr13&lt;/a&gt; (это я:) ) решили написать эмулятор мира, в котором будут жить и взаимодействовать программы-существа.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Терминология:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Мир - игровое пространство состоящее из квадратных областей (у каждой области четыре прямых и четыре диагональных соседа). Области мира объединяются в прямоугольник по периметру которого расположены непроходимые области.&lt;/li&gt;&lt;li&gt;Область (область мира) - основной базовый элемент мира, в один момент времени в области может находиться только одно существо.&lt;/li&gt;&lt;li&gt;Существо - основной житель мира, который может и должен в нем жить. Существо это агент, который появляется в мире после его инициализации.&lt;/li&gt;&lt;li&gt;Существа организованны в команды (могут из разных типов существ).&lt;/li&gt;&lt;li&gt;Эмрельд - на каждой карте есть один эмеральд, владение которым может остановить игру.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Как это работает:&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Вы настраиваете какие существа и команды существую в мире.&lt;/li&gt;&lt;li&gt;Вы создаете игровой мир.&lt;/li&gt;&lt;li&gt;Происходит инициализация всех существ игрового мира. Существа представляют собой обычные Java-классы, которые должны реализовать специальный интерфейс.&lt;/li&gt;&lt;li&gt;Запускается процесс эмуляции игрового мира, во время которого существа злобно поедают друг друга.&lt;/li&gt;&lt;li&gt;Выводится результаты&amp;nbsp; эмуляции игрового мира.&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Пример простого агента:&lt;/strong&gt;&lt;br /&gt;Далее будет приведен простого существа, которое делает всего одну полезную вещь: ест! Не правда ли вам знакомы подобные особи ;)&lt;br /&gt;&lt;blockquote&gt;public class EatAgent implements Agent {&lt;br /&gt;// Инициализация существа&lt;br /&gt;public void init(InitAgentContext initAgentContext) {&lt;br /&gt;int power = initAgentContext.getStartingPoints() / 2;&lt;br /&gt;initAgentContext.setStartingPoints(power, initAgentContext.getStartingPoints() - power);&lt;br /&gt;}&lt;br /&gt;// Процесс совершения хода существом&lt;br /&gt;public void turn(AgentContext agentContext) {&lt;br /&gt;agentContext.setAction(EatAction.getInstance());&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;strong&gt;Вывод результатов эмуляции:&lt;/strong&gt;&lt;br /&gt;Пока у нас нет интерфейса для эмеральдов, но вы можете помочь нам его сделать ;) А сейчас после запуска эмеральдов вы увидите следующий текст:&lt;br /&gt;&lt;blockquote&gt;[0:46:35] Start application - Crown of emeralds&lt;br /&gt;Status:&lt;br /&gt;turn - 8&lt;br /&gt;maxTurn - 1000&lt;br /&gt;Living agents [3]:&lt;br /&gt;AgentInfo:uid[third],class[SimpleAgent],level[14],turns[7],&lt;br /&gt;power[5],energy[4],maxEnergy[5].&lt;br /&gt;AgentInfo:uid[second],class[SimpleAgent],level[12],turns[8],&lt;br /&gt;power[5],energy[2],maxEnergy[5].&lt;br /&gt;AgentInfo:uid[first],class[SimpleAgent],level[5],turns[7],&lt;br /&gt;power[5],energy[5],maxEnergy[5].&lt;br /&gt;Dead agents:[0]:&lt;br /&gt;[0:46:35] End application - Crown of emeralds&lt;/blockquote&gt;Из приведенного выше мы видим:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Я больной человек и не сплю в 46 минут первого :)&lt;/li&gt;&lt;li&gt;Максимальное число ходов 1000, но эмуляция закончилась на 8 ходу.&lt;/li&gt;&lt;li&gt;Количество живых агентов равно трем, мертвых агентов нет :)&lt;/li&gt;&lt;li&gt;Победил агент third, набрав 14 уровень&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Вместо заключения:&lt;/strong&gt;&lt;br /&gt;Мы написали базовый вариант игрового мира со своими правилами и законами, но мы не хотим закрывать проект от всех заинтересованных лиц. Поэтому в ближайшее время будет открыта вся информация по данному проекту и предоставлен доступ к исходному коду проекта. Нам нужны как разработчики существ так и разработчики ядра системы.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Вы хотите участвовать в проекте?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Чуть не забыл: мы ищем парочку бета-тестеров и описанный проект создан в рамках сообщества программистов Иркутска :)&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Картинка взята отсюда: http://www.nightmares.ru/wp_test/wp-content/uploads/2008/12/lango_silver.jpg&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://istuinosum.blogspot.com/2009/03/blog-post.html&quot; target=&quot;_blank&quot;&gt;это кросспост отсюда&lt;/a&gt;</description><link>http://tech.intr13.ru/2009/03/emeralds.html</link><author>noreply@blogger.com (intr13)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-RvczPN6x2kI/TbLXXYPnrfI/AAAAAAAABLg/gk3hBqLepkk/s72-c/lango_silver.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-7531506562697061686</guid><pubDate>Thu, 26 Feb 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-23T22:47:23.078+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">oracle</category><category domain="http://www.blogger.com/atom/ns#">postgre</category><category domain="http://www.blogger.com/atom/ns#">sun</category><category domain="http://www.blogger.com/atom/ns#">клиент</category><category domain="http://www.blogger.com/atom/ns#">лицензирование</category><category domain="http://www.blogger.com/atom/ns#">по</category><category domain="http://www.blogger.com/atom/ns#">россия</category><title>Незаконный Opensource</title><description>Недавно наш клиент спросил: &quot;Вы можете предоставить лицензионные соглашения&amp;nbsp; с производителями используемого Вами программного обеспечения?&quot;. Но ведь мы в основе своей деятельности используем программное обеспечение, которое бесплатно для коммерческого использования. А производители такого ПО заключают договор в форме публичной оферты. Например, когда вы на сайте производителя&amp;nbsp; подтверждаете лицензионное соглашений путем нажатия на определенную ссылку или просто скачивая программный продукт. После чтения законов и интернета ситуация нисколько не прояснилась, и сейчас я даже начал сомневаться о законности использования бесплатного ПО на территории РФ.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Для начала я взглянул на наши законы и увидел следующее:&amp;nbsp; Часть четвертая гражданского кодекса Российской Федерации. Права на результаты интеллектуальной деятельности и средства индивидуализации. Статья 1235. Лицензионный договор:&lt;br /&gt;&lt;blockquote&gt;2. Лицензионный договор заключается в письменной форме, если настоящим Кодексом не предусмотрено иное.&lt;br /&gt;&lt;br /&gt;Лицензионный договор подлежит государственной регистрации в случаях, предусмотренных пунктом 2 статьи 1232 настоящего Кодекса.&lt;br /&gt;&lt;br /&gt;Несоблюдение письменной формы или требования о государственной регистрации влечет за собой недействительность лицензионного договора.&lt;/blockquote&gt;Получается что нет бумажки и ты нарушаешь закон? И что делать? Про иное заключение лицензионного договора я ничего в Кодексе не нашел.&lt;br /&gt;&lt;br /&gt;Я попробовал задать &lt;a href=&quot;http://www.rsdn.ru/Forum/message/3282255.aspx&quot; target=&quot;_blank&quot;&gt;вопрос на форме&lt;/a&gt;, но народ ничего внятного не предложил, кроме оплаченной юридической экспертизы. Правда ребята от SUN обещали помочь и выслать лицензионный договор на Java.&lt;br /&gt;&lt;br /&gt;Также была найдена &lt;a href=&quot;http://bishop-it.ru/?p=152&quot; target=&quot;_blank&quot;&gt;довольно интересная статья&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;В общем, вы должны всегда помнить, что Open Source код для закона ничем не отличается от вашего собственного кода и вы несете полную ответственность за соблюдение всех авторских прав этим кодом.&lt;br /&gt;В переводе на русский язык это означает, что вам не обойтись без юридического отдела, который будет проверять каждый файл из Open Source кода, который вы добавляете в продукт. Им придется пробивать поиском все файлы и сверять все типы лицензий, узнавать владельцев кода, контактировать с ними и многое другое. Только так вы можете быть уверены, что используемый вами “свободный код” действительно “свободный”.&lt;br /&gt;Кроме того, все вышеперечисленные типы лицензий - это просто шаблоны. В каждом конкретном случае может текст лицензии может быть изменен и, например, в него может быть добавлена информация, что автор хочет получать royalties с коммерческого использования его кода. И вычленить такого рода информацию из юридического текста программисту непросто - лучше отдать это на откуп юристам.&lt;br /&gt;&lt;br /&gt;А теперь еще интереснее. В каждой стране свои законы об авторском праве и свои трактовки этих лицензий. Даже внутри Евросоюза нет единого закона. Например, если в лицензии написано, что код находится в Public Domain, то не спешите радоваться. В разных странах этот термин трактуется по-разному. И, например, в Финляндии автор такого кода может через несколько лет прийти и попросить процент с продаж, так как “код в Public Domain, но я все равно хочу процент”. И суд скорее всего удовлетворит иск.&lt;br /&gt;Так что, кроме знания лицензий и терминов, при работе с Open Source стоит знать еще и локальные законы, если вы работаете World wide. Кстати, наибольшее число исков по Open Source делам приходят из Америки (понятно почему) и Германии (не ожидал).&lt;/blockquote&gt;Кроме &quot;ква&quot; других слов просто нет...&lt;br /&gt;&lt;blockquote&gt;Насколько я знаю, обычно в договорах о лицензировании интеллектуальной собственности стараются вставить пункты, что продавец библиотеки гарантирует ее чистоту и что в случае возникновения спора готов выступить соответчиком в суде.&lt;/blockquote&gt;А вот это уже выход, можно предоставлять лицензионный договор для заказчиков и в случае судебного спора судиться. Заказчик будет рад. Но ведь тогда надо предоставить документы о том, что исполнитель действительно может использовать бесплатное ПО.&lt;br /&gt;&lt;br /&gt;Что сейчас делать непонятно, нарушать закон не хочется. Можно конечно попросить у производителя ПО лицензионный договор, ребята из SUN даже предлагали его выслать, но что делать с PostgreSQL? Или что делать с Oracle XE, представители которого вообще отказались предоставить такой документ.&lt;br /&gt;&lt;br /&gt;Вообщем я буду писать письмо в юридический отдел SUN, а дальше посмотрим.&lt;br /&gt;&lt;br /&gt;Пока мне непонятно следующее:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Требуется ли заключение лицензионного договора в письменной форме для бесплатных программных продуктов? Если не требуется, то какими нормативными документами это регламентировано?&lt;/li&gt;&lt;li&gt;На основе чего проверяющие органы могут забрать компьютерную технику на экспертизу - лицензионности программного обеспечения? Какими нормативными документами это регламентируется?&lt;/li&gt;&lt;/ol&gt;</description><link>http://tech.intr13.ru/2009/02/opensource.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5044798210997553039</guid><pubDate>Wed, 25 Feb 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-24T00:27:00.552+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">grid</category><category domain="http://www.blogger.com/atom/ns#">microsoft</category><category domain="http://www.blogger.com/atom/ns#">oracle</category><category domain="http://www.blogger.com/atom/ns#">sun</category><category domain="http://www.blogger.com/atom/ns#">иркутск</category><category domain="http://www.blogger.com/atom/ns#">лицензирование</category><category domain="http://www.blogger.com/atom/ns#">субд</category><title>Технологический день Oracle в Иркутске</title><description>В наш маленький уездный город &lt;a href=&quot;http://www.oracle.com/webapps/events/EventsDetail.jsp?p_eventId=90062&amp;amp;src=6664490&amp;amp;src=6664490&amp;amp;Act=15&quot; target=&quot;_blank&quot;&gt;приехали люди Oracle&lt;/a&gt;. В принципе было довольно интересно, особенно обед :) Но если по существу, то или Oracle сдал или я теперь по другому смотрю на подобные вещи :)&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Первый раз я увидел презентацию Oracle на SECR2006, и мне понравилось. Особенно харизматично выглядели докладчики, эдакие умные мужики в деловых костюмах, которые с ленцой и без особого фанатизма рассказывали о своих технологиях. И как рассказывали.. ..и я верил что все остальные компании ничто по сравнению с мега-Oracle. Помнится тогда у меня сформировалось убеждение что Oracle может сделать все!&lt;br /&gt;&lt;br /&gt;Кстати тогда я увидел еще представителей Microsoft и SUN. Люди из Microsoft показались мне типичными торгашами-братками из девяностых :) А SUNовцы казались сплошь студентами-аспирантами с горящими глазами :) Но хватит воспоминаний, вернемся к технологическому дню Oracle в Иркутске :)&lt;br /&gt;&lt;br /&gt;Темы которые были освещены:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Обзор технологической архитектуры Oracle.&lt;/strong&gt; Рассказали про все основные решения Oracle. Я узнал что у Oracle практически для каждого продукта есть двойник-дублер (они купили кучу компаний, например компанию которая сделала BEA WebLogic Server). Во-общем Oracle хочет стать круче IBM :)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Обзор возможностей СУБД Oracle 11g.&lt;/strong&gt; Рассказали про различные варианты СУБД Oracle, например оказалось, что у них есть мобильная версия Oracle и довольно забавное решение &lt;a href=&quot;http://www.oracle.com/timesten/index.html&quot; target=&quot;_blank&quot;&gt;Oracle TimesTen&lt;/a&gt;. Последний продукт предназначен для СУБД размещаемой в оперативной памяти, с возможностью репликации с основной базой данных Oracle (типа СУБД-кэш). При демонстрации нам показали насколько быстро работает такая связка, но к сожалению в цифрах которые они нам продемонстрировали отсутствовало время на репликацию с основной базой данных :) А так результаты отличались почти на порядок, с TimesTen быстрее.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Дополнительные возможности СУБД Oracle. Real Application Cluster &amp;amp; GRID.&lt;/strong&gt; Рассказывали про построение инфраструктуры для grid вычислений, как это просто и удобно делать под Oracle :) Пример показывали на &lt;a href=&quot;http://www.oracle.com/technologies/virtualization/index.html&quot; target=&quot;_blank&quot;&gt;виртуальной машине от Oracle&lt;/a&gt; :) Кстати они теперь продают железки с предустановленным серверным софтом, например для grid вычислений :)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Oracle Enterprice Content Management.&lt;/strong&gt; Это &lt;a href=&quot;http://www.oracle.com/products/middleware/content-management/enterprise-content-management.html&quot; target=&quot;_blank&quot;&gt;их ответ&lt;/a&gt; Microsoft Sharepoint Server, только на порядок круче (и дороже раз в пять :) ). Особенно красиво сделана интеграция с MS Windows и MS Office, в Microsoft наверно и не знали что так можно сделать :)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Oracle Business Intelligence.&lt;/strong&gt; А зачем нам нужна СУБД? Правильно, &lt;a href=&quot;http://www.oracle.com/appserver/business-intelligence/enterprise-edition.html&quot; target=&quot;_blank&quot;&gt;для генерации красивых отчетов&lt;/a&gt; :)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Лицензирование программных продуктов Oracle.&lt;/strong&gt; А это была самая интересная тема, приведу несколько фактов:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Есть два способа лицензирования СУБД Oracle: по пользователям и по процессорам.&lt;/li&gt;&lt;li&gt;Для многоядерных процессоров есть хитрая формула расчета стоимости, итого цена за один процессор лежит в диапазоне 5.8 - 47.5 тысяч долларов.&lt;/li&gt;&lt;li&gt;При лицензировании по пользователем считаются все возможные пользователи СУБД. Например, если у нас есть 5 пользователей, которые работают в дневное время, и 5 пользователей, которые на тех же самых компьютерах работают в ночное время, то у нас 10 пользователей :) Иногда лицензирование по пользователям дешевле, но оно не применяется для систем которые доступны через Интернет :)&lt;/li&gt;&lt;li&gt;Использовать Oracle XE возможно на одно процессорном компьютере (может быть несколько ядер) с 1GB ОЗУ и хранить в нем не более 4GB данных. Но если вы нарушите данные ограничения, то ничего не сломается, Oracle XE будет работать. Но учтите что тогда вы нарушите лицензию и кара небесная падет на Ваши головы :)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;Если оценить качество докладов, то я бы поставил четыре с большим минусом. Да один из докладчиков был довольно интересен, но зато когда говорил другой, то аудитория погружалась в вечный сон. Извините, но так скучно и сонно мне не было со времен ИрГТУ, когда одна милая женщина читала свои лекции по толстой книжке.&lt;br /&gt;&lt;br /&gt;Кстати первый докладчик, периодически смеялся над своими слайдами. Что там было смешного он к сожалению не поведал, но мне запомнились следующие его высказывания:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Об операторе Merge в Oracle: &quot;У других определенных баз данных такого оператора нет&quot;.&lt;/li&gt;&lt;li&gt;О &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B8%D0%B4&quot; target=&quot;_blank&quot;&gt;grid вычислениях&lt;/a&gt;: &quot;Аналогом grid вычислений является бытовая электрическая сеть, Вы ведь не задумываетесь с какого генератора питается Ваш электрический чайник, Вы просто включаете его в розетку и он работает&quot;.&lt;/li&gt;&lt;/ul&gt;И напоследок расскажу об одном забавном инциденте :) Когда у последнего докладчика, ноутбук отказался работать с проектором, в зале была произнесена следующая фраза: &quot;Пусть сами разбираются, они ведь тут на работе&quot; :)&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Кстати, использование бесплатного программного обеспечения противоречит законодательству РФ. Единственный разумный вариант его использования - это получение лицензионного договора от правообладателя. А представители Oracle сказали, что не дадут мне такую бумажку на &lt;a href=&quot;http://www.oracle.com/technology/products/database/xe/index.html&quot; target=&quot;_blank&quot;&gt;ORACLE XE&lt;/a&gt;. Ушел писать письмо юристам SUN...</description><link>http://tech.intr13.ru/2009/02/oracle-irkutsk.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5656410807713969947</guid><pubDate>Sat, 14 Feb 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-23T22:33:20.377+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">opensuse</category><category domain="http://www.blogger.com/atom/ns#">postgre</category><category domain="http://www.blogger.com/atom/ns#">sql</category><category domain="http://www.blogger.com/atom/ns#">авторизация</category><category domain="http://www.blogger.com/atom/ns#">администрирование</category><category domain="http://www.blogger.com/atom/ns#">настройка</category><category domain="http://www.blogger.com/atom/ns#">пароль</category><category domain="http://www.blogger.com/atom/ns#">установка</category><title>Установка postgreSQL на OpenSuSe</title><description>Оказывает поставить и настроить PostgreSQL на OpenSuSe, довольно просто. Надо всего лишь знать особую уличную магию командной строки :) В Windows все намного проще, один клик и все готово, но мы не ищем легких путей :)&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Цель: установка PostgreSQL на OpenSuse.&lt;br /&gt;&lt;br /&gt;Исходные данные:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Операционная система OpenSuSe 11.1.&lt;/li&gt;&lt;li&gt;Прокладка между стулом и клавиатурой.&lt;/li&gt;&lt;/ul&gt;Моя правильная последовательность действий:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Входим под root: &lt;strong&gt;su&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Ставим PostgreSQL: &lt;strong&gt;zypper install postgresql-server&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Инициализируем и запускаем PostgreSQL: &lt;strong&gt;rcpostgresql start&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Входим под postgres в psql-консоль: &lt;strong&gt;su postgres -c psql postgres&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Меняем пароль для пользователя postgres: &lt;strong&gt;ALTER USER postgres WITH PASSWORD &#39;postgres&#39;;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Выходим из psql-консоли: &lt;strong&gt;\q&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Меняем в файле &lt;strong&gt;/var/lib/pgsql/data/pg_hba.conf&lt;/strong&gt; во всех не комментированных строчках слова &lt;strong&gt;ident&lt;/strong&gt; на &lt;strong&gt;md5&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Перезапускаем PostgreSQL: &lt;strong&gt;rcpostgresql restart&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Наслаждаемся результатом :)&lt;/li&gt;&lt;/ol&gt;А теперь о том что мы делали:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Мы поставили PostgreSQL&amp;nbsp; и сменили пароль для главного администратора баз данных (пользователь postgres) :)&lt;/li&gt;&lt;li&gt;Благодаря изменению файла &lt;strong&gt;/var/lib/pgsql/data/pg_hba.conf&lt;/strong&gt; мы изменили стандартный способ авторизации на md5, который используется при подключении к базам данных.&lt;/li&gt;&lt;/ol&gt;Источник: &lt;a href=&quot;http://www.susegeek.com/database/install-and-configure-postgresql-in-opensuse-110/&quot; rel=&quot;bookmark&quot; target=&quot;_blank&quot; title=&quot;Permanent Link to Install and Configure PostgreSQL in openSUSE 11.0&quot;&gt;Install and Configure PostgreSQL in openSUSE 11.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Для удобного управления базами данных и пользователями, я рекомендую поставить pgAdmin. Найти его можно &lt;a href=&quot;http://software.opensuse.org/ymp/server:database:postgresql/openSUSE_11.1/pgadmin3.ymp&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt; или &lt;a href=&quot;http://software.opensuse.org/search&quot; target=&quot;_blank&quot;&gt;здесь.&lt;/a&gt;</description><link>http://tech.intr13.ru/2009/02/postgresql-opensuse.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-2861834712366827907</guid><pubDate>Thu, 05 Feb 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-23T22:36:13.197+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">firefox</category><category domain="http://www.blogger.com/atom/ns#">opensuse</category><category domain="http://www.blogger.com/atom/ns#">администрирование</category><category domain="http://www.blogger.com/atom/ns#">кодировка</category><category domain="http://www.blogger.com/atom/ns#">орфография</category><title>Проверка русской орфографии в Firefox</title><description>У меня в Firefox 3 не работала проверка русской орфографии. После двух дней мучений я таки решил это поправить :) Оказалось что ставить дополнительных плагинов не требуется, надо всего лишь настроить Firefox через &lt;strong&gt;about:config&lt;/strong&gt;.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Проблема: после установки OpenSuse 11.1 не работает проверка русской орфографии в Firefox 3.0.5.&lt;br /&gt;&lt;br /&gt;Исходные данные:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Операционная система OpenSuSe 11.1.&lt;/li&gt;&lt;li&gt;Интернет браузер Firefox 3.0.5. Firefox обновлен через zypper.&lt;/li&gt;&lt;li&gt;Прокладка между стулом и клавиатурой.&lt;/li&gt;&lt;/ul&gt;Для исправления сего недоразумения надо:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Запустить Firefox.&lt;/li&gt;&lt;li&gt;Написать в строке адреса &lt;strong&gt;about:config&lt;/strong&gt; и нажимаем Enter.&lt;/li&gt;&lt;li&gt;Далее сказать, что мы разумные люди и берем на себя всю ответственность за изменение системных параметров Firefox.&lt;/li&gt;&lt;li&gt;Устанавить у параметра &lt;strong&gt;spellchecker.dictionary&lt;/strong&gt; значение &lt;strong&gt;ru-RU&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Также для проверки орфографии в однострочных полях Firefox можно изменить значение параметра &lt;strong&gt;layout.spellcheckDefault&lt;/strong&gt; с &lt;strong&gt;1&lt;/strong&gt; на &lt;strong&gt;2&lt;/strong&gt;. По умолчанию орфография проверяется только в многострочных полях (textarea).&lt;/li&gt;&lt;li&gt;Перезапустить &lt;strong&gt;Firefox&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Насладиться результатом :)&lt;/li&gt;&lt;/ol&gt;Источник вселенской мудрости &lt;a href=&quot;http://google.com/&quot; target=&quot;_blank&quot;&gt;google&lt;/a&gt;.</description><link>http://tech.intr13.ru/2009/02/firefox.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-7890925773168149363</guid><pubDate>Wed, 07 Jan 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-23T22:11:31.498+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dbf</category><category domain="http://www.blogger.com/atom/ns#">equals</category><category domain="http://www.blogger.com/atom/ns#">foxpro</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">интеллект</category><category domain="http://www.blogger.com/atom/ns#">кодировка</category><category domain="http://www.blogger.com/atom/ns#">ошибки</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>equals или not equals, вот в чем вопрос :)</title><description>Довелось мне столкнуться с одним унаследованным программным комплексом, десятилетней выдержки. Написан он на фоксе и для хранения данных использует DBF-файлы. Так вот, при загрузке данных из этой унаследованной штуки, вдруг обнаружилось что &lt;b&gt;“[какой-то текст 1][символ пробела][какой-то текст 2]“.equals(“[какой-то текст 1][символ пробела][какой-то текст 2]“) == false&lt;/b&gt;. Вначале я впал в небольшой ступор, но потом появилась мысль! Дело в кодировке, а точнее в наборе символов (Charset)!&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Благодаря &lt;b&gt;System.out.println(Arrays.toString(“[символ пробела]“.getBytes()))&lt;/b&gt; я узнал что код этого странного двухбайтового символа – [-62, -96]. Код стандартного пробела – [0, 32].&lt;br /&gt;&lt;br /&gt;При дальнейшем анализе ситуации выяснилось, что в некоторых записях DBF-файла используется стандартный пробел, а в других используется нестандартный пробел. С чем это связано было непонятно, возможно виной пятна на солнце. Хотя есть подозрение что виной утилита для бекапа и восстановления данных, она входит в состав унаследованного программного комплекса.&lt;br /&gt;&lt;br /&gt;Проблема решилась следующим образом, перед сравнением строк просходит предварительная обработка данных из DBF-файла:&lt;b&gt;  [out] = [in].replaceAll(new String(new byte[] { -62, -96 })),new String(new byte[] { 0, 32 }))&lt;/b&gt;, и дальше все как обычно.&lt;br /&gt;&lt;br /&gt;Потом я нашел в данных DBF-файлов следующие забавные вещи:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ошибки в именовании названий объектов, часть написана правильно, а другая часть нет. Например слова: инте&lt;b&gt;лл&lt;/b&gt;ект и инте&lt;b&gt;л&lt;/b&gt;ект.&lt;/li&gt;&lt;li&gt;Часть данных написана с использованием русской кодировки, другая часть вперемешку используя буквы русской и английской кодировки. Например есть такие буквы “&lt;b&gt;р&lt;/b&gt;”  и “&lt;b&gt;H&lt;/b&gt;”, они одинаково выглядят, но в русской кодировке это одна буква, а в английской совсем другая.&lt;/li&gt;&lt;/ul&gt;Вообщем я обеспокоен интеллектом создателей это унаследованной системы  Они наверно даже не знают что такое нормализация базы данных :)</description><link>http://tech.intr13.ru/2009/01/equals-or-not-equals.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-5859521155640407656</guid><pubDate>Tue, 06 Jan 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-24T00:24:01.086+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">dbf</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">maven</category><category domain="http://www.blogger.com/atom/ns#">выбор</category><category domain="http://www.blogger.com/atom/ns#">интернет</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">сравнение</category><title>Maven Repository Manager</title><description>&lt;a href=&quot;http://maven.apache.org/what-is-maven.html&quot;&gt;Maven&lt;/a&gt;&amp;nbsp;довольно интересная штука. При первом запуске приложения, на сборку, к Вам, на локальный компьютер, может скачаться половина Интернета. &amp;nbsp;Поэтому разработчики maven рекомендуют использовать внутренние &lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-repositories.html&quot;&gt;Maven-репозитории&lt;/a&gt;.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;На самом деле причина в том, что внутренние Maven-репозитории позволяют хранить артефакты которые отсутствуют в центральном репозитории. Это могут быть, как Ваши собственные библиотеки, так и сторонние библиотеки, которые пока не выложены в центральный репозиторий. Например, библиотека для доступа к DBF файлам из Java – &lt;a href=&quot;http://xbasej.sourceforge.net/&quot;&gt;xBaseJ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Также при работе над проектами содержимое центральных репозиториев может меняться, пропадают старые версии артефактов или пропадают сами репозитории. Поэтому рекомендуется для каждого проекта иметь отдельный Maven-репозитории.&lt;br /&gt;&lt;br /&gt;Недавно в мировом пространстве WWW я наткнулся на довольно интересное сравнение: &lt;a href=&quot;http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix&quot;&gt;Maven Repository Manager Feature Matrix&lt;/a&gt;. В нашей компании используется &lt;a href=&quot;http://archiva.apache.org/&quot;&gt;Apache Archiva&lt;/a&gt; и пока нареканий к ней особых нет.&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Говорят на заре создания Maven некоторые центральные репозитории постоянно падали и без использования внутренних Maven-репозиториев было совсем никак.&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Для тех, кто плохо знает что такое maven я рекомендую прочитать – &lt;a href=&quot;http://www.ibm.com/developerworks/ru/edu/j-mavenv2/index.html&quot;&gt;Введение в Apache Maven 2&lt;/a&gt;.</description><link>http://tech.intr13.ru/2009/01/maven-repository-manager.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-2041973294955954069</guid><pubDate>Fri, 02 Jan 2009 16:00:00 +0000</pubDate><atom:updated>2011-04-24T00:22:18.439+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">alsa</category><category domain="http://www.blogger.com/atom/ns#">opensuse</category><category domain="http://www.blogger.com/atom/ns#">администрирование</category><category domain="http://www.blogger.com/atom/ns#">звук</category><category domain="http://www.blogger.com/atom/ns#">настройка</category><category domain="http://www.blogger.com/atom/ns#">ноутбук</category><title>Возвращение звука</title><description>Как я уже говорил – у меня заработал звук в OpenSuse 11. Но учитывая полушаманские методы, которые заставили его заработать, я решил найти более конкретное решение проблемы (да сузю я переустановил на более новую  ). Вообщем ключевой момент – пересобирать alsa не надо!&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Проблема: звук работает только из динамиков микрофона, при подключении внешней акустики звук не работает. Например, при подключении наушников в них слышно тишину&lt;br /&gt;&lt;br /&gt;Исходные данные:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ноутбук ASUS A6Q00VM.&lt;/li&gt;&lt;li&gt;Звуковая карта Hda Intel Sound.&lt;/li&gt;&lt;li&gt;Кодек Realtek ALC880.&lt;/li&gt;&lt;li&gt;Операционная система OpenSuSe 11.1.&lt;/li&gt;&lt;li&gt;Прокладка между стулом и клавиатурой.&lt;/li&gt;&lt;/ul&gt;Моя правильная последовательность действий:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Запускаем sudo alsaconf.&lt;/li&gt;&lt;li&gt;После того, как alsaconf выдаст список звуковых карт, мы выбираем нашу карточку (Hda Intel Sound) и говорим сохранить настройки.&lt;/li&gt;&lt;li&gt;Далее запускаем sudo nano /etc/modprobe.d/sound и прописываем в конец файла строчку options snd-hda-intel model=auto.&lt;/li&gt;&lt;li&gt;Перезапускаем и наслаждаемся звуком  Хотя возможно стоит настроить микшер&lt;/li&gt;&lt;/ol&gt;А теперь о том что мы делали:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;alsaconf прописал кошерные настройки нашей звуковой карты в различные конфиги.&lt;/li&gt;&lt;li&gt;редактирование файла /etc/modprobe.d/sound позволило нам выбрать правильную конфигурацию звуковой карты учитывая наш кодек (Realtek ALC880). Кстати, вместо auto можно написать другие буквы, подробнее тут.&lt;/li&gt;&lt;li&gt;Перезапуск позволил нам сделать так чтобы все заработало  .&lt;/li&gt;&lt;/ul&gt;Источники:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://help.ubuntu.com/community/HdaIntelSoundHowto&quot;&gt;HdaIntelSoundHowto&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/RussianDocumentation/AlsaHda-intel&quot;&gt;Настройка ALSA для работы со встроенной звуковой картой HDA-Intel&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>http://tech.intr13.ru/2009/01/opensuse-sound.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-2503086202289363953</guid><pubDate>Sat, 20 Dec 2008 16:00:00 +0000</pubDate><atom:updated>2011-04-23T21:01:39.884+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">request</category><category domain="http://www.blogger.com/atom/ns#">scope</category><category domain="http://www.blogger.com/atom/ns#">seam</category><category domain="http://www.blogger.com/atom/ns#">session</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>ScopeType в JBoss Seam</title><description>У каждого Seam-компонента есть Scope – контекст применения (хранения, использования). Например, есть такой Scope: SESSION – это означает, что компонент будет храниться и получаться из сессии пользователя. То есть получается практически полный аналог сессионных объектов (HttpSession.getAttribute и HttpSession.setAttribute). Также Seam предоставляет еще несколько ScopeType:)&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Типы ScopeType (компоненты отсортированы по уменьшению области применения, вначале идут самы глобальны контексты):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;APPLICATION - компонент создается и храниться в рамках всего приложения, практически аналог глобальны переменных приложения. Это надо чтобы компонент был гарантированно один для всех пользователей.&lt;/li&gt;&lt;li&gt;BUSINESS_PROCESS – компонент создается и храниться в бизнес процессе. Это нужно для хранения компонентов в контексте выполнения бизнес процесса (BEPL и все такое).&lt;/li&gt;&lt;li&gt;SESSION – компонент создается и храниться в сессии пользователя (альтернатива HttpSession). Например для сохранения текущего пользователя (механизм безопасности и проверки прав) рекомендуется использовать этот контекст. Также можно в нем хранить настройки текущего сеанса пользователя.&lt;/li&gt;&lt;li&gt;CONVERSATION – компонент создается и храниться в группе взаимодействии пользователя с сервером, то есть для одной группы взаимодействий может быть проставлено в соответствие несколько запросов на сервер. Применяется эта штука в мастерах, когда у нас есть ряд запросов на сервер для совершения определенного действия.&lt;/li&gt;&lt;li&gt;EVENT – компонент создается и храниться во взаимодействии пользователя с сервером (альтернатива HttpRequest), причем создается на одно взаимодействие. Где его использовать вытекает из его названия, например, если вы делаете запрос на сервер, то было бы неплохо иметь один и тот же объект на один запрос (request).&lt;/li&gt;&lt;li&gt;PAGE – компонент создается и храниться с привязкой к странице (компонент для страницы). Я так понял что используется этот тип если вам нужно изолировать компонент в пределах одной страницы (при запросе на сервер может быть использовано несколько страниц).&lt;/li&gt;&lt;li&gt;STATELESS – компонент создается, используется и сразу удаляется (без сохранения состояния). Это надо чтобы один раз использовать компонент и в следующий раз гарантированно получить новый (похоже на паттерн “команда”).&lt;/li&gt;&lt;/ul&gt;Замечания:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BUSINESS_PROCESS – я не использовал, поэтому до конца не представляю его необходимость.&lt;/li&gt;&lt;li&gt;PAGE - я не понял хранятся ли состояния при обновлении страницы.&lt;/li&gt;&lt;/ul&gt;Вроде все, для дополнительной информации читаем &lt;a href=&quot;http://docs.jboss.org/seam/2.1.0.SP1/api/org/jboss/seam/ScopeType.html&quot;&gt;здесь&lt;/a&gt;.</description><link>http://tech.intr13.ru/2008/12/scopetype-jboss-seam.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-6511096024693924604</guid><pubDate>Tue, 09 Dec 2008 16:00:00 +0000</pubDate><atom:updated>2011-04-23T20:44:58.623+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">microsoft</category><category domain="http://www.blogger.com/atom/ns#">tomcat</category><category domain="http://www.blogger.com/atom/ns#">vista</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">сервис</category><title>Apache Tomcat 6 &amp; Microsoft Windows Vista</title><description>Сегодня возникла необходимость: развернуть продакшн сервер на базе Apache Tomcat 6 и Microsoft Windows Vista. И все бы ничего, но возникла нужда запускать Apache Tomcat 6 как сервис. Для этих целей был скачен установщик и вуаля, вообщем как обычно – сразу не заработало:)&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Далее стало интереснее: оказалось, что из консоли Tomcat запускается. Причем осложняло ситуацию отсутствие меня возле компьютера с проблемой, приходилось консультировать удаленно:)&lt;br /&gt;&lt;br /&gt;Пообщавшись с седым старцем – goggle, &lt;a href=&quot;http://www.nabble.com/Tomcat-6.0.12-in-windows-vista-64-bits-does-not-start-td18967895.html&quot;&gt;ответ был найден&lt;/a&gt;: You are likely using the 32-bit versions of the service wrapper. Get the 64-bit ones here:&lt;br /&gt;&lt;a href=&quot;https://svn.apache.org/repos/asf/tomcat/connectors/trunk/procrun/bin/amd64/&quot;&gt;https://svn.apache.org/repos/asf/tomcat/connectors/trunk/procrun/bin/amd64/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В кратце, проблема в том, что используется неправильная версия приложения, которое запускает tomcat как сервис.  Но у нас была 32-х разрядная Vista! Поэтому пришлось качать врапер, оторый лежал в &lt;a href=&quot;https://svn.apache.org/repos/asf/tomcat/connectors/trunk/procrun/bin/&quot;&gt;https://svn.apache.org/repos/asf/tomcat/connectors/trunk/procrun/bin/&lt;/a&gt;. B случилось чудо! Все заработало!&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;В случае если используется 6 версия tomcat, то надо скачанный врапер переименовать (изменить цифру “5″ на цифру “6″).&lt;br /&gt;&lt;br /&gt;p/s/s&lt;br /&gt;Была найдена еще одна &lt;a href=&quot;http://www.ski-epic.com/2007_small_business_setup/installing_tomcat_6_on_windows.html&quot;&gt;потенциальная проблема&lt;/a&gt;: The current Tomcat installer has a bug where it forgot to install one Windows dll. The solution is to copy a C:\WINDOWS\System32\msvcr71.dll from any Windows system you find it (like XP Pro or Vista or any Windows computer with a Microsoft Visual Studio installed) and copy it to the same directory on your Windows 2003 Server machine. Then Tomcat will launch fine.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Обновление от 14.01.2009:&lt;/b&gt;&lt;br /&gt;Редактировать настройки томкета-сервиса можно в  реестре, лежат они в “HKEY_LOCAL_MACHINE\Software\Apache Fondation”. Например,  необходимость этого возникает, когда надо указать кодировку для java по  умолчанию: -Dfile.encoding=UTF-8.</description><link>http://tech.intr13.ru/2008/12/apache-tomcat-6-microsoft-windows-vista.html</link><author>noreply@blogger.com (intr13)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3305916983903342544.post-4183418462323300401</guid><pubDate>Fri, 05 Dec 2008 16:00:00 +0000</pubDate><atom:updated>2011-04-24T00:41:39.914+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">error</category><category domain="http://www.blogger.com/atom/ns#">gc</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">outofmemory</category><category domain="http://www.blogger.com/atom/ns#">vingrad</category><category domain="http://www.blogger.com/atom/ns#">обсуждения</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Серебряной пули не существует, по крайней мере для OutOfMemoryError</title><description>В ответ на мою заметку об &lt;a href=&quot;http://tech.intr13.ru/2008/12/outofmemoryerror.html&quot; target=&quot;_blank&quot;&gt;OutOfMemoryError&lt;/a&gt;, на одном замечательном форуме меня немножко поправили и дополнили.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Цитата (автор &lt;a href=&quot;http://forum.vingrad.ru/users/Shurr&quot; target=&quot;_blank&quot;&gt;Shurr&lt;/a&gt;):&lt;br /&gt;&lt;blockquote&gt;Для начала стоит попытаться определиться с чем проблема: с кодом приложения, или с ресурсами. Если проблема в ресурсах – я бы начал с базовых рекомендаций по диагностике тюнингу от производителя, например &lt;a href=&quot;http://java.sun.com/docs/hotspot/gc1.4.2/&quot; target=&quot;_blank&quot;&gt;Tuning Garbage Collection&lt;/a&gt; от Sun. Конкретно по ключам запуска можно посмотреть &lt;a href=&quot;http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;. В случае, если используется не HotSpot JVM от Sun, то и документацию по используемой реализации, например &lt;a href=&quot;http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tprf_tunejvm.html&quot; target=&quot;_blank&quot;&gt;для IBM&lt;/a&gt;.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;В данном случае ошибка возникает при горячем передеплое, и OutOfMemory вылетает для perm-области. После прочтения документации мы видим, что проблема скорее всего в ресурсах. Конкретнее – при горячем передеплое контейнер держит два полных набора классов: старые классы ждут полной выработки уже запущенных на исполнение задач, новые используются для всех вновь поступивших.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;В качестве простого решения можно попробовать увеличить размер perm’а. Логически можно предположить, что увеличивать размер perm’а более чем в два раза сейчас не нужно, т.к. один полный набор классов в текущий момент влазит в выделенную для него память.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;Если не поможет – нужно смотреть лог сборки мусора, производится ли она в указанной области, с какими результатами.&lt;/blockquote&gt;Да, я согласен, что проблема описанная мной в заметке – &lt;a href=&quot;http://tech.intr13.ru/2008/12/outofmemoryerror.html&quot; target=&quot;_blank&quot;&gt;OutOfMemoryError&lt;/a&gt;, на самом деле намного глубже и серьезнее. Но ведь не всегда требуется глубокий анализ для решения проблемы, иногда банально не хватает времени:)&lt;br /&gt;&lt;br /&gt;p/s&lt;br /&gt;Спасибо &lt;a href=&quot;http://forum.vingrad.ru/users/Shurr&quot; target=&quot;_blank&quot;&gt;Shurr&lt;/a&gt;&amp;nbsp;за более глубокое разъяснение проблемы:)</description><link>http://tech.intr13.ru/2008/12/outofmemoryerror2.html</link><author>noreply@blogger.com (intr13)</author></item></channel></rss>