tag:blogger.com,1999:blog-79794951869001359272024-03-14T00:47:32.815+04:00IT жизньИстории из жизни молодого архитектора. Зарисовки об IT, путешествиях, жизни.Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-7979495186900135927.post-197420239279912192016-06-12T10:55:00.001+04:002016-06-12T15:29:59.932+04:00Получение визы в США - Administrative Processing<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Do5p5O6k5Qg/V1zvIXn4OXI/AAAAAAAAA6c/ZGoMpdYGBwoTaTu5Gc7VPkCO4N11HMeoQCLcB/s1600/expedite-Administrative-Processing.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="147" src="https://2.bp.blogspot.com/-Do5p5O6k5Qg/V1zvIXn4OXI/AAAAAAAAA6c/ZGoMpdYGBwoTaTu5Gc7VPkCO4N11HMeoQCLcB/s320/expedite-Administrative-Processing.png" width="320" /></a></div>
Прошло всего пол года и я добрался до самой интересной части моего рассказа - Administrative Processing.<br />
<br />
Согласно информации в интернет, небольшой процент "счастливчиков" в процессе получения визы отправляется консулом на дополнительную проверку. Называется это <a href="https://travel.state.gov/content/visas/en/general/administrative-processing-information.html" target="_blank">"Administrative Processing"</a>.<br />
<br />
<a href="http://www.gofortravel.ru/usa/visa/application/reasons-for-refusal/administrative-processing#link1" target="_blank">В интернете пишут</a>:<br />
<blockquote class="tr_bq">
Основная причина – сфера деятельности заявителя. Чаще всего в категорию «проверяемых» попадают сотрудники научно-производственных предприятий и исследовательских институтов, кандидаты и доктора наук, специализирующиеся в ядерной/квантовой физике, атомной и электроэнергетике, биомедицине, химии, материаловедении. Сюда также относятся работники военной, оборонной промышленности и области самых различных высокотехнологичных и научных разработок. </blockquote>
У меня для этой проверки попросили предоставить:<br />
<ol style="text-align: left;">
<li>Приглашение от принимающей стороны</li>
<li>CV</li>
<li>Загранпаспорт </li>
</ol>
<br />
<a name='more'></a><br />
Никаких дополнительных документов не смотрели и не просили. При этом выдали бумажку со списком нужных документов, номером статьи о принятом решении и адресом куда посылать документы.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-MeOSfgTzTL0/V10Aa4MXY0I/AAAAAAAAA6s/QDkEy4-49h8QIkHWfSMsuNiNUTT4UG3vwCKgB/s1600/cv_template_for_blog.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://4.bp.blogspot.com/-MeOSfgTzTL0/V10Aa4MXY0I/AAAAAAAAA6s/QDkEy4-49h8QIkHWfSMsuNiNUTT4UG3vwCKgB/s320/cv_template_for_blog.png" width="230" /></a></div>
CV у меня готово не было и я даже не знал в каком формате и что их интересует. Перерыл весь интернет, нашел описание аналогичных ситуаций, но не нашел ни одного примера. На помощь пришли наши HR'ы, в результате я достал пример CV, которое один раз прошло проверку.<br />
<br />
Вот мой шаблон, без персональной информации и в виде картинки. Но это сделано специально, чтобы не списывали, но могли получить общее представления.<br />
<br />
Я не знаю, насколько он соответствует требованиям посольства, но моя проверка прошла успешно. <br />
<br />
<br />
<br />
<br />
Собственно четыре или пять дней после собеседования в посольстве я потратил на осознание ситуации и составление CV. После этого отправил CV и сел ждать решения. Согласно информации в интернет, рассмотрение дела может занимать от 30 до 90 дней (95% случаев), еще 5% счастливчиков могут ожидать решения много (3+) месяцев. Точную дату вам никто не назовет.<br />
<br />
Отслеживать статус визы можно на <a href="https://ceac.state.gov/CEACStatTracker/Status.aspx" target="_blank">сайте консульства</a>. При этом поле <b>"Select a location"</b> заполнять совсем не обязательно. Маленький life hack.<br />
<br />
Есть еще один интересный момент, о котором не все знают. <b>Вы можете забрать свой паспорт из посольства на время проверки</b>. делать это можно сразу по факту назначения проверки, либо в течении первых 14ти дней. Есть слух, что после 14ти дней паспорт отправляют в США и забрать его становится намного сложнее.<br />
<br />
В регионы России ваш паспорт отправят курьерской службой без доплат с вашей стороны, а потом по факту принятия решения предложат отправить паспорт в консульство тойже курьерской службой.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-ODm-_oWQYxg/V10ElgnzGOI/AAAAAAAAA64/wVM0U7_G6yA4j_qikDEoCfbv0y47xvYNQCLcB/s1600/visa_status_for_blog.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="92" src="https://3.bp.blogspot.com/-ODm-_oWQYxg/V10ElgnzGOI/AAAAAAAAA64/wVM0U7_G6yA4j_qikDEoCfbv0y47xvYNQCLcB/s320/visa_status_for_blog.png" width="320" /></a></div>
Слухи о многомесячных проверках вынудили меня написать заявление на возврат паспорта на 13ый день. Решение по моему случаю было принято ровно на 30 день после собеседования. Еще неделя чтобы отправить паспорт в Москву и получить его обратно.<br />
Именно на эту неделю я опоздал в запланированную командировку и вынужден был её отменить.<br />
<div>
<br />
Надеюсь мой рассказ поможет кому-нибудь сохранить немного времени, нервов и хорошего настроения.</div>
</div>
Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-31106877944253000522015-12-27T00:19:00.004+04:002015-12-27T00:31:58.921+04:00 Получение визы в США - Визит в посольство<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Mrp7p4c3a5k/Vn702fM4mwI/AAAAAAAAA4M/N1-Zb31TqOw/s1600/1013849.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://2.bp.blogspot.com/-Mrp7p4c3a5k/Vn702fM4mwI/AAAAAAAAA4M/N1-Zb31TqOw/s1600/1013849.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/-Mrp7p4c3a5k/Vn702fM4mwI/AAAAAAAAA4M/N1-Zb31TqOw/s320/1013849.JPG" width="320" /></a></div>
<br />
<h3>
Вход в посольство </h3>
Следующий шаг в получении визы это визит в посольство. К вашим услугам посольства США в Москве, Санкт-Петербурге, Владивостоке и Екатеринбурге. Я проходил собеседование в Москве, поэтому весь мой опыт относится именно к этому варианту. Скорее всего в остальных городах все без изменений.<br />
<br />
Один из самых важных моментов - не берите с собой в посольство никакой техники. Максимум, что можно без проблем иметь при себе - это телефон / смартфон. Его вы можете сдать на хранение при входе в посольство. <b>Никакую технику на территорию посольства проносить нельзя</b>, и если для телефонов еще есть "камера хранения", то куда деть остальные вещи - это ваша личная проблема. Отдельная "любовь" у посольства к наушникам. Их тоже проносить нельзя, даже затычки. Сам видел несколько экземпляров наушников, висящих на заборе вокруг посольства.<br />
<br />
Итак, с собой в посольство вы берете комплект документов, телефон и бумажную книгу/газету по желанию. У вас на Appointment Confirmation будет указано время, на которое вас записали. Похоже оно значения не имеет, я сам опоздал минут на 40 и вроде на мое время никто не обращал внимание. Не рекомендую злоупотреблять этим знанием, но возможно вам это сэкономит немного нервов.<br />
<br />
В посольстве США в Москве два входа, один для граждан США, а второй для всех остальных. У забора-заграждения вас встретит охранник в форме и попросит ваш загранпаспорт. С пачкой паспортов он удаляется на пару минут в свой сарайчик и видимо что-то там проверяет / переписывает. После этого он возвращает вам паспорт и пускает во внутренний периметр посольства.<br />
<br />
В посольстве вас ждет первичный досмотр на факт наличия жидкостей, техники. В случае успеха вас пропускают в помещение и вы оказываетесь у "камеры хранения", куда нужно сдать сотовый телефон. В обмен вам дают номерок, по нему ваш телефон можно будет получить назад когда вы уже покинете посольство. Обратите внимание на окошко рядом со входом в посольство. Именно там выдают вещи из камеры хранения.<br />
<br />
Теперь вас ждет следующий пункт досмотра - метало детектор для вас и рентген для сумки. Все как в аэропорту. Теперь вы в посольстве.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-QFagKtZtFj4/Vn71Fx_T35I/AAAAAAAAA4U/hDk7vL23qDI/s1600/pic_1361268169.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="213" src="http://4.bp.blogspot.com/-QFagKtZtFj4/Vn71Fx_T35I/AAAAAAAAA4U/hDk7vL23qDI/s320/pic_1361268169.jpg" width="320" /></a></div>
<h3 style="text-align: left;">
Прохождение квеста в посольстве </h3>
Перемещаясь по указателям вы окажетесь у окна первичной регистрации. По штрих-коду в Appointment Confirmation вам распечатают номерок с которым вы будете проходить все остальные этапы квеста.<br />
<br />
В первую очередь вам надо пройти еще один этап регистрации. Следуйте указателям на регистрацию (не помню как называется). Когда загорится ваш номерок - подходите к окошку и передавайте ваш Appointment Confirmation. Вам на него поставят какой-то штамп или приклеют какую-то бумажку (смутно помню этот шаг). И сразу направят на сдачу отпечатков пальцев. Теоретически это может происходить в одном окне сразу, но в моем случае это была соседняя группа окон и отдельная очередь.<br />
<br />
Сдача отпечатков пальцев. Прикладывайте Appointment Confirmation к стеклу, так чтобы сотрудник мог сканировать ваш штрих-код. После этого вас попросят по очереди приложить пальцы вашей руки к сканеру - правые четыре, левые четыре и два больших. <b>Внимательно слушайте, что вам скажет сотрудник - она вам назовет зал, где будет проходить собеседование. </b>Залов несколько и в каждый своя очередь. Очень многие люди, в том числе и я пропускают номер зала или забывают его. Если вы забыли - идите в главный зал смотреть на общее табло, либо направляйтесь в любой из залов для собеседований и ищите там сотрудницу посольства.<br />
<br />
Очередь на собеседование - это самый длинный этап моего пребывания в посольстве. Я ждал минут 25-30, плюс перепутал зал. Но рано или поздно ваш номерок вызовут к окошку. Если сесть поближе к окошкам, то вполне можно расслышать как происходят собеседования у других людей. Я пересказывать не буду - сами послушайте.<br />
<br />
Язык общения с консулом может быть как русский, так и английский. Есть мнение, что общение на английском повышает ваши шансы, но у меня нет никаких оснований ему доверять. На мой взгляд шансы равны. При этом если вы начали общаться на русском и в процессе общения консул перешел на английский - рекомендуется последовать его примеру и продолжить на английском.<br />
<br />
Итак, консулу нужен ваш Appointment Confirmation. Консул extremely polite и скорее всего будет задавать общие вопросы о вашей поездке:<br />
<ul style="text-align: left;">
<li>когда вы планируете поехать</li>
<li>куда конкретно</li>
<li>зачем</li>
</ul>
Я получал B1 / B2 визу и ехал к заказчику, поэтому меня спросили где я работаю, как долго и зачем еду в США. Есть несколько рекомендаций по общению с консулом:<br />
<ul style="text-align: left;">
<li>Отвечайте на вопросы консула предельно четко. Не вдавайтесь в детали.</li>
<li>Предоставляйте дополнительные документы только по запросу. Не пытайтесь сразу всучить всю пачку документов. В 80% случаев консул запрашивает только Appointment Confirmation и ваш загранпаспорт.</li>
<li>Не врите и не нервничайте. Это самый лучший путь к проблемам.</li>
</ul>
<h3 style="text-align: left;">
Вам повезло</h3>
В 80% процентах случаев консул после 3-8 минут разговора с вами принимает положительное решение о визе. В этом случае он <b>явно сообщает вам, что принято решение выдать вам визу и она будет готова через 2-3 дня</b>. Ваш паспорт остается в посольстве и вы не получаете никакого документа об этом факте. Свой паспорт с вклеенной визой вы получите курьерской службой Pony Express на адрес, который вы указали при заполнении анкеты. Услуги Pony уже входят в стоимость консульского сбора.<br />
<br />
<h3 style="text-align: left;">
Вам не повезло</h3>
В определенном проценте случаев консул принимает решение отказать в выдаче визы. Я свидетелем таких случаев не был, поэтому не представляю как это происходит. Согласно информации в интернете - все что вас волнует в этом случает, это статья по которой вам отказали в визе. В зависимости от статьи определяется ваш шанс на повторную попытку. Отдельные статьи имеют определенный период "карантина", когда вы не можете подавать заявку повторно. А есть и пожизненные запреты. Но они редки и выдаются в исключительных случаях.<br />
<br />
<h3 style="text-align: left;">
Все только начинается</h3>
<div style="text-align: left;">
А еще есть третий вариант развития событий, он называется "Administrative Processing". Означает это дополнительную проверку. В моем случае консул сказал: "Все хорошо, но я не могу выдать визу прямо сейчас. Пройдите в окно номер 1". При этом она:</div>
<ul style="text-align: left;">
<li>возвращает вам ваши документы</li>
<li>выдает картонку с цифрой 1</li>
<li>выдает дополнительный бланк (я был немного обескуражен и даже не посмотрел что это за бланк)</li>
</ul>
Случается это не часто, но за 25 минут ожидания я видел несколько людей с такими "единицами". С этого момента у вас начинается новое приключение под названием "Administrative Processing" и о нем я расскажу в третьей части статьи.<br />
<br />
<h3 style="text-align: left;">
В качестве послесловия</h3>
<div style="text-align: left;">
Статус вашей заявки вы всгда можете узнать на странице <a href="https://ceac.state.gov/CEACStatTracker/Status.aspx">Consular Electronic Application Center</a>, при этом Location выбирать не обязательно. <br />
<br />
Не пытайтесь спорить с консулом о правильности его решения. Есть мнение, что консул сначала проставляет свое решение в системе, а потом сообщает его вам. Т.е. ваша судьба уже решена и консул не уполномочен комментировать причины своего решение. В случае отказа вы получите номер статьи - причины отказа.</div>
</div>
Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com1tag:blogger.com,1999:blog-7979495186900135927.post-14104885248993559102015-12-15T09:48:00.000+04:002015-12-27T00:37:32.922+04:00Получение визы в США - Подготовка документов<div dir="ltr" style="text-align: left;" trbidi="on">
Это серия материалов о моем опыте получения визы в США. Надеюсь она поможет вам найти ответы на ваши вопросы, о собратьям по "Administrative Processing" сэкономить нервы а может и время. <br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-5N0RR-AJex0/Vm-pZor01XI/AAAAAAAAA3Y/Gg-iMPeVRsc/s1600/4688641.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="209" src="http://2.bp.blogspot.com/-5N0RR-AJex0/Vm-pZor01XI/AAAAAAAAA3Y/Gg-iMPeVRsc/s320/4688641.jpg" width="320" /></a></div>
<br />
В декабре мне по работе потребовалось оформить визу (Non-imigrant) в США. Россиянам обычно дают визу класса B1/B2, который является комбинацией tourist/business в привычном нам Шенгене.<br />
<br />
Дальше расскажу алгоритм действий для первого раза. Повторное получение визы можно делать по упрощенному режиму.<br />
<br />
Для оформления заявление необходимо пользоваться сайтом <a href="https://ceac.state.gov/GenNIV/Default.aspx">Consular Electronic Application Center</a>. На сайте необходимо заполнить достаточно стандартный опросник DS-160 и приложить электронную фотографию. В качестве источника подсказок я использовал статью с одного из сайтов посвященных <a href="http://www.worktravel-info.ru/2011/09/ds-160.html">программе </a><a href="http://www.worktravel-info.ru/2011/09/ds-160.html">Work And Travel</a>.<br />
<br />
Очень удобно, что заполненные ответы в форме сохраняются и могут быть отредактированы. Этим обычно пользуются для передачи формы на проверку перед отправкой в консульство.<br />
<br />
После заполнения анкеты DS-160 вы должны оплатить консульский сбор 120$. У консульства заключен договор с банком Русский Стандарт, поэтому вам предоставят ссылку на специальный портал для оплаты консульского сбора. Быстро и удобно. В стоимость консульского сбора также входит доставка паспорта с визой курьерской службой Пони Экспресс.<br />
<br />
Заполненная анкета, Оплаченный консульский сбор - это все. Следующий шаг - это назначение очного интервью в консульстве.<br />
<br />
С собой на интервью обязательно нужно брать следующие документы:<br />
<ul style="text-align: left;">
<li>Свой загранпаспорт (и аннулированные загранпаспорта, если есть)</li>
<li>Свой российский паспорт</li>
<li>Appointment confirmation</li>
</ul>
Это весь список обязательных документов. Часто их достаточно для принятия консулом решения. Да, вы правы - в этом списке нет ни билетов, ни брони гостиницы. Консульство США официально не рекомендует покупать билеты / бронировать гостиницу до получения визы.<br />
<br />
Список документов, которые достаточно часто пригодятся вам:<br />
<ul style="text-align: left;">
<li>Invitation letter (особенно если вы указали что едете по работе)</li>
</ul>
Дополнительные документы (на всякий случай):<br />
<ul style="text-align: left;">
<li>Confirmation after completion of DS 160</li>
<li>Reference from work </li>
<li>Salary reference (НДФЛ-2)</li>
<li>Confirmation of consulate fee payment</li>
<li>The documents that would confirm your non-immigrant intentions</li>
<ul>
<li>diploma (copy)</li>
<li>documents for any property you have (only if you’re the owner)</li>
<li>bank statement</li>
</ul>
</ul>
Пока я ждал своей очереди в посольстве я не видел ни одного случая, когда консул попросил-бы что-то более чем Invitation letter. С другой стороны будет очень грустно, если вас попросят предоставить какой-либо документ и у вас его не окажется. Вам скорее всего не откажут, но попросят дослать этот документ курьерской службой. Это удлинит рассмотрение вашего дела минимум на неделю.<br />
<br />
Теперь вы готовы к поездке на очное интервью. Но об этом во второй части. </div>
Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-22187418244687009562015-03-18T23:36:00.001+04:002015-03-18T23:45:58.171+04:00Python: Простое кэширование для вашего метода<div dir="ltr" style="text-align: left;" trbidi="on">
При написании небольшой утилиты на Python потребовалось оптимизировать взаимодействие с внешней системой (получение имени организации по её id). Очевидно, что простейшим решением будет кэширование результатов. А простейшим решением будет использование dict / или его аналога.<br />
<br />
Прежде чем написать свой кэш на dict (у меня все работает в один поток) заглянул на StackOverflow и совсем не зря: <a href="http://stackoverflow.com/questions/1427255/is-there-a-python-caching-library">Is there a Python caching library?</a>. Вопрос очень старый, но содержит очень интересный ответ:<br />
<br />
<pre class="brush: python">from functools import lru_cache
@lru_cache(maxsize=256)
def f(x):
return x*x
</pre>
<br />
Я надеюсь этот snippet пригодится не только мне.<br />
<br />
ps: В HighLoad production режиме я его использовать не рекомендую, но для повседневных утилит подходит.</div>
Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-65534716055339134472013-06-23T23:47:00.001+04:002013-06-23T23:47:13.558+04:00Log4j, Blitz4j и все-все-все<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ72ExtVbxYZJte-9tCLddb_VFEyMcAVn0LQ0-WJ1Dd7H_ywqCDZw" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ72ExtVbxYZJte-9tCLddb_VFEyMcAVn0LQ0-WJ1Dd7H_ywqCDZw" /></a></div>
Я сейчас в рамках одного из проектов занимаюсь разработкой распределенной системы логгирования. Необходимо собирать логи с распределенной топологии приложений, доставлять их в единое хранилище, индексировать и отображать в UI.<br />
<br />
<a href="http://logstash.net/" target="_blank">Logstash</a> - нам не подощел из-за особенностей нашей сетевой инфраструктуры, поэтому делаем собственное решение.<br />
<br />
Одной из частей этой системы является сервис записи логов в файловое хранилище на локальный диск. Данное требование появилось в связи с необходимостью быстро писать большие объемы логов (INFO, DEBUG) для последующего разбора. По сети DEBUG логи передавать очень тяжело - объемы слишком большие.<br />
<br />
Вот о сервисе локальной записи и варианте его реализации с помощью <a href="https://github.com/Netflix/blitz4j" target="_blank">Blitz4j</a> я и расскажу. Возможно вы уже слышали / читали о Blitz4j. Это "Logging framework for fast asynchronous logging" от команды Netflix, подробнее можно узнать в их статье <a href="http://techblog.netflix.com/2012/11/announcing-bitz4j-scalable-logging.html" target="_blank">Announcing Blitz4j - a scalable logging framework</a>. К сожалению на этом информация о библиотеке заканчивается.<br />
<br />
Но я поверил слухам и решил проверить его в деле. Изначально у меня была реализация локального логирования с помощью <a href="http://logging.apache.org/log4j/1.2/" target="_blank">Log4j</a> и RollingFileAppender. Решение в принципе стабильное, но нагрузка растет и мы решили опробовать хваленый Blit4j.<br />
<br />
Если внимательно читать статью в инженерном блоге Netflix, то становится понятно что <b>Blitz4j это не самостоятельный framework для логирования</b>. Это расширение Log4j, которое заменяет и дополняет часть его внутренней реализации собственными версиями классов. В основном внимание было уделено <a href="https://github.com/Netflix/blitz4j/wiki/Blitz4j-at-a-glance">многопоточной работе и устранению блокировок внутри Log4j</a>. Для этого в том числе активно использовали новые наработки из <a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html">java.util.concurrent</a> и <a href="http://code.google.com/p/guava-libraries/" target="_blank">guava</a>.<br />
<br />
Т.е. мы<br />
<ul style="text-align: left;">
<li>пишем обычный логгер с использованием Log4j</li>
<li>добавляет в classpath blitz4j и еще немного зависимостей (например <a href="https://github.com/Netflix/servo">servo</a>)</li>
<li>изменяем <a href="https://github.com/Netflix/blitz4j/wiki/Configuring-blitz4j">конфигурацию Log4j</a> </li>
</ul>
и надеемся на профит. <br />
<br />
Blitz4j предоставляет возможность обернуть существующие Log4j appenders в специальный асинхронный wrapper. Важные возможности, которые он дает:<br />
<ul style="text-align: left;">
<li>внутренний промежуточный буфер сообщений, в который сохраняются поступающие сообщения</li>
<li>встроенная возможность группировки сообщений при наступлении проблемных ситуаций, когда не успеваем писать поступающие сообщения на диск</li>
<ul>
<li>к сожалению результат группировки сообщение отражает только сам факт группировки. Восстановить потерянные данные невозможно.</li>
</ul>
<li>набор ручек и кнопочек для тюнинга</li>
</ul>
На своем тестовом стенде переход на Blitz4j позволило мне получить прирост в 30% сообщений, записываемых в секунду (при 20-100 потоках генерации сообщений). При этом при постепенном росте количества потоков с 20 до 100 Blitz4j обеспечивает более ровный response time.<br />
<br />
<h3 style="text-align: left;">
Итог</h3>
<div style="text-align: left;">
Вам стоит посмотреть на Blitz4j, если вы:</div>
<ul style="text-align: left;">
<li>пишете логи локально</li>
<li>с помощью Log4j</li>
<li>из 10 и более потоков одновременно</li>
<li>используя стандартные FileAppender / RollingFileAppender</li>
</ul>
Нам пришлось от данного решения отказаться - blitz4j работает со статической конфигурацией. А мы в свою очередь активно создаем и конфигурируем новые logger и appender в runtime (для каждого компонента системы). Скрестить это с blitz4j пока не получилось. Но если мы упремся в скорость записи логов - мы вернемся к этому решению.</div>
Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com4tag:blogger.com,1999:blog-7979495186900135927.post-1957633234284535332012-09-26T18:44:00.001+04:002012-09-26T18:44:28.508+04:00Как подружить Eclipse + GlassFish 3.1.x?<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-rsbl5AImnZc/UGMUedlGWqI/AAAAAAAAAKo/CfdqIfOZhl4/s1600/image_gallery.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="100" src="http://3.bp.blogspot.com/-rsbl5AImnZc/UGMUedlGWqI/AAAAAAAAAKo/CfdqIfOZhl4/s200/image_gallery.png" width="200" /></a></div>
<br />
<br />
Oracle в наследство от Sun получило неплохой сервер приложений GlassFish. С версии 3.1.x GlassFish полностью реализует Java EE 6, что позволяет при разработке использовать EJB 3.1 и прочие прелести современного enterprise.<br />
<br />
Гугл нам подсказывает что для интеграции Eclipse и GlassFish 3.1 есть специальный плагин <a href="http://glassfishplugins.java.net/" target="_blank">Oracle GlassFish Server Tools</a>. К сожалению сайт этот не обновляется, а предложенный плагин из коробки не видит инсталяции GlassFish версии 3.1.x. Причиной проблем является переименование библиотек jsf, проблема описана на stackoverflow: <a href="http://stackoverflow.com/questions/9001120/glassfish-3-1-2-and-eclipse" target="_blank">Glassfish 3.1.2 and Eclipse</a><br />
<br />
На самом деле оказывает Oracle GlassFish Server Tools потихоньку развивается и есть версия 2.0.1. За это нам надо сказать спасибо Vince Kraemer и Peter Benedikovic, свежая версия доступна в update site по ссылке: http://download.java.net/glassfish/eclipse/juno<br />
<br />
А узнать про результаты работы над этим плагином в блоге: <a href="https://blogs.oracle.com/vkraemer/entry/internal_3_1_2_runtime" target="_blank">Internal 3.1.2 runtime plugin for Eclipse available</a> <br />
<br />
</div>
Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-89629425734943183602012-01-09T21:36:00.000+04:002012-01-10T08:42:05.740+04:00Пишем расширение для Mylyn. Основа расширения<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Итак, мы настроили окружение для разработки на базе Mylyn framework и теперь можно приступать непосредственно к созданию скелета нового плагина. Я рассчитываю что у вас уже есть базовое понимание внутренней архитектуры Eclipse и использования OSGI. Для ознакомления с основами рекомендую почитать заметки <a href="http://samolisov.blogspot.com/search/label/Equinox" target="_blank">Павла Смолысова о <b>Equinox.</b></a><br />
<br />
В рамках этого цикла статей мы напишем коннектор к выдуманной Bug Management System (BMS): TTrac. Это позволит нам сконцентрироваться на реализации плагина, а не реализации конкретных особенностей протокола BMS. За основу мы возьмем коннектор <b>org.eclipse.mylyn.trac</b>, который входит в состав Mylyn и обеспечивает интеграцию с популярной системой управления проектами <a href="http://trac.edgewall.org/" target="_blank">Trac</a><br />
<br />
<a name='more'></a><br />
<span style="font-size: large;">1. Создание проектов</span><br />
<br />
Нам необходимо создать 3 проекта:<br />
<ul style="text-align: left;">
<li><b>Plugin</b>: ru.jdevel.mylyn.ttrac.core (Содержит код интеграции с TTraс)</li>
<ul>
<li><b>Project Type</b>: Plugin</li>
<li> <b>Project name</b>: ru.jdevel.mylyn.ttrac.core</li>
<li> <b>ID</b>: ru.jdevel.mylyn.ttrac.core</li>
<li><b>Name</b>: Mylyn TTrac Connector Core</li>
<li><b>Provider</b>: jdevel.ru </li>
<li><b>Activator</b>: ru.jdevel.mylyn.ttrac.core.TTracCorePlugin</li>
</ul>
<li><b>Plugin</b>: ru.jdevel.mylyn.ttrac.ui (Содержит код UI компонентов, которые будут интегрированы в Eclipse)</li>
<ul>
<li><b>Project Type</b>: Plugin</li>
<li> <b>Project name</b>: ru.jdevel.mylyn.ttrac.ui
</li>
<li> <b>ID</b>: ru.jdevel.mylyn.ttrac.ui</li>
<li><b>Name</b>: Mylyn TTrac Connector UI</li>
<li><b>Provider</b>: jdevel.ru </li>
<li><b>Activator</b>: ru.jdevel.mylyn.ttrac.core.TTracUIPlugin</li>
</ul>
<li><b>Feature</b>: ru.jdevel.mylyn.ttrac-feature</li>
<ul>
<li><b>Project Type</b>:Feature</li>
<li> <b>Project name</b>: ru.jdevel.mylyn.ttrac-feature
</li>
<li> <b>ID</b>: ru.jdevel.mylyn.ttrac_feature</li>
<li><b>Name</b>: Mylyn Tasks Connector: TTrac</li>
<li><b>Provider</b>: jdevel.ru <br />
</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-hOd6f9ChBEs/TwstBy0K-yI/AAAAAAAAACc/h1m1DO3vGcM/s1600/mylyn_part3_step_one.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="292" src="http://4.bp.blogspot.com/-hOd6f9ChBEs/TwstBy0K-yI/AAAAAAAAACc/h1m1DO3vGcM/s320/mylyn_part3_step_one.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Создание Feature Project ttrac-feature</td></tr>
</tbody></table>
<ul>
<li>Содержит мета-информацию о нашем коннекторе</li>
<li>Должен включать в себя 2 ранее созданных плагина <b>ttrac.core</b> и <b>ttrac.ui</b></li>
</ul>
</ul>
Следующим этапом будет интеграция нашего коннектора в Eclipse. Здесь нам очень поможет исходный код коннектора для Trac.<b> </b>Если мы сейчас запустим Eclipse с окружением из ткущего workspace, то увидим в списке установленных плагинов наши:<b></b><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-KfiIJ3LFIoM/Twszomv_o1I/AAAAAAAAACk/LcnEGfF6p1M/s1600/mylyn_part3_step_three.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="191" src="http://2.bp.blogspot.com/-KfiIJ3LFIoM/Twszomv_o1I/AAAAAAAAACk/LcnEGfF6p1M/s320/mylyn_part3_step_three.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Список активных plug-ins</td></tr>
</tbody></table>
<span style="font-size: large;">2. Реализация расширений</span> (extension)<br />
<br />
Наши плагины загружены, но ничего не умеют делать. Давайте добавим наш плагин в список известных коннекторов Mylyn. В проекте <b>ru.jdevel.mylyn.ttrac.ui</b> открываем <b>MANIFEST.MF</b> и переходим на вкладку <b>Extensions</b>. В качестве фильтра задаем <i>mylyn</i> и снимаем галочку с пункта: <b>Show only extension points from the reuired plug-ins</b><br />
Мы хотим расширить <b>org.eclipse.mylyn.tasks.ui.repositories</b><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-mcnIT8dGVqY/Twu4GBLKytI/AAAAAAAAACs/zKfMDDTWotQ/s1600/mylyn_part3_step_four.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="308" src="http://4.bp.blogspot.com/-mcnIT8dGVqY/Twu4GBLKytI/AAAAAAAAACs/zKfMDDTWotQ/s320/mylyn_part3_step_four.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Меню выбора точки расширения</td></tr>
</tbody></table>
<b> </b> В результате будет создано расширение для сущности <b>Repository</b> и в зависимости нашего плагина будет добавлен: <b>org.eclipse.mylyn.tasks.ui</b>. По умолчанию для этой точки расширения будет создан класс <b>AbstractRepositoryConnector1</b>, переименуем его в <b>TtracRepositoryConnector</b>. Теперь необходимо написать реализацию этого класса, он должен быть наследником <b>AbstractRepositoryConnector</b>, а для этого в зависимости нашего плагина надо добавить <b>org.eclipse.mylyn.tasks.core</b>.<br />
Если теперь запустить <b>Eclipse</b>, то в диалоге добавления нового репозитария Mylyn мы увидим наш безымянный коннектор:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-xy0Q_mBvvjw/Twu4in2ttiI/AAAAAAAAAC0/23wfF7bPqr8/s1600/mylyn_part3_step_five.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="215" src="http://1.bp.blogspot.com/-xy0Q_mBvvjw/Twu4in2ttiI/AAAAAAAAAC0/23wfF7bPqr8/s320/mylyn_part3_step_five.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Список доступных коннекторов Mylyn</td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
</div>
Попытка каких либо действий с этим репозитарием приведет только к ругани в логах, причиной тому - необходимость корректной реализации абстрактных методов класса <b>AbstractRepositoryConnector</b>.<br />
<br />
<span style="font-size: large;">3. Реализация TtracRepositoryConnector</span><br />
<br />
Класс <b>TtracRepositoryConnector</b> является первой точкой интеграции нашего плагина и <b>Eclipse</b>. Рекомендую вам ознакомиться с классом <b>AbstractRepositoryConnector</b> чтобы понять назначение его методов. Сами методы <b>AbstractRepositoryConnector</b> можно разделить на пять групп:<br />
<br />
- проверка поддержки фичи:<br />
<pre class="brush:java"> public boolean canCreateNewTask(TaskRepository repository)
public boolean canCreateTaskFromKey(TaskRepository repository)
</pre>
В качестве реализации можно смело оставлять return false;<br />
<br />
- получение типа соединения/имени репозитария:<br />
<pre class="brush:java"> public String getConnectorKind()
public String getLabel()
</pre>
В качестве реализации будем возвращать REST и Ttrac Sample repository<br />
<br />
- работа с URL репозитрия/задач:<br />
<pre class="brush:java"> public String getRepositoryUrlFromTaskUrl(String taskFullUrl)
public String getTaskIdFromTaskUrl(String taskFullUrl)
public String getTaskUrl(String repositoryUrl, String taskId)
</pre>
<br />
В качестве реализации можем возвращать repositoryUrl<br />
<br />
- работа с задачами:<br />
<pre class="brush:java"> public void updateTaskFromTaskData(TaskRepository taskRepository,
ITask task, TaskData taskData)
</pre>
- оставляем пустую реализацию<br />
<br />
<pre class="brush:java"> public boolean hasTaskChanged(TaskRepository taskRepository, ITask task,
TaskData taskData)
</pre>
- возвращаем false<br />
<br />
- выполнение операций с репозитарием (основные методы):<br />
<pre class="brush:java"> public TaskData getTaskData(TaskRepository taskRepository, String taskId,
IProgressMonitor monitor)
public IStatus performQuery(TaskRepository repository,
IRepositoryQuery query, TaskDataCollector collector,
ISynchronizationSession session, IProgressMonitor monitor)
</pre>
<br />
Основные методы работы с репозитарием их реализацию будет разбирать позже, пока просто <br />
сделаем простейшую:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-dCUOGHVsV_g/Twu8JMVcM2I/AAAAAAAAAC8/uxZauh0Uk6c/s1600/mylyn_part3_step_sx.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<pre class="brush:java"> @Override
public TaskData getTaskData(TaskRepository taskRepository, String taskId,
IProgressMonitor monitor) throws CoreException {
TaskData task = new TaskData(new TaskAttributeMapper(taskRepository), TTRAC_CONNECTOR_KIND, taskRepository.getRepositoryUrl(), taskId);
return task;
}
@Override
public IStatus performQuery(TaskRepository repository,
IRepositoryQuery query, TaskDataCollector collector,
ISynchronizationSession session, IProgressMonitor monitor) {
return Status.OK_STATUS;
}
</pre>
Если теперь запустить Eclipse, то мы увидим что наш коннектор уже не безымянный:
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-dCUOGHVsV_g/Twu8JMVcM2I/AAAAAAAAAC8/uxZauh0Uk6c/s1600/mylyn_part3_step_sx.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="http://4.bp.blogspot.com/-dCUOGHVsV_g/Twu8JMVcM2I/AAAAAAAAAC8/uxZauh0Uk6c/s320/mylyn_part3_step_sx.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Наш коннектор в списке доступных</td></tr>
</tbody></table>
но все еще не работает. Если выбрать наш коннектор и попробовать нажать Next, мы увидим в консоли Eclipse:</div>
<pre>!ENTRY org.eclipse.ui 4 0 2012-01-09 22:29:33.965
!MESSAGE Unhandled event loop exception
!STACK 0
java.lang.NullPointerException
at org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard.updateSettingsPage(NewRepositoryWizard.java:118)</pre>
<pre> </pre>
<span style="font-size: large;">4. Реализация TtracRepositoryConnector</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
Оказывается нам надо не только реализовать <b>AbstractRepositoryConnector</b>, но и необязательный <b>AbstractRepositoryConnectorUi:</b></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-L1ScVo6H4lg/Twu-Rpd9qDI/AAAAAAAAADE/HNFMwH2GAhA/s1600/mylyn_part3_step_seven.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="202" src="http://2.bp.blogspot.com/-L1ScVo6H4lg/Twu-Rpd9qDI/AAAAAAAAADE/HNFMwH2GAhA/s320/mylyn_part3_step_seven.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Расширение ConnectorUI</td></tr>
</tbody></table>
<div dir="ltr" style="text-align: left;" trbidi="on">
Этот класс отвечает за реализацию мастера подключения нового репозитария. В нем реализуется задание основных настроек репозитария.<br />
Его основные методы:</div>
<pre class="brush:java"> public String getConnectorKind() - аналог метода в TtracRepositoryConnector
public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) - возращает окно с настройками репозитария,
необходимо создать класс public class TtracRepositorySettingsPage extends AbstractRepositorySettingsPage </pre>
<pre> </pre>
часть методов заменим шаблонной реализацией:
<br />
<pre class="brush:java"> @Override
public IWizard getQueryWizard(TaskRepository taskRepository,
IRepositoryQuery queryToEdit) {
RepositoryQueryWizard wizard = new RepositoryQueryWizard(taskRepository);
return wizard;
}
@Override
public IWizard getNewTaskWizard(TaskRepository taskRepository,
ITaskMapping selection) {
return new NewTaskWizard(taskRepository, selection);
}</pre>
После небольшой доработки вновь запускаем Eclipse и видим результат нашей работы:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-Ml5m4xpZ4zI/Twu_26mnSlI/AAAAAAAAADM/9SVNY02JDn0/s1600/mylyn_part3_step_eight.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="231" src="http://4.bp.blogspot.com/-Ml5m4xpZ4zI/Twu_26mnSlI/AAAAAAAAADM/9SVNY02JDn0/s320/mylyn_part3_step_eight.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Мастер настроек TTrac коннектора</td></tr>
</tbody></table>
<span style="font-size: large;">5</span><span style="font-size: large;">. Заключение</span><br />
<span style="font-size: large;"><span style="font-size: small;">Мы реализовали простейший repository connector для Mylyn. На текущем этапе его возможностей достаточно только для добавления репозитария задач в Mylyn, но далее мы научим его многим интересным вещам:</span></span><br />
<ul style="text-align: left;">
<li><span style="font-size: large;"><span style="font-size: small;">извлечение задач из репозитария</span></span></li>
<li><span style="font-size: large;"><span style="font-size: small;">отображение задач в Eclipse </span></span></li>
</ul>
<span style="font-size: large;"><span style="font-size: small;">Исходный код этой статьи доступен в mercurial репозитарии </span></span><a href="https://bitbucket.org/pavel_vinogradov/jdevel_mylyn_tutorial%20" target="_blank"><span style="font-size: large;"><span style="font-size: small;">jdevel_mylyn_tutorial @ </span></span><span style="font-size: large;"><span style="font-size: small;">: </span></span><span style="font-size: large;"><span style="font-size: small;">bitbucket</span></span></a><span style="font-size: large;"><span style="font-size: small;"><br /></span></span></div>Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-39852247412051672732012-01-02T19:19:00.010+04:002012-01-10T08:12:29.313+04:00Осваиваем Eclipse. Пишем расширение для Mylyn. Окружение<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://eclipse.org/mylyn/">Mylyn</a> - это подпроект Eclipse, который предоставляет framework для реализации task and application lifecycle management (ALM). Что за хитрый термин этот ALM?<br />
<br />
<a href="http://2.bp.blogspot.com/-9Ii-5VpeN0A/TwHMFEOen7I/AAAAAAAAABw/ZCUp8PHroXA/s1600/agilealm-phases.gif"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5693055791378898866" src="http://2.bp.blogspot.com/-9Ii-5VpeN0A/TwHMFEOen7I/AAAAAAAAABw/ZCUp8PHroXA/s320/agilealm-phases.gif" style="cursor: hand; cursor: pointer; float: left; height: 214px; margin: 0 10px 10px 0; width: 320px;" /></a><br />
ALM это сокращение для термина - управление жизненным циклом приложения: от сбора требований до поставки. Простейшим случаем (и наиболее распространенным) является управление багами или задачами (issue/bug management system).<br />
<br />
Mylyn предоставляет framework, который позволяет вам прямо из Eclipse:<br />
<ul>
<li>управлять багами в вашей bug management system (например trac или bugzila)</li>
<li>сохранять и открывать историю изменений кода связанную с конкретным багом</li>
<li>видеть результаты сборки билда</li>
<li>и много другое</li>
</ul>
Более подробно о возможностях Mylyn я расскажу позже, а сейчас я хочу рассказать как настроить окружение разработки для работы и исходным кодом Mylyn.<br />
Основой для этой статьи послужил <a href="http://wiki.eclipse.org/index.php/Mylyn/Contributor_Reference">Mylyn/Contributor Reference</a>, но я взял на себя смелость пересказать это по русски и с пояснениями.<br />
<br />
<a name='more'></a><br />
<ol>
<li>Скачать и установить последнюю версию <a href="http://eclipse.org/downloads/">Eclipse Classic</a> (на данный момент это 3.7.1)</li>
<li>Запустить Eclipse и создать новый workspace с именем Mylyn-Bootstrap (здесь будут собраны исходники mylyn и его зависимостей)</li>
<li>Установить необходимые компоненты Eclipse: <span style="font-weight: bold;">File > Import > Install Software Items from File</span>: <a class="external text" href="http://eclipse.org/mylyn/doc/dev/mylyn-bootstrap.p2f" rel="nofollow" title="http://eclipse.org/mylyn/doc/dev/mylyn-bootstrap.p2f">mylyn-bootstrap.p2f</a></li>
<li>Загрузить в рабочее окружение зависимости Mylyn: <span style="font-weight: bold;">File > Import > Team Project Set</span>: <a class="external text" href="http://eclipse.org/mylyn/doc/dev/mylyn-dependencies.psf" rel="nofollow" title="http://eclipse.org/mylyn/doc/dev/mylyn-dependencies.psf">mylyn-dependencies.psf</a></li>
<li>Переключиться на перспективу <span style="font-weight: bold;">Git Repository Exploring</span> и клонировать все <a href="http://wiki.eclipse.org/Mylyn/Contributor_Reference#Checkout">репозитарии компонентов Mylyn</a> (при клонировании рекомендую выбирать последний стабильный бранч)</li>
<br /><a href="http://3.bp.blogspot.com/-Tg7buDWO5mM/TwHUITEmzjI/AAAAAAAAAB8/62gni-5XG_M/s1600/mylyn_step_one.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5693064642996653618" src="http://3.bp.blogspot.com/-Tg7buDWO5mM/TwHUITEmzjI/AAAAAAAAAB8/62gni-5XG_M/s320/mylyn_step_one.png" style="cursor: hand; cursor: pointer; float: left; height: 178px; margin: 0 10px 10px 0; width: 320px;" /></a><br />
<li>После клонирования каждого репозитария его проекты можно добавить в <span style="font-weight: bold;">workspace</span> с помощью <span style="font-weight: bold;">Import Projects</span></li>
</ol>
<br />
<br />
<br />
<br />
<br />
В результате в нашем <span style="font-weight: bold;">workspace</span> окажутся исходные тексты проекта Mylyn и все его зависимости. Некоторое время Eclipse потратит на сборку всех тих проектов. А нам останется только настроить наш workspace<br />
<br />
<span style="font-weight: bold;">API Baseline</span>:<br />
<ol>
<li>Скачать текущую версию <a href="http://www.eclipse.org/mylyn/downloads/archive.php#baseline">API Mylyn</a></li>
<li>Распаковать Eclipse Classic (SDK) в отдельную папку</li>
<li>Распаковать архив с API Mylyn и скопировать папки plugins в папку с Eclipse SDK</li>
<li>Добавить папку plugins как baseline в <span style="font-weight: bold;">Windows > Preferences > Plug-in Development > API Baselines</span></li>
</ol>
<h3>
<span class="mw-headline"><span style="font-weight: normal;"><span style="font-weight: bold;">Target Environment</span>:</span><span style="font-weight: bold;"></span></span></h3>
New Launch Configuration:<br />
Создаем новую конфигурацию запуска в разделе <span style="font-weight: bold;">Run->Run configurtions...</span> создаем новое Eclipse Application:<a href="http://2.bp.blogspot.com/-r8-QQAekHd4/TwHXAoTot9I/AAAAAAAAACI/m4JcYD3ell4/s1600/mylyn_step_two.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5693067809792767954" src="http://2.bp.blogspot.com/-r8-QQAekHd4/TwHXAoTot9I/AAAAAAAAACI/m4JcYD3ell4/s200/mylyn_step_two.png" style="cursor: hand; cursor: pointer; display: block; height: 94px; margin: 0px auto 10px; text-align: center; width: 200px;" /></a> Это наша конфигурация запуска, в её основе лежит текущее окружение Eclipse плюс плагины, которые сейчас находятся в <span style="font-weight: bold;">workspace</span>. Теперь, если мы запустим настроенное приложение - мы увидим вторую копию Eclipse с чистым <span style="font-weight: bold;">workspace</span>, разница в том что вторая копия Eclipse включает в себя базовый набор плагинов <span style="font-weight: bold;">Mylyn</span>, которые были собраны в нашем <span style="font-weight: bold;">workspace</span>.<br />
<br />
<a href="http://2.bp.blogspot.com/-uV5YA2slVQA/TwHZAheweSI/AAAAAAAAACU/utcvnnjopRg/s1600/mylyn_step_three.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5693070006983620898" src="http://2.bp.blogspot.com/-uV5YA2slVQA/TwHZAheweSI/AAAAAAAAACU/utcvnnjopRg/s320/mylyn_step_three.png" style="cursor: hand; cursor: pointer; display: block; height: 242px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a>Далее нас ждет самое интересно - создание нового расширение для Mylyn и проверка его работы.</div>Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com2tag:blogger.com,1999:blog-7979495186900135927.post-59528111928786718242012-01-02T18:25:00.004+04:002012-01-02T19:25:05.638+04:00Осваиваем Eclipse. Пишем расширение для Mylyn. Введение<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://1.bp.blogspot.com/-VI8JHkC7QyY/TwHEkWSEvqI/AAAAAAAAABk/AVjn5kM1t0w/s1600/gosling06.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5693047532708740770" src="http://1.bp.blogspot.com/-VI8JHkC7QyY/TwHEkWSEvqI/AAAAAAAAABk/AVjn5kM1t0w/s320/gosling06.jpg" style="cursor: hand; cursor: pointer; float: left; height: 240px; margin: 0 10px 10px 0; width: 320px;" /></a><br />
Все Java разработчики знают о существовании 3х самых популярных Java IDE:<br />
<div>
<ul>
<li><a href="http://www.blogger.com/www.eclipse.org/">Eclipse</a></li>
<li><a href="http://www.blogger.com/www.netbeans.org/">NetBeans</a></li>
<li><a href="http://www.blogger.com/www.jetbrains.com/idea/">IDEA</a></li>
</ul>
<div>
<br /></div>
Каждая эта среда имеет свою историю, достоинства и недостатки, и конечно армии поклонников. Важно другое уже минимум 2 года эти продукты стали не просто программами, а платформами для построения приложений.</div>
<div>
<br /></div>
<div>
Это позволило использовать базовые возможности этих IDE для разработки приложений:</div>
<div>
<ul>
<li>своих IDE (<a href="http://www-01.ibm.com/software/awdtools/developer/application/">IBM RAD</a>, <a href="http://www.blogger.com/www.jetbrains.com/pycharm/">PyCharm</a>, ...)</li>
<li>standalone приложений</li>
<li>распределенных приложений</li>
<li>и многого другого</li>
</ul>
<div>
Для меня наибольший интерес как платформа представляет именно Eclipse и причин для этого сразу несколько:</div>
<div>
<ul>
<li>я использую Eclipse в повседневной работе</li>
<li>полная открытость исходного кода модели разработки</li>
<li>очень богатая инфраструктура платформы (GUI, ECF, OSGI, ...)</li>
<li>большой объем существующих разработок</li>
</ul>
</div>
<div>
И надо сказать что Eclipse как платформа меня интересует уже не первый год, но Eclipse проект очень большой и очень сложный поэтому освоение идет медленно и осторожно. За последние 2 года я немного познакомился с OSGI как платформой для построения распределенных приложений, в прошлом году принял участие в исправлении некоторых багов (так и не приняты в upstream), с интересом читал заметки <a href="http://samolisov.blogspot.com/search/label/ECF">Павла Самолысова aka Бывшего сурового челябинского программиста</a>.</div>
</div>
<div>
<br /></div>
<div>
И в этом году решил сделать суровый рывок и написать для компонента <a href="http://eclipse.org/mylyn/">Mylyn</a> собственный коннектор для доступа к багам из внутренней Issue Tracking System моей компании. Именно этому будут посвящены следующие несколько заметок в блоге.</div>
</div>Pavel Vinogradovhttp://www.blogger.com/profile/17490801436528300797noreply@blogger.com2tag:blogger.com,1999:blog-7979495186900135927.post-66394034046318620972011-02-16T12:15:00.002+03:002012-01-10T08:11:50.314+04:00WebSphere: Реальное использование планировщика WebSphere 7.0<div dir="ltr" style="text-align: left;" trbidi="on">
В одной из прошлых статей я уже рассказывал как <a href="http://www.jdevel.ru/2010/11/websphere-websphere-70-ejb-21.html">использовать встроенные планировщик WebSphere</a>.Сейчас я хочу вернуться к этому вопросу и показать практический пример из реальной жизни.
<br />
А в реальной жизни нам потребовались следующие возможности планирования:
<br />
<ul>
<li>- Планировать произвольные задачи (EJB 3.0 бины)
</li>
<li>- Передавать задачам параметры выполнения
</li>
</ul>
<br />
<a name='more'></a><br /><br />
<h2>
1. Планирование произвольных задач</h2>
<h3>
1.1. Планирование EJB 3.0 бинов</h3>
Планировщик WebSphere работает с EJB 2.1 бинами и в WebSphere 7.0 в этом направлении ничего не изменилось. Поэтому мы будем использовать обходные пути для решения наших задач.<br />
Мы напишем обработчик запланированных задач (EJB 2.1 бин), который будет рассматривать имя запланированной задачи как JNDI имя бина с интерфейсом ScheduledTask.<br />
<br />
<b>Class : ScheduledTask.class</b>
<br />
<pre class="brush:java">@Remote
public interface ScheduledTask {
public void execute();
}
</pre>
<br />
В процессе обработки задачи мы выполняем JNDI-lookup и находим реализацию этой задачи (или не находим - если нам задали некорректное имя). У полученного экземпляра достаточно выполнить метод execute и наша цель будет достигнута:
<br />
<br />
<b>Class : TaskHandlerBean.class</b>
<br />
<pre class="brush:java">public class TaskHandlerBean implements javax.ejb.SessionBean {
static final long serialVersionUID = 3206093459760846163L;
private javax.ejb.SessionContext mySessionCtx;
/**
* Внутренний логгер
*/
private final Logger logger = LoggerFactory.getLogger(this.getClass().getCanonicalName());
/**
* getSessionContext
*/
public javax.ejb.SessionContext getSessionContext() {
return mySessionCtx;
}
/**
* setSessionContext
*/
@Override
public void setSessionContext(javax.ejb.SessionContext ctx) {
mySessionCtx = ctx;
}
public ScheduledTask resolveJNDITaskName(final String jndiName) {
PpuScheduledTask taskHandlerHome = null;
try {
// Create new Task with TaskHandlerHome & NotificationSinkHome callbacks
Object object = new InitialContext().lookup(jndiName);
taskHandlerHome = (ScheduledTask) PortableRemoteObject.narrow(object, ScheduledTask.class);
} catch (NamingException e) {
// TODO: handle exception
}
return taskHandlerHome;
}
public void process(TaskStatus arg) {
String name = arg.getName();
logger.info("Обработка запланированной задачи " + name + ".");
ScheduledTask taskHandlerHome = resolveJNDITaskName(name);
if (taskHandlerHome != null) {
taskHandlerHome.execute(argsMap);
} else {
logger.warn("Не найдена реализация задачи " + name + ".");
}
logger.info("Завершена обработка запланированной задачи " + name + ".");
}
/**
* ejbCreate
*/
public void ejbCreate() throws javax.ejb.CreateException {
}
/**
* ejbActivate
*/
@Override
public void ejbActivate() {
}
/**
* ejbPassivate
*/
@Override
public void ejbPassivate() {
}
/**
* ejbRemove
*/
@Override
public void ejbRemove() {
}
}
</pre>
<h3>
1.2. Планирование POJO задач</h3>
<br />
Если мы хотим планировать задачи из произвольного класса, в этом случае в качестве имени задачи можно передавать полное имя класса реализации (FQCN): например <b>net.nixdev.was.scheduler.tasks.ConsoleWriterScheduled</b> и далее использовать <b>Class.forName</b> для создания экземпляра задачи.
<br />
<h2>
2. Передача аргументов задачам</h2>
Следующей интересной проблемой стал вопрос передачи параметров задачам при планировании.<br />
Структура WAS для планирования задач не содержит полей для передачи параметров, поэтому мы воспользовались аналогом GET запроса и добавили все параметры в форме:
<br />
<b>?<key1>=<value1>&<key2>=<value2></b>
<br />
<br />
Далее эту конструкцию можно распарсить и использовать аргументы для планирования.
<br />
<br />
<b>Class : ScheduledTask.class</b>
<br />
<pre class="brush:java">@Remote
public interface ScheduledTask {
public void execute(Map<string, string=""> args);
}
</string,></pre>
<br />
<b>Class : TaskHandlerBean.class</b>
<br />
<pre class="brush:java">public class TaskHandlerBean implements javax.ejb.SessionBean {
....
public void process(TaskStatus arg) {
String name = arg.getName();
String argsList = "";
Map<string, string=""> argsMap = null;
int index = arg.getName().indexOf("?");
if (index > 0) {
name = arg.getName().substring(0, index);
argsList = arg.getName().substring(index + 1);
argsMap = getParamsMap(argsList);
}
logger.info("Обработка запланированной задачи " + name + ". Аргументы: " + argsList);
ScheduledTask taskHandlerHome = resolveJNDITaskName(name);
if (taskHandlerHome != null) {
taskHandlerHome.execute(argsMap);
} else {
logger.warn("Не найдена реализация задачи " + name + ".");
}
logger.info("Завершена обработка запланированной задачи " + name + ".");
}
....
}
</string,></pre>
Конечно такой подход накладывает ограничения на имена и значения аргументов, но в нашем примере этими ограничениями можно принебречь. А в случае необходимости использования нестандартных символов - использовать BASE64 encoding параметров.
<br />
<h2>
3. Дополнительные вопросы</h2>
<br />
<h3>
3.1. Динамическое изменение параметров запланированной задачи</h3>
<br />
К сожалению WAS не предоставляет API для динамического изменения параметров уже запланированной задачи. А вариант изменения данных в базе очень рискован блокировками (планировщик блокирует записи в таблице в время выполнения задач) и затруднен тем что часть информации о задачи хранится в виде сериализованных классов WAS.<br />
<br />
<h3>
3.2. Массовое планирование задач / внешнее API</h3>
<br />
Как я уже говорил - вариант создания и изменения задач напрямую в БД оказался недоступным для использования, поэтому задачи можно создавать только программно из контекта WAS.<br />
<br />
А вот внешний интерфейс для создания задач вы можете реализовать на свой вкус - мы сделали WebService и JMX доступ.</div>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com2tag:blogger.com,1999:blog-7979495186900135927.post-49281816238355951282010-11-26T20:32:00.001+03:002011-02-16T12:17:44.815+03:00WebSphere: Используем сервис планирования WebSphere 7.0 из EJB 2.1<br>
В последнее время по своей работе мне приходится много общаться с WebSphere 7.0. Т.к. зверь это тяжелый и малоизученный - я буду временами публиковать интересные заметки из нашей с ним совместной жизни.<br>
<br>
Сегодня я хочу рассказать о сервисе планирования, который есть в WebSphere с 6ой версии. Основой данной статьи является <a href="http://rationalwebsphere.blogspot.com/2009/09/using-websphere-scheduler.html">Using a WebSphere Scheduler</a>.<br>
<br>
Я адаптировал данную статью для WebSphere 7.0 под управлением ОС Windows, исправил ряд недочетов автора, описал несколько присыпанных листьями граблей и главное выложу исходный код классов, которые оригинальный автор выложил в виде картинок.<br>
<br>
Данная статья промежуточная для стадии получения первого рабочего прототипа, в следующей статье я планирую написать продолжение с переходом на EJB 3.0 и примером из реальной жизни.<br>
<br>
Нашей целью будет научиться использовать встроенный в WebSphere сервис планирования для планирования наших собственных задач.<br />
<a name='more'></a><br />
<br />
<h2>1. Подготавливаем БД</h2>
<br />
Сервис планирования WebSphere хранит информацию о задачах в БД. В качестве БД можно использовать СУБД: DB2, Derby, Informix, MSSQL, Oracle, Sybase. С остальными СУБД тоже можно запустить, но как минимум DDL скрипт создания БД придется адаптировать самому.
<br>
В качестве БД мы будем использовать <b>Apache Derby</b>. Она простая и легкая, а именно это нам и надо в нашем примере.
Я взял последнюю версию 10.6.2.1 с <a href="http://db.apache.org/derby/">официального сайта</a>.
<br />
<h3>1.1. Установка</h3>
<br />
Установка Derby просто до безобразия - просто распакуйте её в любую папку на жестком диске. Я установил её в папку <b>D:\devel\derby\10.6.2.1</b>
<br />
<h3>1.2. Настройка окружения</h3>
<br />
Чтобы использовать Derby было удобно надо немного настроить окружение Windows. Добавьте следующие переменные окружения:
<br />
<b>DERBY_HOME = D:\devel\derby\10.6.2.1</b>
В переменную <b>CLASSPATH</b> добавьте новые значения:
<br />
<b>%DERBY_HOME\lib\derbyclient.jar;%DERBY_HOME\lib\derbytools.jar;</b>
<h3>1.3. Создание схемы БД</h3>
<br />
Структуру БД планировщика вы можете найти в папке <b>%WebSphere_HOME%/Scheduler/createSchemaMod1Derby.ddl</b>
В этом файле хранится структура БД, необходимо скопировать этот файлв <b>derby.sql</b> и заменить все вхождения <b>@TABLE_QUALIFIER@@TABLE_PREFIX@</b> на <b>sched_</b>
<br />
<h3>1.4. Создание БД</h3>
<br />
После этого вы сможете запустить Derby с помощью команды:
<b>java -jar %DERBY_HOME%\lib\derbyrun.jar server start</b>
Создать структуру БД можно с помощью команды <b>java -jar %DERBY_HOME%\lib\derbyrun.jar ij</b> запущенной из другого терминала.
Вам последовательно надо будет выполнить следующие команды:
<br />
<pre>
#Подключаться к Derby и создать новую БД
connect 'jdbc:derby://localhost:1527/d:\temp\SchedulerDb;create=true';
#Импортировать структуру БД из заранее подготовленной схемы
run '/home/jsears/local/tmp3/derby.sql';
#проверить результат
show tables;
#настроить параметры безопасности
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.user.user1', 'password1');
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.connection.requireAuthentication', 'true');
#переподключиться к БД и проверить авторизацию
disconnect;
connect 'jdbc:derby://localhost:1527/d:\temp\SchedulerDb;user=user1;password=password1';
exit;
</pre>
После этого Derby необходимо перезапустить.
<br />
<h2>2. Создание JDBC ресурса в WebSphere</h2>
<br />
В WebSphere как и в других Application Server'ах приложения получают доступ к БД через JDBC Provide / DJBC Datasource. Эти ресурсы настроиваются прямо на сервере приложений и позволяют абстрагировать наше приложения от особенностей подключения к БД.
<bR>
Необходимо подключить наше БД как JDBC resource в WebSphere. Для этого в Integrated Solutions Console выполняем следующие действия:
<br />
<h3>2.1. Сохраним credentials для доступа к нашей БД.</h3>
<br />
Для этого в разделе <b>Security->Global security->JAAS - J2C authentication data</b> нужно создать новый ресурс:
<br />
<pre>
- Alias = derby_user
- User ID = user1
- Password = password1
</pre>
Логин и пароль должны совпадать с теми которые вы заводили в БД
<br />
<h3>2.2. Теперь создаем JDBC провайдера</h3>
<br />
В разделе <b>Resources->JDBC providers</b> создаем новый ресурс:
<br />
<pre>
Database type = Derby
Provider type = Derby JDBC Provider
Implementation Type = Connection pool data source
Name = Derby JDBC Provider Scheduler
</pre>
<br />
<h3>2.3. Создаем новый DataSource:</h3>
<br />
В разделе <b>Resources->JDBC providers -> Derby JDBC Provider Scheduler -> Data Sources</b> создаем новую запись:
<br />
<pre>
Step 1:
Data source name = Derby JDBC Driver DataSource
JNDI name = jdbc/DerbyNSDS
Step 2:
Database name = d:\temp\SchedulerDb
Step 3:
Component-managed authentication alias = Node01/Derby user
Mapping-configuration alias = none
Container-managed authentication alias = Node01/Derby user
</pre>
Проверьте соединение с помощью Test Connection. Если все хорошо - вы успешно подключили БД к WebSphere, в противном случае придется искать ошибку.<br>
<br>
В моем случае я получил следующее сообщение:<br>
<br>
<br>
<b>"The test connection operation failed for data source Derby JDBC Driver DataSource on server server1 at node Node01 with the following exception:
java.sql.SQLException: Failed to start database 'd:\temp\SchedulerDb' with class loader com.ibm.ws.bootstrap.ExtClassLoader@f5e0f5e, see the next exception for
details.DSRA0010E: SQL State = XJ040, Error Code = 40,000. View JVM logs for further details."</b>
<br>
<br />
<h3>2.4. Настройка classpath</h3>
<br />
Самый простой способ это вернуться в настройку <b>JDBC providers</b> и изменить значение полей:
<br>
<pre>
Classpath
с
"${DERBY_JDBC_DRIVER_PATH}/derby.jar"
на
"D:\devel\derby\10.6.2.1\lib\derbyclient.jar"
</pre>
<br>
<pre>
"Implementation class name" с
"org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource"
на
"org.apache.derby.jdbc.ClientConnectionPoolDataSource"
</pre>
<br>
<br>
Теперь сообщение изменилось на:<br>
<br>
<br>
<b>"The test connection operation failed for data source Derby JDBC Driver DataSource on server server1 at node Node01 with the following exception:
java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientConnectionPoolDataSource. View JVM logs for further details."</b>
<br>
<br>
Оказалось что значение classpath в JDBC providers не сохралилось.
<br>
После этого все успешно заработало и было получено сообщение:
<br>
<br>
<b>InformationThe test connection operation for data source Derby JDBC Driver DataSource on server server1 at node Node01 was successful.</b>
<br>
<br />
<h2>3. Создание Scheduler в WebSphere</h2>
<br />
<h3>3.1. Создание ресурса - планировщик</h3>
<br />
Перейдите в раздел <b>Resources->Scheduler</b> и в качестве scope выберите ваш instance сервера. <br> Выберите команду New и введите следующие параметры:
<br />
<pre>
- Name = MyScheduler
- JNDI name = sched/MyScheduler
- Data source JNDI name = jdbc/DerbyNSDS
- Data source alias = Node01/Derby user
- Table prefix = <имя схемы>.<префикс БД> в моем случае это было APP.sched_
- Work manager JNDI name = ws/default
</pre>
И нажмите кнопку "Ok".
<br />
<h2>4. Использование планировщика из приложений</h2>
<br />
Теперь пришло время реализовать работу с планировщиком из наших приложений. В оригинале статьи примеры используют EJB 2.1. Поэтому и мы для начала воспользуемся этой версией (а потом разберемся как это реализовать в EJB 3.0)
<br />
<h3>4.1. Создание EAR</h3>
<br />
Я рекомендую вам создать новый EAR проект и использовать его для компонентов планировщика, назовем его SchedulerEAR
<br />
<h3>4.2. Создание сервлета</h3>
<br />
Также нам нужен сервлет для вызова нашего планировщика, назовем проект SchedulerWeb
и в проекте создадим сервлет SchedulerServlet
<br>
<b>Class : SchedulerServlet</b>
<br>
<pre class="brush:java">
package ru.jdevel.websphere.scheduler.web;
import java.io.IOException;
import java.util.Calendar;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.websphere.scheduler.BeanTaskInfo;
import com.ibm.websphere.scheduler.NotificationSinkHome;
import com.ibm.websphere.scheduler.Scheduler;
import com.ibm.websphere.scheduler.TaskHandlerHome;
import com.ibm.websphere.scheduler.TaskInfo;
import com.ibm.websphere.scheduler.TaskNotificationInfo;
import com.ibm.websphere.scheduler.TaskStatus;
/**
* Servlet implementation class SchedulerServlet
*/
public class SchedulerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SchedulerServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Handle request");
try {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809");
Context initialContext = new InitialContext(env);
//get scheduler reference which we register via admin console
Scheduler scheduler = (Scheduler) initialContext.lookup("sched/MyScheduler");
TaskInfo taskInfo = scheduler.getTask("01");
if (taskInfo != null) {
System.out.println("====== Deregister");
int status = taskInfo.getStatus();
System.out.println("====== Task status: " + status + " id: " + taskInfo.getTaskId());
scheduler.purge("01");
} else {
System.out.println("====== Register new task");
//Create new Task with TaskHandlerHome & NotificationSinkHome callbacks
Object object = new InitialContext().lookup("ejb/ejbs/HandlerHome");
TaskHandlerHome taskHandlerHome = (TaskHandlerHome) PortableRemoteObject.narrow(object, TaskHandlerHome.class);
object = new InitialContext().lookup("ejb/ejbs/SinkHome");
NotificationSinkHome notificationSinkHome = (NotificationSinkHome) PortableRemoteObject.narrow(object, NotificationSinkHome.class);
BeanTaskInfo beanTaskInfo = (BeanTaskInfo) scheduler.createTaskInfo(BeanTaskInfo.class);
beanTaskInfo.setTaskHandler(taskHandlerHome);
beanTaskInfo.setName("01");
beanTaskInfo.setNotificationSink(notificationSinkHome, TaskNotificationInfo.ALL_EVENTS);
Calendar now = Calendar.getInstance();
beanTaskInfo.setStartTime(now.getTime());
beanTaskInfo.setNumberOfRepeats(5);
beanTaskInfo.setRepeatInterval("10seconds");
TaskStatus taskStatus = scheduler.create(beanTaskInfo);
System.out.println("status: " + taskStatus.getStatus() + "; " + taskStatus.getTaskId());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
</pre>
<br />
<h3>4.3. Создание EJB</h3>
<br />
Нам надо создать 2 EJB (версии 2.1.) HandlerBean, SinkBean и демкриптор развертывания ejb-jar.xml
<br>
<b>Class : HandlerBean</b>
<br>
<pre class="brush:java">
package ru.jdevel.websphere.scheduler;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import com.ibm.websphere.scheduler.TaskStatus;
/**
* Session Bean implementation class HandlerBean
*/
public class HandlerBean implements SessionBean {
private SessionContext ctx;
public SessionContext getSessionContext() {
return ctx;
}
/**
* Default constructor.
*/
public HandlerBean() {
// TODO Auto-generated constructor stub
}
public void process (TaskStatus arg) {
System.out.println("process ==============");
System.out.println("name=" + arg.getName() + "; status=" + arg.getStatus() + "; repeatsLeft=" + arg.getRepeatsLeft());
}
@Override
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException {
this.ctx = ctx;
}
}
</pre>
<br>
<b>Class : SinkBean</b>
<br>
<pre class="brush:java">
package ru.jdevel.websphere.scheduler;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import com.ibm.websphere.scheduler.TaskNotificationInfo;
/**
* Session Bean implementation class SinkBean
*/
public class SinkBean implements SessionBean {
private SessionContext ctx;
public SessionContext getSessionContext() {
return ctx;
}
public void handleEvent(TaskNotificationInfo arg) {
int eventType = arg.getEventType();
String eventName = "UNKNOWN";
switch (eventType) {
case 1: eventName = "SCHEDULED"; break;
case 2: eventName = "PURGED"; break;
}
System.out.println("handleEvent: " + eventName);
}
/**
* Default constructor.
*/
public SinkBean() {
// TODO Auto-generated constructor stub
}
@Override
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void setSessionContext(SessionContext ctx) throws EJBException, RemoteException {
this.ctx = ctx;
}
}
</pre>
<br>
<b>File : ejb-jar.xml</b>
<br>
<pre class="brush:xml">
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
<display-name>Scheduler</display-name>
<enterprise-beans>
<session id="ejbs.SinkBean">
<ejb-name>Sink</ejb-name>
<home>com.ibm.websphere.scheduler.NotificationSinkHome</home>
<remote>com.ibm.websphere.scheduler.NotificationSink</remote>
<ejb-class>ru.nixdev.websphere.scheduler.SinkBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session id="ejbs.Handler">
<ejb-name>Handler</ejb-name>
<home>com.ibm.websphere.scheduler.TaskHandlerHome</home>
<remote>com.ibm.websphere.scheduler.TaskHandler</remote>
<ejb-class>ru.nixdev.websphere.scheduler.HandlerBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<ejb-client-jar>SchedulerEJBClient.jar</ejb-client-jar>
</ejb-jar>
</pre>
<br />
<h2>5. Профит</h2>
<br />
Теперь полученный EAR можно задеплоить на сервер приложений и получить доступ к планировщику через сервлет. Например у меня он был доступен по адресу <b>http://localhost:9080/SchedulerWeb/SchedulerServlet/</b>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com2tag:blogger.com,1999:blog-7979495186900135927.post-90256501857976384542010-09-07T16:23:00.007+04:002012-01-10T08:12:54.872+04:00Eclipse, Gwt и Maven - Как сделать свою жизнь проще<div dir="ltr" style="text-align: left;" trbidi="on">
Недавно у меня был research проект в котором мы изучали возможности GWT 2.x, а также изучали способы интеграции
maven и GWT. Тремя самыми интересными решениями я хочу поделиться.
Используемые компоненты:
<br />
<ul>
<li>Eclipse 3.6
</li>
<li>GWT 2.0.4
</li>
<li>Maven 2.2.1
</li>
<li>gwt-maven-plugin 1.2.0
</li>
</ul>
<h3>
1. Hot redeploy клиентского кода</h3>
<br />
Как известно GWT из java кода клиентского интерфейса генерирует JS-код. Даже на небольших проектах такой цикл compile + deploy занимает 30+ секунд времени.<br />
<br />
Путем небольших настроек maven проекта это время можно свести к нулю, обеспечив hot redeploy клиентского кода.<br />
<br />
Как написано на официальном сайте GWT - работа над интеграцией GWT и Maven ведется, но еще не закончена. Основной проблемой в данный момент является расположение генерируемых файлов и web.xml. Поэтому для корректной работы hot redeploy необходимо достигнуть взаимопонимания между GWT, Maven и Eclipse.<br />
<br />
<a name='more'></a><br /><br />
<b>1.1. Настройка Eclipse</b><br />
<br />
1.1.1 В свойствах вашего клиентского модуля <b>Properties->Google->Web Application</b> убедитесь что опция <b>This project has a WAR directory</b> выбрана и указывает на <b>src/main/webapp directory</b>. Это стандартная папка с описанием для maven WAR проектов. Также убедитесь что опция <b>Launch and deploy from this directory</b> НЕ выбрана.<br />
<br />
1.1.2 В свойствах вашего клиентского модуля <b>Properties->Java Build Path</b> выберите вкладку "Source" и убедитесь что параметр <b>Default output folder</b> активирован и указывает на папку <b>target/your-project-name/WEB-INF/classes</b>.<br />
<br />
1.1.3 При запуске приложения через <b>Run As->Web Application (or Debug)</b> вы увидите диалоговое окно с предложением выбора папку war. Необходимо указывать не <b>src/main/webapp</b>, а директорию с результатом компиляции <b>target/your-project-name</b>.<br />
<br />
После этих настроек ваше приложение можно будет запускать как <b>Web Application</b>. Для активации сделанных изменений необходимо будет выполнять команд <b>GWT Compile Project</b>.<br />
<br />
<b>1.2. Настраиваем Maven</b><br />
<br />
Для работы с GWT вам необходимо подключить плагин <a href="http://mojo.codehaus.org/gwt-maven-plugin/">gwt-maven-plugin</a>.<br />
<br />
1.2.1. Мы использовали gwt-maven-plugin версию 1.2.0-11137. Вот пример настроек плагина:<br />
<br />
<code>
<plugin><br />
<groupId>org.codehaus.mojo</groupId><br />
<artifactId>gwt-maven-plugin</artifactId><br />
<version>1.2.0-11137</version><br />
<executions><br />
<execution><br />
<goals><br />
<goal>compile</goal><br />
<goal>test</goal><br />
</goals><br />
</execution><br />
</executions><br />
<configuration><br />
<runTarget>com.epam.dms.Application/Application.html</runTarget><br />
</configuration><br />
</plugin><br />
</code>
<br />
1.2.2. Кроме настроек плагина необходимо немного модифицировать поведение Maven:<br />
<br />
<code>
<build><br />
...
<outputDirectory>war/WEB-INF/classes</outputDirectory><br />
...
</build><br />
</code>
<br />
С помощью этой директивы мы говорим Maven что компилировать классы надо не в target/..., а в <b>war/WEB-INF/classes</b><br />
<br />
1.2.3. Чтобы корректно собирать war-файл с gwt приложением необходимо настроить плагин maven-war-plugin:<br />
<br />
<code><br />
<plugin><br />
<groupId>org.apache.maven.plugins</groupId><br />
<artifactId>maven-war-plugin</artifactId><br />
<version>2.0.2</version><br />
<configuration><br />
<warSourceDirectory>war</warSourceDirectory><br />
<webXml>src/main/webapp/WEB-INF/web.xml</webXml><br />
</configuration><br />
</plugin><br />
</code>
<br />
1.2.4. После этих нехитрых манипуляций клиентское приложение можно будет запускать как mvn gwt:run. В качестве сервера приложений будет использоваться встроенный в GWT Jetty. А все изменения в код клиента будут автоматически подхватываться без каких-либо дополнительных действий.<br />
<br />
<h3>
2. Отладка GWT приложения</h3>
<br />
После выполнения настроек из раздела 1 нам нужно будет только запускать приложение как <b>mvn gwt:debug</b>. Сервер приложений будет стартовать в режиме удаленной отладки и вы сможете подключиться к нему на стандартном порту с помощью <b>Debug As->Remote Java Application</b><br />
<br />
<h3>
3. Автоматическое развертывание проекта на Tomcat</h3>
<br />
На нашем проекте кроме автосборки всех компонентов мы внедрили и автоматическое развертывание всех успешных билдов на тестовом сервере. Это позволяло без каких либо задержек видеть изменения в UI, вносимых разработчиками.<br />
<br />
В качестве тестового сервера приложений был выбран Apache Tomcat 6.0.24.<br />
<br />
3.1. Настройка maven<br />
<br />
Нашей целью было корректно развертывать приложение с помощью <b>tomcat:deploy</b> в различных окружениях (как на машинах разработчиков, так и в тестовом окружении)<br />
<br />
Мы решили использовать tomcat-maven-plugin<br />
<br />
3.2. Настройка tomcat-maven-plugin<br />
<br />
<code>
<plugin><br />
<groupId>org.codehaus.mojo</groupId><br />
<artifactId>tomcat-maven-plugin</artifactId><br />
<version>1.0</version><br />
<configuration><br />
<url>${appserver.home}</url><br />
<path>${appserver.context}</path><br />
<server>${appserver.id}</server><br />
</configuration><br />
</plugin><br />
</code>
<br />
3.3. В зависимости от окружения мы активировали тот или иной profile:<br />
<br />
<code>
<profiles><br />
<profile><br />
<id>default</id><br />
<activation><br />
<activeByDefault>true</activeByDefault><br />
</activation><br />
<properties><br />
<appserver.home>http://localhost:8080/manager/</appserver.home><br />
<appserver.context>/dms</appserver.context><br />
<appserver.id>tomcat-local</appserver.id><br />
</properties><br />
</profile><br />
<profile><br />
<id>ci</id><br />
<properties><br />
<appserver.home>http://appserver:8585/manager/</appserver.home><br />
<appserver.context>/dms</appserver.context><br />
<appserver.id>tomcat-ci</appserver.id><br />
</properties><br />
</profile><br />
</profiles><br />
</code><br />
<br />
3.4. Логин и пароль к manager интерфейсу tomcat завались в глобальных настройках maven (.m2/settings.xml):<br />
<br />
<code>
<servers><br />
<server><br />
<id>tomcat-local</id><br />
<username>admin</username><br />
<password>admin</password><br />
</server><br />
</servers><br />
</code>
<br />
3.5. На CI сервере (мы использовали hudson) была создана задача autodeploy, которая запускалась при успешной сборке проекта. Она последовательно выполняла <b>mvn -P ci tomcat:undeploy tomcat:deploy</b><br />
<br />
<h3>
Заключение:</h3>
<br />
Каждая из этих операций позволяет вам сэкономить от 10 до 60ти секунд за операцию. На первый взгляд это совсем немного, но если посчитать сколько раз в день разработчик пересобирает приложение чтобы увидеть свои изменения - цифра издержек получается существенной.<br />
<br />
А возможность в любой момент дать стороннему человеку ссылку на свежую версию нашего приложения (пусть и нестабильную) - избавляет нас от головной боли о срочном развертывании где-то текущей версии системы.</div>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com2tag:blogger.com,1999:blog-7979495186900135927.post-1807460675552732292010-07-23T18:12:00.001+04:002010-09-07T07:25:44.017+04:00Интегрируем Windows + Eclipse Helios + Git (GitHub)<div class="separator" style="clear: both; text-align: center;"><a href="http://www.eclipse.org/home/promotions/friends-helios/helios.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="45" src="http://www.eclipse.org/home/promotions/friends-helios/helios.png" width="320" /></a></div> Совсем недавно вышла очередная верси <a href="http://www.eclipse.org/">Java IDE Eclipse</a> под номером 3.6 и кодовым названием Helios. Одним из долгожданных нововведений стало включение поддержки распределенной системы версий Git в основной релиз Eclipse.<br />
<br />
Стоит отметить что поддержка Git для Eclipse была реализована намного раньше и включала в себя 2 модуля:<br />
<ul><li> <a href="http://eclipse.org/jgit">JGit</a> - реализация Git на Java </li>
<li><a href="http://eclipse.org/egit">EGit</a> - собственно сам plugin для Eclipse</li>
</ul> Но включению этих модулей в Eclipse мешали лицензионные проблемы в несовместимости текущей лицензии J/EGit и Eclipse. Но за последнее время их удалось разрешить и EGit был включен в Eclipse Helios как Incubation проекты.<br />
<br />
Некоторые Eclipse разработчики в своих блогах пишут что включение EGit в Eclipse стало поводом для миграции некоторых подроектов Eclipse c Svn/Cvs на Git. Вот и я решил попробовать новые возможности Git в маленьком R&D проекте. Но, как оказалось чтобы подружить Windows + Eclipse + Git (GitHub) надо потратить немного времени на настройку и Gogglение. Я свое время уже потратил и расскажу о результатах.<br />
<br />
<ol><li>В первую очередь нам нужен Eclipse 3.6 Helios (или более новая версия). Скачать его можно на сайте <a href="http://www.eclipse.org/downloads/">Eclipse Foundation</a>. Я использовал редакцию <span class="title"><a href="http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/heliosr"></a>Eclipse IDE for Java EE Developers.</span></li>
<li><span class="title">Небходимо установить JGit и EGit, т.к. по умолчанию они не установлены. Для этого в Eclipse идет в меню Help->Install New Software...</span></li>
<ol><li><span class="title">В разделе Work With выбираем Helios</span></li>
<li><span class="title">В появившемся дереве плагинов выбираем раздел Collaboration</span></li>
<li><span class="title">Помечаем для установки модули JGit и EGit</span></li>
<li><span class="title">Нажимаем Finish</span></li>
</ol>
<li><span class="title">Ставим Git</span></li>
<ol><li><span class="title">Оффициальных сборок Git для Windows все еще нет</span></li>
<li><span class="title">На сайте проекта </span><a href="http://code.google.com/p/msysgit/">msysgit</a> можно скачать специальную сборку для Windows.</li>
<li>Я использовал вариант <a href="http://code.google.com/p/msysgit/downloads/detail?name=Git-1.7.0.2-preview20100309.exe&can=2&q=" style="white-space: nowrap;">Git-1.7.0.2-preview20100309.exe </a></li>
<li>В процессе установки можно оставлять все опции в значениях по умолчанию </li>
<li>После установки необходимо настроить 2 ключевых параметра</li>
<ol><li> <b><i>git config --global user.name "Pavel Vinogradov"</i></b></li>
<li> <b><i>git config --global user.email pavel.vinogradov@email.com</i></b></li>
</ol>
<li>Также необходимо сгенерировать ssh ключ для работы с удаленными репозитариями по ssh</li>
<ol><li>для этого необходимо в проводнике Windows через контекстное меню открыть Git Bash</li>
<li>В Git Bash нужно выполнить: <b><i>ssh-keygen -C "pavel.vinogradov@nixdev.net" -t rsa</i></b></li>
<li>Сгенерированный ключ будет храниться в вашем Windows профиле в папке .ssh </li>
</ol></ol>
<li><span class="title">Если у вас еще нет аккаунта на <a href="https://github.com/">GitHub</a>, тогда самое время его завести. GitHub на данный момент является самым популярным хостингом git репозитариев. Вы совершенно бесплатно можете хранить на нем до 300Mb кода в публичных репозитариях, а вот дальше придется платить.</span></li>
<ol><li><span class="title">Создаем аккаунт</span></li>
<li><span class="title">Создаем проект с публичным репозитарием</span></li>
<li><span class="title">Загружаем публичный ключ из .ssh/id_rsa.pub</span></li>
</ol>
<li><span class="title">Теперь в консоли мы можем не только работать с локальным git репозитарием, но и синхронизироваться с репозитарием на GitHub</span></li>
<li><span class="title">Соединяем проект Eclipse и GitHub</span></li>
<ol><li><span class="title">Настраиваем ssh в Eclipse</span></li>
<ol><li><span class="title">Eclipse в Windows самостоятельно работает с ssh, поэтому по умолчанию не видит ключей, которые мы сгененировали раннее. Это описано в </span><a href="http://www.blogger.com/goog_1330295351">Issue </a><a href="http://www.blogger.com/goog_1330295351">104</a><a href="http://code.google.com/p/egit/issues/detail?id=104">: SSH problem on Windows</a></li>
<li>Идем в Window->Preferences->General->Network->SSH2 и в качестве <b>Ssh Home</b> указываем папку <b>.ssh</b> в вашей домашней директории</li>
<li>После этого переходим на вкладку Key Management и выбираем Load Existing Key и указываем сгенерированный ключ </li>
</ol>
<li><span class="title">Импорт проекта с GitHub</span></li>
<ol><li><span class="title">Выбираем Import->Git->Projects from Git</span></li>
<li><span class="title">Вариант Clone</span></li>
<li><span class="title">В url указываем адрес репозиратрия: git@github.com:<login>/<project>.git</project></login></span></li>
<ol><li><span class="title">В качестве протокола выбираем git+ssh</span></li>
<li><span class="title">В имени пользователя указываем git</span></li>
</ol>
<li><span class="title">Eclipse автоматически воспользуется вашим ssh ключем для авторизации на GitHub</span></li>
</ol>
<li><span class="title">Экспорт проекта на GitHub</span></li>
<ol><li><span class="title">Выбираем Team->Push</span></li>
<li><span class="title">В качестве URLа назначения указываем адрес репозитраия проекта на GitHub</span></li>
<li><span class="title">Выбираем протокол git+ssh</span></li>
</ol></ol>
<li><span class="title">Профит. Работаем и радуемся.</span></li>
</ol><span class="title">Для дальнейшего ознакомления с EGit и Git рекомендую:</span><br />
<ul><li><span class="title"><a href="http://wiki.eclipse.org/EGit/User_Guide">EGit/User Guide</a></span></li>
<li><span class="title"><a href="http://progit.org/book/">Pro Git professional version control</a></span></li>
<li><span class="title"><a href="http://www.vogella.de/articles/EGit/article.html">Git with Eclipse (EGit) - Tutorial</a></span></li>
</ul><br />
<span class="title">07.09.10: Небольшой бонус. Настройка Git Server на Vindows 7.</span><br />
<ul><li><span class="title"><a href="http://weblogs.java.net/blog/survivant/archive/2010/09/06/git-repository-server-gitosis-win7-100-working">Git Repository Server Gitosis on Win7 (100% working)</a></span></li>
<li><span class="title"><a href="http://weblogs.java.net/blog/survivant/archive/2010/09/06/git-repository-server-gitosis-win7-troubleshooting">Git Repository Server Gitosis on Win7 : Troubleshooting</a></span></li>
</ul>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com3tag:blogger.com,1999:blog-7979495186900135927.post-58293984809333955052010-07-23T16:49:00.007+04:002010-07-23T16:55:00.135+04:00Книги/Рецензии: Том Демарко - Deadline. Роман об управлении проектамиВ повседневной работе удалось найти небольшой кусочек свободного времени, который я посвятил знакомству с знаменитым произведением Демарко - Deadline.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.ozon.ru/multimedia/books_covers/1000284950.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://www.ozon.ru/multimedia/books_covers/1000284950.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Deadline. Роман об управлении проектами</td></tr>
</tbody></table><br />
<br />
Книга не имеет прямого отношения к разработке на каком-либо языке программирования. Она посвящена управлению разработчиками. Главной особенностью книги для меня является стиль изложения. Книга написана легким и нетехническим языком и представляет собой некий IT-роман.<br />
<br />
Главный герой - мистер Томпкинс, получает уникальную возможность создать и возглавить лабораторию по изучению процессов разработки ПО. У него есть возможность на практике проверить как те или иные факторы влияют на срок сдачи проекта. Политика, изменение сроков, подбор персонала, метрики производительности, DDD и элементы Agile - это только часть факторов которые упоминаются в книге. По ходу книги проект, возглавляемый Томпкинсом проходит все стадии от идеального до жестокой реальности с политикой и директором садистом.<br />
<br />
По ходу книги в конце каждой главы автор от лица мистера Томпкинса делает заметки о самых важных мыслях, которые он хотел донести до читателя. Опытные менеджеры найдут все эти заметки знакомыми и известными, а вот менеждеры-новички могут увидеть романтическую картину процесса разработки ПО. Поэтому я готов порекомендовать эту книгу тем, кто только начинает свой путь в управлении людьми.Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-88394880636007330632010-05-31T13:29:00.001+04:002011-02-16T12:18:31.501+03:00Agile. Гибкие методологии разработки. Мое выступление на конференции IzhDevelopersС недавнего времени у нас в городе Ижевск регулярно проводятся встречи разработчиков ПО в виде мини-конференций. На прошлой неделе на этой встрече выступал я, темой выступления стали Agile и Scrum. <br />
<br />
Сейчас Agile и Scrum это очень популярные слова в мире разработки ПО. При этом весь Agile подход состоит из набора рекомендаций, которым можно следовать, а можно и игнорировать. Поэтому результат получается разным. Кто-то получает "SRUM", а кто-то сплоченную команду разработчиков и повышение производительности.<br />
<br />
Я свой доклад делал на обзорном уровне. Целевой аудитерией были люди, которые слышали в общих словах о Scrum. В процессе серии вопросов и ответов были затронуты многие практические вопросы от людей, которые не только слышали, но и пробовали Scrum.<br />
<br />
К сожалению записи нет, но доступны слайды доклада: <A href="http://nixdev.net/people/vinogradov/files/thesis/IzhDevelopers_2010-Introdution_to_Agile.pdf">Agile. Гибкие методологии разработки</a>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-22302111438473258242010-04-05T10:11:00.001+04:002011-02-16T12:18:42.915+03:00Лучшая первоапрельская шутка о JavaПервого апреля принято шутить и каждый шутит в меру своих способностей, а кто-то через несколько дней дает ссылки на эти шутки:<br />
<br />
<A href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_receives">The Apache Software Foundation Receives Approval for Sale to Oracle Corporation</a><br />
<br />
Если перевести на русский - Oracle купил всю интеллектуальную собственность ASF за 1.5 биллиона $. Напомню что в ASF входят - Apache, Ant, Maven. Perl, Subversion и очень много других популярных проектов.<br />
<br />
Сам я увидел кросспост этой новости в другом блогt и датировано это было 4м апреля, поэтому даже повелся и пытался понять как это удалось Oraclу.Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-80551112415521634592010-02-08T19:13:00.002+04:002011-02-16T12:18:56.438+03:00Что нового в Subversion 1.7Основой для этого поста послужила презентация "Subversion in 2010 and Beyond", ссылка на которую будет приведена в конце текста.<br />
<br />
В 2010 году планируется выпуск новой версии популярной систему управлениям версиями (VCS) <b>Subversion 1.7</b>. Многие люди пророчат скорую смерть централизованным системам управления версиями, но это не мешает другим людям использовать эти VCS а системам соответственно развиваться. Я расскажу вам что нового обещают разработчики в грядущем svn 1.7.<br />
<br />
<b>Использование HTTPv2</b>:<br />
На самом деле протокол HTTPv2 это полностью переписанный протокол общения svn-клиента и сервера по HTTP. Изначально для этого svn использовала WebDav/DeltaV. <br />
Согласно заявлением разработчиков - этот метод доступа оказался сложным и не очень эффективным, потреблял много трафика и его сложно было расширять. В результате было принято решение реализовать HTTPv2. <br />
<br />
Основные преимущества и характеристики:<br />
- повышение производительности<br />
- потенциал для дальнейшего развития<br />
- лучшее кеширование на прокси-серверах<br />
<br />
<b>Working Copy - Next Generation (WC-NG):</b><br />
Еще одно значительное улучшение в грядущем релизе. Сейчас svn хранит служебную информацию рабочей копии в каждой директории. Там хранится служебная информация, лог изменений, создаются файлы блокировки и многое другое. Управление этой метаинформацией в больших репозитариях очень неудобно и требует много ресурсов.<br />
<br />
Поэтому было предложено решение, названное <b>WC-NG</b>. Основные преимущества нового формата:<br />
- Для хранения метаинформации используется база данных SqlLite<br />
- Вместо логов используются workqueues<br />
- обратная совместимость<br />
<br />
Это позволяет обеспечить:<br />
- Более быстрые блокировки<br />
- Возможность удалять папки в рабочей копии<br />
- Снижение зависимости от файловых сиситем не различающий регистр букв в названиях файлов<br />
<br />
Пока работа еще продолжается и еще многое предстоит сделать.<br />
<br />
<b>Obliterating:</b><br />
<br />
Obliterating history - возможность внесения изменений в историю коммитов и полное удаление частей или конкретных версий из репозитария. <br />
<br />
Основных применения два:<br />
- уничтожить случайно закомиченный файл с приватными данными<br />
- уничтожить устаревшую ветку чтобы освободить место на диске<br />
<br />
Вы можете сказать что это уже было реализовано в виде <b>svn del</b> или <b>svn merge</b>, но это не так. Все изменения проводимые над репозитарием сохраняются в истории и могут быть восстановлены. Пользователь легко может получить версию репозитария до того как вы удалили файл с паролями, а удаление целой директории - сохраняет всю историю изменений и совсем не освобождает занимаемое место.<br />
<br />
Планируется реализовать этот функционал в рамках svn клиента, а это значит что доступ на машину с репозитарием будет не нужен. При этом разработчики обещают позаботиться о жестком разгараничении прав - кому и что можно делать с историей и по умолчанию этот функционал будет отключен для всех пользователей.<br />
Ктоме этого будет вестись лог изменений в истории. По этому логу можно будет узнать кто, когда и что менял в истории. Но вот откатить изменения возможности уже не будет.<br />
<br />
<b>SubversionJ:</b><br />
Еще одна реализация протокола для тоступа к subversion серверу, в этот раз на Java. Ожидается что этот протокол позволит использовать современные Java EE контейнеры для хостинга svn-репозитария и сделает svn более привлекательным для java разработчиков. При этом автор обещает полную совместимость со стандарным протоколом, вплоть до повторения всех багов:). При этом разработчики нацелены на реализацию поддержки HTTPv2, а только потом WebDav.<br />
<br />
Более подробно об этих новшествах вы можете послушать в презентации Subversion in 2010 and Beyond:<br />
<br />
<div style="width:425px;text-align:left" id="__ss_2959961"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/wandisco/subversion-in-2010-and-beyond" title="Subversion in 2010 and Beyond">Subversion in 2010 and Beyond</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=master3-100120174927-phpapp02&stripped_title=subversion-in-2010-and-beyond" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=master3-100120174927-phpapp02&stripped_title=subversion-in-2010-and-beyond" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/wandisco">WANdisco Inc</a>.</div></div>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-58046749469376399062010-01-07T00:56:00.001+04:002010-01-07T00:58:41.053+04:00Что нового в JDK 7 - Часть втораяВторая часть повествования о новом в JDK7, в первой части повествования о <a href="http://www.jdevel.ru/2009/11/jdk-7.html">новинках в JDK 7</a> я говорил расширенной поддержке поллекций, автоматическом управлении ресурсами, diamond операторе и некоторых других новшествах.<br />
<br />
Сейчас я расскажу о других новшествах (за исключением Closures, их я оставлю для 3ей части).<br />
<br />
<b>Новый сборщик мусора - Garbage First GC (“G1”)</b><br />
Новый сборщик мусора предназначенный для работы в эру многопроцессорных систем с большим количеством оперативной памяти. Старый сборщик мусора работал со всей оперативной памяти и с ростом количества оперативной памяти его работа становилась все более и более заметна. Новый сборщик мусора должен решить эту проблему за счет разбиения памяти на маленькие регионы, внутри которых будет выполняться сборка мусора по специальным алгоритмам.<br />
<br />
Это большое нововведение, которое ожидалось многими разработчиками. Вы можете прочитать подробно о технических аспектах реализации G1 в статье <a href="http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf">Garbage-First Garbage Collection</a>. Те кому нетерпится побыстрее испытать его в деле - могут это сделать уже JDK 6 update 14 и старше с помощью ключей <b>-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC</b><br />
<br />
<b>JSR 308: Аннотации</b><br />
В JDK 6 аннотации были ограничены применением только при декларации пременных, методов, пакетов. В JDK 7 эти ограничения будут сняты и их можно будет использовать для любых типов. Но при этом аннотации не могут быть использованы для изменения семантики языка.<br />
<br />
<b>JSR 294: Project Jigsaw - Модулизация</b><br />
В недрах SUN ведется разработка проекта <a href="http://openjdk.java.net/projects/jigsaw/">Jigsaw</a>, который должен повысить модульность JDK. Во многом это повторение работы, выполненной в рамках разработки стандарта OSGI. В JDK7 будет реализовано новое ключевое слово <b>module</b>. С помощью этих возможностей планируется реализация профилей JDK (аналог профилей JEE), позволяющих адаптировать JDK для работы в различных уловиях. За счет уменьшения зависимостей планируется решить проблему размера JDK, время её старта а также размер потребляемой памяти.<br />
<br />
<b>JSR 203: NIO2 - New I/O API</b><br />
В рамках работы над новым API для ввода/вывода планируется решить 3 основных задачи:<br />
<ul><li>Новый API для работы с файловой системой, групповой работой с атрибутами, сокрытие API специфичного для конкретной файловой системы или операцинной системы.<br />
<li>Обновление API socket-channel, позволяющее работать с каналами без использования классов из java.net<br />
<li>Асинхронный ввод/вывод (самое главное)<br />
</ul>Подробнее о NIO2 на странице <a href="http://openjdk.java.net/projects/nio/">проекта NIO</a>
<b>Обновление API XML-стэка</b> Обновление JAXP, JAXB, и JAX-WS API до последних стабильных версий<br />
<br />
<br />
В третьей части я рассмотрю подробно замыкания (Closures).Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-78189543940457895032009-12-02T15:42:00.001+04:002009-12-04T20:28:07.450+04:00Maven - Использование библиотек, которых нет в официальных репозитарияхВсем известно что одной из сильных сторон Maven является управление зависимостей и возможность скачивать нужные версии библиотек из специального репозитария. Это действительно очень удобно и избавляет от необходимости хранить кучу библиотек прямо в репозитарии проекта.<br />
<br />
Когда я переводил на Maven свой первый проект я столкнулся с большой проблемой - а где взять библиотеки, которые не представлены в официальном maven репозитарии, но от которых зависит проект? Честно признаться в первый момент меня этот вопрос поставил в тупик и пришлось призвать на помощь накомых maven-оводов.<br />
<br />
Сначала немного теории. Для разрешения зависимостей в Maven используются репозитарии зависимостей, где размещены собранные версии различных библиотек и приложений. При этом в большинстве репозитариев все эти бобилиотеки содержат специальную мета-информацию о своих зависимостях, в формате понятно Maven. Поэтому вы можете в своем проекте сказать что ваше приложение использует API сервера jetty и Maven при сборке автоматическе выкачает сам jetty указанной версии и необходимые для его работы зависимоcти.<br />
<br />
Maven репозитариев достаточно много, перечислю только несколько наиболее популярных:<br />
<ul><li><a href="http://repo2.maven.org/maven2/">Основной репозитарий Maven 2</a></li>
<li><a href="http://download.java.net/maven/2/">Maven сайта java.net</a></li>
<li><a href="http://repository.jboss.com/maven2/">Maven2 репозитарий JBoss</a></li>
<li><a href="http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/">Maven1|2 репозитарий GWT</a></li>
<li>и другие</li>
</ul><br />
Самым большим конечно яляется основной репозитарий, там собрана огромная коллекция Java библиотек, она регуряно обновляется и имеет метаинформацию. Но там есть не все. В таких случая нужную библиотеку иногда можно найти в каком-то специализированном репозитарии, тут вам на помощь придет <a href="http://mvnrepository.com/">MVNRepository</a>, <a href="http://mavensearch.net/">Maven Search</a> или другой поисковик Maven артифактов, таких сайтов сейчас не один десяток.<br />
<br />
И все-же бывают случаи когда нужной библиотеки в репозитариях нет или вы используете какие либо библиотеки собственной разработки. Тут вам на помощь придет локальный и проектный/корпоративный репозитарий. Разберемся что это такое.<br />
<br />
<b>Локальный репозитарий</b><br />
Такой репозитарий создается на локальной машине с целью кеширования артифактов, выкачиваемых из вышестоящих репозитариев. Поэтому первая сборка Maven проекта идет так долго - необходимо скачать зависимости проекта из внешнего репозитария, а потом и зависимости зависимостей. Таким образом локальный репозитарий быстро разрастается до размеров в несколько гигабайт. Полезно знать где он находится и как перенести его на другой диск.<br />
<br />
Настройки репозитария находятся в файле settings.xml, который хранится в домашней папке пользователя ($HOME/.m2 для Linux и $USER_HOME/.m2 для Windows.<br />
Путь к локальному репозитарию задается переменной <b>localRepository</b> и по умолчанию репозитарий находится в папке .m2<br />
<br />
Для установки собранных артифактов в локальный репозитарий необходимо выполнить команду mvn install. Для установки в локальный репозитарий кастомных библиотек необходимо использовать расширенный синтаксис поканды install:<br />
<br />
<b>mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar</b><br />
<br />
Тут мы задаем группу, к которой будет относиться библитека, её идентифкатор, версиию и собственно сам файл.<br />
<br />
Чтобы указать эту библиотеку в заивисмостях необходимо написать следующее:<br />
<br />
<code><br />
<dependency><br />
<groupId>com.oracle</groupId><br />
<artifactId>ojdbc</artifactId><br />
<version>11.1.0.7.0</version><br />
</dependency><br />
</code><br />
<br />
Недостатки: <br />
<ul><li>Репозитарий локален, другие разработчики не имею к нему доступ</li>
<li>На другом компьютере использовать нельзя</li>
<li>Проблемы на серверах автосборки</li>
<li>Нет централизованного места для хранения стабильных версий компонентов проекта</li>
</ul>Плюсы:<br />
<ul><li>Не требует настройки, администрирования</li>
<li>Прост в использовании</li>
</ul><br />
На одном из проектов мы некоторое время использовали локальные репозитарии для хранения custom-артифактов, в svn-репозитарии у нас была отдельная папка extlib и bat-файл, который при запуске деплоил все эти библиотеки в локальный репозитарий. Но проблемы с серверами автосборки и необходимость писать письмо на команду "Запустите batник перед сборкой" после каждого обновления библиотеки пересилило лень и мы развернули проектный Maven репозитарий.<br />
<br />
<b>Проектный / корпоративный репозитарий</b><br />
<br />
В определенный момент функционал локального репозитария перестает устраивать и начинаются поиски более функционального решения. Тут ваиантов несколько:<br />
<ul><li>расшарить папку с репозитарием, и настроить maven на остальных компьютерах на использование этого расшаренного репозитария</li>
<li>развернуть свой Maven репозитарий</li>
</ul><br />
В первом случае нам нужно будет настраивать Maven на всех машинах участвующих в сборке проекта.<br />
Во втором случае мы разворачиваем свой репозитарий, добавляем его в pom.xml проекта и с этого момента при сборке проекта на любой машине - maven в поисках артифактов будет заглядывать и в наш репозитарий.<br />
<br />
Сейчас существует большое количество продуктов (как закрытых и клатных, так и Open Source), позволяющих развернуть свой Maven репозитарий. Приведу ссылки на некоторые: <a href="http://archiva.apache.org/">Apache Archiva</a>, <a href="http://www.jfrog.org/products.php">Artifactory</a>, <a href="http://nexus.sonatype.org/">Nexus</a> и другие.<br />
Сейчас я не буду описывать настройку этих продуктов, скажу только что на развертывание Archiva я потрали часа 3.<br />
<br />
Для того чтобы задеплоить кстомную библитоеку в репозитарий необходмо будет выполнить следующую команду:<br />
<br />
mvn deploy:deploy-file -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar -DrepositoryId=archiva -Durl=http://mavenrep:8889/archiva/repository/oracle<br />
<br />
Здесь мы указываем:<br />
<ul><li>Группу библиотеки</li>
<li>Её идентификатор</li>
<li>Версию</li>
<li>Расположение на диске</li>
<li>Адрес репозитария</li>
</ul><br />
Для использования в зависимостях необходимо подлючить этот репозитарий к проекту, для этого добавляем:<br />
<br />
<code><br />
<repositories><br />
<repository><br />
<id>oracle</id><br />
<url>http://mavenrep:8889/archiva/repository/oracle</url><br />
<snapshots><br />
<enabled>false</enabled><br />
</snapshots><br />
</repository><br />
</repositories><br />
</code><br />
<br />
После этого декларация зависимости не будет отличаться от предыдущего примера.<br />
<br />
Maven репозитарии кроме всего проечего предлагают и некоторые дополнительные функции:<br />
<ul><li>Прокси для вышестоящих репозитариев</li>
<li>Поиск по репозитарию</li>
<li>Права доступа</li>
<li>и другие</li>
</ul><br />
<b>Заключение</B>:<br />
<br />
Лучше конечно обходиться без зависимостей от нестандартных библиотек, но такой вариант почти нереален. Поэтому для хранения custom библиотек в проектах, использующих Maven для сборки, лучше развернуть свой собственный репозитарий. В последствии вы сможете его использовать и для хранения релиз-версий своих артифактов, а потом возможно он станет репозитарием всей компании.<br />
<br />
И один раз настроив репозитарий - вы решаете большинство проблем с управлением зависимостей и можете сосредоточиться на разработке.Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-31916032051527602422009-11-25T11:35:00.003+04:002013-09-06T08:02:55.170+04:00Что нового в JDK 7 - Часть первая<div dir="ltr" style="text-align: left;" trbidi="on">
На днях завершилась конференция <a href="http://www.devoxx.com/">Devoxx.com</a>, где Mark Reinhold официально объявил - замыкания (closures) будут в JDK 7. Для многих замыкания были очень важным нововведением - с одной стороны они должны значительно расширить выразительность языка и привнести некоторую долю функционального программирования в Java. В вот с другой стороны это усложнит язык - и не все разработчики смогут в полной мере использовать эти возможности.<br />
<br />
Но замыкания это отдельная тема для отдельной статьи, сейчас могу предложить только оригинальную статью <a href="http://www.jroller.com/scolebourne/entry/closures_in_jdk_7">Closures in JDK 7</a>. Я постараюсь написать об этом позже.<br />
<br />
А теперь вернемся к теме - А что-же еще нового в JDK 7, которая должна выйти в сентябре 2010 года?<br />
<br />
Намнем с 7ми нововедений в языке, которые были реализованы в рамках <a href="http://openjdk.java.net/projects/coin/">проекта Coin</a> (это перевод статьи <a href="http://code.joejag.com/2009/new-language-features-in-java-7/">New language features in Java 7</a>):<br />
<br />
<a name='more'></a><br />
<br />
<b>Расширенная поддержка коллекций в языке:</b><br />
<br />
В Java будет реализован новый синтаксис для создания коллекций (в стиле Ruby). Теперь вместо:<br />
<br />
<code><br />
List<string> list = new ArrayList<string>();<br />
list.add("item");<br />
String item = list.get(0);<br />
<br />
Set<string> set = new HashSet<string>();<br />
set.add("item");<br />
<br />
Map<string integer=""> map = new HashMap<string integer="">();<br />
map.put("key", 1);<br />
int value = map.get("key");<br />
</string></string></string></string></string></string></code><br />
<br />
можно будет писать<br />
<br />
<code><br />
List<string> list = ["item"];<br />
String item = list[0];<br />
<br />
Set<string> set = {"item"};<br />
<br />
Map<string integer=""> map = {"key" : 1};<br />
int value = map["key"];<br />
</string></string></string></code><br />
<br />
При этом данные коллекции будут неизменяемы (immutable).<br />
<br />
<b>Автоматическое управление ресурсами</b><br />
<br />
Некоторые ресурсы, создаваемые в процессе работы приложения, должны быть закрыты явно - обычно с помощью метода close(). В Java 7 будет расширен функционал try блока, позволяя прямо в try блоке декларировать необходимые ресурсы, которые по завершению блока будут коректно закрыты (с помощью вызова close()).<br />
<br />
Резонным вопросом будет - а как среда выполнения будет определять ресурсы, требующие и поддерживающие явное закрытие? Ответ прост - будет создан новый интерфейс Closable и соответсвующие классы ресурсов (InputStream, Writers, Sockets, Sql клссы) будут расширены для реализации этого интерфейса. Такая реализация будет обратно совместима со старыми версиями Java.<br />
<br />
А теперь пример. Сейчас чтение из файла выглядит следующим образом:<br />
<br />
<code><br />
BufferedReader br = new BufferedReader(new FileReader(path));<br />
try {<br />
return br.readLine();<br />
} finally {<br />
br.close();<br />
}<br />
</code><br />
<br />
В Java 7 этот код может быть переписан как:<br />
<br />
<code><br />
try (BufferedReader br = new BufferedReader(new FileReader(path))) {<br />
return br.readLine();<br />
}<br />
</code><br />
<br />
<b>Улучшенное вычисление типов при создании коллекций</b><br />
<br />
Я думаю что почти все программисты сталкивались с необходимостью писать:<br />
<code><br />
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();<br />
</code><br />
<br />
При этом в большинстве случаев приходится дублировать типу значений коллекции. Эта проблема была решена в библиотеки <a href="http://code.google.com/p/google-collections/">google-collections</a>, а теперь это включат и в сам язык.<br />
<br />
Теперь можно будет писать:<br />
<code><br />
Map<String, List<String>> anagrams = new HashMap<>();<br />
</code><br />
При этом вводится оператор <b><></b> - diamond (брилиант), который получает тип от описания ссылки.<br />
<br />
<b>Подчеркивания в числах</b><br />
<br />
Одно из самых бесполезных для меня нововведений в этой статье:<br />
<br />
<code><br />
int one_million = 1_000_000;<br />
</code><br />
<br />
Официальная причина - повышение читабельности большие int и long.<br />
<br />
<b>Использование строк в операторе switch</b><br />
<br />
До данного момента в операторе switch можно было использовать только числа (Number) и перечисления (enum). В Java 7 возможно будет добавлена поддержка строк:<br />
<br />
<code><br />
String s = ...<br />
switch(s) {<br />
case "quux":<br />
processQuux(s);<br />
// fall-through<br />
<br />
case "foo":<br />
case "bar":<br />
processFooOrBar(s);<br />
break;<br />
<br />
case "baz":<br />
processBaz(s);<br />
// fall-through<br />
<br />
default:<br />
processDefault(s);<br />
break;<br />
}<br />
</code><br />
<br />
<b>Упрощенный вызов метода с переменным числом аргументов</b><br />
Если сейчас вы попытаетесь вызвать метод с переменным количеством параметров, тип которых явно неопределен (используются Generic), то вызов метода будет отмечен предупреждением от компилятора. В Java 7 этот warning будет относиться к объявлению метода, а не его вызову.<br />
<br />
Подробно о этом нововведении можно прочитать в <a href="http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000217.html">PROPOSAL: Simplified Varargs Method Invocation</a> я приведу лишь пример.<br />
<br />
Сейчас мы имеем:<br />
<br />
<code><br />
static <T> List<T> asList(T... elements) { ... }<br />
<br />
static List<Callable<String>> stringFactories() {<br />
Callable<String> a, b, c;<br />
...<br />
*// Warning: **"uses unchecked or unsafe operations"*<br />
return asList(a, b, c);<br />
}<br />
</code><br />
<br />
А будет:<br />
<code><br />
*// Warning: **"enables unsafe generic array creation"*<br />
static <T> List<T> asList(T... elements) { ... }<br />
<br />
static List<Callable<String>> stringFactories() {<br />
Callable<String> a, b, c;<br />
...<br />
return asList(a, b, c);<br />
}<br />
</code><br />
<br />
<b>Итого:</b> Я описал только небольшую часть новинок, которые нас ждут в JDK 7. Конечно самой главной новикой будут замыкания, но о них в следующий раз. А сейчас я могу сказать что скорее всего будут использовать diamond оператор и скорее всего автоматическое управление ресурсов. А вот строки в switch мне кажутся злом, т.к. поощеряют использование строковых констант вместо enum.<br />
<br />
Также хочу отметить что это только первый пост в этой серии - продолжение обязательно будет.</div>
Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com3tag:blogger.com,1999:blog-7979495186900135927.post-58587840569392593912009-11-17T08:21:00.000+04:002009-11-17T08:21:03.318+04:00Что почитать Java разработчику - Блог №1 - Geek ExplainsЯ начинаю новую верию постов, в которых буду давать краткие аннонтации лучшим, на мой взгляд, блогам о Java-разработке.<br />
И сегодня в первом выпуске я хочу вам представить блог <a href="http://geekexplains.blogspot.com/">Geek Explains</a>. <br />
<br />
Язык: английский<br />
Автор: An Indian, a Software Engineer, a Web Addict, and a Blogger.<br />
Тематика: Различные тонкие моменты и особенности Java<br />
Частота обновления: Несколько раз в месяц<br />
Оценка: 10/10<br />
<br />
Практически уникальный блог, выделяется на фоне других именно своей тематикой. Автор редко пишет о новых технологиях, конференциях или теоретических вещах. Основной материал блога составляют рассказы о ситуациях в Java с которыми мы регулярно сталкиваемся на работе, но обычно откладываем на потом или просто забиваем. Например:<br />
<ul> <li><a href="http://geekexplains.blogspot.com/2009/01/javalangunsupportedclassversionerror.html">java.lang.UnsupportedClassVersionError: when is it thrown by a JVM & how to resolve it?</a></li>
<li><a href="http://geekexplains.blogspot.com/2008/11/playing-with-try-catch-finally-in-java.html">Various possible scenarios for try-catch-finally blocks and their execution</a></li>
<li><a href="http://geekexplains.blogspot.com/2008/06/what-is-cloning-how-clone-method-works.html">What is Cloning? How clone() method works in Java?</a></li>
</ul><br />
При этом автор пишет не только о Java, но и других вещах связанных с програмированием. Я в данный момент читаю только выборку про Java, но подумываю о полной подписке.Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com1tag:blogger.com,1999:blog-7979495186900135927.post-25800669279859519192009-11-17T00:03:00.001+04:002009-11-17T08:16:10.704+04:00Что нового будет в Maven 3Apache Maven — фреймворк, сборщик программных проектов, специфицированных на XML-языке POM (en).<br />
<br />
Управление зависимостями является одной из самых сильных сторон этого фреймворка. В отличие от Ant, сборка проекта в maven описывается декларативно а не императивно (командами). В Maven большинство операций стандартизировано, а большинство нестандартных задач решаются с помощью плагинов.<br />
<br />
Сейчас Maven находится в стадии активной разработки. Стабильной версией является вертка 2.2, в разработке находится версия 3. <br />
<br />
Одной из главных особенностей версии 3 будет <b>полная обратная совместимость с проектными файлами написанными для версии 2.x</b>. Хорошо это или плохо - сложно сказать. С одной стороны это значительно ускорит миграцию старых пользователей на новую версию, с другой требует больших трудозатрат от разработчиков. Для облегчения жизни при поддержании совместимости разработчики написали большое количество Unit Testов, покрывающих большую часть функционала. Совместимы будут не только файлы сборки, но и плагины.<br />
<br />
Еще одной интересной особенностью в 3ей версии будет так называемый <b>Polyglot Maven</b>. Этот подпроект направлен на значительное расширение возможностей при написании и интерпритации pom файлов. Например теперь pom-файлы можно писать с использованием Groovy. При этом это не просто еще один вариант записи нотации - в таком pom файле можно использовать функции языка Groovy для манипуляции данными. Создана специальная утилита, позволяющая конвертировать polyglot pom в привычное xml описание. Мне пока сложно представить где эта возможность найдет свое применение, но она явно позволит вносить больше динамики в файлы сборки. Например извлечение параметров сборки из БД или других источников.<br />
<br />
<b>Embedded maven</b> - Maven уже перерос время когда он был внешним средством для сборки проекта. Сейчас Maven уже интегрирован в Eclipse с помощью плагина <a href="http://m2eclipse.sonatype.org/">m2eclipse</a>, и как мне известно в NetBeans используют версию 3 для реализации поддержки Maven. При этом главной проблемой стала неподготовленность API maven для использования в качестве библиотеки. Оно было достаточно сложным и запутанным. В версии 3 этому уделили отдельное внимание. Вместе с полной обратной совместимостью это дало неожиданный эффект - уже сейчас плагины интеграции maven в основные IDE используют 3ью версию как встроенную библиотеку. Но при этом API еще находится в стадии активной разработки и не подвергалось заморозке.<br />
<br />
<b>Оптимизация производительности</b> - тут все понятно. Оптимизации потребления CPU, дисковых операций, кеширования. В результате обещают повышение скорости сборки на 50-200%.<br />
<br />
<b>Maven Shell</b> - специальный вариант работы Maven, значительно расширяющий обычную CLI версию. Обещают что это будет значительно удобнее и производительнее чем обычные сборки из командной строки.<br />
<br />
Ну и самое главное - вместе с выходом 3.0 GA нам обещают полностью обновленную книгу: Maven: The Definitive Guide.<br />
<br />
Если у кого-то возникло желание уже сейчас испробовать Maven 3, то для вас готова свежая <a href="http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.0-alpha-3-bin.tar.bz2">3ья альфа</a>. Разработчики призывают к активному тестированию и обещают оперативно реагировать на отзывы, отчеты об ошибках и патчи.<br />
<br />
ps: В основе статьи лежит: <a href="http://www.sonatype.com/people/2009/11/maven-30-alpha-3-released/">Maven 3.0-alpha-3 Released!</a>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0tag:blogger.com,1999:blog-7979495186900135927.post-57958422596671625522009-11-16T00:05:00.007+04:002010-02-12T21:19:40.419+04:00Виды сертификации Java<b>Сертификация</b> - это один из способов документального подтверждения вашего опыта в той или иной области.<br />
<br />
Для Java существует несколько основных направлений сертификации:<br />
<ul>
<li>От компании <a href="http://www.sun.com/training/certification/" target="_blank" title="Professional Java and Solaris Certification from Sun Microsystems">SUN</a> - на знание самого языка и технологий</li>
<li>От компаний <a href="http://www.oracle.com/education/index.html" target="_blank" title="Oracle University">Oracle</a>, <a href="http://www-304.ibm.com/jct03001c/services/learning/ites.wss/zz/en?pageType=page&c=a0011023" target="_blank" title="IBM IT Technical Training - IBM Training - Global">IBM</a>, <a href="https://www.redhat.com/training/" target="_blank" title="RedHat Training">RedHat</a> - на знание конкретного стека технологий, разрабатываемых этими компаниями (например SOA Fundamentals от IBM или JBoss jBPM от RedHat)</li>
<li>От сторонних компаний - на знание конкретных продуктов или технологий .</li>
</ul><br />
<ul></ul><br />
И полный список этих сертификаций очень большой, но нужны-ли нам эти все сертификаты, а если нужны - с чего начать?<br />
<br />
<br />
<div style="text-align: center;"><b> Что такое сертификация?</b><br />
</div><br />
<br />
<b> Сертификация</b> - это подтверждение фаших профессиональных знаний и опыта в той или иной области. Формы проведения сертификации могут быть различными:<br />
<ul>
<li> Удаленный экзамен</li>
<li>Тестирование</li>
<li>Практическое задание</li>
<li>Личное собеседование</li>
<li>Теоретические вопросы</li>
</ul><br />
Также сертифкация может состоять из нескольких этапов или заданий. Обычно сертификации соответствуют профессиональному развитию человека - начиная с самых основ языка или технологии и заканчивая экспертным уровнем понимания архитектуры решения. Такие сертификации расчитаны на прохождение в течении нескольких лет.<br />
<div style="text-align: center;"><b> Для чего это нужно?</b><br />
</div><br />
<a name='more'></a><br />
<br />
Стимулы для прохождения сертификации бывают самые разные:<br />
<ul>
<li>Подтверждение своих профессиональных знаний</li>
<li>Систематизация знаний и их документальное подтверждение</li>
<li>Самооутверждение, профессиональный и карьерный рост</li>
<li>Повод попросить прибавку к зарплате</li>
<li>Доступ к более продвинутым экзаменам</li>
</ul><br />
Часто у человека есть сразу несколько стимулов, а начальник отдела предлагает пройти сертификацию за счет фирмы - и человек соглашается, рискуя только своим личным временем потраченным на подготовку к сертификации.<br />
<div style="text-align: center;"><b> Отношение работодателя к сертификации.</b><br />
</div><br />
<br />
Работодатели к сертификации относятся по разному, кто-то приветствует эти процессы и полностью оплачивает прохождение сертификации, кто-то покрывает часть расходов в случае успешного прохождения. В некоторых случаях с сотрудником заключается дополнительное соглашение, обязывающее его отработать некоторый срок в счет затраченных на его обучение средств. Во многих фирмах успешная сдача сотрудником сертификации является поводом для незначительного увелечения зарплаты или пересмотра его профессионального уровня.<br />
В предыдущие годы многие западные клиенты ценили или даже в обязательном порядке требовали наличие в штате исполнителя сертифицированных специалистов определенного уровня. В таких случаях у сотрудника появлялась возможность не только пройти обучение и сертификацию за счет работодателя/клиента, но и по результатам сертификации принять участие в новом и перспективном проекте.<br />
<div style="text-align: center;"><b> Ценность сертификатов при трудоустройстве</b><br />
</div><br />
<br />
В настоящий момент ценность сертификатов в глазах клиентов немного упала, но даже в такой ситуации наличие сертификатов в вашем послужном списке изменяет отношение к вам со стороны потенциального работодателя. Я лично общался на эту тему с рекрутерами крупных компаний и они признают, что человек, имеющий сертификаты в своей профессиональной области рассматривается как более перспективный и серьезный сотрудник на фоне своих конкурентов. Сертификат как минимум говорит о вас следующие вещи:<br />
<ul>
<li>вы интересуетесь профессиональной областью</li>
<li>вы можете систематизировать свои знания и успешно обучаетесь</li>
<li>вы имеете некий базис знаний</li>
<li>на собеседовании можно опустить некоторые глупые вопросы, с которых обычно начинается собеседование чтобы расслабить кандидата.</li>
</ul><br />
Обязательно нужно помнить очень важный момент - сертификаты придают вам только внешний блеск в глазах потенциального работодателя. Уже прошли те времена, когда человека с крутыми сертификатами брали на работу на его условиях практически без собеседования. Никакие сертификаты не гарантируют что вы именно тот человек, который нужен работодателю. Поэтому хотя сертификаты и позволят вам лучше начать свое собеседование - будьте готовы что поблажек вам уже не дадут. Простые вопросы будут отложены в сторону, но к ним могут вернуться если ваши ответы дадут повод собеседнику сомневаться в вашей квалификации. Но с другой стороны - более строгие требования говорят о том что вас рассматривают на более серьезную позицию.<br />
<div style="text-align: center;"><b> Виды Java сертификации:</b><br />
</div><br />
<br />
<b> Сертификация от SUN: </b><br />
<br />
Компания SUN предлагает набор учебных курсов и экзаменов связанных с Java - от самых основ, до архитектора сложных корпоративных приложений.<br />
Курсы выстроены в определенной последовательности - начиная от общих основ работы с Java и запуска Java-приложений и заканчивая профессиональной разработкой Web или Корпоративных систем. <br />
<br />
Предусмотрено 7 основных программы сертификации по Java:<br />
<ul>
<li>Sun Certified Programmer for Java Platform (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scjp.html" target="_blank" title="SCJP">SCJP</a>)</li>
<li>Sun Certified Java Developer (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scjd.html" target="_blank" title="SCJD">SCJD</a>)</li>
<li>Sun Certified Web Component Developer for Java Platform, Enterprise Edition (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scwcd.html" target="_blank" title="SCWCD">SCWCD</a>)</li>
<li>Sun Certified Business Component Developer (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scbcd.html" target="_blank" title="SCBCD">SCBCD</a>)</li>
<li>Sun Certified Developer For Java Web Services (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scdjws.html" target="_blank" title="SCDJWS">SCDJWS</a>)</li>
<li>Sun Certified Mobile Application Developer (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scmad.html" target="_blank" title="SCMAD">SCMAD</a>)</li>
<li>Sun Certified Enterprise Architect for J2EE Technology (<a href="https://www.suntrainingcatalogue.com/eduserv/client/learningPath.do?p=/training/certification/java/scea.html" target="_blank" title="SCEA">SCEA</a>)</li>
</ul><br />
Они покрывают следующие области:<br />
<ul>
<li>SCJP - практические навыки по использованию основного синтаксиса и структуры языка Java.</li>
<li>SCJD - применение знаний по использованию основного синтаксиса и структуры языка Java при создании сложных программных продуктов.</li>
<li>SCBCD - дра разработчиков бизнес-компонентов с использованием технологии Enterprise JavaBeans (EJB).</li>
<li>SCDJWS - для разработчиков, которые занимаются web-сервисами и их интеграцией.</li>
<li>SCMAD - для разработчиков на Java ME, который пишут софт для мобильных телефонов и смартфонов.</li>
<li>SCWCD - возможности технологии Java (в частности, сервлеты и JavaServer Pages) для разработки сетевых приложений.</li>
<li>SCEA - для проектировщиков, использующих возможности технологии Java для разработки гибких, легкорасширяемых и высокозащищенных приложений.</li>
</ul><br />
<b>Сертификация от IBM, Oracle, RedHat, etc... :</b><br />
<br />
Эти компании предлагают несколько направлений сертификации:<br />
<ul>
<li>Сертификация по использованию продуктов компании для разработки корпоративных приложений на Java</li>
<li>Сертификация по использованию общепринятых стандартов для проектирования и разработки корпоративнх приложений (SOA, BPM, UML)</li>
</ul><br />
Очень часто оба этих направления сертификации пересекаются, т.к. продукты компании используются для реализации тех или иных стандартов.<br />
<br />
Данные курсы считаются узкоспециализированными и привязаны к конкретным средсвам разработки и реализациям стандартов, хотя и способствуют пониманию общей концепции того или иного стандарта. Обычно аудиторией таких курсов становятся разработчики с опытом работы в несколько лет, которые в процессе своего профессионального развития уходят от написания обычного кода на Java и начинают заниматься разработкой архитектуры приложений, вопросами интеграции или бизнесс аналитики.Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com4tag:blogger.com,1999:blog-7979495186900135927.post-63605659164186909712008-11-17T08:23:00.004+04:002010-07-23T16:55:25.439+04:00Лучшая книга для Java разработчиков в 2008 годуКаждый год издательства по всему миру печатают миллионы самых разнообразных книг и только сотые доли процента этих книг посвящены Java. Но даже эти сотые доли процента - это огромная стопка книг чтение которых может затянуться на пол-года, а то и весь год. Именно поэтому я хочу выделить лучшую книгу, посвященную Java разработке, выпущенную в 2008 года.<br />
<br />
Как обычно бывает - книг о программировании выходит много, об этом все еще модно писать. А вот хороших книг очень мало. Но несмотря на эти грустные факты я хочу рассказать вам о великолепной книге. Итак, это книга <a href="http://en.wikipedia.org/wiki/Joshua_Bloch" target="_blank">Joshua Bloch</a>. Joshua Bosh - это один из ярчайших профессионалов в мире Java, в данный момент он работает в Google, и давно участвует в разработке самой платформы Java.<br />
<br />
Книга предназначена для опытных Java разработчиков, она не учит вас писать на Java за 21 один день (как учат большинство других книг). В книге рассказывается о том как правильно, красиво и оптимально писать на Java. Рассказывается о коллекция, потоках, работе со строками и многом другом. Автор не опрерирует голой теорией а приводит примеры для каждой темы. При этом пости все варианты снабжены не только описанием их достоинств, но и недостатков.<br />
<br />
Конечно многие из этих практик и так применяются разработчиками в повседневной практике, но чаще всего это идет на уровне интуиции и не всякий может объяснить причину использования того или иного паттерна. Здесь вы найдете именно это объяснение, а может и более оптимальное решение.<br />
<br />
При этом материал книги покрывает стандарную Java SE, без всевозможных EE расширений, поэтому и применима она для всех разработчиков независимо от того пишите вы server side, web клиента или GUI - вы все равно используете коллекции, enum, исключения.<br />
<br />
В 2008 году было выпущено второе издание книги <i>Effective Java: Programming Language Guide.</i>Первая часть была отличной книгой, а второе издание - это доработанный и переработанный материал с учетом текущих реалей (с учтом нововведений 1.6). К сожалению в России можно купить только первое издание этой книги как на русском <a href="http://www.ozon.ru/context/detail/id/1259354/?partner=jdevel">Java. Эффективное программирование</a>, так и на английском <a href="http://www.ozon.ru/context/detail/id/1829400/?partner=jdevel">Effective Java. Programming Language Guide</a>.<br />
<br />
Второе издание все еще не переведено на русский, но я думаю это не будет проблемой для большинства профессиональных разработчиков. Второе издание в оригинале можно заказать <a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683" target="_self" title="Effective Java (2nd Edition) (Java Series) (Paperback)">с Amazon</a>.<br />
<br />
Подробнее узнать о книге можно из первых рук самого автора в его видео-послании потенциальным покупателям книги:<br />
<br />
<object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/ZOwHiGCzZjo&hl=ru_RU&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ZOwHiGCzZjo&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>Pavel Vinogradovhttp://www.blogger.com/profile/09751272224537412849noreply@blogger.com0