<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2928069500105440659</id><updated>2012-01-19T12:41:50.672-08:00</updated><category term='поезія'/><category term='music'/><category term='tools'/><category term='javascript'/><category term='спорт'/><category term='java'/><category term='python'/><category term='process'/><category term='books'/><category term='Linux'/><category term='programming'/><category term='presentations'/><title type='text'>Вести из киберпространства</title><subtitle type='html'>Аз есмь программеръ.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-8658254080912479470</id><published>2012-01-09T08:30:00.000-08:00</published><updated>2012-01-09T08:40:10.553-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='поезія'/><title type='text'>Він був листоношею в  Амстердамі</title><content type='html'>&lt;iframe width="480" height="360" src="http://www.youtube.com/embed/JicjkRNKMnM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-8658254080912479470?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/8658254080912479470/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=8658254080912479470' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8658254080912479470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8658254080912479470'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2012/01/blog-post.html' title='Він був листоношею в  Амстердамі'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/JicjkRNKMnM/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-8126130620071318659</id><published>2011-12-18T14:49:00.000-08:00</published><updated>2012-01-01T13:34:57.061-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Как радио Шансон меня достало  и что из этого получилось</title><content type='html'>Я часто пользуюсь такси, и почти всегда в машине играет радио. Вот вчера едем, водитель слушает радио шансон, какой-то пропито-прокуренный голос исполняет незатейливую песню про жизнь урки (или орка), можно назвать этот жанр "Оркские народные песни", да простит меня профессор Толкиен который не мог подумать что орки и гоблины не только сочиняют и поют песни, но  даже имеют собственную радиостанцию которая круглосуточно вещает из Мордора. &lt;br /&gt;&lt;br /&gt; Я вежливо попросил убрать шансон, таксист переключил на другую волну. Мне от этого не стало легче, потому что то что я услышал по радио было не намного лучше шансона, новости гламура :) Но не все так плохо, нашел в интернете чудесный &lt;a href="http://internet-radio.org.ua/ru/ur1_ukraine"&gt;ресурс&lt;/a&gt;, жаль что в такси про него не знают. &lt;br /&gt;&lt;br /&gt;Итак, решил разобраться как создавать интернет-радио. Выяснил что для Linux уже есть готовый солюшен, называется icecast2. Установил на свой Ubuntu сервер пакет icecast2, но этого оказалось не достаточно. Надо поставить еще один пакет, называется ices2. Ices2 служит источником данных для icecast2. Icecast2 может транслировать звук из разных источников, например,  изаудио-файлов на диске, также можно подключить микрофон к компьютеру, тогда icecast2 будет передавать звук из микрофона.&lt;br /&gt;&lt;br /&gt;Создаем конфиг файл /etc/ices.xml из шаблона /usr/share/doc/ices2/examples/ices-playlist.xml. Теперь нужно указать где лежит папка с файлами в формате ogg которые будут проигрываться на нашем радио. Добавляем в /etc/ices.xml элемент:&lt;br /&gt;&lt;p style="font-style:italic"&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;input&amp;gt;&lt;br /&gt; &amp;lt;module&amp;gt;playlist&amp;lt;/module&amp;gt;&lt;br /&gt; &amp;lt;param name="type"&amp;gt;basic&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="file"&amp;gt;/var/music/playlist.txt&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="random"&amp;gt;1&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="restart-after-reread"&amp;gt;0&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="once"&amp;gt;0&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;/input&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Теперь ices2 будет отдавать на сервер iceсast2 файлы которые перечислены в текстовом файле /var/music/playlist.txt. Теперь возникает вопрос: а кто же будет заполнять это файл ? Я решил что будет папка в которой я буду выкладывать аудио файлы, /var/music.  Теперь надо написать скрипт который генерит плейлист из содержимого папки /var/music:&lt;br /&gt;&lt;p style="font-style:italic;"&gt;&lt;br /&gt;/usr/local/bin/update-playlist.sh&lt;br /&gt;#!/bin/bash&lt;br /&gt;find /var/music -name '*ogg'  &amp;gt; /var/music/playlist.txt&lt;br /&gt;chmod g+r -R /var/music&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Дальше нужно сделать чтобы ices2 стартовал как сервис Unix. Пишем скрипт&lt;br /&gt;&lt;p style="font-style:italic;"&gt;&lt;br /&gt;/etc/init.d/ices&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;PIDFILE=/var/run/ices/ices.pid&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;echo "Starting ices"&lt;br /&gt;start-stop-daemon  -b -c icecast2 -m -p $PIDFILE --exec /usr/bin/ices2 -S /etc/ices.xml&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;echo "Stopping ices"&lt;br /&gt;start-stop-daemon -p $PIDFILE -K&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "Usage: /etc/init.d/ices {start|stop}"&lt;br /&gt;exit 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Генерим плейлист:&lt;br /&gt;&lt;p style="font-style: italic;"&gt;generate-playlist.sh&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Теперь включаем сервис ices2:&lt;br /&gt;&lt;p style="font-style:italic;"&gt;&lt;br /&gt;sudo update-rc.d ices defaults&lt;br /&gt;sudo service ices start&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Все, можно слушать радио.&lt;br /&gt;&lt;br /&gt;Пока я возился с радио, сделал удивительное открытие: оказалось что формат MP3 не лучший выбор для хранения музыки, формат OGG намного лучше передает звук, особенно на высоких частотах. Ices2 не поддерживает MP3, зато поддерживает OGG, и слава богу. Я сравнил как звучит MP3 и OGG на одинаковом битрейте 192 Кb/s, оказалось что OGG намного ближе к оригиналу.&lt;br /&gt;Есть плейер который умеет играть OGG стрим, называется &lt;a href="http://ffmp3.sourceforge.net/"&gt;ffmp3&lt;/a&gt;, его можно легко встроить в блог.&lt;br /&gt;&lt;br /&gt;В заключение публикую редкое видео - как работает радио шансон, взгляд изнутри :)&lt;br /&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/p1dKKqgVMTs" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-8126130620071318659?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/8126130620071318659/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=8126130620071318659' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8126130620071318659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8126130620071318659'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/12/blog-post_18.html' title='Как радио Шансон меня достало  и что из этого получилось'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/p1dKKqgVMTs/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-8621939731266580296</id><published>2011-12-08T14:27:00.000-08:00</published><updated>2011-12-08T14:41:11.796-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='спорт'/><title type='text'>Плаваем не напрягаясь</title><content type='html'>&lt;p&gt;&lt;br /&gt;Недавно я обнаружил что можно плавать не напрягаясь как угодно долго. Эта техника называется total immersion, смотрим видео. Делаем только один удар ногой на один гребок рукой, и большую часть времени тело просто скользит по воде.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;iframe width="480" height="360" src="http://www.youtube.com/embed/rJpFVvho0o4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-8621939731266580296?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/8621939731266580296/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=8621939731266580296' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8621939731266580296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8621939731266580296'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/12/blog-post.html' title='Плаваем не напрягаясь'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/rJpFVvho0o4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-7602801607904018300</id><published>2011-11-10T13:11:00.000-08:00</published><updated>2011-11-10T13:20:44.126-08:00</updated><title type='text'>Gnome 3, Unity  - катастрофа на десктопе</title><content type='html'>Прошел почти месяц как я обновил свой Убунту до версии 11.10. То что творится у меня на десктопе это катастрофа. Я много лет использовал Gnome 2, не было никаких проблем. Теперь Canonical навязывает мне уродливые и глючные Gnome 3 и Unity. Я не понимаю зачем вообще нужен Gnome 3, лучше бы девелоперы применили энергию в мирных целях. Твердо решил снести  Ubuntu и попробовать Mint.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-7602801607904018300?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/7602801607904018300/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=7602801607904018300' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7602801607904018300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7602801607904018300'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/11/gnome-3-unity.html' title='Gnome 3, Unity  - катастрофа на десктопе'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-5945651884346272650</id><published>2011-10-29T13:29:00.000-07:00</published><updated>2011-10-29T13:55:52.368-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>JavaScript MVC: идея Ruby on Rails живет и побеждает</title><content type='html'>В последнее время пришлось работать с языком JavaScript. За 10 лет я не писал на JavaScript, но в последний год  пришлось его изучить и даже полюбить. Первым делом прочитал книгу "JavaScript, the good parts". Автор утверждает что JavaScript самый распространенный и самый малоизученный язык программирования, наверное это так. Потом прочитал книгу "jQuery in Action", и вдруг пришло понимание что на JavaScript действительно  можно писать легко и красиво, и все же были сомнения как поддерживать JavaScript код если нету тестов. Я думал что единственный способ тестирования это Selenium, но оказалось что все интереснее. На прошлой неделе я нашел &lt;a href="http://javascriptmvc.com/"&gt;JavaScript MVC&lt;/a&gt; и понял что это то что надо. JavaScript MVC очень похож на Ruby on Rails, Grails и Django, только он написан на JavaScript. Контроллер в отличие от RoR находится не на веб сервере а на клиенте и реализован на JavaScript, view тоже. Сервером может быть все что угодно, лишь бы оно поддерживало json и REST.  А самое приятное это возможность писать фунциональные тесты которые выполняются в браузере или движке javascript, например rhino. Итак, можно быстро писать на JavaScript код который покрывается тестами и легко поддерживается.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-5945651884346272650?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/5945651884346272650/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=5945651884346272650' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5945651884346272650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5945651884346272650'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/10/javascript-mvc-ruby-on-rails.html' title='JavaScript MVC: идея Ruby on Rails живет и побеждает'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-7845065083295894953</id><published>2011-06-03T09:44:00.000-07:00</published><updated>2011-06-03T10:02:24.558-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><title type='text'>Моя презентация на Ciklum Software Architecture Practice Leaders Group</title><content type='html'>Выкладываю мое первое публичное выступление на тему Distributed Version Control. &lt;br /&gt;&lt;br /&gt;Часть 1&lt;br /&gt;&lt;iframe width="600" height="500" src="http://www.youtube.com/embed/q8Z7luocF1A" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Часть 2&lt;br /&gt;&lt;iframe width="600" height="500" src="http://www.youtube.com/embed/1oNQTgIAw8s" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-7845065083295894953?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/7845065083295894953/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=7845065083295894953' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7845065083295894953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7845065083295894953'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/06/ciklum-software-arechitecture-practice.html' title='Моя презентация на Ciklum Software Architecture Practice Leaders Group'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/q8Z7luocF1A/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-8686686935168786593</id><published>2011-05-17T12:22:00.000-07:00</published><updated>2011-05-17T12:34:47.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Angelic Upstarts - Solidarity</title><content type='html'>Удивительно красивая музыка и слова.&lt;br /&gt;&lt;br /&gt;&lt;iframe width="480" height="340" src="http://www.youtube.com/embed/owrVQebWCtc" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-8686686935168786593?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/8686686935168786593/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=8686686935168786593' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8686686935168786593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8686686935168786593'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/05/angelic-upstarts.html' title='Angelic Upstarts - Solidarity'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/owrVQebWCtc/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-2983380778105235757</id><published>2011-05-03T02:08:00.001-07:00</published><updated>2011-05-03T02:38:15.482-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>DCVS is becoming mainstream</title><content type='html'>For the last two years I have been observing how popularity of distributed version control systems is increasing. Now is the time to admit that distributed version control systems are not exotic animals anymore,  and more and more people realize advantages of DCVS.  In a recent year when interviewing job seekers for Java developer's position  I noticed growing number of  candidates who tell that they use a DCVS at work. When I was looking for a  job I've been interviewed several times,  and I always asked my interviewers which VCS they use. Big companies use a kind of centralized version control, but many small and mid-sized companies have switched or are switching to a DCVS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-2983380778105235757?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/2983380778105235757/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=2983380778105235757' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2983380778105235757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2983380778105235757'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/05/dcvs-is-becoming-mainstream.html' title='DCVS is becoming mainstream'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-8915197542771254193</id><published>2011-04-30T01:21:00.001-07:00</published><updated>2011-05-03T02:51:36.511-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Ubuntu 11.04 - неприятно удивлен</title><content type='html'>Вчера обновил Ubuntu до версии 11.04 и сразу же пожалел об этом. Вместо Gnome теперь будет Unity. Unity выглядит ужасно, к тому же еще и глючит не по детски. Спасением стала возможность выбрать "Ubuntu Classic"  сессию, то есть Gnome.&lt;br /&gt;Я считаю что Canonical сделала большую ошибку. Возможно прийдется менять дистрибутив Linux на другой, а этого не хотелось бы делать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-8915197542771254193?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/8915197542771254193/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=8915197542771254193' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8915197542771254193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8915197542771254193'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/04/ubuntu-1104.html' title='Ubuntu 11.04 - неприятно удивлен'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-5244835468587710558</id><published>2011-04-03T06:46:00.000-07:00</published><updated>2011-04-03T11:24:55.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>My 6 tips  for designing Java-based solutions</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Database choice&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The common mistake is to use MySQL in areas where PostgreSQL is a better choice. I mean enterprise applications with hundreds of tables and  complicated normalized database structure used by intra-net users. I think it happens because MySQL is easier to set up and administrate, and more people familiar with it. While using MySQL is the right choice for high-load apps with denormalized database structure, and for projects with simple database structure, MySQL's query planner is not as good as PostgreSQL at the moment of writing this article. In addition, PostgreSQL has much stronger support for stored procedures, it implements wider set of ANSI SQL standard than MySQL. Nowadays almost every enterprise-application needs  GIS functionality, and Postgresql has GIS support. Another advantage of PostgreSQL is that its date/time types include timezone information, and that will save you a lot of time by avoiding conversions from one timezone to another if you have users who operate in different timezones, for example, schedule service. I am not saying that it is impossible to use MySQL in this area, it is certainly possible, but the cost of development would be higher. If you need to import large bulks of data,it is likely that you will have to use stored procedures to import data in a reasonable time frame, and stored procedures in PostgreSQL exist for decades while MySQL adopted them 1 year ago.&lt;br /&gt;&lt;br /&gt;Of course, it is possible to write a query which will be executing very slow on PostgreSQL, but in general, the chances to produce a good query plan are higher when using PostgreSQL, particularly for sub-queries.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web framework choice&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ironically, in many cases  decision to use Java  for web development is a mistake.  There are two cases here. Case 1, we can avoid using Java language, but still use Java platform, for example, with Grails. Case 2, we can avoid using Java platform at all, and use Apache plus some scripting language like PHP, Python or Ruby. My favorite is Python.&lt;br /&gt;&lt;br /&gt;The problem with Java language for web is long development cycle. For example, when you add a method or variable to a Spring MVC controller, you have to re-compile the re-start web server.  People who use scripting languages like PHP, Python or Groovy just save file on the disk and refresh the page, and that is much faster. So I suggest considering implementing web layer in Django, Ruby on Rails or Grails, and that can speed up web development  from 2 to 5 times.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Templating&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's assume that you decided to use Java for web developement. My advice is : avoid using JSP in any form, including JSTL!  I suggest using &lt;a href="http://freemarker.sourceforge.net/"&gt;FreeMarker&lt;/a&gt; which is a fantastic templating engine with clear and elegant syntax. Velocity is also a good choice.  If your system sends emails, then use FreeMarker or Velocity for message body.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Often people write classes which provide access to applications configuration. It is better to spend that time on something useful because &lt;a href="http://commons.apache.org/configuration"&gt;commons configuration&lt;/a&gt; is an excellent library for configuring your application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you have functional tests, then  &lt;a href="http://testng.org/"&gt;TestNG&lt;/a&gt; is a better choice than JUnit. Functional tests are scenarios which are executed in an environment which is close to production environment, I mean real database, JMS server, probably mail server. For functional tests you will want to control the order of execution, for example, first you call your public API to enter some information into the system, then  call API to update it, then call API to remove it. The order of operations is clear: first create, then update, then remove. In TestNG you can define the order with annotations.  Of course, you can use JUnit, but TestNG is a more elegant solution for functional tests.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Temporal types&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When designing API avoid using java.util.Calendar, use &lt;a href="http://joda-time.sourceforge.net/"&gt;Joda Time&lt;/a&gt; instead.  It will save you the time you would spend on writing unnecessary code for timezones, periods, intervals,  time calculations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-5244835468587710558?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/5244835468587710558/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=5244835468587710558' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5244835468587710558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5244835468587710558'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/04/6-tips-for-designing-java-based.html' title='My 6 tips  for designing Java-based solutions'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6416066040768606687</id><published>2011-03-18T17:38:00.000-07:00</published><updated>2011-03-18T17:44:07.735-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Layla - Eric Clapton</title><content type='html'>Прекрасная аранжировка для акустической гитары.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="600" height="390" src="http://www.youtube.com/embed/3jf2FmmdmK4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6416066040768606687?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6416066040768606687/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6416066040768606687' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6416066040768606687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6416066040768606687'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2011/03/layla-eric-clapton.html' title='Layla - Eric Clapton'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/3jf2FmmdmK4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-2762105401896365142</id><published>2010-11-02T13:51:00.000-07:00</published><updated>2010-11-02T13:58:15.104-07:00</updated><title type='text'>PostgreSQL 9.0 is out</title><content type='html'>Наконец вышла долгожданная &lt;a href="http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.0"&gt;девятая версия PostgreSQL &lt;/a&gt; !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-2762105401896365142?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/2762105401896365142/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=2762105401896365142' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2762105401896365142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2762105401896365142'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/11/postgresql-90-is-out.html' title='PostgreSQL 9.0 is out'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-1399914095105129495</id><published>2010-10-05T12:31:00.000-07:00</published><updated>2010-10-05T12:41:56.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Книга: Enterprise Software Without the BS</title><content type='html'>&lt;div align="right"&gt;&lt;i&gt;Что за бойкое перо! Господи Боже! как пишет этот человек!&lt;/i&gt;&lt;/div&gt; &lt;br /&gt;&lt;div align="right"&gt;&lt;i&gt;Н.В. Гоголь, Миргород&lt;/i&gt;&lt;/div&gt; &lt;br /&gt;&lt;br /&gt;Прочитал на одном дыхании &lt;a href="http://myflex.org/yf/ESnoBS.pdf"&gt;книгу&lt;/a&gt; широко известного в узких кругах специалистов по Java и Adobe Flex Якова Файна. Это книга больше про жизнь, чем про софтвер. Как наниматься на работу и как правильно уйти из компании, что нужно говорить и о чем лучше молчать, как строить карьеру - обо всем этом поведал автор c присущим ему чувством юмора.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-1399914095105129495?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/1399914095105129495/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=1399914095105129495' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/1399914095105129495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/1399914095105129495'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/10/enterprise-software-without-bs.html' title='Книга: Enterprise Software Without the BS'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-4734990676140956010</id><published>2010-10-04T03:09:00.000-07:00</published><updated>2010-10-04T03:18:08.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Мартин Фаулер жжот</title><content type='html'>Я всегда читаю Мартина Фаулера с удовольствием, вот нашел его &lt;a href="http://martinfowler.com/bliki/VersionControlTools.html"&gt;статью &lt;/a&gt;о системах контроля версий. Рекомендую всем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-4734990676140956010?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/4734990676140956010/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=4734990676140956010' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4734990676140956010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4734990676140956010'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/10/blog-post.html' title='Мартин Фаулер жжот'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6789054482207642380</id><published>2010-09-23T10:37:00.000-07:00</published><updated>2010-09-25T12:01:20.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Build Adobe Flex projects with Apache Maven and Groovy</title><content type='html'>I have released the &lt;a href="https://code.google.com/p/gmaven-flex"&gt;first version&lt;/a&gt; of GMF. GMF stands for Groovy Maven Flex. This is an Apache Maven plugin to build Adobe Flex projects. I developed it for my needs, hoping that someone will find it useful. Why to develop another plugin when there are already 2 or 3 available ? While working on Flex projects, I felt that using Flex SDK as Maven dependency is not handy. I have also found that using external swc libraries with Maven is also not handy, because most of them are not available in public Maven repositories.&lt;br /&gt;I think that people should not write Maven plugins in Java, because Groovy fits better for small projects. Another reason is that I don't think that we have to use XML to configure Maven plugins. So I have implemented GMF in Groovy, and it is configured with a Groovy-based domain-specific language. Finally, I discovered that Plexus which is dependency-injection container in Maven is very out-of-date compared to modern DI containers, so I used Guice instead of Plexus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6789054482207642380?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6789054482207642380/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6789054482207642380' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6789054482207642380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6789054482207642380'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/09/build-adobe-flex-projects-with-apache.html' title='Build Adobe Flex projects with Apache Maven and Groovy'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-416407416450068192</id><published>2010-09-21T14:27:00.000-07:00</published><updated>2010-09-25T12:03:57.678-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Tagging successful builds  with Mercurial</title><content type='html'>I have shared &lt;a href="https://bitbucket.org/sgr/hg-tag/src/tip/tag_this_repository.py"&gt;a script&lt;/a&gt; which tags successful builds. &lt;br /&gt;&lt;br /&gt;This is configuration for Hudson:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_unqJcEiu7BE/TJklLd5mHGI/AAAAAAAACqE/MvMO2Za4bYQ/s1600/Screenshot-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 166px;" src="http://3.bp.blogspot.com/_unqJcEiu7BE/TJklLd5mHGI/AAAAAAAACqE/MvMO2Za4bYQ/s400/Screenshot-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5519483697254243426" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-416407416450068192?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/416407416450068192/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=416407416450068192' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/416407416450068192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/416407416450068192'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/09/tagging-successful-builds-on-ci-server.html' title='Tagging successful builds  with Mercurial'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_unqJcEiu7BE/TJklLd5mHGI/AAAAAAAACqE/MvMO2Za4bYQ/s72-c/Screenshot-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-1531251085345794967</id><published>2010-09-14T09:08:00.000-07:00</published><updated>2010-09-14T09:20:00.834-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Apache Maven  - взгляд изнутри</title><content type='html'>Хочу поделиться опытом написания  плагина для Apache Maven. Хотя 99 процентов плагинов написаны на java, я убедился что лучше писать плагины для Maven на языке Groovy. Так получается быстрее и меньше кода. Второе открытие - Maven использует устаревший и неуклюжий dependency injection container который называется Plexus. Работать с ним можно, но противно. Поэтому я отказался от Plexus и использовал Guice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-1531251085345794967?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/1531251085345794967/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=1531251085345794967' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/1531251085345794967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/1531251085345794967'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/09/apache-maven.html' title='Apache Maven  - взгляд изнутри'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-2228196331424383443</id><published>2010-08-24T11:11:00.000-07:00</published><updated>2010-08-24T11:30:05.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>В поисках e-mail клиента для Linux</title><content type='html'>Наконец, я нашел себе e-mail клиент по душе. За 10 лет пробовал их много, Pine, Evolution, Thunderbird, KMail... Но вот недавно установил &lt;a href="http://www.claws-mail.org/"&gt;Claws Mail&lt;/a&gt; и эта програмулина мне очень понравилась. Доступ по IMAP в Сlaws Mail реализован лучше, чем у других клиентов, интуитивно понятный и удобный интерфейс , работает очень шустро. Отлично конектится к GMail.&lt;br /&gt;Да и это не удивительно, потому что Сlaws Mail очень похож на лучший email client всех времен и народов - &lt;a href="http://www.ritlabs.com/en/products/thebat/"&gt;The Bat&lt;/a&gt;. Мне удалось запустить The Bat под wine, но все-таки отдал предпочтение Сlaws Mail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-2228196331424383443?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/2228196331424383443/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=2228196331424383443' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2228196331424383443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2228196331424383443'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/08/e-mail-linux.html' title='В поисках e-mail клиента для Linux'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-995170112099016998</id><published>2010-08-14T14:14:00.000-07:00</published><updated>2010-08-14T14:19:33.272-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Книги В.В. Ершова</title><content type='html'>Открыл для себя замечательного писателя - &lt;a href="http://lib.ru/MEMUARY/ERSHOW_W"&gt;ходи сюда&lt;/a&gt;.&lt;br /&gt;В.В. Ершов - русский Экзюпери.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-995170112099016998?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/995170112099016998/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=995170112099016998' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/995170112099016998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/995170112099016998'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/08/blog-post.html' title='Книги В.В. Ершова'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-5542758059427448529</id><published>2010-08-08T07:31:00.000-07:00</published><updated>2010-08-08T15:18:13.894-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Что такое  NIO и как с ним бороться</title><content type='html'>Коротко физику природного явления NIO  можно выразить формулой:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/New_I/O"&gt;&lt;span style="font-weight:bold;"&gt;NIO&lt;/span&gt;&lt;/a&gt; = &lt;a href="http://download.oracle.com/javase/tutorial/essential/io/"&gt;&lt;span style="font-weight:bold;"&gt;IO&lt;/span&gt;&lt;/a&gt; + &lt;a href="http://linux.die.net/man/2/select"&gt;&lt;span style="font-weight:bold;"&gt;select&lt;/span&gt;&lt;/a&gt; + &lt;span style="font-weight:bold;"&gt;E&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Кликните в браузере поочередно на первые три переменные. Четвертая переменная, &lt;span style="font-weight:bold;"&gt;E&lt;/span&gt;, является энергией еквивалентной усилиям потраченным на  синхронизацию между selecting thread и worker thread, а также протокол обмена в не-блокирующем режиме, в том числе учитывая дефрагментацию TCP пакетов.&lt;br /&gt;&lt;br /&gt;Мне нужно было написать простой java server который принимает сообщения от Adobe Flash Player по протоколу XmlSocket. Задача выглядела очень простой - получай запросы и отсылай ответы, поэтому решил не прикручивать готовый application server типа томката, а написать свой маленький сервер. За день я сделал реализацию на блокирующих сокетах. Дальше решил сделать эксперимент и переписать на не-блокирующих сокетах, тоесть NIO. &lt;br /&gt;&lt;br /&gt;Оказалось что c NIO все намного сложнее, сразу стало ясно что &lt;span style="font-weight:bold;"&gt;Е&lt;/span&gt; совсем не маленькая величина. Остановился на самоой простой реализации с единственным selecting thread, это заняло в два раза больше времени чем блокирующие сокеты. Последняя стадия эксперимента: безжалостно убил материализцию темной енергии &lt;span style="font-weight:bold;"&gt;Е&lt;/span&gt; в коде и  и использовал &lt;a href="http://mina.apache.org/"&gt;Apache Mina&lt;/a&gt;. И тут я понял насколько полезна Mina для написания распределенных систем, и что нет смысла реализовывать взамодействие между частями системы  на сокетах с нуля. Mina создает уровень абстракции  который сводит  &lt;span style="font-weight:bold;"&gt;E&lt;/span&gt;  к минимуму. После того как прикрутил Mina, количество кода уменьшилось в три раза: было 6 классов, осталось 2.&lt;br /&gt;&lt;br /&gt;Поэтому, если надо работать с сокетами, то лучше делать это используя Mina, это будет быстрее и надежнее.&lt;br /&gt;&lt;br /&gt;Вот пример Mina сервиса на Groovy: &lt;br /&gt;&lt;br /&gt;&lt;iframe  src="https://docs.google.com/document/pub?id=1vf3GsG5ByS4PuK6W-wIZHf6SN-x6AI5oTTvSvUAy22g&amp;amp;embedded=true"  style="width:100%;height:510px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-5542758059427448529?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/5542758059427448529/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=5542758059427448529' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5542758059427448529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5542758059427448529'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/08/nio.html' title='Что такое  NIO и как с ним бороться'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-1273488574505683078</id><published>2010-07-11T15:54:00.000-07:00</published><updated>2010-07-13T04:14:30.765-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Гитарные гуру</title><content type='html'>Что это я все о работе да о работе. &lt;a href="http://grigorievs.blogspot.com/2008/08/blog-post.html"&gt;Давно&lt;/a&gt; не писал о музыке. Представляю вашему вниманию троих гитарных гуру.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4jx-G6WTr_w&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/4jx-G6WTr_w&amp;amp;hl=en_US&amp;amp;fs=1" width="425" height="344" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jLFjp-r_fVU&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/jLFjp-r_fVU&amp;amp;hl=en_US&amp;amp;fs=1" width="480" height="295" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object style="background-image:url(http://i3.ytimg.com/vi/FHamXAgYabQ/hqdefault.jpg)"  width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FHamXAgYabQ&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/FHamXAgYabQ&amp;amp;hl=en_US&amp;amp;fs=1" width="425" height="344" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-1273488574505683078?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/1273488574505683078/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=1273488574505683078' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/1273488574505683078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/1273488574505683078'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/07/blog-post_11.html' title='Гитарные гуру'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-5808310312054669718</id><published>2010-07-10T12:25:00.000-07:00</published><updated>2010-07-10T13:30:33.633-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><title type='text'>Самодокументируемый код - миф или реальность ?</title><content type='html'>Для каждого проекта важно иметь документацию. Существует два уровня документации. &lt;br /&gt;Уровень первый или базовый уровень - это комментарии в коде. Также существует документация в виде Wiki, это-следующий уровень. Есть люди которые убеждены что самодокументируемый код не нуждается в комментариях. Идея самодокументируемого кода в том чтобы давать названия переменным и функциям таким образом, чтобы при взгляде на код было понятно как он работает, то есть комментарии как бы не нужны. На своем опыте я убедился что эта идея не работает. Комментарии обязательно нужны. В чем-то защитники самодокументируемого кода правы - автор кода может понять как работает его код. Но другой человек все равно не поймет. Не поймет потому что самодокументируемый код может дать ответ как этот кусок работает. но не даст ответ зачем чем этот кусок был написан, какие ограничения на параметры, поэтому полной картины в голове не будет. Должен быть самодокументируемый код плюс комментарии к нему :)&lt;br /&gt;&lt;br /&gt;Написание комментариев - это избыточное действие. От программиста требуется некоторое дополнительное усилие чтобы написать комментарии. Поддержку документации в Wiki можно считать сверхусилием. Ведь документация пишется не для себя, она для коллег. Поэтому если человек не хочет или не способен к малому усилию - написанию качественных комментариев, то не стоит ожидать что он будет тратить свое время на написание или поддержку других форм документации. &lt;br /&gt;&lt;br /&gt;Поэтому проверка наличия комментариев должна  быть частью code review. Если нет комментариев значит, на этапе code review код должен быть забракован.&lt;br /&gt;&lt;br /&gt;Кстати, по тому как программисты пишут комментарии можно определить отношение к работе. Мой опыт подтверждает что люди которые не хотят писать комментарии и агрессивно доказывающие что самодокументируемый код рулит, не являются командными игроками, и наоборот, тот кто пишет комменты работает в первую очередь на команду. Поэтому на собеседовании я спрашиваю как кандидат относится к написанию комментариев.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-5808310312054669718?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/5808310312054669718/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=5808310312054669718' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5808310312054669718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5808310312054669718'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/07/blog-post.html' title='Самодокументируемый код - миф или реальность ?'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-5146283891233274693</id><published>2010-07-09T10:11:00.000-07:00</published><updated>2010-07-10T08:48:14.014-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Линукс, Open Source и патриотизм</title><content type='html'>Три года назад на мероприятии организованном компанией Sun в Киеве выступали докладчики из Китая. В перерыве я подошел к одному  китайцу и спросил, правда ли что в Китае существует государственная ОС, называется Red Flag ? Китайский специалист подтвердил что у них закон обязывает использовать Red Flag Linux в государственных учреждениях. В России тоже &lt;a href="http://habrahabr.ru/blogs/linux/98527"&gt;занимаются созданием национальной OC&lt;/a&gt;. Нужна ли национальная ОС государству ? Я считаю что национальная ОС необходима, потому что это гарантия суверенитета государства, такая же как и вооруженные силы. Стратегия развития государственных компьютерных сетей должна основываться на использовании государственной ОС и open source software. Почему я так считаю ? Допустим, у государства XXX все компьютеры работают под ОС W, все программное обеспечение в министерстве образования, министерстве обороны написано под W. В один прекрасный момент фирма-производитель OC W, назовем ее M, говорит что у нас уже вышла новая версия W, поддержка старой версии заканчивается через 3 года. Государство уже подсело на иглу W и через 3 года будет вынуждено заплатить M сумму денег чтобы проапгрейдить W. Далее, Государственная Налоговая Инспекция использует формат файла .PUK, который является закрытым форматом и принадлежит компании M. то есть государство попадает на деньги по схеме vendor lock-in. Значит государство будет покупать  X-Office у компании M. за бюджетные. тоесть наши с тобой, читатель, денежки. Это еще цветочки. Давайте представим что у государства XXX возник конфликт с государством в котором находится компания М, назовем его YYY. До столкновения вооруженных сил пока что дело не дошло, стороны используют не боевые методы, а именно, каждый день производятся атаки на сервера. Через некоторое время все компьютеры в государстве XXX перестают работать, хакеры из министерства обороны YYY нашли уязвимость в ОС W. Возникает совершенно дикая ситуация, теперь министерство обороны страны XXX обращается в компанию M с просьбой чтобы уязвимость в OC W была устранена. Но компания M находится в государстве YYY, то есть в стране противника. В результате компьютерные системы страны XXX выведены из строя, деятельность госучреждений парализована, информация о конфликте в интернете представлена исключительно с точки зрения YYY. Все, война проиграна. Вот к каким ужасным последствиям может привести отсутствие национальной ОС. Война в киберпространстве &lt;a href="http://www.compromat.ru/page_23174.htm"&gt;уже стала реальностью&lt;/a&gt;. О современных специальных операциях как форме геополитического противоборства можно почитать &lt;a href="http://militera.lib.ru/science/kvachkov_vv/03.html"&gt;тут&lt;/a&gt;, очень познавательно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-5146283891233274693?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/5146283891233274693/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=5146283891233274693' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5146283891233274693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5146283891233274693'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/07/open-source.html' title='Линукс, Open Source и патриотизм'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-2805873431696103142</id><published>2010-05-19T11:55:00.000-07:00</published><updated>2010-05-19T12:18:04.285-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Хто сломал билд ?!</title><content type='html'>Иногда бывает что автор коммита который поломал билд не доступен, например, заболел, и  вам нужно определить почему завалился билд. Как же это сделать если вы ничего не знаете о подсистеме в которой завалился тест ? Можно использовать метод бинарного поиска.&lt;br /&gt;&lt;br /&gt;В Subversion есть команда svn-bisect из пакета subversion-tools, инсталируется так:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; sudo apt-get install subversion-tools&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Счастливые пользователи Hg или Git используют hg bisect и git bisect.&lt;br /&gt;&lt;br /&gt;Выражаю соболезнования пользователям CVS, бинарный поиск не работает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-2805873431696103142?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/2805873431696103142/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=2805873431696103142' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2805873431696103142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2805873431696103142'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/05/blog-post.html' title='Хто сломал билд ?!'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-3895364585734911920</id><published>2010-05-03T23:14:00.000-07:00</published><updated>2010-05-19T12:26:25.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>from CVS to Hg</title><content type='html'>Два месяца назад наша компания отказалась от CVS и перешла на Mercurial.&lt;br /&gt;Давно было понятно что продолжать использовать CVS не имеет смысла. Как жестко сказал Linus Torvalds "If you like using СVS, you should be in some kind of mental institution or somewhere else". Было два варианта: Subversion или DCVS. Провели анализ, оказалось что действительно cовременные DCVS такие как Mercurial или Git превосходят Subversion, особенно в branching и merging. В некоторых экзотических случаях Subversion лучше подходит, например если нужно делать sparse checkouts потому что размер репозитория настолько огромен что он не помещается на диске, или если нужно скрыть папки от одних юзеров и наоборот, дать доступ другим юзерам. На практике такое случается редко, у нас размер CVS репозитория был 800 Mb, понятно что sparse checkouts никому не нужны. Дальше, у нас кросс-функциональная команда, каждый девелопер имеет право записи в любую папку,поэтому вторая мега-фича Subversion - ограничение доступа тоже для нас не актуальна. Зато для нас очень важно иметь хороший branching и merging, а здесь DCVS рулят.&lt;br /&gt;&lt;br /&gt;Еще один важный момент, интеграция VCS с другими тулзами. Есть Mercurial плагин для Eclipse, он работает медленно при апдейтах на больших проектах (35 000+ файлов). Поэтому лучше использовать черепаху для коммитов и апдейтов, а Mercurial плагин юзать для просмотра истории изменений файла или аннотации. CruiseControl и Hudson интегрируются отлично. Сode Review&lt;a href="http://www.reviewboard.org/"&gt; tool&lt;/a&gt;  тоже поддерживает Mercurial.  Интеграция с JIRA есть,  но для нас не имеет значения, потому что Mercurial имеет команду поиска , и если надо найти коммиты по номеру тикета то это всегда можно сделать через веб морду или с командной строки.&lt;br /&gt;&lt;br /&gt;При конверсии репозитория СVS в HG главная ветка (head) сконвертилась нормально, остальные 3 ветки сконвертировались не совсем правильно, пришлось их фиксить руками. Проблема с ветками в том, что в СVS невозможно определить время создания бранча, можно только определить время первого коммита в бранч. Поэтому после конверсии в бранчах не хватало файлов которые не были изменены в бранчах. Проблему решил так: после конверсии нашел старые СVS теги которые тегают код непосредственно перед созданием бранча и смерджил бранчи с этими тегами. После этого в бранчах появились все файлы.&lt;br /&gt;&lt;br /&gt;Затраты на миграцию. Вечером в конце рабочего дня мы закрыли СVS репозиторий на запись. На следующий день девелоперы потратили пол-дня чтобы настроить environment, после обеда пошли первые коммиты в новый репозиторий. Можно сказать что процесс прошел без потерь.  У некоторых девелоперов будет культурный шок, потому что они пытаются применить навыки работы с CVS которые не работают в HG, но после первых коммитов и мерджей это пройдет.&lt;br /&gt;&lt;br /&gt;HG дает возможность делать сode review до того как код попадет в сentral repository. Мы коммитим локально, создаем соde review topic на review board, только после того как коммит одобрен, мы пушим в сentral repository.  Такой подход трудно реализовать в Subversion, надо возиться с патчами, практически это не реально.&lt;br /&gt;&lt;br /&gt;Если вы используете СVS, то я бы советовал перейти на Git или Mercurial, ни в коем случае не Subversion.&lt;br /&gt;Если вы уже используете Subversion, то вопрос миграции не так актуален как с СVS. Если сильно хочется работать с DCVS, то можно не ждать пока компания перейдет на DCVS (мне пришлось ждать полтора года) и  использовать две системы одновременно, делать всю работу в DCVS а потом заливать результат в Subversion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-3895364585734911920?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/3895364585734911920/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=3895364585734911920' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3895364585734911920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3895364585734911920'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/05/from-cvs-to-hg.html' title='from CVS to Hg'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-2098353765058201561</id><published>2010-04-02T13:08:00.000-07:00</published><updated>2010-04-02T16:28:00.681-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>И все же TestNG лучше чем JUnit</title><content type='html'>Сегодня я скачал последнюю версию JUnit, а именно 4.8.1 и еще раз убедился что JUnit не догнал TestNG. Есть 4 причины почему TestNG лучше:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Parameterized tests &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;DataProviders в TestNG удобнее чем статические методы с аннотацией @Parameters в JUnit. Мне не нравится что JUnit требует чтобы метод, который создает параметры для теста, был статическим, также в TestNG есть возожность задавать параметры в файле.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Concurrent tests&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;В JUnit аннотация Test не позволяет  указать что тест должен высполняться в разных потоках одновременно.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dependency between tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В JUnit фича отсутствует.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Документация&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Сравните &lt;a href="http://junit.sourceforge.net/doc/cookbook/cookbook.htm"&gt;http://junit.sourceforge.net/doc/cookbook/cookbook.htm&lt;/a&gt; и &lt;a href="http://testng.org/documentation-main.html"&gt;http://testng.org/documentation-main.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-2098353765058201561?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/2098353765058201561/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=2098353765058201561' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2098353765058201561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2098353765058201561'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/04/testng-junit.html' title='И все же TestNG лучше чем JUnit'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6222070568267843479</id><published>2010-03-13T23:23:00.001-08:00</published><updated>2010-03-14T01:06:48.320-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Самый популярный != лучший</title><content type='html'>Не всегда самый популярная технология есть лучший выбор. Например, в мире Java самый популярный фреймворк для тестов был и есть JUnit. Но до четвертой версии JUnit'а c 2004 по 2006 год лучшим однозначно был другой фреймворк, а именно TestNG. Четвертый JUnit, кажется, догнал TestNG позаимствовав у него много идей, можно выразить это такой формулой: &lt;span style="font-weight: bold;"&gt;JUnit 4.x = TestNG + Junit 3.8&lt;/span&gt;  . TestNG как минимум не хуже JUnit, и я выбираю TestNG.&lt;br /&gt;&lt;br /&gt;Какая опен сорс база данных является самой популярной ? Правильно, MySQL.  Я никогда не буду использовать MySQL, только PostgreSQL. Мне не нужна база данных которая не может построить правильный план для запроса с subqueries.&lt;br /&gt;&lt;br /&gt;Какая самая популярная система контроля версий ? Конечно, это Subversion.  Я спрыгнул с Subversion на Mercurial в 2009 году   и ни разу об этом не пожалел, надеюсь, что  больше никогда не буду работать с Subversion.&lt;br /&gt;&lt;br /&gt;Самый популярный continuous integration server это CruiseControl. Я не понимаю как это случилось, потому что Hudson намного лучше.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6222070568267843479?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6222070568267843479/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6222070568267843479' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6222070568267843479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6222070568267843479'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/03/blog-post.html' title='Самый популярный != лучший'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6734567365512242560</id><published>2010-02-21T12:26:00.000-08:00</published><updated>2010-02-21T13:09:32.356-08:00</updated><title type='text'>Picture Driven Computing, Java и Python</title><content type='html'>Мне стало интересно какая ситуация в проекте  &lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt;,  когда я заглядывал на их сайт год назад он был скорее мертв, чем жив.  Но не все так плохо, проект ожил и развивается ! На cайте Jython вы можете увидеть ссылку на проект &lt;a class="reference external" href="http://groups.csail.mit.edu/uid/sikuli/"&gt;Sikuli&lt;/a&gt; который меня просто поразил.  Sikuli  применяет концепцию &lt;a href="http://web.mit.edu/newsoffice/2010/screen-shots-0120.html"&gt;Picture Driven Computing&lt;/a&gt;  для программирования скриптов.&lt;br /&gt;&lt;br /&gt;Допустим, нам нужно написать скрипт который реализует какой-то сценарий тестирования для GUI приложения под Windows. Традиционный подход - запустить тулзу которая записывает наши действия а потом воспризводит их посылая на GUI элементы такие события как клик мышью, перевод фокуса, ввод текста, нажатие на кнопку, выбор меню и т.д.  Чтобы правильно воспроизвести сценарий тулза запоминает координаты контролов, значения которые вы вводите в контролы,  последовательность операций.  Например , "кликнуть на пятую иконку в третьем ряду таблицы".  Вместо того чтобы запоминать позицию иконки, Sikuli использует распознавание образов, запоминает образ иконки которая была нажата, снимает скриншот  с экрана. Когда вы воспроизводите сценарий,  Sikuli найдет на окне иконку по ее образу и кликнет.&lt;br /&gt;&lt;br /&gt;Еще одна приятная новость - можно запускать Django на Jython! Можно использовать Django на платформе Java,  Django это отличный web framework, аналог  Ruby реализован на Питоне.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FxDOlhysFcM&amp;hl=en_US&amp;fs=1&amp;color1=0xe1600f&amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FxDOlhysFcM&amp;hl=en_US&amp;fs=1&amp;color1=0xe1600f&amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6734567365512242560?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6734567365512242560/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6734567365512242560' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6734567365512242560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6734567365512242560'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/02/picture-driven-computing-java-python.html' title='Picture Driven Computing, Java и Python'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-7535248376254176402</id><published>2010-01-22T23:50:00.000-08:00</published><updated>2010-01-23T00:38:06.051-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Нужна ли Java на веб-морде или зачем зайцу пятая нога</title><content type='html'>Я пришел к выводу что язык Java не есть лучший выбор для web интерфейса.&lt;br /&gt;&lt;br /&gt;Причины:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Внесение изменений в контроллеры требует перезагрузки приложения в аппликейшен сервере (кроме простых случаев когда достаточно java hot swap ).  &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Сам язык Java является представителем семейства C++ подобных языков и плохо подходит для Web, нужно делать слишком много лишний движений  сравнительно со скриптовыми языками. На ruby, python или groovy получается в два-три раза меньше строк кода чем на Java, работа с коллекциями, мапами на скриптовых языках намного приятнее, операции с строками тоже лучше, а нам для веба больше ничего и не нужно потому что вся логика вынесена в business logic layer (BLL)&lt;/li&gt;&lt;li&gt;По вышеуказанным причинам продуктивность работы web девелопера ухудшается.  Когда я стал программировать на grails, то скорость разработки возросла примерно в полтора-два раза.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Поэтому есть смысл использовать&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Grails (проверено опытом)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Spring MVC c контроллерами на cкриптовых языках (проверено опытом)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Wicket Groovy (нужно еще разобраться)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-7535248376254176402?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/7535248376254176402/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=7535248376254176402' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7535248376254176402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7535248376254176402'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2010/01/java.html' title='Нужна ли Java на веб-морде или зачем зайцу пятая нога'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-3283586838328265958</id><published>2009-10-04T06:37:00.000-07:00</published><updated>2010-08-08T13:48:27.231-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Чак Норрис и Continuos Integration</title><content type='html'>Что общего может быть у Чака Норриса и Continuos Integration ?&lt;br /&gt;Я тоже думал что ничего общего нет, пока не открыл для себя Hudson. Hudson - это open source continuos integration and build management server, аналог Cruise Control и Apache Continuum. Для него написано много плагинов, один из них - Чак Норрис плагин. Этот плагин рисует Чака Норриса в разных эмоциональных состояниях в зависимости от статуса билда. Если билд прошел - то Чак улыбается, иначе Чак стоит в боевой стойке готов  надавать звиздюлей тому, кто поломал билд.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_unqJcEiu7BE/Ssi6ceZrkKI/AAAAAAAABpY/x7Luy-oLuis/s1600-h/build_faled1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 172px;" src="http://3.bp.blogspot.com/_unqJcEiu7BE/Ssi6ceZrkKI/AAAAAAAABpY/x7Luy-oLuis/s320/build_faled1.jpg" alt="" id="BLOGGER_PHOTO_ID_5388761952508678306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_unqJcEiu7BE/Ssis8hSNNlI/AAAAAAAABpQ/wu8o8M12UZA/s1600-h/build_successful.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 172px;" src="http://2.bp.blogspot.com/_unqJcEiu7BE/Ssis8hSNNlI/AAAAAAAABpQ/wu8o8M12UZA/s320/build_successful.jpg" alt="" id="BLOGGER_PHOTO_ID_5388747109875660370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;До Гудзона я работал с CruiseControl и Apache Continuum. Cruise Control это наверное самый популярный CI Server, если его правильно настроить то работает как часы. Я был разочарован Apache Continuum, это сырой продукт, версия 1.2.3 по качеству скорее beta чем release, хотя можно его настроить и тоже будет работать.&lt;br /&gt;&lt;br /&gt;Я считаю что Hudson лучший из этой тройки потому что:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;удобный GUI интерфейс для администрирования&lt;/li&gt;&lt;li&gt;система аутентификации пользователей может использовать как свою базу данных ролей и юзеров, так и аккаунты  Linux или Windows&lt;/li&gt;&lt;li&gt;Можно создать кластер и распределять билды по нодам&lt;/li&gt;&lt;li&gt;Много разных плагинов&lt;/li&gt;&lt;li&gt;Уникальная фича - можно по артефакту найти номер билда в котором он был создан&lt;/li&gt;&lt;li&gt;Инкрементальный билд для многомодульных билдов Maven'а&lt;/li&gt;&lt;li&gt;Hudson отслеживает выход новых версий (в том числе плагинов) и сам предлагает обновиться через GUI&lt;/li&gt;&lt;li&gt;Распространяется как war&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Чак Норрис плагин :)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-3283586838328265958?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/3283586838328265958/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=3283586838328265958' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3283586838328265958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3283586838328265958'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/10/continuos-integration.html' title='Чак Норрис и Continuos Integration'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_unqJcEiu7BE/Ssi6ceZrkKI/AAAAAAAABpY/x7Luy-oLuis/s72-c/build_faled1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6441000821761898322</id><published>2009-09-17T11:17:00.000-07:00</published><updated>2010-08-08T13:48:54.308-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Новая фича в Apache Maven - инкрементальный билд</title><content type='html'>В новой версии 2.2.1 Мавена появилась возможность делать инкрементальный билд. Инкрементальный билд - это когда при изменении одного модуля мы пересобираем не весь проект, а только те модули, которые используют код измененного модуля.&lt;br /&gt;&lt;br /&gt;Например, зависимости выглядят так:&lt;br /&gt;&lt;br /&gt;          A&lt;br /&gt;        /   \&lt;br /&gt;       B     C&lt;br /&gt;      / \&lt;br /&gt;     D   E&lt;br /&gt;&lt;br /&gt;Модуль A зависит от B и С, а  B зависит от D и E.&lt;br /&gt;&lt;br /&gt;Допустим, в код  модуля D внесли изменения.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;modules&gt;&lt;modules&gt;&lt;/modules&gt;&lt;/modules&gt;&lt;/span&gt;&lt;br /&gt;набираем&lt;span style="font-weight: bold; font-style: italic;"&gt; mvn -amd -pl D сlean install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В результате будут пересобраны три модуля - D, B и A.  Модули C и E не будут собраны потому что они  не зависят от D напрямую или косвенно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6441000821761898322?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6441000821761898322/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6441000821761898322' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6441000821761898322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6441000821761898322'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/09/apache-maven.html' title='Новая фича в Apache Maven - инкрементальный билд'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-7644857070364873392</id><published>2009-08-27T12:34:00.000-07:00</published><updated>2009-08-27T15:21:16.529-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Локальный SMTP и POP3 сервер для development mode</title><content type='html'>Сейчас я работаю над системой одной из функций которой является рассылка пользователям e-mail'ов (aka мыла), серверную часть мы пишем на java. Когда система работает в production mode,  она отсылает мыло на реальные адреса пользователей. В процессе разработки мы все запускаем наш java сервер на воркстейшенах, и конечно, нужен SMTP сервер на который система отсылала бы мыло в development mode, и нужен POP3 cервер чтобы читать это мыло. К счастью, в Ubuntu Jaunty появился новый пакет - dovecot-postfix. Он содержит POP3 и SMTP сервер. При инсталляции спрашивает тип установки - я выбрал local. После установки на воркстейшене появляются SMTP и POP3 серверы готовые к использованию. В настройках java сервера указываю что SMTP сервер находится на localhost. Теперь нужно поправить конфиг файл для SMTP сервера (Postfix) чтобы он редиректил всю почту на мой аккаунт на локальном POP3 сервере. Для этого нужно прописать в файле /etc/postfix/virtual-regexp правило&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;# Rewrite all addresses to sgr@localhost&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;/.+@.+/ sgr@localhost&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;и добавить в /etc/postfix/main.cf строку&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;virtual_maps = regexp:/etc/postfix/virtual-regexp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Готово. Перезапускаем Postfix чтобы он перечитал конфиг файл.&lt;br /&gt;Теперь вся почта, которая посылается java сервером, редиректится на мой аккаунт. Осталось настроить почтовый клиент ( я использую evolution) чтобы он забирал почту с локального аккаунта на POP3 сервере, логин и пароль тот же что и для входа в Ubuntu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-7644857070364873392?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/7644857070364873392/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=7644857070364873392' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7644857070364873392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/7644857070364873392'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/08/smtp-pop3.html' title='Локальный SMTP и POP3 сервер для development mode'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-3420266311593731596</id><published>2009-08-14T13:25:00.000-07:00</published><updated>2010-08-08T13:49:16.512-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Как смотреть прогресс восстановления базы данных  MySQL из дампа</title><content type='html'>Недавно открыл для себя чрезвычайно полезную утилиту &lt;a href="http://linux.die.net/man/1/pv"&gt;pv&lt;/a&gt;. Раньше я импортировал дамп базы данных MySQL так:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;mysql my_database &lt; dump.sql&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Я не указываю для команды mysql хост, логин и пароль, потому что эти на&lt;span&gt;стройки хранятся в файле my.cnf. &lt;/span&gt;&lt;span&gt;Если дамп достаточно большой, он  может импортироваться несколько часов. Чтобы увидеть прогресс импорта нужно сделать так&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;pv dump.sql | mysql my_database&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-3420266311593731596?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/3420266311593731596/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=3420266311593731596' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3420266311593731596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3420266311593731596'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/08/mysql.html' title='Как смотреть прогресс восстановления базы данных  MySQL из дампа'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-2610405003148433832</id><published>2009-08-08T12:10:00.000-07:00</published><updated>2010-08-08T13:49:37.828-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Как работает  Ubuntu Support Team</title><content type='html'>У меня возникла проблема, впервые за два года использования Ubuntu я не смог найти решение в интернете, пришлось &lt;a href="http://ubuntuforums.org/showthread.php?t=1234278"&gt;писать на форум Ubuntu&lt;/a&gt;. Я запостил вопрос и думал что  мне ответят на следующий день в лучшем случае. Я был приятно удивлен когда через  10 минут после того, как я запостил мой вопрос, я получил на e-mail нотификацию про ответ. Возвращаюсь на форум, там написано что у меня есть новое личное сообщение. Читаю (вольный перевод с английского) &lt;br /&gt;&lt;br /&gt;Дорогой юзер,&lt;br /&gt;&lt;br /&gt;Для вашей проблемы существует решение, но мы не рекомендуем так делать потому что это рисковано с точки зрения безопасности. Поэтому отвечаем вам не на форуме, а в личном сообщении. &lt;br /&gt;Но если вы все таки хотите так сделать, то смотрите этот линк.&lt;br /&gt;&lt;br /&gt;Дальше ссылка на топик форума как решить проблему.&lt;br /&gt; &lt;br /&gt;Что тут можно еще добавить? 10 минут это отличный результат.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-2610405003148433832?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/2610405003148433832/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=2610405003148433832' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2610405003148433832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/2610405003148433832'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/08/support-ubuntu.html' title='Как работает  Ubuntu Support Team'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6600403671363346935</id><published>2009-08-08T10:51:00.000-07:00</published><updated>2010-08-08T13:52:11.159-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>YAML is XML for human beings</title><content type='html'>Недавно я скачал себе Google App Engine SDK для питона, и один из конфиг файлов назывался config.yaml. Я заинтересовался, что за YAML, и оказалось что YAML это такой язык, альтернатива XML. Как и  XML, YAML создан для описания данных, но предназначен для чтения людьми, а XML как мы знаем, предназначен для чтения компьютерами.  Действительно, YAML визуально воспринимается намного лучше чем  XML. В этом читатель может легко убедиться, зайдите на &lt;a href="http://yaml.org/"&gt;Official YAML Web Site&lt;/a&gt;, главная страница написана на YAML.&lt;br /&gt;&lt;br /&gt;Я предпочитаю использовать YAML для конфиг файлов вместо XML. Еще одно возможное применение - данные для юнит тестов.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6600403671363346935?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6600403671363346935/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6600403671363346935' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6600403671363346935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6600403671363346935'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/08/yaml-is-xml-for-human-beings.html' title='YAML is XML for human beings'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-4472726722514407347</id><published>2009-07-25T04:28:00.000-07:00</published><updated>2010-08-08T13:50:45.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Mercurial для сисадмина</title><content type='html'>Я уже пол-года как спрыгнул с Subversion и использую &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt; для разработки, оказывается что эта чудесная система контроля версий может быть использована не только программистами, но и сисадминами.  Очень удобно ( и полезно) положить конфиг - файлы в Mercurial. К примеру, мне приходится править конфиг файл для &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;Cruise Control&lt;/a&gt;, и хочется иметь возможность отслеживать историю изменений файла. Задача решается просто. Заходим в папку где лежит конфиг файл для Cruise Control&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hg init&lt;/span&gt; // создаем репозиторий&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hg add config.xml &lt;/span&gt;// добавляем в репозиторий конфиг файл для Cruise Control&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hg ci -m 'initial commit'&lt;/span&gt; // коммитим конфиг файл&lt;br /&gt;&lt;br /&gt;Теперь наш конфиг файл в репозитории Mercurial&lt;br /&gt;&lt;br /&gt;Допустим, я (или другой человек) внес измненения в конфиг файл.&lt;br /&gt;&lt;br /&gt;Делаем &lt;span style="font-weight: bold;"&gt;hg ci -m 'Added e-mail notification for nighty build'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Новая версия файла попадает в репозиторий.&lt;br /&gt;&lt;br /&gt;Чтобы посмотреть историю изменений в файле набираеем &lt;span style="font-weight: bold;"&gt;hg log&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Можно трекать изменения в папке /etc&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cd /etc &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sudo hg init&lt;/span&gt;  // создаем репозиторий для папки etc&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cd X11 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sudo hg add xorg.conf &lt;/span&gt;// трекаем изменения в файле xorg.conf&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sudo hg ci -m 'initial commit'&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;В этом случае я использую Mercurial как своеобразное  расширение  функциональности  файловой системы&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;которое позволяет трекать историю изменения файлов в папке.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-4472726722514407347?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/4472726722514407347/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=4472726722514407347' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4472726722514407347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4472726722514407347'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/07/mercurial.html' title='Mercurial для сисадмина'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-4632675168303267823</id><published>2009-07-25T03:39:00.000-07:00</published><updated>2010-08-08T13:53:33.863-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Еще одна причина почему Linux рулит</title><content type='html'>Я занимался разработкой на Java под Linux два года на моем &lt;a href="http://www.encode.dk"&gt;прошлом месте работы&lt;/a&gt;, в октябре 2008 года  перешел в  &lt;a href="http://www.worldticket.net"&gt;другой проект&lt;/a&gt;, cменив OS на Windows. Поработав пару месяцев я понял что на Windows мне работается хуже чем на Linux, не потому что Windows плохой а Linux хороший, а потому что я принадлежу к Unix culture, и мне многие вещи быстрее и проще делать в командной строке. Поэтому я поставил себе Ubuntu и вроде бы все хорошо, но free -m&lt;br /&gt;показывает что  в системе только 3.2 гигабайта RAM, хотя физически установлено 2 модуля по 2 GB, тоесть 800 MB  не доступно.&lt;br /&gt;  Оказывается что обычный kernel в 32- разрядном ядре, которое инсталируется при установке Ubuntu, не может адресовать больше чем 3.2 GB, но можно (и нужно) поставить server kernel который  скомпилирован таким образом что видит больше чем 3.2 GB памяти. Теперь 32- разрядное ядро Ubuntu видит 4 GB памяти и все в порядке :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-4632675168303267823?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/4632675168303267823/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=4632675168303267823' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4632675168303267823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4632675168303267823'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/07/lunux.html' title='Еще одна причина почему Linux рулит'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-4064307004455533806</id><published>2009-07-17T16:02:00.000-07:00</published><updated>2010-08-08T13:52:42.117-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Практическое применение Ubuntu One в разработке</title><content type='html'>&lt;a href="https://ubuntuone.com/"&gt;Ubuntu One&lt;/a&gt; это бесплатный online storage service который предоставляет Сanonical.  После инсталляции клиента на Убунту у вас появляется папка содержимое которой синхронизируется с сервером.  Бесплатно дают 2 GB.  Также есть доступ к файлам через  web интерфейс. В Википедии написано что Ubuntu One использует &lt;a href="http://aws.amazon.com/s3/"&gt;Amazone S3&lt;/a&gt;.  Это очень удобная вещь если вы работаете с разных компьютеров над одним проектом.  Мне часто приходится переключаться с ноутбука на workstation и обратно (на обоих стоит Ubuntu), поэтому я храню конфиг файлы для приложений в папке которая синхронизируется с сервером. Например, я работаю над web application которое читает конфиги из папки ${CATALINA_HOME}/data.  Есть папка ${HOME}/Cloud_Storage на воркстейшене и ноутбуке которая шарится через Ubuntu One.&lt;br /&gt;&lt;br /&gt;На воркстейшене делаю&lt;br /&gt;&lt;br /&gt;mv ${CATALINA_HOME}/data  ${HOME}/Cloud_Storage&lt;br /&gt;ln  -s ${HOME}/Cloud_Storage/data&amp;nbsp;&amp;nbsp;{CATALINA_HOME}/data&lt;br /&gt;&lt;br /&gt;теперь кликаю мышей на меню "сonnect" Ubuntu One, файлы записываются на сервер&lt;br /&gt;&lt;br /&gt;на ноутбуке&lt;br /&gt;ln  -s ${HOME}/Cloud_Storage/data&amp;nbsp;&amp;nbsp;${CATALINA_HOME}/data&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;теперь конфиг файлы на ноутбуке и воркстейшене одинаковы. Закончил работать с ноутбуком, опять кликаю мышей на меню "сonnect" Ubuntu One. Потом прихожу на работу, синхронизирую папку и вижу последние измненения в конфигах.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-4064307004455533806?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/4064307004455533806/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=4064307004455533806' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4064307004455533806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/4064307004455533806'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/07/ubuntu-one.html' title='Практическое применение Ubuntu One в разработке'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-6709027962264416250</id><published>2009-07-05T12:55:00.000-07:00</published><updated>2009-07-18T02:10:30.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Билдим Flex используя Maven</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;  Год назад я начал работать над RIA, клиент - flex, сервер - java.  Решил использовать maven для билда,  java билдилась без проблем, а вот с flex пришлось повозиться. Тогда я нашел единственный maven плагин для flex, &lt;a href="http://projects.israfil.net/mojo/index.html"&gt;Israfil Mojo&lt;/a&gt;. С ним были проблемы, потому что плагин не поддерживает все опции для компилятора, поэтому часть опций я вынес в конфиг файл, и указал плагину что нужно использовать конфиг файл. Вторая задача которую нужно было решать - это запаковать flex приложение в war. Задача решилась просто, &lt;a href="http://projects.israfil.net/mojo/index.html"&gt;Israfil  Mojo&lt;/a&gt; позволяет копировать flex-артефакты  из репозитория maven в указанную папку.&lt;br /&gt;&lt;br /&gt;Месяц назад  случайно нашел еще один maven плагин для flex,  &lt;a href="http://www.servebox.org/maven-flex-plugin/"&gt;mvnflexplugin&lt;/a&gt;. Этот плагин мне нравится намного больше, потому что он поддерживает больше опций компилятора и поддерживает rsl, поэтому я перевел мой проект на этот плагин.  &lt;a href="http://www.servebox.org/maven-flex-plugin/"&gt;Mvnflexplugin&lt;/a&gt; не копирует flex-артефакты из репозитория в war, но эта задача решается  с помощью &lt;a href="http://maven.apache.org/plugins/maven-dependency-plugin/"&gt;maven-dependency-plugin&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-6709027962264416250?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/6709027962264416250/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=6709027962264416250' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6709027962264416250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/6709027962264416250'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/07/flex-maven.html' title='Билдим Flex используя Maven'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-5511616194063881366</id><published>2009-07-04T06:38:00.001-07:00</published><updated>2009-07-04T12:09:15.954-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Вышел Review Board 1.0</title><content type='html'>Недавно вышел &lt;a href="http://www.review-board.org/"&gt;Review Board 1.0&lt;/a&gt;.  Это замечательный code review tool,  я использую  на работе beta версию и очень доволен. Рекомендую всем кто хочет улучшить code review процесс. Review Board намного лучше чем &lt;a href="http://codestriker.sourceforge.net/"&gt;Codestriker&lt;/a&gt; о котором я &lt;a href="http://grigorievs.blogspot.com/2008/07/making-code-review-easier-with.html"&gt;писал&lt;/a&gt; раньше.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-5511616194063881366?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/5511616194063881366/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=5511616194063881366' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5511616194063881366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/5511616194063881366'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2009/07/review-board-10.html' title='Вышел Review Board 1.0'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-668181956181314900</id><published>2008-09-26T12:53:00.000-07:00</published><updated>2010-08-08T13:53:10.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>книга "My Job Went to India: 52 Ways to Save Your Job"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_unqJcEiu7BE/SN1EfEREdII/AAAAAAAAA8E/KOQ80uSPdNM/s1600-h/mjwti.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_unqJcEiu7BE/SN1EfEREdII/AAAAAAAAA8E/KOQ80uSPdNM/s320/mjwti.jpg" alt="" id="BLOGGER_PHOTO_ID_5250428041095836802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cейчас я читаю &lt;a href="http://www.pragprog.com/titles/mjwti/my-job-went-to-india"&gt;замечательную книгу&lt;/a&gt;, и чем дальше, тем веселее.  На обложке изображен программист c обьявлением "Кодирую за еду" в руках :)  Цитирую текст который меня повеселил:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;How would you write a program, in pure Java, that would make the Java Virtual&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Machine crash? Dead silence. Hello?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I’m sorry. I’m not getting you. Could you repeat the question, please? The voice&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;sounded desperate. I knew from experience that repeating the question&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wasn’t going to help. So, I repeated the question, slowly and more loudly.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;How would you write a program, in pure Java, that would cause the Java Virtual&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Machine to crash?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Uh...I’m sorry. I’ve never done this before.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I’m sure you haven’t. How about this question: how would you write a program&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;that would NOT cause the JVM to crash? I was looking for really good Java&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;programmers. To start the interview, I asked this person (and all the others&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I had interviewed that week) to rate himself on a scale of one to ten. He&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;said nine. I’m expecting a star here. If this guy rates himself so high, why can’t&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;he think of a single abusive programming trick that would cause a JVM to crash?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;И таких ярких моментов в книге много :)&lt;br /&gt;&lt;br /&gt;Книга о том, как выжить программистам в США в условиях когда все больше заказов уходит на аутсорсинг и количество рабочих мест сокращается.  Лучшая из книг  прочитанных мной в этом году.  Автор анализирует сильные и слабые стороны американских программистов  и их конкурентов в Индии и дает советы как правильно построить карьеру. Во многом его мысли совпадают с моими, например, он рекомендует изучать несколько языков программирования чтобы стать универсальным специалистом способным принимать архитектурные решения.  Рекомендую почитать. Книга написана живым языком , автор обладает отличным чувством юмора, в то же время пишет о серьезных вещах. Читается легко.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-668181956181314900?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/668181956181314900/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=668181956181314900' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/668181956181314900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/668181956181314900'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2008/09/my-job-went-to-india-52-ways-to-save.html' title='книга &quot;My Job Went to India: 52 Ways to Save Your Job&quot;'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_unqJcEiu7BE/SN1EfEREdII/AAAAAAAAA8E/KOQ80uSPdNM/s72-c/mjwti.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-3277978185842221099</id><published>2008-08-02T11:22:00.000-07:00</published><updated>2010-08-08T13:55:10.489-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Энвер  Измайлов</title><content type='html'>&lt;object width="425" height="344"&gt;   В прошлом году я с друзьями отдыхал в Коктебеле.  Увидел обьявление про концерт Энвера Измайлова и решил пойти. Я раньше слышал про него много хорошего, но действительность превзошла все ожидания.&lt;br /&gt;  Выступление Энвера было частью большого джаз концерта. До появления Измайлова на сцене неискушенная в джазе публика, в том числе я с другом откровенно скучали. Все ждали появления Маэстро, а он все не выходил на сцену. Я даже спросил у него - "Вы будете играть сегодня ?" Cказал что будет.&lt;br /&gt; И наконец дождались.  Сразу стало ясно что это музыкант мирового уровня, на голову выше чем  многие раскрученные западные и наши звезды рока. Публика была в восторге. Выкладываю видеоролик.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="movie" value="http://www.youtube.com/v/EoJmKoinEKc&amp;amp;hl=ru&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x402061&amp;amp;color2=0x9461ca"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/EoJmKoinEKc&amp;amp;hl=ru&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x402061&amp;amp;color2=0x9461ca" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-3277978185842221099?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/3277978185842221099/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=3277978185842221099' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3277978185842221099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3277978185842221099'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2008/08/blog-post.html' title='Энвер  Измайлов'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-3524373535918665186</id><published>2008-07-28T00:35:00.000-07:00</published><updated>2010-08-08T13:47:03.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Making code review easier with Codestriker</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;The big brother is watching you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;George Orwell&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Everybody agrees that code review is crucial for any software project.  I don't believe that it is possible to do good code reviews on a regular basis without a code  review tool.  I you are not using a code review tool, the following scenarios might happen:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You have just finished with your task and want the code to be reviewed. The reviewer and you work in the same office. Unfortunately,  the reviewer is not available at the moment. There are many reasons why it can happen. The reviewer might have  flexible working schedule which differs from your working schedule, he might be ill, he might be at a meeting, visiting the dentist, stuck in a traffic jam.  Of course, you can't wait until the reviewer appears in the office, you switch to another task instead.  It is easy to forget about code review.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You have a distributed team. One or two developers work in one office, the rest of developers work in another office which might be located in another country. We had this situation at my last place of work.  In this case  the only way to send a code review request is an email with an attached patch file which contains your changes to code.   The reviewer is supposed to read your email, save the attached patch to a folder, then apply the patch to the right version, examine your code.  It is time-consuming and not efficient.&lt;/li&gt;&lt;/ol&gt;Without a code review tool the team leader doesn't have the whole picture of what is going on with code reviews.  How many code review requests are pending ? Which topics are the most discussed ? These questions need to be addressed, and a code review tool helps.&lt;br /&gt;&lt;br /&gt;There are many code review tools available, most of them are commercial, some are free. The one I introduced in my team was &lt;a href="http://codestriker.sourceforge.net/"&gt;Codestriker&lt;/a&gt;.  It's a free tool written in Perl.  Although its functionality has minimum features, it can be successfully used. Basically, it is a web appplication running on &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt;.  Although Codestriker has no built-in security support,  you can secure Codestriker with Apache's &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_auth.html"&gt;auth module&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Learning and setting up Codestriker took me one day.  Configuration is simple but requires knowledge of Linux or Unix. You tell Codestriker what database to use and where is the code repository. We used MySQL and Subversion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Features of Codestiker&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The creator of a topic gets notifications by e-mail when reviewers post comments.&lt;/li&gt;&lt;li&gt;You can have multiple reviewers&lt;/li&gt;&lt;li&gt;All the members of the team can post  comments on any topic&lt;/li&gt;&lt;li&gt;You can browse changes to code through Codestriker's web interface&lt;/li&gt;&lt;li&gt;You can add comments to a single line of code and to a whole topic.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Even though we were using the simpliest code review tool,  the quality of code reviews increased dramatically. The code became controlled better by the team lead. More members became involved in code review. Intreraction between offices improved.  It turned out that it is possible to misuse code review tool.  If the team lead  is a dictator and willing to blame and critisize everyone,  he can &lt;span style="font-weight: bold;"&gt;abuse&lt;/span&gt; the code review tool. Other members would feel like "the big brother is watching you".The programmers would feel that their every step is under attack, they would loose motivation or leave the company. So be careful  with code review tools.  Small teams with limited budget who don't want to spend money on commercial code review tools can use Codestiker fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-3524373535918665186?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/3524373535918665186/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=3524373535918665186' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3524373535918665186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/3524373535918665186'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2008/07/making-code-review-easier-with.html' title='Making code review easier with Codestriker'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2928069500105440659.post-8744464557159990244</id><published>2008-07-25T23:15:00.000-07:00</published><updated>2010-08-08T13:47:55.705-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Wonderful Wicket</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;All ingenious is simple&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;First, I'm going to tell you how I came across Wicket.  A year ago I was working for &lt;a href="http://ciklum.net/"&gt;Ciklum&lt;/a&gt; on a project that was basically a Java web application. The application consisted of hundreds of web pages.   Although we were using Spring MVC, I didn't feel quite happy, do you know why ? The answer is "reusing a single component in different web pages is not perfect with Spring MVC". This is not weakness of Spring MVC,   it's weakness of all workflow-oriented web frameworks.  If you need to reuse a component with Spring MVC you need to&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; Create a reusable tag which contains shared HTML code&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Create a reusable method which handles HTTP requests from the tag.  It is not easy when you have many nested components on a single web page&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Call the method from an MVC controller for every page containing the tag&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;If you are intensively reusing components on GUI level , then a component framework would better suit your needs.&lt;br /&gt;&lt;br /&gt;So I started my research on component web frameworks for Java.  My first candidate was JSF.  After I had read a &lt;a href="http://books.google.com/books?id=Iv9r-CT6ZwwC&amp;amp;printsec=frontcover&amp;amp;dq=pro+jsf+and+ajax&amp;amp;ei=Bc2KSN6VNIzQjgGI3NiDDw&amp;amp;hl=ru&amp;amp;sig=ACfU3U0W83ygynmSg6exE336qpalBmLM7w"&gt;book&lt;/a&gt; on JSF, I had impression that JSF is overcomplicated technology. Nevertheless I downloaded the latest release of &lt;a href="http://www.icefaces.org/"&gt;ICEFaces&lt;/a&gt; and tried to write a simple "hello world" application with a singe button and a message area. I've spent two hours configuring it and six hours figuring out how to eliminate an exception. I can't remember the exact error, it was something about "invalid JSF context".  I came to conclusion that I don't need such a framework. Developing GUI is probably the easiest task and  definitely shouldn't be that complicated.  Developing custom components for JSF is a nightmare. You would have to write three or four classes for a single component. One of the reasons why JSF is so complicated is that JSF has been designed to support different renderers' families. For example, you can switch from HTML to WML by changing a line in the config file. But I believe that in a couple of years WML will not be widely used, because the number of mobile phones capable of displaying HTML increases every year. Eventually I decided that I can't spend my precious time on mastering JSF.&lt;br /&gt;&lt;br /&gt;So I said "No" to JSF.  The two other candidates were &lt;a href="http://tapestry.apache.org/"&gt;Tapestry&lt;/a&gt; and &lt;a href="http://wicket.apache.org/"&gt;Wicket&lt;/a&gt;.  So I downloaded Wicket and started reading documentation. I was really impressed by the framework's simplicity. Configuration is very easy. All you have to do is to add Wicket's servlet to  the web.xml.&lt;br /&gt;&lt;br /&gt;Another concept I like in Wicket is separation of HTML and Java code,  in other words&lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns"&gt; separation of concerns&lt;/a&gt;.  Imagine your technology is JSP and you have a team consisting of programmers and a web designer. In most cases the web designer has his own copy  of GUI consisting of static HTML pages,  so-called "prototype of GUI".  If any changes to HTML code  are required, then the web designer updates his web site and sends the new version of  modified HTML  files to a programmer. The programmer finds a single JSP or multiple JSP's to be modified according to the modified prototype. The programmer modifies JSP's.  I believe that this approach is completely wrong.  If you are using Wicket, forget about this slow and ugly way of modifying HTML. Just let the web designer to modify HTML, that's all. No programmer's assistance is needed to modify HTML, and I believe it's great !&lt;br /&gt;&lt;br /&gt;If you are familiar with Swing, then mastering  Wicket will be very easy for you. Spring and Wicket are very similar.   Swing JPanel is like Wicket Panel, Swing Button is  like Wicket JButton. Very simple. If you want to handle a form's submission, just add an event listener to the form's button, just like in Swing. Working example is available at&lt;a href="http://www.wicketstuff.org/wicket13/echo/"&gt; http://www.wicketstuff.org/wicket13/echo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wicket is different from javascript - oriented frameworks like &lt;a href="http://code.google.com/webtoolkit"&gt;GWT&lt;/a&gt; or &lt;a href="http://echo.nextapp.com/site"&gt;Echo&lt;/a&gt;.  GWT components are rendered with javascript, while Wicket's components are mainly  pure HTML.  Web pages built with Wicket components can be indexed by search engines while GWT pages can't.&lt;br /&gt;&lt;br /&gt;Wicket integrates with Spring, has support for internationalization and security. If I were to start a new web project now, I would definitely choose Wicket.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2928069500105440659-8744464557159990244?l=grigorievs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grigorievs.blogspot.com/feeds/8744464557159990244/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2928069500105440659&amp;postID=8744464557159990244' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8744464557159990244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2928069500105440659/posts/default/8744464557159990244'/><link rel='alternate' type='text/html' href='http://grigorievs.blogspot.com/2008/07/wonderful-wicket.html' title='Wonderful Wicket'/><author><name>Sergey Grigoriev</name><uri>http://www.blogger.com/profile/16447443301040798047</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
