<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUICQX4_fSp7ImA9WhdaGEU.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968</id><updated>2011-10-29T14:26:00.045+03:00</updated><category term="Apache OfBiz" /><category term="JQuery" /><category term="DIP" /><category term="Плоды работы воспалённого мозга" /><category term="SQL" /><category term="Маргинальное" /><category term="FP" /><category term="Clojure" /><category term="XML" /><category term="Java" /><category term="Банальности" /><category term="Google" /><category term=".NET" /><title>Блог Павла Дробушевича</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://pdrobushevich.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/PavelDrobushevichBlog" /><feedburner:info uri="paveldrobushevichblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0IFRHg7cCp7ImA9WhdVEko.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-8554498620367619791</id><published>2011-09-09T22:52:00.000+03:00</published><updated>2011-09-17T19:05:15.608+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-17T19:05:15.608+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Akka actors: Первое неоднозначное впечатление</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://akka.io/images/akka-logo-159h.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="159" width="203" src="http://akka.io/images/akka-logo-159h.png"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Давно я ничего не писал, хотя в draft лежит много чего, в том числе интересного. Но эта статья носит немного другой, как мне кажется, не технический, а больше эмоциональный характер, поэтому решил её долго не пилить и выложить, тем более в twitter обещал отписаться о моём опыте.
&lt;/p&gt;
&lt;p&gt;
Ситуация такая. Есть у нас маленький, как считалось не слишком важный, кусочек кода, который переносит данные из oracle в mongo с небольшими преобразованиями. Через некоторое время, как обычно, оказалось, что он не такой уж и неважный, поэтому возникла задач быстро его немножко ускорить. Особо оптимизировать в коде нечего было, поэтому ускорение можно было предать параллелизацией некоторых его частей, благо код был разделен на достаточно независимые части. Для этого я решил в порядке эксперимента воспользоваться интересно библиотекой Akka, написанной на Scala, но разработчики поддерживают удобное api и документацию и для Java. Это мой первый опыт с данной библиотекой, так что никаких откровений тут не будет, да и в целом, как я ранее написал, статья больше эмоциональная, нежели техническая.
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/09/akka-actors.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-8554498620367619791?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=a53wybDA81A:7OJLh0_Avzc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/a53wybDA81A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/8554498620367619791/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/09/akka-actors.html#comment-form" title="Комментарии: 11" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/8554498620367619791?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/8554498620367619791?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/a53wybDA81A/akka-actors.html" title="Akka actors: Первое неоднозначное впечатление" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-01L1Gom2ICg/TnS6KKuYENI/AAAAAAAAA1o/ctl6pW27KOw/s72-c/flow.png" height="72" width="72" /><thr:total>11</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/09/akka-actors.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAARH44eCp7ImA9WhZVFk0.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-7008028720382901488</id><published>2011-05-28T20:51:00.002+03:00</published><updated>2011-05-28T21:19:05.030+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-28T21:19:05.030+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JQuery" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>JQuery: Slider + Table или я в роли доктора Франкенштейна</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-hOrqdBZ4NiA/TeEmQ4GtlfI/AAAAAAAAAgc/kJA0KBt-oNw/s1600/jquery-frankenstein.PNG" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="241" src="http://4.bp.blogspot.com/-hOrqdBZ4NiA/TeEmQ4GtlfI/AAAAAAAAAgc/kJA0KBt-oNw/s320/jquery-frankenstein.PNG"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Для тех, кто меня не очень хорошо знает, этот пост может показаться несколько бессмысленным (слишком он в духе К.О.), поэтому объясню. Уже пару лет я занимаюсь по большей части backend приложениями (как в рабочее, так и в свободное время). Тут предоставилась возможность поработать над прототипом с web интерфейсом. Вот и хотел поделится своими ощущениями, что сейчас это уже выглядит не так страшно, вроде бы.
&lt;/p&gt;
&lt;p&gt;
Стоит задача сделать что-то похожее на &lt;a href="http://www.google.com/finance/stockscreener"&gt;Google Finance StockScreener&lt;/a&gt;. В первом приближении необходима приятная табличка (с сортировкой и разбитием на страницы) и слайдер, с помощью которого можно отфильтровать данные, отображаемые в этой таблице. Слайдер уже есть практически из коробки: &lt;a href="http://jqueryui.com/demos/slider/"&gt;JQuery UI Slider&lt;/a&gt;. В качестве таблицы выбор пал на &lt;a href="http://datatables.net/"&gt;Data Tables&lt;/a&gt;. Осталось только их соединить так сказать вместе и об этом и будет этот небольшой пост.
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/05/jquery-slider-table.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-7008028720382901488?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=lwA3TEO_z8s:PneXsGimlGc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/lwA3TEO_z8s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/7008028720382901488/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/05/jquery-slider-table.html#comment-form" title="Комментарии: 9" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/7008028720382901488?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/7008028720382901488?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/lwA3TEO_z8s/jquery-slider-table.html" title="JQuery: Slider + Table или я в роли доктора Франкенштейна" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-hOrqdBZ4NiA/TeEmQ4GtlfI/AAAAAAAAAgc/kJA0KBt-oNw/s72-c/jquery-frankenstein.PNG" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/05/jquery-slider-table.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcGQ346fip7ImA9WhZVFEw.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-3798761685085714314</id><published>2011-05-14T23:57:00.001+03:00</published><updated>2011-05-26T15:30:22.016+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-26T15:30:22.016+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Маргинальное" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><title>Мир вверх тормашками или код как данные</title><content type="html">&lt;p&gt;
Я тут в очередной раз пытаюсь перечитать (но уже печатную) &lt;a href="http://mitpress.mit.edu/sicp/"&gt;SICP&lt;/a&gt;. Вторая глава там: Построение абстракций с помощью данных. Действительно, чтобы мы делали, если бы нельзя было из примитивных типов строить что-то побольше. И мне там очень понравился один примерчик. Про его и хочу рассказать. Если выключить машину времени и вернуться в реальность без скобочек, то в мейнстримных сейчас в наших палестинах C#/Java обычно для этих целей мы используем классы. Книжный пример рассказывал о паре. В C# для этих целей есть класс Tuple (там правда не только пара, но нам сойдёт). Так вот, а давайте представим, что в C# не было бы специальной конструкции языка class (ну и struct заодно). Как же теперь нам сделать пару или любую другую сложную структуру данных из примитивов языка? Я уже в статье раньше &lt;a href="http://pdrobushevich.blogspot.com/2011/02/blog-post.html"&gt;рассуждал немного&lt;/a&gt; о философской проблеме ООП языков: кто должен быть this&amp;#39;ом. Так вот под катом пример на C# (переделанный из SICP) демонстрирующий ненужность this :)
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/05/blog-post.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-3798761685085714314?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=CCXuQ5T1k5M:VFqhSxVZIu8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/CCXuQ5T1k5M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/3798761685085714314/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/05/blog-post.html#comment-form" title="Комментарии: 24" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3798761685085714314?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3798761685085714314?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/CCXuQ5T1k5M/blog-post.html" title="Мир вверх тормашками или код как данные" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>24</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBSHc9eCp7ImA9WhZQE0o.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-2612664764220689730</id><published>2011-04-20T19:16:00.004+03:00</published><updated>2011-04-21T11:07:39.960+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-21T11:07:39.960+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>JLine: Интерактивная Java Console в стиле Quake</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-q9dFtOGoBkk/Ta7noJsh9jI/AAAAAAAAAfo/cJ1zTQTeLZs/s1600/Quake-3-Logo-Final-Result.jpg" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="200" width="200" src="http://2.bp.blogspot.com/-q9dFtOGoBkk/Ta7noJsh9jI/AAAAAAAAAfo/cJ1zTQTeLZs/s320/Quake-3-Logo-Final-Result.jpg"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Каждому программисту в жизни приходилось писать небольшие консольные утилитки. Обычно это выглядит как бесконечный цикл чтения строки, парсинга её и выполнение. Но визуально это всегда выглядит не очень, да и пользоваться трудно. Но мне как-то пришлось писать такую консольную утилитку, с которой должны работать нормальные люди :) поэтому задумался (после соответсвующего пинка :))) над её усовершенствованием в стиле Quake, т.е. сделать такую консольку более интерактивной. Конечно же писать самостоятельно в 2011 году наверно глупо. Немного поискав, остановился на наилучшем, на мой взгляд, варианте: &lt;a href="http://jline.sourceforge.net/"&gt;JLine&lt;/a&gt;. Перечислю те вещи, за которые она мне больше всего приглянулась:
&lt;ul&gt;
&lt;li&gt;История команд, по которой можно легко перемещаться с помощью стрелочек.&lt;/li&gt;
&lt;li&gt;Редактирование строки. В стандартном java console приложении невозможно отредактировать символ внутри уже набранной строки, приходится удалять весь хвост.&lt;/li&gt;
&lt;li&gt;Автодополнение команд с помощью tab. Легко настраиваемое, но при этом с хорошим стандартным набором&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
В этом посте я набросаю простенькую консоль, поддерживающую команды, которые можно легко будет добавлять (для этого задействуем Google Guice).
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/04/jline-java-console-quake.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-2612664764220689730?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=wfP5J1hmNHI:6BdeBli5ZKo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/wfP5J1hmNHI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/2612664764220689730/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/04/jline-java-console-quake.html#comment-form" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/2612664764220689730?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/2612664764220689730?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/wfP5J1hmNHI/jline-java-console-quake.html" title="JLine: Интерактивная Java Console в стиле Quake" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-q9dFtOGoBkk/Ta7noJsh9jI/AAAAAAAAAfo/cJ1zTQTeLZs/s72-c/Quake-3-Logo-Final-Result.jpg" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/04/jline-java-console-quake.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04HQ3k8fSp7ImA9WhZREUU.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-6335057064292047981</id><published>2011-03-26T22:39:00.011+02:00</published><updated>2011-04-07T18:25:32.775+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T18:25:32.775+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Маргинальное" /><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="FP" /><title>Субботний вечер пропаганды маргинальных технологий: Статистический анализ с помощью clojure и incanter</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-9tBREyP_YAg/TZ1R5kx2ZXI/AAAAAAAAAcY/SSLLAEnb8WA/s1600/incanter-i-logo-holo.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="175" width="173" src="http://4.bp.blogspot.com/-9tBREyP_YAg/TZ1R5kx2ZXI/AAAAAAAAAcY/SSLLAEnb8WA/s320/incanter-i-logo-holo.png"&gt;&lt;/a&gt;&lt;/div&gt;
Начну из далека. Все прекрасно знают, что Java код компилируется в платформа независимый java bytecode. Sun&amp;#39;ики этого не планировали, но, так же как и для CLR, появились альтернативные языки, компилируемые под JVM. Зачастую это порты других известных языков: Jython (Python), JRuby (Ruby), Kawa (Scheme). Они пользуются небольшой популярностью по очевидной причине, люди предпочитают использовать не порт, а настоящий язык. Но есть языки разработанные специально для JVM. Например Groovy, солянка Ruby и Java, заполучил своё место под солнцем как скриптовый язык, часто используется, как основа более гибких конфигураций, нежели статический xml и вроде веб на нём тоже делают. Ещё есть Scala, мельтипарадигменный язык, который совмещает в себе огромную кучу фич из ООП и ФП. Мне он не очень нравится перегруженностью синтаксиса, но он набирает популярность как замена Java. Но сегодня я хотел бы поговорить о &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; - это функциональный язык, диалект великого Lisp&amp;#39;а. Ах, нет, я хотел обмануть, про замечательный язык clojure я не стану рассказывать детально в этой статье, лучший способ с ним познакомиться это &lt;a href="http://alexott.net/ru/clojure/"&gt;одноименный раздел на сайте Алекса Отта&lt;/a&gt;. Там же есть постоянно обновляющаяся &lt;a href="http://alexott.net/ru/clojure/clojure-intro/index.html"&gt;вводная статья&lt;/a&gt; написанная Алексом для журнала &lt;a href="http://fprog.ru/"&gt;fprog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Я участвую в проекте по обработке данных. Предыдущая версия использовала MS Sql Server для своей работы, поэтому анализ работы системы сделать было достаточно просто, можно было обойтись и простым t-sql скриптом или, если нужно было графическое представление, то можно было использовать Reporting services. Сейчас же, для того компонента, которым я занимаюсь, никакие СУБД не используются, поэтому какие-то выводы можно делать исключительно по логам. Поэтому даже был сделан отдельный структурированный лог в csv формате обо всех важных событиях, произошедших в системе. К примеру, к нам приходит много файлов, поэтому для каждого из этих фалов, этот лог содержит упрощённо 3 записи: файл найден, файл отправлен на обработку, файл обработан. Как то у &lt;a href="http://www.facebook.com/profile.php?id=100000498221779"&gt;Ярослава&lt;/a&gt; возникла идея попробовать &lt;a href="http://www.r-project.org/"&gt;язык R&lt;/a&gt;, чтобы нарисовать какие-нибудь интересные аналитические графики. Меня идея заинтересовала, я скачал книгу и впал в ступор. В общем и целом, язык этот мне не понравился (можно сказать не осилил:)). Но месяц назад в очередном порыве изучения clojure, у Алекса наткнулся на упоминания о проекте &lt;a href="http://incanter.org/"&gt;incanter&lt;/a&gt;. Лучше всего его описали сами авторы: 
&lt;/p&gt;
&lt;blockquote&gt;Incanter is a Clojure-based, R-like platform for statistical computing and graphics.&lt;/blockquote&gt;
&lt;p&gt;
В этой статье я попробую рассказать, как я, человек знакомый с clojure только по статьям/книгам/скринкастам, использовал incanter для построения интересных, на мой взгляд, графиков работы нашего приложения. 
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/03/clojureincanter.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-6335057064292047981?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=DFXdN_bfGwk:szBYX-avCDU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/DFXdN_bfGwk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/6335057064292047981/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/03/clojureincanter.html#comment-form" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6335057064292047981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6335057064292047981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/DFXdN_bfGwk/clojureincanter.html" title="Субботний вечер пропаганды маргинальных технологий: Статистический анализ с помощью clojure и incanter" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-9tBREyP_YAg/TZ1R5kx2ZXI/AAAAAAAAAcY/SSLLAEnb8WA/s72-c/incanter-i-logo-holo.png" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/03/clojureincanter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEECQ34-fip7ImA9WhZREUo.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-7133243452242745300</id><published>2011-03-07T19:46:00.001+02:00</published><updated>2011-04-07T13:37:42.056+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T13:37:42.056+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Две стороны одной медали: удобство разработки</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-y_PTOdT0-Fk/TZ2Sxsd6QVI/AAAAAAAAAco/GXAdaBzvyqM/s1600/two-sides-of-same-coin.jpg" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="105" width="200" src="http://4.bp.blogspot.com/-y_PTOdT0-Fk/TZ2Sxsd6QVI/AAAAAAAAAco/GXAdaBzvyqM/s200/two-sides-of-same-coin.jpg"&gt;&lt;/a&gt;&lt;/div&gt;
Хотел немного подробнее раскрыть упомянутый в предыдущем посте антипаттерн &amp;quot;Immutable Class&amp;quot;, изобретение которого принадлежит моей клавиатуре. В данном конкретном случая, это была попытка в Java реализовать Immutable object. И тут возникла проблема, которая всегда актуальна в спорах &amp;quot;динамическая типизация vs статическая типизация&amp;quot;. Т.е. с одной стороны можно сделать конечный код (который использует этот класс) более простым, с другой стороны мы получаем ошибки, которые, как правильно в &lt;a href="http://pdrobushevich.blogspot.com/2010/10/immutability.html"&gt;исходном посте&lt;/a&gt;&lt;a href="http://pdrobushevich.blogspot.com/2010/10/immutability.html?showComment=1289732214768#c1640629424244356278"&gt; заметил Андрей&lt;/a&gt; не находятся компилятором. И это действительно произошло, у людей были проблемы с модификацией этого класса, из за чего он и был наречён immutable. Хотел бы более развёрнуто описать почему я так решил, вернее почему мне кажется, что ответ на это вопрос не так однозначен. В самом исходном посте одну из причин я уже указывал, это наследования с огромным количеством переопределенных методов. Тут хотел рассмотреть вопрос удобства изменения только этого класса. Комментарии и в особенности критика приветствуются.
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/03/blog-post.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-7133243452242745300?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=d2qsw-QW-bI:HWFeDobHml8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/d2qsw-QW-bI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/7133243452242745300/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/03/blog-post.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/7133243452242745300?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/7133243452242745300?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/d2qsw-QW-bI/blog-post.html" title="Две стороны одной медали: удобство разработки" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-y_PTOdT0-Fk/TZ2Sxsd6QVI/AAAAAAAAAco/GXAdaBzvyqM/s72-c/two-sides-of-same-coin.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/03/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4GQH0ycSp7ImA9WhZREUo.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-8789236809280951068</id><published>2011-03-06T18:16:00.001+02:00</published><updated>2011-04-07T13:42:01.399+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T13:42:01.399+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>О поиске простого решения или как я писал JobStore для Quartz</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-vVtVx4rn9L0/TZ2U8U2wl3I/AAAAAAAAAcw/9bE8LtzlluU/s1600/quartzEJS_med.jpg" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="92" width="190" src="http://1.bp.blogspot.com/-vVtVx4rn9L0/TZ2U8U2wl3I/AAAAAAAAAcw/9bE8LtzlluU/s200/quartzEJS_med.jpg"&gt;&lt;/a&gt;&lt;/div&gt;
Java очень хорошо известна своим разнообразием различных Open Source frameworks, одни ребята из Apache наверно несколько десятков сгенерировали. Причём всегда есть много альтернатив (к сожалению, зачастую все равно выбрать нечего :))). Но есть планировщик задач &lt;a href="http://www.quartz-scheduler.org/"&gt;Quartz&lt;/a&gt;, которому нет альтернативы, почти стандарт, так сказать. Причём с архитектурной точки зрения он довольно прост и хорош. У нас есть &lt;a href="http://www.quartz-scheduler.org/docs/api/1.8.1/org/quartz/Scheduler.html"&gt;Scheduler&lt;/a&gt; в котором мы регистрируем &lt;a href="http://www.quartz-scheduler.org/docs/api/1.8.1/org/quartz/Trigger.html"&gt;Trigger&amp;#39;ы&lt;/a&gt; и &lt;a href="http://www.quartz-scheduler.org/docs/api/1.8.1/org/quartz/Job.html"&gt;Job&amp;#39;ы&lt;/a&gt; и связи между ними, таким образом каждый триггер может активировать одну или несколько работ.
&lt;/p&gt;
&lt;p&gt;
Данная библиотека одна из ключевых в одном из наших подпроектов. Важный вопрос как всегда это persistence. Т.е. возможны следующие случаи к примеру:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Если триггер должен сработать только несколько раз. То после рестарта приложения Scheduler должен знать об этом и не активировать его.
&lt;/li&gt;
&lt;li&gt;
Если у нас есть триггер, который должен срабатывать каждый час, но спустя, например, 59 минут наше приложение упало. То когда его перезапустили, этот триггер должен сработать через минуту, а не через час.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Это вопрос в Quartz так же решён. Есть интерфейс &lt;a href="http://www.quartz-scheduler.org/docs/api/1.8.1/org/quartz/spi/JobStore.html"&gt;JobStore&lt;/a&gt;, к которому обращается Scheduler за всеми нужными данными и он должен обеспечивать сохранность данных. По умолчанию существуют две реализации RAM и JDBC. Как нетрудно догадаться, RAM никакой сохранности не обеспечивает, но JDBC по сути должно хватить всем, так как почти любая СУБД к вашим услугам. К сожалению для нас это не так, мы не используем СУБД. Поэтому пришлось реализовывать JobStore самостоятельно. И вот тут, тот, кто также успел сходить по ссылке на api JobStore, мог ужаснуться, так как JobStore - это интерфейс наверно на полсотни методов. Поэтому под катом, моя история, как я пытался малой кровью реализовать этого бегемота для наших нужд :)
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/03/jobstore-quartz.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-8789236809280951068?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=qzsN-Rnl-Jc:TnmbWBDkPcA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/qzsN-Rnl-Jc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/8789236809280951068/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/03/jobstore-quartz.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/8789236809280951068?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/8789236809280951068?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/qzsN-Rnl-Jc/jobstore-quartz.html" title="О поиске простого решения или как я писал JobStore для Quartz" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-vVtVx4rn9L0/TZ2U8U2wl3I/AAAAAAAAAcw/9bE8LtzlluU/s72-c/quartzEJS_med.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/03/jobstore-quartz.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcDQHg9fSp7ImA9WhZREk0.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-250495474608142885</id><published>2011-02-19T20:23:00.004+02:00</published><updated>2011-04-07T22:04:31.665+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T22:04:31.665+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Маргинальное" /><title>Субботний вечер пропаганды маргинальных технологий: Анемичная модель</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-8QinEwdcS4g/TZ4KuF3a-xI/AAAAAAAAAdY/k9b7WRZm6I0/s1600/tools2blue.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="200" width="162" src="http://3.bp.blogspot.com/-8QinEwdcS4g/TZ4KuF3a-xI/AAAAAAAAAdY/k9b7WRZm6I0/s200/tools2blue.png"&gt;&lt;/a&gt;&lt;/div&gt;
Ох, эта статья будет ещё более сумбурная, чем они бывают обычно у меня. Просто есть какие-то мысли и надо их немного устаканить.&lt;/p&gt;
&lt;p&gt;Есть такой человечище, зовут Мартином. Когда я ещё только играл в HoMM 3, он уже написал статью про анти-паттерн &lt;a href="http://martinfowler.com/bliki/AnemicDomainModel.html"&gt;AnemicDomainModel&lt;/a&gt;. И не смотря на то, что я запоем читал некоторые его книги и статьи, с этим я совершенно не согласен.&lt;br&gt;
&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/02/blog-post.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-250495474608142885?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=N4YEdWLfi0I:yxmq154aBB8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/N4YEdWLfi0I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/250495474608142885/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/02/blog-post.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/250495474608142885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/250495474608142885?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/N4YEdWLfi0I/blog-post.html" title="Субботний вечер пропаганды маргинальных технологий: Анемичная модель" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-8QinEwdcS4g/TZ4KuF3a-xI/AAAAAAAAAdY/k9b7WRZm6I0/s72-c/tools2blue.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/02/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4NSXo_eip7ImA9WhZREUo.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-5978512575850702540</id><published>2011-02-19T12:21:00.003+02:00</published><updated>2011-04-07T13:59:58.442+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T13:59:58.442+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>java.lang.Process баги</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-LCu92aXdn2w/TZ2ZJ2g2jLI/AAAAAAAAAdI/hfXSkaGDdJQ/s1600/no-java.original.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="200" width="200" src="http://1.bp.blogspot.com/-LCu92aXdn2w/TZ2ZJ2g2jLI/AAAAAAAAAdI/hfXSkaGDdJQ/s200/no-java.original.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Хотел бы в очередной раз поругать Java'у. В этот раз по делу :)&lt;/p&gt;
&lt;p&gt;Есть такой интерфейс java.lang.Process и класс Runtime, которые позволяют &amp;nbsp;запускать другие приложения, скажем так. У нас это достаточно частая штука. Скажем даже основная функция (:&lt;/p&gt;
&lt;p&gt;Поэтому следующие два&amp;nbsp;взаимодополняющих&amp;nbsp;бага в JVM прочувствовали очень сильно на себе.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4254231"&gt;Process.waitFor() fails to return&lt;/a&gt;. Проблема заключается в том, что waitFor может упасть, если никто не вычитает stream'ы процесса. Я не зря употребил слово _может&amp;nbsp;_, так как это например у нас первый раз появилось спустя несколько месяцев тестирования. Ладно, его типа закрыли, так как можно перед вызовом waitFor прочитать потоки процесса и всё будет хорошо. Ага, только в каком-либо другом, идеальном мире.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5101298"&gt; "IOException: Stream closed" if more data sent after Process.destroy&lt;/a&gt;. Тут мы приходим ко второму багу. Так как если применить выше указанный способ, т.е. запускать процесс, открывать потоки и читать их до завершения у работающего процесса, то в случае если его кто-нибудь kill'нёт, что для ряда процессов у нас нормальное явление, то мы получаем ещё один прекрасный exception при чтении. И этот баг не закрыт.&lt;/p&gt;
&lt;p&gt;Да, варианты конечно всегда есть, даже несколько. Можно глотать exception, можно использовать цикл и exitValue, вместо waitFor. Но оба&amp;nbsp;смотрятся по&amp;nbsp;уродски.&lt;/p&gt;
&lt;p&gt;Вот такая нелёгкая жизнь у Java программиста :) И я бы &lt;s&gt;Sun&lt;/s&gt;&amp;nbsp;Oracle всё бы простил, если бы это происходила на какой-нибудь Windows, так нет, тут всё хорошо, а происходят эти баги на той самой SunOS.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-5978512575850702540?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=cwurhGWt9bY:_x2WesZWSdo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/cwurhGWt9bY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/5978512575850702540/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/02/javalangprocess.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/5978512575850702540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/5978512575850702540?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/cwurhGWt9bY/javalangprocess.html" title="java.lang.Process баги" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-LCu92aXdn2w/TZ2ZJ2g2jLI/AAAAAAAAAdI/hfXSkaGDdJQ/s72-c/no-java.original.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/02/javalangprocess.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQNQnY6fSp7ImA9WhZREUo.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-567852716876453751</id><published>2011-01-07T23:22:00.002+02:00</published><updated>2011-04-07T13:49:53.815+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T13:49:53.815+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Плоды работы воспалённого мозга" /><title>Новогоднее обещание :)</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-c77dsxKK6cw/TZ2WxZgSP-I/AAAAAAAAAdA/sX6oxt_EjWM/s1600/BenBois_Christmas_tree.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="200" width="133" src="http://3.bp.blogspot.com/-c77dsxKK6cw/TZ2WxZgSP-I/AAAAAAAAAdA/sX6oxt_EjWM/s200/BenBois_Christmas_tree.png"&gt;&lt;/a&gt;&lt;/div&gt;
Не привычный пост :) Обычно пишу всякий рабочий треш, куча которого скопилась ещё и в draft&amp;#39;ах :) Но тут другое дело. Некоторый поток сознания приведший к этому можно почитать в buzz&amp;#39;е. Но если кратко. Часто видел/читал про американскую традицию давать в новый год всякие обещания на следующий, типа бросить курить или похудеть. Я решил, что надо поумнеть. Не знаю как у кого, но у меня знания очень трудно усваиваются после прочтения книжки, даже если делать задания в конце глав (а в некоторых таких заданий и нет). Вообщем было решено написать проектик, конечно же open source. Ничего нового и никаких startup&amp;#39;ов, просто проект, в котором можно было бы попробовать немного того, что прочитал или увидел в книгах, конференциях, статьях, подкастах и пр. Как всегда часто возникает вопрос, почему бы не присоединиться к существующему проекту. Всё просто, я хочу учить, попробовать много фишек, вообщем это не для проектов, которые ставят цель создать продукт, в конце я конечно надеюсь к декабрю 2010 получить продукт, но всё же основная цель поиграться, понабивать шишек, которые недоступны в hello world приложениях.&lt;/p&gt;
&lt;p&gt;Больше двух с половиной лет, я каким то образом занимаюсь ETL и обработкой данных. И знаете, мне это нравиться. Вот и решил написать свою ETL :) Их тыщи, ещё одна не повредит. Ах да, и спасибо &lt;a href="http://www.shcoder.by/"&gt;Андрею&lt;/a&gt; и &lt;a href="http://d2nx.ru/"&gt;Вите&lt;/a&gt;, вместе проработали много, делали PoC такой ETL на .NET.  Да и вся с кем я работа(л/ю). Получил бесценный опыт и большинство, что я тут напишу я знаю благодаря им. И конечно Ване, который меня познакомил со всеми этими отличными людьми.&lt;/p&gt;
&lt;p&gt;Под катом, немного подробностей, если кому интересно.&lt;/p&gt;
&lt;p&gt;И конечно же всех с наступившим Новым годом и успехов вам в ваших проектах!&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2011/01/blog-post.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-567852716876453751?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=JvWJbVF-BtY:tKyooypr_7M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/JvWJbVF-BtY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/567852716876453751/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2011/01/blog-post.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/567852716876453751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/567852716876453751?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/JvWJbVF-BtY/blog-post.html" title="Новогоднее обещание :)" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-c77dsxKK6cw/TZ2WxZgSP-I/AAAAAAAAAdA/sX6oxt_EjWM/s72-c/BenBois_Christmas_tree.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2011/01/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQMQXc_eyp7ImA9Wx9aE0k.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-2385620613575038301</id><published>2010-12-06T22:47:00.011+02:00</published><updated>2011-03-05T20:06:20.943+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-05T20:06:20.943+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Плоды работы воспалённого мозга" /><title>Java Generics vs Наследование</title><content type="html">&lt;p&gt;Вообщем по &lt;a href="http://twitter.com/#!/davion_groovy/status/11798178370158592"&gt;просьбе&lt;/a&gt; &lt;a href="http://twitter.com/#!/davion_groovy"&gt;Viktor Davion&lt;/a&gt; объясняю (в 140 твиттеровских символов не уложился), отчасти, что побудило к &lt;a href="http://twitter.com/#!/pdrobushevich/status/11774626975719424"&gt;посту ненависти&lt;/a&gt;. Под катом, т.к. содержит плоды работы воспалённого мозга.&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2010/12/java-generics-vs.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-2385620613575038301?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=sNN-tVkvMxY:_0FuWOsZKMk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/sNN-tVkvMxY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/2385620613575038301/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/12/java-generics-vs.html#comment-form" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/2385620613575038301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/2385620613575038301?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/sNN-tVkvMxY/java-generics-vs.html" title="Java Generics vs Наследование" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/12/java-generics-vs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEBR305cCp7ImA9Wx9aE0k.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-5225369705088943826</id><published>2010-11-05T00:29:00.001+02:00</published><updated>2011-03-05T20:10:56.328+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-05T20:10:56.328+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Code coverage для интеграционного тестирования</title><content type="html">&lt;p&gt;Итак, ситуация следующая. Есть у нас Integration Test Framework, написанный специально для нашего приложения. Но начался он писаться задолго после старта работы над приложением, поэтому накопилось большое количество кода, который тестируется в лучшем случае unit тестами. Как это всё вместе работает не совсем понятно :) Для это писался этот ITF, но он ещё в разработке и тесты пишутся достаточно медленно. Вот в процессе обсуждение этого факта, мне подумалось, а почему бы не считать каково покрытие тестами у нас. Вообще, было замечено, что многие программисты очень плохо относятся ко всяким таким характеристикам как сode coverage. Вот для unit тестов оно у нас не считается, но локально иногда запускаешь посмотреть, сейчас у нас больше 80%. Но, как мне сказали, о чём это говорит? Из за неправильного ответа на этот вопрос и возникает такая не любовь к этой величине. То, что сode coverage 100% это не значит, что вы достигли просветление, ваше приложение идеально и вы на пути к нирване. Но это говорит о том, что весь написанный код, действительно вызывается, т.е. это немного спасает от простых ошибок.&lt;/p&gt;
&lt;p&gt;Но вернёмся к ITF. Почему я считаю, что для интеграционных тестов сode coverage более полезен.&lt;/p&gt;
&lt;ol&gt;
&lt;p&gt;&lt;li&gt;Меньше возможностей для искусственной манипуляции результатами. Как иногда бывает с простыми численными характеристиками, за что их и не любят, люди увлекаются попыткой их достижения. И если мы говорим о unit тестах, то достаточно просто написать много, по своей сути бесполезных тестов, которые дадут требуемую цифру. Это ещё одна из причин, почему test first :) Но для интеграционных тестов это не так. Они не работают напрямую с методами или классами. Они используют исключительно пользовательское api, создание файла, нажатие на кнопку и т.п. Поэтому пытаться искусственно делать 100% покрытие очень трудоёмкая задача. Кроме того, даже для ручного тестирования, многие все равно прикручивают сode coverage, чтобы увидеть это заветное число, после того как тестировщики погоняют приложение. Это даёт много интересной информации для размышления.&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;Мы оказались в ситуации, что интеграционные тесты приходится писать вдогонку. Уже есть большая часть приложения, команда разрослась почти до 10 человек и всего 2 тестировщика. Таким образом, отслеживая величину покрытия, можно делать выводы о том, мы догоняем или всё таки уже опоздали. Т.е. если на предыдущей недели было 20%, а на этой стало 23%, то мы на верном пути, но если стало 10%, то слишком увлеклись генерированием не проверенного кода и наверно стоит поднапрячь программистов, чтобы они побольше внимания уделяли написанию интеграционных тестов в помощь тестировщикам.&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div&gt;В результате всё таки создал такой таск и решил на досуге посмотреть, что может предложить open source java community поэтому поводу. Надо была попроще библиотека, которая позволяла посчитать покрытие кода, по результатам работы приложения. начал конечно же с &lt;a href="http://java-source.net/open-source/code-coverage/codecover"&gt;Open Source Software in Java&lt;/a&gt;. В принципе, предложения есть. Я выбрал последнее с &amp;quot;оригинальным&amp;quot; названием &lt;a href="http://codecover.org/"&gt;CodeCover&lt;/a&gt;. Последняя версия можно считать 1.0.* оформленная ажно в 2009 году, но плагин под эклипс обновлялся в 2010, да и остальные тулы, тоже не сильно новее. Маленький проектик hoto можно увидеть под катом, если заинтересовало.&lt;/div&gt;&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2010/11/code-coverage.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-5225369705088943826?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=Mac_SPe7py0:c57AUC2r-Z8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/Mac_SPe7py0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/5225369705088943826/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/11/code-coverage.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/5225369705088943826?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/5225369705088943826?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/Mac_SPe7py0/code-coverage.html" title="Code coverage для интеграционного тестирования" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_a4Q2DEgLPvg/TNNUOV_-CdI/AAAAAAAAAUw/mbR-4WBc6QA/s72-c/codecover-main.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/11/code-coverage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04AR3w7cSp7ImA9WhZREUg.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-812158646843092487</id><published>2010-10-30T20:08:00.009+03:00</published><updated>2011-04-07T08:59:06.209+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T08:59:06.209+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Маргинальное" /><title>Субботний вечер пропаганды маргинальных технологий: hgsubversion</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-BoN87m0Ywd0/TZ1SlWtcl5I/AAAAAAAAAcg/nS6__jtdl6g/s1600/mercurial-logo-droplets-200.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="240" width="200" src="http://1.bp.blogspot.com/-BoN87m0Ywd0/TZ1SlWtcl5I/AAAAAAAAAcg/nS6__jtdl6g/s320/mercurial-logo-droplets-200.png"&gt;&lt;/a&gt;&lt;/div&gt;
Как можно было заметить, обычно в блоге пишу про рабочие моменты. Поэтому решил отдельно выделить записи, которые будут посвященных не очень популярных в &amp;quot;энтерпрайз&amp;quot; кругах, технологиях и темах :)&lt;/p&gt;
&lt;p&gt;Сегодня хотел немного затронуть тему &lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control"&gt;распределенных систем контроля версий&lt;/a&gt;. На самом деле, эта тема достаточно популярно, просто больших компаниях приживается очень плохо, некоторые, как я узнал, например в &lt;a href="http://iba.by/index.html"&gt;IBA&lt;/a&gt;, вообще cvs пользуются. Подробно рассказывать именно про DVCS не думаю, что есть смысл, материалов на всех языках мира хватает, как в общем про DVCS, так и про конкретные системы. Один из главных зачинатилей всего безобразия, это Линус, так что в качестве введения можно посмотреть&lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt; его выступление в кампусе Google&lt;/a&gt;, где в его духе эмоционально рассказано кто не прав и почему :)&lt;/p&gt;
&lt;p&gt;Я расскажу про немного другую проблему. Когда вы делаете не свой продукт, а под заказ или являетесь всего лишь небольшим подпроектом огромного проекта, часть технологий вы выбрать не можете и вынужденны использовать subversion. Но ведь хочется вкусненького, и это возможно. Почти все разработчики DVCS понимают, что все сейчас прям не бросятся переводить свои репозитории на новые рельсы. Поэтому присутствует интеграция с многими другими системами контроля версий. Например с subversion. Вот хотел бы рассказать про hgsubversion, проект, который позволяет интегрировать subversion и mercurial репозитории. Был опробован на реальном проекте и пока никаких проблем не возникло.&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2010/10/hgsubversion.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-812158646843092487?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=vfxuhkxJWLw:1lUpqJFwCNQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/vfxuhkxJWLw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/812158646843092487/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/10/hgsubversion.html#comment-form" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/812158646843092487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/812158646843092487?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/vfxuhkxJWLw/hgsubversion.html" title="Субботний вечер пропаганды маргинальных технологий: hgsubversion" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-BoN87m0Ywd0/TZ1SlWtcl5I/AAAAAAAAAcg/nS6__jtdl6g/s72-c/mercurial-logo-droplets-200.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/10/hgsubversion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMFQnY9fip7ImA9Wx9aFUw.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-718185623282505754</id><published>2010-10-29T00:15:00.007+03:00</published><updated>2011-03-07T19:03:33.866+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T19:03:33.866+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Банальности" /><title>Требую больше immutability!</title><content type="html">&lt;p&gt;Вообщем тривиальная слоган, его можно прочитать даже в достаточно старой &lt;a href="http://www.shelfari.com/books/51000/Effective-Java-Programming-Language-Guide"&gt;Joshua Bloch: Effective Java&lt;/a&gt;, Item 15: Minimize mutability.&lt;/p&gt;
&lt;p&gt;Под катом чутка банальности, так как сегодня доделал и наболело.&lt;/p&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2010/10/immutability.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-718185623282505754?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=ol9V6K2eynA:1cuIkNkdj5k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/ol9V6K2eynA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/718185623282505754/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/10/immutability.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/718185623282505754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/718185623282505754?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/ol9V6K2eynA/immutability.html" title="Требую больше immutability!" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/10/immutability.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcGQHo6eCp7ImA9Wx5UF00.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-6549590684091019399</id><published>2010-10-22T00:02:00.002+03:00</published><updated>2010-10-22T03:07:01.410+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-22T03:07:01.410+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Java сompile time annotations</title><content type="html">Ох.. тут давече затеяли большой рефакторинг проекта в рамках которого я решил сделать пару классов &lt;a href="http://en.wikipedia.org/wiki/Immutable_object"&gt;immutable&lt;/a&gt;. Казалось бы, делаем все поля private + final и всё ок. Но нет, для ссылочных типов это не работает. Так как в этом случае мы не можем изменить ссылку на этот объект, которая храниться в поле, но за то можем изменить сам этот объект, например добавить в коллекцию ещё пару объектов. Тут есть два подхода, оба приводят к равно ценном результату (immutable классу):&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;&lt;li&gt;Требовать, чтобы все ссылочные типы также были immutable, как String например. Для коллекций можно использовать Collections.unmodifiableCollection метод.&lt;/li&gt;
&lt;li&gt;Второй способ заключается в основе ООП: инкапсуляции. Ни один метод не возвращает объект по ссылке, только его копию, например вместо возврата коллекции можно вернуть её неизменяемую копию с помощью описанного выше метода.&lt;/li&gt;
&lt;/ol&gt;Вообщем то всё достаточно очевидно. Ввиду ряда особенностей и уменьшения последствий рефаторинга, посоветовавшись, я решил воспользоваться вторым способом. Но пока рассматривал первый метод, захотелось аннотацию, которая бы сигнализировала, что объект не изменяем и корректность класса проверялась на этапе компиляции. Если кого-то заинтересовала, краткое описание под катом.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://pdrobushevich.blogspot.com/2010/10/java-compile-time-annotations.html#more"&gt;Дальше »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-6549590684091019399?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=trsjo4q2STY:mdRjEr2d7FI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/trsjo4q2STY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/6549590684091019399/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/10/java-compile-time-annotations.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6549590684091019399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6549590684091019399?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/trsjo4q2STY/java-compile-time-annotations.html" title="Java сompile time annotations" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_a4Q2DEgLPvg/TMDQ_EBwe-I/AAAAAAAAAUQ/5Q-As6y9RXc/s72-c/tools.jar" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/10/java-compile-time-annotations.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YHQXg6cCp7ImA9Wx5XF08.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-3359480673577220974</id><published>2010-09-16T21:07:00.001+03:00</published><updated>2010-09-17T15:05:30.618+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-17T15:05:30.618+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Log4j file header</title><content type="html">Давно не писал, но тут накипело. Читал буквально позавчера статью&amp;nbsp;&lt;a href="http://www.skipy.ru/architecture/module_design.html"&gt;Модульный дизайн, или «что такое DIP, SRP, IoC, DI и т.п.»&lt;/a&gt;. Вот там говориться про великий Log4j, какой он распрекрасный. И вот понадобилось мне сделать header для файлов. Такой вот конфиг:&lt;br /&gt;
&lt;script&gt;
function CopyToClipboard(c) { var code=getNodeData(document.getElementById(c).nextSibling);if(window.clipboardData){window.clipboardData.setData('text',code);}else{cfc=document.createElement('div');document.getElementById('-uniqueid-').appendChild(cfc);cfc.innerHTML='&lt;embed src="http://aivolkov.ru/_js/clipboard.swf" FlashVars="clipboard='+encodeURIComponent(code)+'" width="0" height="0" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;';}alert('The code is in your clipboard now');} function getNodeData(c){var t='';if(c.nodeType==3)return c.data;if (c.hasChildNodes()){for(var i=0;i&lt;c.childNodes.length;i++)t+=getNodeData(c.childNodes[i]);}return t;}
&lt;/script&gt;








&lt;div style="background-color: #e7e5dc; border: none; font-family: Consolas,Monaco,Courier New,Courier,monospace !important; font-size: 12px; font-weight: normal; margin: 0; overflow: auto; padding-top: 1px; padding: 0;"&gt;

&lt;div id="id_8878494766" style="padding-left: 45px;"&gt;

&lt;div style="background-color: #f8f8f8; border-left: 3px solid #6CE26C; font-size: 9px; padding: 3px 8px 3px 10px;"&gt;

&lt;a href="javascript:CopyToClipboard('id_8878494766')" style="color: #a0a0a0; text-decoration: none;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://aivolkov.ru/online-syntax-highlighter/" style="color: #a0a0a0; float: right; margin-top: -12px;"&gt;подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol style="background-color: white; border-left: 3px solid #6CE26C; color: #5c5c5c; line-height: 14px; list-style-position: outside; list-style: decimal; margin: 0px 0px 1px 45px !important; padding: 0px;"&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;lt;appender&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"eventhistoryfile"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"&amp;nbsp;org.apache.log4j.RollingFileAppender"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param&amp;nbsp;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"LogFileName"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"${log4j.file.name}"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;/&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;layout&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"org.apache.log4j.PatternLayout"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param&amp;nbsp;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"ConversionPattern"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"${log4j.pattern}"&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;/&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/layout&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;lt;/appender&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;Очень простой.. Как добавить хедер? Оказывается &lt;i&gt;PatternLayout &lt;/i&gt;содержит пустую реализацию метода &lt;i&gt;getHeader&lt;/i&gt;. Ну и как это называется??? Ладно, сделал свой, который добавляет эту функциональность, не сложно.
Идём дальше. Запустил, работает. Вырубил&amp;nbsp;приложение, запустил ещё раз появился ещё один&amp;nbsp;header&amp;nbsp;в файле О_о я нахожусь в шоке. Пришлось ещё наследоваться от&amp;nbsp;&lt;i&gt;RollingFileAppender &lt;/i&gt;и переопределять у него метод&amp;nbsp;&lt;i&gt;writeHeader&lt;/i&gt;, чтобы header в файл писался один раз (код взят в исходном&amp;nbsp;&lt;i&gt;FileAppender&lt;/i&gt;&amp;nbsp;&amp;nbsp;только добавлена последняя проверка).



&lt;div style="background-color: #e7e5dc; border: none; font-family: Consolas,Monaco,Courier New,Courier,monospace !important; font-size: 12px; font-weight: normal; margin: 0; overflow: auto; padding-top: 1px; padding: 0;"&gt;

&lt;div id="id_7803176290" style="padding-left: 45px;"&gt;

&lt;div style="background-color: #f8f8f8; border-left: 3px solid #6CE26C; font-size: 9px; padding: 3px 8px 3px 10px;"&gt;

&lt;a href="javascript:CopyToClipboard('id_7803176290')" style="color: #a0a0a0; text-decoration: none;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://aivolkov.ru/online-syntax-highlighter/" style="color: #a0a0a0; float: right; margin-top: -12px;"&gt;подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol style="background-color: white; border-left: 3px solid #6CE26C; color: #5c5c5c; line-height: 14px; list-style-position: outside; list-style: decimal; margin: 0px 0px 1px 45px !important; padding: 0px;"&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&lt;span style="color: #646464;"&gt;@Override&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;protected&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;void&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;writeHeader()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;.layout&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;return&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;header&amp;nbsp;=&amp;nbsp;layout.getHeader();&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;(header&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;.qw&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;return&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File&amp;nbsp;f&amp;nbsp;=&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;File(&lt;/span&gt;&lt;span style="color: #006699; font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;.getFile());&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;(!f.exists()&amp;nbsp;||&amp;nbsp;(f.exists()&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;f.length()&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #c00000;"&gt;0&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;))&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #006699; font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="background-color: inherit; color: black;"&gt;.qw.write(header);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: white; color: inherit; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;li style="background-color: #f8f8f8; color: #5c5c5c; margin: 0; padding: 0 3px 0 10px;"&gt;&lt;span style="background-color: inherit; color: black;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;Вообщем, &lt;b&gt;негодую&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-3359480673577220974?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=EemGG1Ef03g:1ioASqzfQAg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/EemGG1Ef03g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/3359480673577220974/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/09/log4j-file-header.html#comment-form" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3359480673577220974?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3359480673577220974?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/EemGG1Ef03g/log4j-file-header.html" title="Log4j file header" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/09/log4j-file-header.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYAQXw5eyp7ImA9WxFUEUs.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-7711428475555201027</id><published>2010-06-22T01:55:00.005+03:00</published><updated>2010-06-22T02:32:20.223+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-22T02:32:20.223+03:00</app:edited><title>Crash Racing</title><content type="html">Для получения Диплома осталось только подписать обходной лист. Вот разбирал архивы, чтобы всё накопленное записать на dvd и сдать в архив, и наткнулся на прикольный проект. На втором курсе у нас Java вёл очень хороший преподаватель Гафуров Сергей Владимирович. И в конце курса &amp;nbsp;мы разбились на команды и где-то недели две писали сетевую игру на Java. Мы выбрали гоночки и как видно из заголовка поста - разрушительные гоночки. Это был невероятный проект и очень полезный, заставил&amp;nbsp;по другому&amp;nbsp;взглянуть на программирование. Всё таки работа в команде, это работа в команде :) Где-то в середине проекта стало понятно, что мы не успеваем и пришлось перебороть юношеский максимализм и волевым усилием отказаться от оружия. Зато к сроку у нас был работающий проект, хоть и разрушать ничего нельзя было. Вот на память записал видео сражения 4х ботов на моей любимой карте, за ними наблюдать иногда веселее чем самому играть, а благодаря Диме Гончарову выиграть у них практически не возможно =DD это удавалось только Диме Хоревичу. Кстати да, о лицах :) Первый Дима как не сложно&amp;nbsp;догадаться работал над физикой и ИИ, второй над UI, Катя Цвирко сделала потрясающие карты и работала с панелью игрового поля. А я скромно писал сетевое&amp;nbsp;взаимодействие. Играть можно было по сети. Так как ботов было трудно победить - сражались между собой :) Игра не поражает воображение, но это всё таки учебный проект второкурсников, причём в жатые сроки, мне нравиться ^__^&lt;br /&gt;
&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-YrU0G-oQOU&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999"&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/-YrU0G-oQOU&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
Код не покажу, стыдно :)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Upd:&lt;/b&gt;&amp;nbsp;Видео уже лень делать, вот скриншоты :)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_a4Q2DEgLPvg/TB_2TOCeaKI/AAAAAAAAASA/5w44_U-d0Pc/s1600/sea.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_a4Q2DEgLPvg/TB_2TOCeaKI/AAAAAAAAASA/5w44_U-d0Pc/s320/sea.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_a4Q2DEgLPvg/TB_2e1RT1jI/AAAAAAAAASI/AQWKvIzlgjk/s1600/red.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_a4Q2DEgLPvg/TB_2e1RT1jI/AAAAAAAAASI/AQWKvIzlgjk/s320/red.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-7711428475555201027?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=vBNjoraeO_4:VNYN8wenKkw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/vBNjoraeO_4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/7711428475555201027/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/06/crash-racing.html#comment-form" title="Комментарии: 15" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/7711428475555201027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/7711428475555201027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/vBNjoraeO_4/crash-racing.html" title="Crash Racing" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_a4Q2DEgLPvg/TB_2TOCeaKI/AAAAAAAAASA/5w44_U-d0Pc/s72-c/sea.PNG" height="72" width="72" /><thr:total>15</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/06/crash-racing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4DRXo9fCp7ImA9WxFXEEw.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-6309905061235785666</id><published>2010-05-16T10:14:00.005+03:00</published><updated>2010-05-16T16:36:14.464+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-16T16:36:14.464+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Прикольный workaround для деплоя репортов в Reporting Services</title><content type="html">Reporting Services штука полузная. Сделаные в VS репорты для него можно деплоить по разному. Через web интерфейс, с помощью&amp;nbsp;SQL Server Management Studio. Но иногда нужны автоматические скрипты. Для этого есть утилитка&amp;nbsp;rs.exe.&lt;br /&gt;
rs.exe -i MyReportScript.rss -s http://localhost/reportserver&lt;br /&gt;
MyReportScript.rss - это скрипт на VB, который и загружает репорт или репорты.&lt;br /&gt;
Вот так примерно выглядит код загрузки:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vbnet" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;"&gt;&lt;ol&gt;&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&lt;span style="color: #0600FF;"&gt;Try&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; &lt;span style="color: #0600FF;"&gt;Dim&lt;/span&gt; stream &lt;span style="color: #FF8000;"&gt;As&lt;/span&gt; FileStream &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;a style="color: #000060;" href="http://www.google.com/search?q=FILE+site:msdn.microsoft.com"&gt;&lt;span style="color: #008000;"&gt;File&lt;/span&gt;&lt;/a&gt;.&lt;span style="color: #0000FF;"&gt;OpenRead&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;reportName &lt;span style="color: #008000;"&gt;+&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;quot;.rdl&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; definition &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #FF8000;"&gt;New&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;stream.&lt;span style="color: #0000FF;"&gt;Length&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; stream.&lt;span style="color: #0000FF;"&gt;Read&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;definition, &lt;span style="color: #FF0000;"&gt;0&lt;/span&gt;, &lt;span style="color: #0600FF;"&gt;CInt&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;stream.&lt;span style="color: #0000FF;"&gt;Length&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: bold; vertical-align:top;font-weight: bold; color: #006060;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; stream.&lt;span style="color: #0600FF;"&gt;Close&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; &lt;span style="color: #0600FF;"&gt;Catch&lt;/span&gt; e &lt;span style="color: #FF8000;"&gt;As&lt;/span&gt; IOException&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; Console.&lt;span style="color: #0000FF;"&gt;WriteLine&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;e.&lt;span style="color: #0000FF;"&gt;Message&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&lt;span style="color: #0600FF;"&gt;End&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;Try&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: bold; vertical-align:top;font-weight: bold; color: #006060;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&lt;span style="color: #0600FF;"&gt;Try&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; warnings &lt;span style="color: #008000;"&gt;=&lt;/span&gt; rs.&lt;span style="color: #0000FF;"&gt;CreateReport&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;reportName, reportsPath, &lt;span style="color: #0600FF;"&gt;True&lt;/span&gt;, definition, props&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; Console.&lt;span style="color: #0000FF;"&gt;WriteLine&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;quot;Upload Report: {0}.&amp;quot;&lt;/span&gt;, reportName&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; &lt;span style="color: #0600FF;"&gt;Catch&lt;/span&gt; e &lt;span style="color: #FF8000;"&gt;As&lt;/span&gt; Exception&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; Console.&lt;span style="color: #0000FF;"&gt;WriteLine&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;e.&lt;span style="color: #0000FF;"&gt;Message&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: bold; vertical-align:top;font-weight: bold; color: #006060;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&lt;span style="color: #0600FF;"&gt;End&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;Try&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
Репорты делал не я и делались они 2005 студии. У меня стоит 2008, после пары изменений, я получаю вот такое сообщение:&lt;br /&gt;
System.Web.Services.Protocols.SoapException: The report definition is not valid. &amp;nbsp;Details: '.', hexadecimal value 0x00, is an invalid character. Line 4334, position 10.&lt;br /&gt;
Через&amp;nbsp;Management Studio загружается нормально.&lt;br /&gt;
Конечно же файл репорта представляет из себя просто ужасный xml. И что мы видем в строчке&amp;nbsp;4334? Заключительный закрывающийся тэг:&lt;br /&gt;
Становится совсем не понятно, но всемогущий гугль легко находит линку:&lt;br /&gt;
&lt;a href="http://connect.microsoft.com/SQLServer/feedback/details/331311/rs-exe-fails-to-deploy-a-report-upgraded-from-sql-server-2005-reporting-services-report-definition-is-not-valid"&gt;RS.EXE fails to deploy a report upgraded from SQL Server 2005 Reporting Services - "report definition is not valid"&lt;/a&gt;&lt;br /&gt;
Предложенное&amp;nbsp;решение проблемы меня просто поставило в тупик&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vbnet" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;"&gt;&lt;ol&gt;&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;Replacing&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;My_Byte_Array &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #FF8000;"&gt;New&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;stream.&lt;span style="color: #0000FF;"&gt;Length&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&lt;span style="color: #0600FF;"&gt;With&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;"&gt;&lt;div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;My_Byte_Array &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #FF8000;"&gt;New&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;stream.&lt;span style="color: #0000FF;"&gt;Length&lt;/span&gt; &lt;span style="color: #008000;"&gt;-&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
Вообщем даже не представляю как это у них получилось cгенерировать&amp;nbsp;такую проблему в новой студии, вообщем просто в шоке =D&lt;br /&gt;
Хотя я иногда и по круче отжиги делаю :)&lt;br /&gt;
&lt;br /&gt;
З.Ы.: Сорри за не самую красивую подсветку, просто мой любимый&amp;nbsp;&lt;a href="http://aivolkov.ru/online-syntax-highlighter/"&gt;Online syntax highlighter&lt;/a&gt;&amp;nbsp;что-то с VB на отрез отказался работать, а&amp;nbsp;&lt;a href="http://www.stevetrefethen.com/highlighter/default.aspx"&gt;HTML Source Code Syntax Highlighter&lt;/a&gt;&amp;nbsp;хоть и подсвечивает код, но не очень красиво.&lt;br /&gt;
&lt;br /&gt;
З.Ы.Ы.: &lt;a href="http://coonica.blogspot.com/"&gt;Катя&lt;/a&gt; подсказала более крутой сервис для подсветки кода, так как ей нужен был Object C, то она нашла &lt;a href="http://quickhighlighter.com/"&gt;вот этот&lt;/a&gt;, количество языков поражает. Только надо выбрать опцию Combine Style and HTML, чтобы он не генерировал отдельно css стиль, а всё выдавал html кодом. Качество подсветки хорошее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-6309905061235785666?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=p4OW9hS37cA:kboRtJZqj9U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/p4OW9hS37cA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/6309905061235785666/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/05/workaround-reporting-services.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6309905061235785666?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6309905061235785666?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/p4OW9hS37cA/workaround-reporting-services.html" title="Прикольный workaround для деплоя репортов в Reporting Services" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/05/workaround-reporting-services.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYHSXo9eCp7ImA9WxFSFUk.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-291588284222506111</id><published>2010-04-18T00:38:00.037+03:00</published><updated>2010-04-18T01:08:58.460+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-18T01:08:58.460+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><title>Java - отличная платформа, но слишком неповоротливый язык.</title><content type="html">Хотел поделится порцией очевидностей. Java - это действительно отличная платформа для разработки, с больших комьюнити, огромным числом Open Source библиотек, инструментов и т.п. Но вот язык Java этой платформы слишком устарел. Лично я не поклонник нагромождения синтаксического сахара, как например в Ruby. Но я сравниваю с C# и там есть много действительно полезных плюшек, практически полезных (я вообще пишу только о том, с чем лично столкнулся).&lt;br /&gt;
Вот два небольших примера.&lt;br /&gt;
1. Есть очень популярная задача, организовать конвейер для обработки документов, которые по сути из себя представляют Map или, если говорим о C#,  Dictionary. К Dictionary в дот нете, у меня есть одна большая претензия, он слишком часто кидает исключения. Но речь не об этом. Вот так выглядит простой документ, я добавил в него метод AddProperty, с помощью которого можно не только добавить элемент, но и перезаписать старый:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_5030394618"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_5030394618')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Document&amp;nbsp;:&amp;nbsp;Dictionary&amp;lt;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;string&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;object&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Document&amp;nbsp;AddProperty(&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;string&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;name,&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;object&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;)&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;if&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;(ContainsKey(name))&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Remove(name);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Add(name,&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Собственно ничего интересно, за исключение полезной штучки, метод возвращает не void, а самого себя.&lt;br /&gt;
API конвейера тоже простое:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_7987417063"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_7987417063')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Pipeline&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;void&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;AddProccessor(Func&amp;lt;Document,&amp;nbsp;Document&amp;gt;&amp;nbsp;proccessor)&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;void&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Execute()&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Вот тут почти самый главный момент. Делегаты это хорошо, мне надоели в том же свинге листенеры с одним методом, это ужас какой-то.&lt;br /&gt;
Но самое интересное теперь. Иногда требуется добавить очень простую обработку, которая просто добавляет пару полей к документу. В java пришлось бы поступить как в свинге, анонимный класс с реализацией метода интерфейса листенера. Но в C# &lt;a href="http://d2nx.ru"&gt;коллега&lt;/a&gt; подсказал очень и очень красивое решение:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_7091517489"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_7091517489')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;var&amp;nbsp;pipeline&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;new&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Pipeline();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;pipeline.AddProccessor(record&amp;nbsp;=&amp;gt;&amp;nbsp;record.AddProperty(&lt;span style="color:blue;"&gt;"NewProp"&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:blue;"&gt;"Value"&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;).AddProperty(&lt;/SPAN&gt;&lt;span style="color:blue;"&gt;"AnotherProp"&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;,&amp;nbsp;1));&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Действительно в одну строчку.&lt;br /&gt;
2. На эту тему копий сломано не мало, перегрузка методов или параметры по умолчанию. Кто бы, что ни говорил, но C# 4.0 c параметрами по умолчанию плюс именование параметров, лично для меня, отличное, красивое и удобно решение.&lt;br /&gt;
Вот есть метод:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_9385027634"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_9385027634')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;static&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;string&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;format(&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;string&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;bool&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;option1&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;false&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;bool&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;option2&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;false&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;)&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Параметры по умолчанию позволяют не забивать и так не маленькие исходные тексты кучей не нужного текста. Но к сожалению они не идеальны без одной маленькой штучки. Вот скажите, что надо сделать, чтобы вызвать описанный метод, но чтобы option2 был true. Придется или перегружать метод, или при вызове передавать false для option1. Но проблема решена в C# 4.0. При вызове метода передаваемые параметры можно именовать, так что теперь можно не беспокоиться об очерёдности параметров, а также решить указанную выше проблему простым способом:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_5040798675"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_5040798675')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;format(&lt;/SPAN&gt;&lt;span style="color:blue;"&gt;"test"&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;,&amp;nbsp;option2:&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;true&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Да, для JVM есть много интересных альтернативных языков, например мне нравится &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;. Но например у него есть проблемы с производительности и вообще, его активно портируют на CLR. Хотелось бы, чтобы и основной язык платформы более активно развивался.&lt;br /&gt;
&lt;br /&gt;
Ну и так, ещё одна рабочая мысль за сегодня: парное программирование - это не только весело, но и действительно продуктивно.&lt;br /&gt;
&lt;br /&gt;
И совсем напоследок цитата дня (которую правда уже постил в &lt;a href="http://www.google.com/profiles/p.drobushevich#buzz"&gt;Buzz'е&lt;/a&gt;, но уж больно понравилась):&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_9023431792"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_9023431792')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;select&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;fun,&amp;nbsp;profit&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;from&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;real_world&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;where&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;relational=&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;false&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-291588284222506111?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=vW3YCiwYpdc:_QUhkMJ_7zk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/vW3YCiwYpdc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/291588284222506111/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/04/java.html#comment-form" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/291588284222506111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/291588284222506111?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/vW3YCiwYpdc/java.html" title="Java - отличная платформа, но слишком неповоротливый язык." /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/04/java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IDRn46eyp7ImA9WxFTFEQ.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-2174949952917378658</id><published>2010-04-05T22:18:00.001+03:00</published><updated>2010-04-05T22:26:17.013+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-05T22:26:17.013+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Java Decompiler</title><content type="html">Да, по названию поста будет понятно о чём речь :)&lt;br /&gt;
По старой традиции использовал для этих целей всегда JAD. Но он уже достаточно давно заброшен и не справляется с некоторыми фишками. Нашёл хорошую альтернативу, так прям и называется &lt;a href="http://java.decompiler.free.fr/"&gt;Java Decompiler&lt;/a&gt;. Работает как отдельное приложение, так и как плагин к эклипсу.&lt;br /&gt;
Больше всего не давали жить две штуки (исходники, которые мне нужны, были просто напичканы ими): ассерты и дженерики. Вот на составил небольшой демонстрационный примерчик:&lt;br /&gt;
Исходный текст:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_1520137507"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_1520137507')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Doing&amp;lt;T&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base&amp;lt;T&amp;gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#646464;"&gt;@Override&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;T&amp;nbsp;doSomething(T&amp;nbsp;param)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;assert&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;(param&amp;nbsp;==&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;null&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;param;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;abstract&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base&amp;lt;T&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;abstract&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;T&amp;nbsp;doSomething(T&amp;nbsp;param);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;doing()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;То что выдал JAD:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_1385691424"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_1385691424')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#008200;"&gt;//&amp;nbsp;Decompiled&amp;nbsp;by&amp;nbsp;Jad&amp;nbsp;v1.5.8g.&amp;nbsp;Copyright&amp;nbsp;2001&amp;nbsp;Pavel&amp;nbsp;Kouznetsov.&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#008200;"&gt;//&amp;nbsp;Jad&amp;nbsp;home&amp;nbsp;page:&amp;nbsp;http://www.kpdus.com/jad.html&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#008200;"&gt;//&amp;nbsp;Decompiler&amp;nbsp;options:&amp;nbsp;packimports(3)&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#008200;"&gt;//&amp;nbsp;Source&amp;nbsp;File&amp;nbsp;Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;Example.java&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;abstract&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;abstract&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;doSomething(Some&amp;nbsp;some);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;final&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;$&lt;/SPAN&gt;&lt;span style="color:#C00000;"&gt;0&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;$&lt;/SPAN&gt;&lt;span style="color:#C00000;"&gt;0&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;=&amp;nbsp;Example.&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;super&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Doing&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;doSomething(Some&amp;nbsp;param)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;if&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;(!$assertionsDisabled&amp;nbsp;&amp;&amp;&amp;nbsp;param&amp;nbsp;!=&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;null&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;)&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;throw&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;new&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;AssertionError();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;else&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;param;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;final&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;$&lt;/SPAN&gt;&lt;span style="color:#C00000;"&gt;0&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;static&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;final&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;boolean&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;$assertionsDisabled&amp;nbsp;=&amp;nbsp;!Example&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.desiredAssertionStatus();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Doing()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;$&lt;/SPAN&gt;&lt;span style="color:#C00000;"&gt;0&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;=&amp;nbsp;Example.&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;super&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;doing()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;final&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;$&lt;/SPAN&gt;&lt;span style="color:#C00000;"&gt;0&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;$&lt;/SPAN&gt;&lt;span style="color:#C00000;"&gt;0&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;=&amp;nbsp;Example.&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;super&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;И наш чемпион Java Decompiler:&lt;br /&gt;
&lt;div style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;div style="padding-left:45px;" id="id_3233039935"&gt;&lt;div style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;a HREF="javascript:CopyToClipboard('id_3233039935')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;a style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;ol style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;abstract&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base&amp;lt;T&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example.Some&amp;gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Base()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;abstract&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;T&amp;nbsp;doSomething(T&amp;nbsp;paramT);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Doing&amp;lt;T&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example.Some&amp;gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;extends&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Example.Base&amp;lt;T&amp;gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Doing()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;super&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;(Example.&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;T&amp;nbsp;doSomething(T&amp;nbsp;param)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;assert&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;(param&amp;nbsp;==&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;null&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;param;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;Some&amp;nbsp;doing()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;span style="color:#069;font-weight:bold;"&gt;this&lt;/SPAN&gt;&lt;span style="color:black;background-color:inherit;"&gt;;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;li style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;span style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Разница заметна на лицо, комментарии излишни :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-2174949952917378658?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=cfLHbYsZZD4:sA2nHmAmVJU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/cfLHbYsZZD4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/2174949952917378658/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/04/java-decompiler.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/2174949952917378658?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/2174949952917378658?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/cfLHbYsZZD4/java-decompiler.html" title="Java Decompiler" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/04/java-decompiler.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8MR3YycCp7ImA9WhZREUo.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-5526085959314594301</id><published>2010-04-05T22:10:00.006+03:00</published><updated>2011-04-07T14:14:46.898+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T14:14:46.898+03:00</app:edited><title>Подсветка кода</title><content type="html">&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-mOoGDpsyYjc/TZ2cnli3mPI/AAAAAAAAAdQ/k4Z9kKGwkpY/s1600/highlighting.gif" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="135" width="200" src="http://1.bp.blogspot.com/-mOoGDpsyYjc/TZ2cnli3mPI/AAAAAAAAAdQ/k4Z9kKGwkpY/s200/highlighting.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
Ранее я&amp;nbsp;&lt;a href="http://pdrobushevich.blogspot.com/2009/08/blogger-notes.html"&gt;писал&lt;/a&gt;&amp;nbsp;как можно сделать подсветку исходного кода в записях с помощью&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" style="color: blue; text-decoration: none;"&gt;SyntaxHighlighter&lt;/a&gt;. Но пару дней назад&amp;nbsp;официальный&amp;nbsp;сайт отвалился и код перестал подсвечиватся. По сути, если подумать, то делать это в динамике, как это делает&amp;nbsp;SyntaxHighlighter нет смысла. Но на серверную сторону блогера повлиять трудно. Поэтому нашёл замечательный&amp;nbsp;&lt;a href="http://aivolkov.ru/online-syntax-highlighter/"&gt;сайт&lt;/a&gt;. Идея просто, вставляет код, там используется&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;SyntaxHighlighter&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&amp;nbsp;от которого получаем статический html, и спокойно вставляем её в запись.&lt;/p&gt;Единственный недостаток, с &amp;lt;, &amp;gt; вообщем запрещёнными&amp;nbsp;символами, которые, например, встречаются в LINQ выражениях. Придётся самостоятельно делать эксейпинг.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Да, и ещё одним преимуществом такого статического подхода, является корректное отображения кода в RSS ридерах и пр. трансляторах, js они не могу проинтерпретировать, а со статичным html'ем справляются на ура.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Не знаю как просмотрел, но есть отличная js библиотечка для динамической подсветки &lt;a href="http://softwaremaniacs.org/soft/highlight/"&gt;highlight.js&lt;/a&gt; от &lt;a href="http://softwaremaniacs.org"&gt;Ивана Сагалаева&lt;/a&gt;. Поддерживает целых 35 языков и всё время пополняется, кроме того, у неё есть отличный набор &lt;a href="http://softwaremaniacs.org/media/soft/highlight/test.html"&gt;из более чем десятка тем&lt;/a&gt;. Я себе под новый дизайн выбрал Dark.&lt;/p&gt;
&lt;pre&gt;&lt;code class="xml"&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;response value="ok" xml:lang="en"&amp;gt;
  &amp;lt;text&amp;gt;Ok&amp;lt;/text&amp;gt;
  &amp;lt;comment html_allowed="true"/&amp;gt;
  &amp;lt;ns1:description&amp;gt;&amp;lt;![CDATA[
  CDATA is &amp;lt;not&amp;gt; magical.
  ]]&amp;gt;&amp;lt;/ns1:description&amp;gt;
  &amp;lt;a&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a/&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-5526085959314594301?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=pBQmvzYipuY:3n8aZ_Z-8GI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/pBQmvzYipuY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/5526085959314594301/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/04/blog-post.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/5526085959314594301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/5526085959314594301?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/pBQmvzYipuY/blog-post.html" title="Подсветка кода" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-mOoGDpsyYjc/TZ2cnli3mPI/AAAAAAAAAdQ/k4Z9kKGwkpY/s72-c/highlighting.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IBRX0-cSp7ImA9WxBaFU0.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-3376007303261431065</id><published>2010-03-22T00:42:00.002+02:00</published><updated>2010-03-25T11:32:34.359+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-25T11:32:34.359+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Ant Magic</title><content type="html">Совсем недавно на проекте столкнулись с забавным поведением компиляции из анта. Решил описать, так как по моему это некорректное поведение анта. Вот так выглядит проект:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_a4Q2DEgLPvg/S6addapDtnI/AAAAAAAAAJk/k2fYiBSNRSQ/s1600-h/ant+project.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_a4Q2DEgLPvg/S6addapDtnI/AAAAAAAAAJk/k2fYiBSNRSQ/s320/ant+project.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;Код простой. Класс 1 вызывает метод класса 2.&lt;br /&gt;
&lt;DIV style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;DIV style="padding-left:45px;" id="id_0678427905"&gt;&lt;DIV style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;A HREF="javascript:CopyToClipboard('id_0678427905')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;A style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;OL style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;import&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;test.sub2.Sub2;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;Sub1&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;SPAN style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;static&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;void&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;sub1()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;Sub2.sub2();&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;package&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;test.sub2;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;class&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;Sub2&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;SPAN style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;static&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;void&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;sub2()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Класс Sub2 из другого модуля и не должен компилироваться с основным. Класс 1 тоже не должен компилировать с основным, они оба из модуля 2, но лежат в разных пакетах и пакет Sub1 по случайности не был исключён из компиляции основного модуля 1. Т.о. ант скрипт выглядит вот так:&lt;br /&gt;
&lt;DIV style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;DIV style="padding-left:45px;" id="id_2230442670"&gt;&lt;DIV style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;A HREF="javascript:CopyToClipboard('id_2230442670')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;A style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;OL style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;lt;project&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:red;"&gt;name&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"TestProject"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:red;"&gt;default&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"compile"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;lt;target&amp;nbsp;&lt;SPAN style="color:red;"&gt;name&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"compile"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;delete&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;fileset&amp;nbsp;&lt;SPAN style="color:red;"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"bin"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;include&amp;nbsp;&lt;SPAN style="color:red;"&gt;name&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"**/*.class"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;/&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/fileset&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/delete&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;javac&amp;nbsp;&lt;SPAN style="color:red;"&gt;srcdir&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"src"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:red;"&gt;destdir&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"bin"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;exclude&amp;nbsp;&lt;SPAN style="color:red;"&gt;name&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="color:blue;"&gt;"test/sub2/**"&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/javac&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;lt;/target&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;lt;/project&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;Чего я ожидал, что класс Sub2 не будет компилироваться, так как я его исключил и будет ошибка компиляции так как Sub1 пытается импортировать класс, которого нет в classpath.&lt;br /&gt;
Но не тут то было, его тоже скомпилирует и всё пройдёт саксес. Хорошо тут специально симулированный простой случай, но начинается полная (_!_) когда Sub2 вызывает ещё какой-то класс, в котором есть специфические методы из библиотек, которых нет в classpath модуля1 и соответственно это умный ант разрулить не может. И человек рвёт на себе волосы, потому что по сути он всё сделал правильно, модуль 2 компилируется без проблем, какого падает компиляция модуля 1, хотя в его классах не было изменений, не понятно. Вообщем вот он какой magic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-3376007303261431065?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=wciaS_1QJz8:Ex6mX7brYuo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/wciaS_1QJz8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/3376007303261431065/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/03/ant-magic.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3376007303261431065?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3376007303261431065?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/wciaS_1QJz8/ant-magic.html" title="Ant Magic" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_a4Q2DEgLPvg/S6addapDtnI/AAAAAAAAAJk/k2fYiBSNRSQ/s72-c/ant+project.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/03/ant-magic.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UNQ3k6eCp7ImA9WxBUGE4.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-4658377922304313694</id><published>2010-03-06T02:02:00.002+02:00</published><updated>2010-03-06T02:28:12.710+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-06T02:28:12.710+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>Google Chrome vs (js performance) Opera 10.50</title><content type="html">Я в шоке, я негодую! Как можно было заметить по моему блогу я фанат Google Chrome (хотя в целом фанат всей продукции корпорации Добра =D). В качестве основного интернет браузера уже давно только его использую. Но&amp;nbsp;внутренние&amp;nbsp;сервисы на работе иногда открыты по Оперой 10.10. Вот вечером вышел спор/обсуждение с коллегой. За короткий промежуток Opera 10.50 из альфы перешла в релиз. Но речь не об этом. А о том, что горячие норвежские парни переделали javascript движок, добавив модную JIT компиляцию. И знаете что?! Как я ни старался, ни на рабочем компьютере, ни на домашнем, Google Chrome (5.0.342.2 dev) не смог сделать Oper'у в SunSpider тесте! Я просто в шоке:&lt;br /&gt;
** TOTAL **: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.14x as fast &amp;nbsp; &amp;nbsp; 657.2ms +/- 1.7% &amp;nbsp; 576.8ms +/- 2.9%&lt;br /&gt;
Немного, но быстрее, и это печалит. Надеюсь потому что у меня Dev версия Хрома. Я уже к Хрому привык, а теперь снова надо думать и это не только потому js быстрее, они снова переделали интерфейс, теперь вкладки очень похожи на Хромовские. И в целом интерфейс стал&amp;nbsp;отзывчивее. Хотя&amp;nbsp;коллега&amp;nbsp;говорит, что есть проблема с отображением и иногда даже паданием некоторых сайтов.&lt;br /&gt;
Норвежцы однозначно молодцы!!&lt;br /&gt;
&lt;b&gt;UPD:&lt;/b&gt; &amp;nbsp;&lt;a href="http://bolknote.ru/2010/03/05/~2445#00"&gt;Производительность «Оперы» 10.50&lt;/a&gt;&amp;nbsp;- странно, а тут немного другие результаты, Хром немного делает оперу.&lt;br /&gt;
&lt;br /&gt;
Результаты ещё пары тестов:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;V8 Benchmark Suite - version 5&lt;/b&gt;&lt;br /&gt;
Google Chrome (5.0.342.2): 3241&lt;br /&gt;
Opera 10.50 : 3587&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Peacekeeper&lt;/b&gt;&lt;br /&gt;
Google Chrome (5.0.342.2): 2954 Points&lt;br /&gt;
Opera 10.50: 2713 Points&lt;br /&gt;
&lt;br /&gt;
В Peacekeeper всё таки Хром вырвался вперёд, но странно что в собственном V8 тесте не смог.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-4658377922304313694?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=fCWV6zokUjY:lFGJ9EnqGCY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/fCWV6zokUjY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/4658377922304313694/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/03/google-chrome-vs-js-performance-opera.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/4658377922304313694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/4658377922304313694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/fCWV6zokUjY/google-chrome-vs-js-performance-opera.html" title="Google Chrome vs (js performance) Opera 10.50" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/03/google-chrome-vs-js-performance-opera.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIEQnc5fyp7ImA9WxBUFE0.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-3463535647773844429</id><published>2010-02-27T01:29:00.003+02:00</published><updated>2010-03-01T01:41:43.927+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-01T01:41:43.927+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XML" /><title>XML - универсальное зло</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Хотел написать про набивший&amp;nbsp;оскомину&amp;nbsp;XML. Надоело, что XML используют где только можно в приложениях, мне это не нравиться, этот формат конечно хорош, но надо всё таки проявлять хоть какую-нибудь фантазию.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Мною были замечены три места, где можно более эффективно искоренить XML.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;DSL&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;domain-specific language&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;). Это настолько ужасное место для применение XML, что даже есть книги по тому как это&amp;nbsp;эффективно&amp;nbsp;делать. Моё мнение совпадает со старой статьёй Фаулера:&amp;nbsp;&lt;/span&gt;&lt;a href="http://martinfowler.com/articles/languageWorkbench.html"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Language Workbenches: The Killer-App for Domain Specific Languages?&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;. Статья уже достаточно старая. Народ, есть же куча генераторов парсеров, которые выдают исходный код на куче всевозможных языков. В качестве рекламы, уже почти полгода как зарелизался продукт от JetBrains:&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.jetbrains.com/mps/index.html"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Meta Programming System&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;. Это действительно классная штука. Сам пока&amp;nbsp;баловался только на уровни простых примеров. Но сами JetBrains выпустили отличный баг трекер на нём (сами его используем, язык поисковых запросов у них очень удобный). Я считаю не стоит ленится и сделать свой язык, при этом забыв про XML, и вы посмотрите, у вас получится отличный продукт. Хороший и жизненный пример это aspectj и spring aop. Во втором случае, как всегда в спринге, приходится писать здоровенный xml, а в первом просто немного простых&amp;nbsp;директив непосредственно в коде, при этом отличная интеграция с эклипсом. Показывает например методы, на которые распространяется аспект. По моему даже обсуждать глупо, в этом случае однозначно свой велик.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Разновидность первого, это различные конфигурационные файлы. Скажем так, это более простой случай DSL. Для Java мне кажется достаточно хорошим решением в замен являются аннотации. Очень-очень часто, смена конфигурации несёт переделку кода, так что&amp;nbsp;все равно&amp;nbsp;пересобирать проект. Если динамический язык как Python, то вообще нет вопросов. При использовании средств языка, при создании конфигураций, можно получить много бонусов при использовании IDE, более точный поиск и автоматический рефакторинг. Но, если действительно, нужен текстовый конфиг, который будет часто изменятся, то я считаю лучшее решение это&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.yaml.org/"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;YAML&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;. Чем то напоминает JSON, только более&amp;nbsp;расширенный. Убил бы человека, который придумал, что XML удобный для чтения формат, читать его конечно можно, но это не черта не удобно, столько уже этого насмотрелся во всяких java framework's. Вообщем, если действительно пишете очередной фреймворк, и вам нужны файлы конфигурации, пожалуйста присмотритесь к простым property файлам, может быть вам будет достаточно. Нет? Тогда может YAML, это&amp;nbsp;действительно&amp;nbsp;очень расширяемый и удобный формат, причём всяких парсеров, так же как для XML, для многих языков более чем достаточно.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Обмен данными. Да, вот тут уделать XML не так легко. Рассмотрим два случая:&lt;/span&gt;&lt;/li&gt;

&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Формат данных&amp;nbsp;навряд ли&amp;nbsp;будет изменятся. Спросите где это возможно? Например&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;ETL&lt;/a&gt;&amp;nbsp;приложение. Одним из ключевых элементов такого приложения является Промежуточное хранилище. В большинстве случаев, внутри такой системы элементы представляют собой словарь&amp;nbsp;атрибутов. Поэтому в качестве промежуточного формата данных можно выбрать&amp;nbsp;бинарный формат [name|value|....].&amp;nbsp;Причём например если известен максимальный размер имени и значения, при выборке, можно выбирать только нужные поля, пропуская в массиве байтов остальные.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Будет изменятся. Тут есть проблемы, можно конечно рассмотреть сериализацию объектов, но тогда может возникнуть проблема с десериализацией в разных языках. Можно присмотреться к уже&amp;nbsp;реализованным&amp;nbsp;бинарным протоколам, например&amp;nbsp;&lt;a href="http://code.google.com/p/protobuf/"&gt;Google Protocol Buffers&lt;/a&gt;. Конечно, если вам надо распарсить одну XML в час, то вам наверно всеравно, но если пару десятков тысяч в секунду, то приходится задумываться над эффективностью действий. Да и хранение + последующая выборка избыточны и не добавляют производительности приложению. Да, открытось бинарных протоколов&amp;nbsp;оставляет&amp;nbsp;желать лучшего, тогда возвращаемся к&amp;nbsp;упомянутым&amp;nbsp;выше YAML и JSON. Хотя бы для начала посмотрите, как можно решить вашу задачу с их помощью, перед тем как кричать XML.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;В целом посыл поста был один. Не стоит использовать XML как универсальное средство решение любой проблемы, потому как есть более эффективные способы решить вашу проблему и стоит вначале оценить их и сравнить с волшебным XML'ем.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-3463535647773844429?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=e4CGreOho_c:vQpS4n9wI68:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/e4CGreOho_c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/3463535647773844429/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/03/xml.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3463535647773844429?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/3463535647773844429?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/e4CGreOho_c/xml.html" title="XML - универсальное зло" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/03/xml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFQ3w_fip7ImA9WxBUE0Q.&quot;"><id>tag:blogger.com,1999:blog-7555770271531199968.post-6541153807726924920</id><published>2010-02-27T00:32:00.000+02:00</published><updated>2010-03-01T00:33:32.246+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-01T00:33:32.246+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>Google Chrome и Плагины</title><content type="html">Google Chrome классный браузер, полюбил его за скорость и интерфейс. Раньше писал про плагины, которые у него появились. Это круто, что они работают в отдельных процессах, если один падает (что иногда случается так как сижу на dev канале хрома), то просто появляется сообщение и кнопочка перегрузить его. Но есть одна проблема, как только стартует первый процесс браузера, он стартует все плагины, у меня их 6, т.е. стартует ещё 6 процессов. А так как в процессе работы я часто закрываю и открываю его (привык начиная с первой версии хрома), то время первого старта браузера сильно замедлилось, что меня печалит. Поэтому теперь держу gmail открытым как приложение, остальные экземпляры стартуют быстрее. Но вообще да, как-то не очень получается с этими плагинами.&lt;br /&gt;
А ещё одно наблюдение, что-то страницы стали грузится не в отдельных процессах иногда, как-то страно это.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7555770271531199968-6541153807726924920?l=pdrobushevich.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?a=1M-abHO5Jrs:ZffewnMtalg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PavelDrobushevichBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PavelDrobushevichBlog/~4/1M-abHO5Jrs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pdrobushevich.blogspot.com/feeds/6541153807726924920/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://pdrobushevich.blogspot.com/2010/03/google-chrome.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6541153807726924920?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7555770271531199968/posts/default/6541153807726924920?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PavelDrobushevichBlog/~3/1M-abHO5Jrs/google-chrome.html" title="Google Chrome и Плагины" /><author><name>Pavel Drobushevich</name><uri>https://profiles.google.com/105938880741462935537</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-axFBm8rfRMM/AAAAAAAAAAI/AAAAAAAAA5k/YbOBUkwZVqQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pdrobushevich.blogspot.com/2010/03/google-chrome.html</feedburner:origLink></entry></feed>

