<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блоги &#187; Управляемость</title>
	<atom:link href="http://software.intel.com/ru-ru/blogs/category/manageability/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description></description>
	<lastBuildDate>Thu, 24 May 2012 12:16:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Несколько мыслей о прогрессе, прекрасном и неумолимом</title>
		<link>http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/#comments</comments>
		<pubDate>Tue, 15 May 2012 09:13:52 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Ultrabook]]></category>
		<category><![CDATA[Ultrabooks]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[progress]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/</guid>
		<description><![CDATA[В середине девяностых годов прошлого века мой любимый журнал «Компьютерра» регулярно поднимал тему влияния Интернета на повседневную жизнь людей. Помнится, по достижению средней скорости домашнего канала скорости в 256 килобит обещалось всеобщее видеообщение  и просто неограниченные возможности для удаленной работы. Действительно, легкий и быстрый доступ в Сеть со временем подарил нам много новых возможностей. Но мне иногда хочется, чтобы некоторые он забрал обратно.]]></description>
			<content:encoded><![CDATA[<p>В середине девяностых годов прошлого века мой любимый журнал «Компьютерра» регулярно поднимал тему влияния Интернета на повседневную жизнь людей. Помнится, по достижению средней скорости домашнего канала скорости в 256 килобит обещалось всеобщее видеообщение  и просто неограниченные возможности для удаленной работы. Действительно, легкий и быстрый доступ в Сеть со временем подарил нам много новых возможностей. Но мне иногда хочется, чтобы некоторые он забрал обратно.</p>
<p>Ох уж эти заветные 256 килобит! Какими недостижимыми они казались, когда мы кое-как подключались к провайдеру через старую аналоговую АТС, и кое-как соединялись на скорости 14400 или, если повезет, 18600. Пара килобайт в секунду прокачивается – и уже отлично! При этом у самого «крутого» саратовского провайдера ширина канала на Москву равнялась <em>мегабиту</em>. У остальных – поменьше. У кого в два раза, а у кого и в четыре.</p>
<p>Но вот быстрый Интернет действительно стал обыденностью. Его отсутствие вызывает  раздражение – словно отключили горячую воду или забыли подать ток в розетку. Даже в дальнем зарубежье войти в Сеть не составляет никакого труда. Не в гостинице, так в кафе. Не в кафе, так через местную сим-карту. Ну и просто можно встать около жилого дома и посканировать эфир: почти наверняка найдется ретроград, не желающий настраивать шифрование WiFi у своего роутера.</p>
<p>Что до устройств, способных выходить в Сеть, то с ними у нас все просто замечательно. Смартфон, планшет, ноутбук – это уж наверняка. Иногда им на помощь приходят еще умные плееры и портативные игровые консоли. Пара кликов – и вот они, любимые почта, мессенджер, Facebook да Twitter. Все знакомые здесь, словно ты и не уезжал никуда (<em>кстати, это «словно никуда не уезжал» работает и в другую сторону. Недавно прикинули с другом, давно живущим в Китае, сколько же мы с ним не виделись. Оказалось – не меньше пяти лет. При этом ощущения разлуки нет никакого, потому что мы почти каждый день общаемся по ICQ и почте</em>). Помню, поначалу меня это ощущение очень радовало – надо же, чувствуешь себя дома по всему миру. Но вот в последние годы меня это ощущение стало почему-то раздражать…</p>
<p>Нет, дело не в острой форме мизантропии. Просто вместе с «чувством дома» Интернет приносит чувство долга. Ведь мой ноутбук (простите, UltraBook ™) представляет собой абсолютно полноценное рабочее место. Я могу на нем отвечать на письма, писать статьи, обрабатывать фотографии… А раз могу – то и делаю. Помнится, раньше, побыв свидетелем какого-то IT-события, я шел заниматься своими делами, и уже по возвращению домой писал статью. Теперь же я пишу ее ночью, чтобы как можно скорее опубликовать на сайте. Отдельное «спасибо» цифровой фотографии: снимки готовы для обработки сразу, без необходимости вмешательства фотолаборатории. И нашему брату-трудоголику никак нельзя лечь спать, пока лучшие двадцать-тридцать кадров не попадут в заботливые руки коллег… </p>
<p>И ладно бы ограничивалось недосыпом из-за желания поведать о чем-то интересном. В конце концов, это работа, причем – любимая. Но ведь в почте регулярно обнаруживаются напоминания о делах скучных, рутинных, а иногда и попросту неприятных. И, честно говоря, с ними я бы предпочел не сталкиваться до возвращения домой. Но – не могу.</p>
<p>Все мы сейчас напоминаем эдаких гребцов, прикованных к галерам. Разве что галеры у нас довольно изящные, и обычно мы их подбираем себе сами. Добавить еще к Интернету постоянно работающий мобильник («спасибо» подешевевшему роумингу), и причины неуклонного роста благосостояния врачевателей неврозов становятся очевидными.</p>
<p>Как журналист и просто любитель техники я аплодирую прогрессу в области аппаратных и программных средств. Действительно, техническая сторона работы становится все проще и удобнее. Но как человек я немного насторожен. Сейчас нам еще удается выскакивать из колеса, которое мы упорно крутим. Но тропка-то на волю все сужается.  И как бы нам не нащупать этот самый предел возможностей, благо психо-физиологические возможности гомо сапиенс не способны поспевать за законом Мура.</p>
<p>Что скажете, коллеги? Нагнетаю не по делу? Или есть рациональное зерно? Просто скоро сезон отпусков, а у вас-то рабочее место тоже всегда при себе. Как бороться с работой, если она так заманчиво близка на любом расстоянии от дома?</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дорожные записки</title>
		<link>http://software.intel.com/ru-ru/blogs/2012/05/05/2007303/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/05/2007303/#comments</comments>
		<pubDate>Sat, 05 May 2012 14:09:11 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Ultrabook]]></category>
		<category><![CDATA[Ultrabooks]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[Acer]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[London]]></category>
		<category><![CDATA[Toshiba]]></category>
		<category><![CDATA[ultrabook]]></category>
		<category><![CDATA[ультрабук]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/05/2007303/</guid>
		<description><![CDATA[Этот месяц у меня богат на командировки. Пункты назначения все замечательные: Лондон, Шанхай, Тель-Авив, но вот перемещаться между ними, не сбавляя рабочего ритма – это не шуточки. Тут бы написать что-то вроде «но со мной мой верный ультрабук, и все трудности нам нипочем», однако это, конечно, не совсем так. Если не поспишь сутки, никакой персональный компьютер не поможет быть веселым и эффективным. Но работается нам и правда хорошо. ]]></description>
			<content:encoded><![CDATA[<p>Этот месяц у меня богат на командировки. Пункты назначения все замечательные: Лондон, Шанхай, Тель-Авив, но вот перемещаться между ними, не сбавляя рабочего ритма – это не шуточки. Тут бы написать что-то вроде «но со мной мой верный ультрабук, и все трудности нам нипочем», однако это, конечно, не совсем так. Если не поспишь сутки, никакой персональный компьютер не поможет быть веселым и эффективным. Но работается нам и правда хорошо. </p>
<p>В Лондоне проходила презентация нового флагманского смартфона Samsung Galaxy SIII. Так получилось, что из России на нее полетел только я, и потому поступили заказы на «живые фотографии» для двух ресурсов, кроме нашего собственного. Помочь коллегам – святое дело, и отказываться не стал. Правда, задачка встала непростая: сначала отснять  много-много кадров на два фотоаппарата, чтобы каждому ресурсу достались оригинальные снимки, потом быстро добежать до гостиницы, выбрать лучшие кадры, обработать их (снимаю исключительно в RAW) и отправить всем заинтересованным сторонам. Времени в обрез: читатели ждут оперативного отчета. </p>
<p>Для обработки картинок у меня на ультрабуке стоят Photoshop CS5.1 и IrfanView. Обычно это пара из Photoshop и ACDSee, однако после покупки камеры Canon PowerShot S100 у последнего приложения возникли проблемы с показом получающихся на ней RAW. Вроде бы новая версия ACDSee этим тайным умением обладает, но пока руки не дошли ее купить. IrfanView, теоретически, ничем не хуже, однако на практике ограничений здесь масса, и, например, просматривать на сразу много относительно крупных preview фотографий в RAW невозможно, а изменение размера у пары десятков кадров сразу реализовано, по крайней мере, не очень интуитивно. По крайней мере, я так и не сообразил – как это сделать. Возможно, причина в спешке и недосыпе. Но, конечно, дареному коню в зубы не смотрят, а IrfanView бесплатна целиком и полностью.</p>
<p>Презентация смартфона закончилась примерно в 23-20 по Москве, а уже в половине первого я отослал первую партию обработанных фотографий. К часу с хвостиком было отослано вообще все. RAW-файлы мои камеры выдают немаленькие, по 11-13 мегабайт каждый. Однако обрабатывать их на ультрабуке – сплошное удовольствие. Никакой разницы в скорости по сравнению с настольным компьютером, по крайней мере, не заметил. Если бы не мои старомодные привычки обрабатывать каждый файл в Photoshop’е по отдельности, а не общим скриптом, получилось бы еще быстрее. В результате, еще до того, как я рухнул спать, фоторепортажи были опубликованы сразу в трех местах (<a href="http://www.dgl.ru/news/fotootchet-s-prezentatsii-samsung-galaxy-s-iii_1782.html">раз</a>, <a href="http://hi-tech.mail.ru/news/misc/galaxys3.html">два</a> и <a href="http://www.3dnews.ru/news/628727">три</a>). Надо будет в следующий раз и видео снять.</p>
<p>Наутро, более-менее выспавшись, отправился по магазинам. Дело в том, что все культурные места в Лондоне я истоптал во время прошлых визитов, в десятый раз припадать губами к переходу на Abbey Road счел излишним, а в магазинах всегда что-то новенькое. Не рискну публиковать здесь полный фоторепортаж о лондонском шоппинге, но несколько кадров все же выложу. Забрел я в один из огромных и довольно бестолковых магазинов. На первом этаже часы и косметика, на втором и третьем женская одежда, на четвертом мужские вещи, на пятом – подушки, кастрюли и прочие домашние принадлежности. А на самом верху разместился отдел, торгующий электроникой. Ультрабуков там насчитал шесть штук, причем стоят они на отдельных маленьких стендах с разъяснительными надписями.</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/ultra1.jpg"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/ultra1.jpg" alt="" width="650" height="279" class="aligncenter size-full wp-image-2007304" /></a></p>
<p>Выбор довольно приличный – от первопроходца Acer Aspire S3 до свежих Samsung. Некоторые бренды представлены сразу двумя-тремя моделями. Причем, подчеркиваю, это просто отдел в большом универсаме, а не специализированный магазин электроники.</p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/ultra2.jpg"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/ultra2.jpg" alt="" width="650" height="430" class="aligncenter size-full wp-image-2007305" /></a></p>
<p>На меня сильное впечатление произвела вот эта «таблетка» на Core i5. По характеристикам – настоящий мощный компьютер, с 4 гигабайтами ОЗУ, SSD на 64 гигабайта, емкостным мультитач-экраном с разрешением 1366х768 (причем матрица не TN, а PLS), USB-портами и другими привычными вещами. При необходимости подключаем мышь, клавиатуру и монитор, и тогда получается совсем уж бескомпромиссная рабочая лошадка. </p>
<p><a href="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/ultra3.jpg"><img src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/ultra3.jpg" alt="" width="650" height="476" class="aligncenter size-full wp-image-2007306" /></a></p>
<p>При этом вес – 860 грамм, толщина корпуса 13 миллиметров, а время автономной работы – до шести с половиной часов. Последнее, правда, относится к очень оптимистичным фантазиям маркетологов, но пять часов тянет точно. И все это, замечу, на процессоре, который для таких нужд, прямо скажем, заточен средне. Чует, чует мое сердце – на Ivy Bridge пойдут уже не красивые экспериментальные модели, вроде этой, а вполне себе массовые решения. И цена, надо думать, снизится: все же 1000 фунтов (47 000 рублей) за планшет, каким бы функциональным он ни был, дороговато. Также очень любопытно, на какой операционной системе планшетных компьютеров с x86 внутри будет больше, на Android или Windows 8? Вам как кажется?</p>
<p>А знаете, что было самым знаковым во время лондонской командировки? Я впервые за последние полтора года не взял с собой iPad. С ультрабуком он оказался не очень-то и нужным…</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/05/2007303/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сила правильного жеста</title>
		<link>http://software.intel.com/ru-ru/blogs/2012/02/06/2006824/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/02/06/2006824/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 11:38:40 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[CES]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Kinect]]></category>
		<category><![CDATA[Omek Interactive]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/02/06/2006824/</guid>
		<description><![CDATA[На CES в этом году показывали чудо-покрытие, которым можно обработать смартфон, или любой другой традиционно чувствительный к попаданию влаги гаджет, после чего его можно смело ронять в раковину, бассейн и другие богатые водой места. И, говорят, это не красивый концепт с неясными рыночными перспективами, а самое настоящее завтра индустрии. Вроде бы подобное покрытие будет по умолчанию нанесено на неумолимо приближающийся iPhone 5. Я смотрю и думаю: это ж надо какую проблемищу решили, а вот сущую мелочь, некое покрытие, отучающее экраны собирать «пальцы», сделать так и не могут. Хотя разговоры о том, что «вот-вот» слышу с момента появления первых телефонов, управляющихся движениями пальцев по сенсорному экрану…]]></description>
			<content:encoded><![CDATA[<p>На CES в этом году показывали чудо-покрытие, которым можно обработать смартфон, или любой другой традиционно чувствительный к попаданию влаги гаджет, после чего его можно смело ронять в раковину, бассейн и другие богатые водой места. И, говорят, это не красивый концепт с неясными рыночными перспективами, а самое настоящее завтра индустрии. Вроде бы подобное покрытие будет по умолчанию нанесено на неумолимо приближающийся iPhone 5. Я смотрю и думаю: это ж надо какую проблемищу решили, а вот сущую мелочь, некое покрытие, отучающее экраны собирать «пальцы», сделать так и не могут. Хотя разговоры о том, что «вот-вот» слышу с момента появления первых телефонов, управляющихся движениями пальцев по сенсорному экрану…</p>
<p>В свое время сотрудник Apple дал мне мудрый совет по сохранению экрана в чистоте: надо просто отказаться от всяческих чехлов и носить iPhone в кармане джинсов. Действительно, помогает. Особенно если не класть по соседству ключи от квартиры. Но все это не тянет даже на полумеру: в конце концов, просто нереально ходить круглый год в джинсах, а карман пиджака, классических брюк или шорт чистящим эффектом в должной мере не обладает. Казалось бы, остается лишь смириться с неизбежным злом, но, возможно, его удастся забороть немного с другой стороны. Как вы, наверное, знаете, со 2 февраля в продажу поступила версия Microsoft Kinect для Windows, а также стал доступным для скачивания  Kinect Windows SDK версии 1.0. Ходят слухи, что сейчас тестируется версия Kinect, встраиваемая в ноутбуки и ультрабуки, а там, глядишь, дело дойдет до таблеток и смартфонов. Я, конечно, слабо верю в то, что кто-то будет прыгать перед экраном телефона, изображая веселого тигренка, или даже боксировать с виртуальным противником. Но многие привычные операции можно будет совершать без физического контакта. Речь, конечно, не только о банальной идентификации по лицу – это работает и безо всяких мудреных Kinect’ов. Но вот управление жестами может оказаться очень кстати. Пальцами можно изображать много всякого, и одна фигура будет запускать любимое приложение, вторая – открывать адресную книгу, третья, наоборот, возвращать на главный экран. И так далее, и тому подобное. Кстати, только представьте – какой жест будет выбран большинством для звонка любимому руководителю… Результат: экран чистый, аппаратные кнопки испытывают минимум нагрузки и служат дольше, у людей планеты резко улучшается мелкая моторика. Побочный эффект – сокращение времени автономной работы, потому что пара-тройка камер, работающих постоянно, кушает ох как много энергии. Но, глядишь, к тому времени модули камер научат хорошим манерам.</p>
<p>Сама Microsoft тоже не напирает на игровое использование Kinect на компьютерах. Уже выложены ролики о том, как хороша система во время презентаций; как хирург, не нарушая стерильности рук, листает на экране слайды с УЗИ-обследования прямо во время операции, и т.д. и т.п. Выглядит красиво и практично. И все же чуть отстраненно от широких масс.</p>
<p>В связи с этим не могу не поинтересоваться у читателей – а какую практическую пользу вы видите от проникновения на мобильные компьютеры возможности бесконтактного «мимически-ручного» управления? Я, например, вижу огромное облегчение для людей с ограниченными возможностями, причем без дополнительных и недешевых ухищрений, прямо из коробки. А что еще? Как Kinect и его альтернативы могут пригодиться в ультрабуке, в планшетном ПК, в смартфоне? И, главное, насколько удобно добавлять поддержку подобных вещей в программное обеспечение? Просто наизобретать-то можно чего угодно, а реализация на практике частенько прихрамывает на все четыре лапы по весьма банальной причине непродуманности технологии в этом аспекте. Кто уже изучал Kinect Windows SDK живьем?</p>
<p>Кстати, насчет альтернатив – это не оборот речи. На той же CES я познакомился с парнями из израильской компании Omek Interactive, которая придумала технологию, позволяющую соорудить аналог Kinect из подручных средств. Подключаете к компьютеру буквально любые камеры, от камкордеров до вебок, система все это распознает, объединяет, и понеслась. Учитывая, что и сам Kinect родился в Израиле, удивляться не приходится <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/02/06/2006824/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Что необычного в ультрабуках?</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/11/23/2006100/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/23/2006100/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 10:13:34 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Открытый код]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[Acer Aspire S3]]></category>
		<category><![CDATA[Aerofoil]]></category>
		<category><![CDATA[Blink]]></category>
		<category><![CDATA[Folder Lock]]></category>
		<category><![CDATA[Joulemeter]]></category>
		<category><![CDATA[ультрабук]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/23/2006100/</guid>
		<description><![CDATA[На выходных я наконец-то дописал большую статью об ультрабуках, которую некоторые коллеги уже успели окрестить и «полотном», и «Войной и миром». Действительно, в материале 18 000 знаков без учета подписей к иллюстрациям, и еще не все рассказал, что мог бы! Просто ультрабуки – не просто тонкие и легкие ноутбуки, а довольно интересный «отвар» аппаратных и программных технологий, чьи ценные качества будут улучшаться год от года. Но в этом посте, кроме собственно анонса статьи, мне хотелось бы сказать несколько слов о программах, которые будут смотреться на ультрабуках особенно гармонично.]]></description>
			<content:encoded><![CDATA[<p>На выходных я наконец-то дописал большую статью об ультрабуках, которую некоторые коллеги уже успели окрестить и «полотном», и «Войной и миром». Действительно, в материале 18 000 знаков без учета подписей к иллюстрациям, и еще не все рассказал, что мог бы! Просто ультрабуки – не просто тонкие и легкие ноутбуки, а довольно интересный «отвар» аппаратных и программных технологий, чьи ценные качества будут улучшаться год от года. Но в этом посте, кроме собственно анонса статьи, мне хотелось бы сказать несколько слов о программах, которые будут смотреться на ультрабуках особенно гармонично.</p>
<p>Статья под названием «Acer Aspire S3, ультрабук-первопроходец» опубликована на Хабре, <a href="http://habrahabr.ru/company/intel/blog/133066/">добро пожаловать читать и плюсовать</a> (ну, или минусовать, если не понравится). Но вот представьте, купили вы себе что-то подобное, установили привычные программы и призадумались – эх, а чем бы его таким зарядить, чтобы чувствовалось не только «бук», но и «ультра»? При поддержке моего коллеги Андрея Крупина могу предложить несколько вариантов на подобный случай.</p>
<p>Во-первых, на такой действительно мобильный компьютер можно поставить <a href="http://research.microsoft.com/en-us/projects/joulemeter/">программу Joulemeter</a>, разрабатываемую Microsoft. Она умеет в режиме реального времени оценивать энергопотребление как аппаратной части, так и каждого приложения в отдельности. Железо, в силу особенно высокой степени его интеграции, у ультрабука особенно не поменяешь, и можно только любоваться на то, как же мало энергии потребляют такие совершенные микросхемы. А вот наблюдения за поведением софта помогут сформировать правильную модель использования последнего, дабы батарея не садилась подольше.</p>
<p>Многим, наверное понравится и программка <a href="http://luxand.com/blink/">Luxand Blink!</a>, позволяющая отказаться от ввода пароля или сканирования пальца при входе в свой эккаунт. Достаточно просто заглянуть в объектив встроенной камеры – и все, добро пожаловать. А защищать ноутбук хотя бы паролем надо непременно – мало ли что может случиться в дороге. Самые же ценные данные можно зашифровать при помощи программы, вроде <a href="http://www.newsoftwares.net/folderlock/">Folder Lock</a>. Я очень-очень надеюсь, что ни мне, ни вам никогда не придется потерять ноутбук, но, право же, в подобных случаях о железке переживаешь гораздо меньше, чем о личной информации, попадающей в лапы непонятно кому. </p>
<p>Возвращаясь к вопросу энергосбережения, вспомним о программке <a href="http://www.softpedia.com/get/System/OS-Enhancements/Aerofoil.shtml">Aerofoil</a>  которая поможет детально настроить функциональность ультрабука при питании от сети и от батареи, а потом мгновенно переключиться между настройками. Многое из этого можно проделать стандартными средствами Windows, но придется повозиться, а вещи, вроде интерфейса Aero, все равно надо будет включать/выключать вручную. Лучше сэкономить время, благо программка-то бесплатная.</p>
<p>Мы с вами понимаем, что перечисленное выше ПО написано не для ультрабуков, а «просто так». И вот вопрос – а можно ли придумать что-то особенно полезное именно для этого нового класса мобильных компьютеров? Или это слишком нишевая штука, чтобы ломать голову? Или ничего особенного в ультрабуках, с точки зрения разработчика, нет и не будет? </p>
<p>Поделитесь мыслями, пожалуйста.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/23/2006100/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обзор и применение отладочного интерфейса Java (JDI) для модификации ПО</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/11/23/java-jdi-2/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/11/23/java-jdi-2/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 06:59:49 +0000</pubDate>
		<dc:creator>Sergey Melnikov (Intel)</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDI]]></category>
		<category><![CDATA[модификация]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/11/23/java-jdi-2/</guid>
		<description><![CDATA[>В практическом программировании периодически возникают задачи, связанные с необходимостью модификации программного обеспечения при условии отсутствия доступа к его исходным кодам (например, в случае утраты исходных кодов приложения, необходимости доработки стороннего программного обеспечения (добавление в сторонние продукты поддержки сертифицированных в России криптоалгоритмов, реализованных в сторонних криптопровайдерах, например «Крипто-Про JCP»).<br /> Автором предлагается для модификации ПО использовать отладочный интерфейс (в данной статье рассмотрена платформа Java и Java Debug Interface (JDI)): устанавливать в некоторые места точки останова и ждать их активации (по активации точек останова анализировать состояние внутренних структур данных модифицируемого приложения и выполнять действия на основании полученных данных).]]></description>
			<content:encoded><![CDATA[<h1>Введение</h1>
<p> </p>
<p style="text-align: justify">В практическом программировании периодически возникают задачи, связанные с необходимостью модификации программного обеспечения при условии отсутствия доступа к его исходным кодам (например, в случае утраты исходных кодов приложения, необходимости доработки стороннего программного обеспечения (добавление в сторонние продукты поддержки сертифицированных в России криптоалгоритмов, реализованных в сторонних криптопровайдерах, например «Крипто-Про JCP»).<br /> Автором предлагается для модификации ПО использовать отладочный интерфейс (в данной статье рассмотрена платформа Java и Java Debug Interface (JDI)): устанавливать в некоторые места точки останова и ждать их активации (по активации точек останова анализировать состояние внутренних структур данных модифицируемого приложения и выполнять действия на основании полученных данных).<br /> В статье описывается, как можно провести анализ модифицируемого приложения (реверс инжиниринг), дается небольшой обзор JDI и общие рекомендации по созданию модифицирующего приложения-отладчика. В конце стать есть пример.</p>
<p style="text-align: justify"><img height="157" src="http://software.intel.com/ru-ru/blogs/wordpress/wp-content/uploads/scheme.jpg" alt="Схема" width="577" /></p>
<p><em>Рисунок 1. Общая архитектура программного комплекса</em></p>
<p>На рис.1 представлена общая архитектура программного комплекса, состоящего из отлаживаемого модифицируемого приложения, которое необходимо запускать с ключом JVM, активирующим отладку, и разработанного приложения, которое подключается к целевому приложению в качестве отладчика, устанавливает необходимые точки останова и ожидает их активации.<br /> В первую очередь для модификации ПО необходимо провести анализ модифицируемого приложения (реверс-инжиниринг) и выявить места, где необходима и возможна установка точек останова. Это описано в разделе «Анализ модифицируемого приложения». Далее необходимо создать приложение, которое через отладочный интерфейс: создает необходимые точки останова, следящее за их состоянием и анализирующее внутренние структуры данных модифицируемого приложения при их активации. Этот этап описан в разделе «Создание приложения-отладчика». Замечания по полученной системе, ее компонентах и их развертывании описаны в разделе «Развертывание модифицированного приложения».</p>
<p> </p>
<h1>Анализ модифицируемого приложения</h1>
<h2>Получение примерных исходных кодов модифицируемого приложения</h2>
<p style="text-align: justify">Для начала анализа модифицируемого приложения необходимо получить его бинарные jar-файлы с основной логикой его работы (обычно находятся в папке, куда устанавливается модифицируемое приложение). Далее для простоты описания предполагается, что вся логика модифицируемого приложения содержится в одном jar-файле.<br />Первоначально необходимо получить примерные исходные коды приложения, для этого следует распаковать jar-архив как архив zip. В результате этого действия в целевой директории (куда происходила распаковка jar-архива) окажется откомпилированный байт-код Java, сгруппированный в class-файлы, находящиеся в каталогах, соответствующих пакету класса.</p>
<blockquote>
<p style="text-align: justify">Для класса a.b.c.D – файл .\a\b\c\D.class</p>
</blockquote>
<p style="text-align: justify">Для последующего анализа целесообразно получить примерные исходные коды приложения. При этом следует иметь в виду, что декомпиляторы для Java не могут полностью восстановить исходные коды реальных приложений. Полностью восстановить исходные коды возможно лишь для примитивных примеров. Для восстановления исходных кодов по откомпилированному байт-коду, находящемуся в class-файлах, автор использует декомпилятор JAD, распространяемый как свободный для некоммерческого использования. JAD запускается командой вида:</p>
<blockquote><p>jad -o -r -sjava -dsrc tree/**/*.class</p></blockquote>
<p style="text-align: justify">tree/**/*.class – путь к скомпилированным class-файлам, распакованным из jar-архива приложения.<br />По выполнению данной команды в каталоге src будут находиться декомпилированные исходные коды классов модифицируемого приложения.</p>
<blockquote><p>Нумерация строк в восстановленных исходных кодах отличается от реальной. Для установки точки останова по линии необходимо обратиться к ассемблерному листингу class файла.</p></blockquote>
<blockquote><p>jad не совсем корректно определяет try…catch блоки обработки исключений.</p></blockquote>
<h2></h2>
<h2>Анализ исходных кодов</h2>
<blockquote><p>Следующие 2 пункта являются итерационными действиями. Т.е., если по их выполнении не достигнута цель, необходимо повторить их выполнение.</p></blockquote>
<p style="text-align: justify">Затем необходимо провести анализ исходных кодов, чтобы найти возможные участки кода, обрабатывающие события, факт которых необходимо логировать (это можно сделать, анализируя названия классов/методов/логику методов/используемые константы/…). Для этого в среде программирования можно создать пустой проект и поместить туда полученный исходный код. Несмотря на то, что проект не скомпилируется и среда сообщит о множестве ошибок, можно будет пользоваться навигацией по коду.</p>
<blockquote><p>В результате выполнения анализа должны быть выявлены методы, отвечающие за искомую функциональность.</p></blockquote>
<h2></h2>
<h2>Проверка положения точек останова</h2>
<p style="text-align: justify">Для уточнения и проверки мест, при выполнении которых будут активироваться точки останова, необходимо воспользоваться отладочными функциями платформы Java. Необходимо запустить виртуальную машину Java (далее JVM – Java Virtual Machine), которая выполняет модифицируемое приложение в отладочном режиме. Для этого необходимо скорректировать (добавить) параметры, передающиеся приложению JVM при старте (параметры командной строки). Обычно java-приложение запускается строчкой вида Java –jar ПутьКJAR.jar (для более серьезных программных продуктов используются собственные «запускальщики», в конфигурационных файлах которых содержатся параметры запуска JVM), к которой необходимо добавить параметры</p>
<blockquote><p>-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</p></blockquote>
<p style="text-align: justify">Теперь можно открыть среду программирования на Java (например, NetBeans) и начать удаленную отладку приложения: среда подключится к модифицируемому приложению в качестве отладчика, что даст возможность уточнить места модифицируемой функциональности, в которые необходимо устанавливать точки останова. В первом приближении для более точного определения участка, обрабатывающего необходимое событие, автор рекомендует ставить точки останова (Breakpoint) для всех методов класса (флажок All Methods), полученного в ходе анализа декомпилированных исходных кодов. Также рекомендуется установить реакцию на точку останова – продолжение выполнения.</p>
<blockquote><p>Если исходные коды были скомпилированы без информации о:</p>
<li>строках, то создать точку останова, активирующуюся по выполнении заданной строчки невозможно.</li>
<li>локальных переменных, то информация о локальных переменных будет недоступна</li>
</blockquote>
<blockquote><p>Стоит обратить внимание на поле ввода “Print Text” свойств точек останова – во время активации точки останова на панель Output будет выводиться сообщение из этого поля ввода. В это поле ввода можно добавить вывод значений полей или выполнения методов. Вычисляемые значения обрамляются символами “{=” и “}” в начале и конце соответственно. Пример: Break point active: {=SomeField}, {=toString()}, {=SomeMethod()}</p></blockquote>
<p style="text-align: justify">Далее следует проанализировать результат, выведенный в панели Output. В нем необходимо найти классы и методы, вызываемые при возникновении ожидаемого события. В результате этого будет получен список методов классов, пригодных для обнаружения факта возникновения события.</p>
<p style="text-align: justify">Для проверки пригодности полученных методов классов для обнаружения события можно провести проверку: создать точки останова только для полученных методов классов и запустить приложение на выполнение. В логах точек останова (на панели Output) должны появляться сообщения об активации точек останова одновременно с возникающим событием. В результате выполнения данных итерационных действий будет получен один/несколько целевых методов классов, вызов которых происходит при обработке события. После прохождения первой итерации, возможно, полное понимание, изменение каких внутренних структур модифицируемого приложения необходимо отслеживать не появится. Необходимо вернуться к анализу примерного исходного кода модифицируемого приложения для уточнения.</p>
<p style="text-align: justify">Обычно необходимо не только обнаруживать факт возникновения события, но и получить некую информацию о событии, для чего можно воспользоваться методом, описанным ниже.</p>
<p style="text-align: justify">Необходимо установить точки останова на методы классов, полученных во время предыдущей итерации. В качестве реакции на активацию точки останова необходимо установить остановку потока/всего приложения. По активации точки останова (возникновении события) необходимо перейти на панель Variables (переменные) и просмотреть значения локальных переменных. Также рекомендуется еще раз обратиться к примерным исходным кодам.</p>
<blockquote><p>Можно рекомендовать изменить окно стека и проанализировать поля/локальные переменные других окон стека.</p></blockquote>
<p style="text-align: justify">Также возможна реализация такого механизма модификации: выявляется некий относительно простой (по объему кода) класс (возможно, предок какой-то иерархии), чей код достаточно читаем после декомпиляции. Необходимо полностью восстановить его, чтобы класс компилировался и добавить необходимый функционал (например, записи в файл). Откомпилированный класс, представляющий собой class файл можно будет на лету заменить при помощи метода redefineClasses(…) объекта, реализующего интерфейс VirtualMachine (подробнее рассмотрено в разделе «Выполнение методов в отлаживаемой JVM»).</p>
<blockquote><p>В результате выполнения данного пункта должно появиться полное понимание, где необходимо расставить точки останова в модифицируемом приложении. Теперь можно перейти к созданию приложения-отладчика.</p></blockquote>
<h1></h1>
<h1>Создание приложения-отладчика</h1>
<h2>Установление связи отладчика и отлаживаемого приложения</h2>
<p style="text-align: justify">После выяснение положения точек останова, необходимо начать реализацию приложения-отладчика, модифицирующего функционал модифицируемого приложения.</p>
<p style="text-align: justify">Автор использовал реализацию JDI от Sun, распространяемую вместе с Java Development Kit (JDK) в виде jar-архива tools.jar.</p>
<p style="text-align: justify">Для установки соединения c удаленной JVM используются классы com.sun.jdi.Bootstrap com.sun.jdi.VirtualMachineManager. В результате подключения к удаленной JVM будет получен объект, реализующий интерфейс com.sun.jdi.VirtualMachine (см. Листинг 1).</p>
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">VirtualMachineManager VMManager <span style="color: #339933">=</span> Bootstrap.<span style="color: #006633">virtualMachineManager</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">for</span> <span style="color: #009900">&#040;</span>AttachingConnector Connector <span style="color: #339933">:</span> VMManager.<span style="color: #006633">attachingConnectors</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>Connector.<span style="color: #006633">transport</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">name</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">equals</span><span style="color: #009900">&#040;</span>“dt_socket”<span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; AttConnector <span style="color: #339933">=</span> Connector<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">break</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">Map<span style="color: #339933">&lt;</span>String, Argument<span style="color: #339933">&gt;</span> connectorParameters <span style="color: #339933">=</span> AttConnector.<span style="color: #006633">defaultArguments</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">connectorParameters.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;port&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">setValue</span><span style="color: #009900">&#040;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aport+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Port</span></a><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">connectorParameters.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;hostname&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">setValue</span><span style="color: #009900">&#040;</span>Host<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">VirtualMachine result <span style="color: #339933">=</span> AttConnector.<span style="color: #006633">attach</span><span style="color: #009900">&#040;</span>connectorParameters<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
</ol>
</div>
</blockquote>
<p><em>Листинг 1. Подключение к отлаживаемой JVM</em></p>
<p><em><br /></em></p>
<p style="text-align: justify">В документации JavaDoc описаны несколько методов подключения отладчика. Выше показано использование самого интересного варианта – подключение на лету (Just-In-Time Debugging). Стоит отметить, что подключение к отлаживаемой JVM возможно с помощью нескольких коннекторов:</p>
<ul>
<li><strong>dt_socket</strong> – подключение через сетевые сокеты;</li>
<li><strong>dt_shmem</strong> – подключение через общий участок памяти</li>
</ul>
<p style="text-align: justify">Выбор коннектора из списка возможных, возвращаемых методом  attachingConnectors() экземпляра класса VirtualMachineManager, осуществляется по названию. Различные реализации JVM могут предоставлять разные коннекторы.</p>
<p style="text-align: justify">Описание параметров подключения для каждого коннектора представлены в Таблице 1.</p>
<p><em>Таблица 1. Коннекторы и их параметры</em> </p>
<table border="1">
<tbody>
<tr>
<td width="100px"><strong>Коннектор</strong></td>
<td width="200px"><strong>dt_socket</strong></td>
<td width="200px"><strong>dt_shmem</strong></td>
</tr>
<tr>
<td>Параметры</td>
<td>
<ul>
<li>host – адрес (символьный или IP) компьютера, на котором запущено отлаживаемое приложение</li>
<li>port – порт, который слушает отлаживаемое приложение</li>
<li>timeout – время ожидания ответа</li>
</ul>
</td>
<td>
<ul>
<li>name – имя общего участка памяти</li>
<li>timeout – таймаут ожидания ответа</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p style="text-align: justify">Пример, приведенный в Листинге 1, иллюстрирует подключение через коннектор dt_socket. Данный коннектор позволяет отлаживать приложения не только в рамках локального  компьютера, но и удаленно (по сети).</p>
<h2></h2>
<h2>Типы точек останова, поддерживаемые JVM</h2>
<p style="text-align: justify">Интерфейс JDI поддерживает типы точек останова, представленные в Таблице 2. Все точки останова унаследованы от интерфейса EventRequest.</p>
<p><em>Таблица 2. Типы точек останова</em> </p>
<table border="1">
<tbody>
<tr>
<td width="50%"><strong>Тип точки останова</strong></td>
<td width="50%"><strong>Активируется по</strong></td>
</tr>
<tr>
<td>AccessWatchpointRequest</td>
<td>доступу к полю класса</td>
</tr>
<tr>
</tr>
<tr>
<td>BreakpointRequest</td>
<td>выполнению кода</td>
</tr>
<tr>
</tr>
<tr>
<td>ClassPrepareRequest</td>
<td>загрузке нового класса</td>
</tr>
<tr>
</tr>
<tr>
<td>ClassUnloadRequest</td>
<td>выгрузке класса</td>
</tr>
<tr>
</tr>
<tr>
<td>ExceptionRequest</td>
<td>возникновению исключения в отлаживаемой JVM</td>
</tr>
<tr>
</tr>
<tr>
<td>MethodEntryRequest</td>
<td>началу выполнения метода</td>
</tr>
<tr>
</tr>
<tr>
<td>MethodExitRequest</td>
<td>окончанию выполнения метода</td>
</tr>
<tr>
</tr>
<tr>
<td>ModificationWatchpointRequest</td>
<td>модификации значения поля</td>
</tr>
<tr>
</tr>
<tr>
<td>StepRequest</td>
<td>пошаговому выполнению</td>
</tr>
<tr>
</tr>
<tr>
<td>ThreadDeathRequest</td>
<td>остановке потока</td>
</tr>
<tr>
</tr>
<tr>
<td>ThreadStartRequest</td>
<td>созданию потока</td>
</tr>
<tr>
</tr>
<tr>
<td>VMDeathRequest</td>
<td>остановке отлаживаемой JVM</td>
</tr>
</tbody>
</table>
<p style="text-align: justify">Установку точки останова, активирующейся по началу выполнения определенного кода (в данном случае – в начале метода), можно провести с помощью следующего кода:</p>
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">EventRequestManager Manager <span style="color: #339933">=</span> JVM.<span style="color: #006633">eventRequestManager</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">ReferenceType RefType <span style="color: #339933">=</span> JVM.<span style="color: #006633">classesByName</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;&#1062;&#1077;&#1083;&#1077;&#1074;&#1086;&#1081;.&#1050;&#1083;&#1072;&#1089;&#1089;&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Method</span></a> RefMethod <span style="color: #339933">=</span> RefType.<span style="color: #006633">methodsByName</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;&#1062;&#1077;&#1083;&#1077;&#1074;&#1086;&#1081;&#1052;&#1077;&#1090;&#1086;&#1076;&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">BreakpointRequest <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arequest+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Request</span></a> <span style="color: #339933">=</span> Manager.<span style="color: #006633">createBreakpointRequest</span><span style="color: #009900">&#040;</span>RefMethod.<span style="color: #006633">location</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arequest+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Request</span></a>.<span style="color: #006633">setSuspendPolicy</span><span style="color: #009900">&#040;</span>BreakpointRequest.<span style="color: #006633">SUSPEND_EVENT_THREAD</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arequest+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Request</span></a>.<span style="color: #006633">enable</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
</ol>
</div>
</blockquote>
<p><em>Листинг 2. Создание и «включение» точки останова</em></p>
<p style="text-align: justify">Пояснения к коду: первоначально создается менеджер точек останова (объект Manager). Далее происходит получение объектов с интерфейсами <em>ReferenceType</em> и <em>Method</em>, описывающих, соответственно, целевой класс и метод, находящиеся на удаленной JVM. Интерфейс <em>Method</em> унаследован от интерфейса <em>Locatable</em>, в результате чего можно получить точное местоположение метода в выполняемом байт-коде и создать в этом месте точку останова. Далее создается точка останова (объект Request типа BreakpointRequest), активирующаяся при выполнении каким-либо потоком приложения целевого метода (точнее, его начала, на которое указывает метод <em>location()</em>).</p>
<p style="text-align: justify">При создании точки останова можно изменить политику остановки потоков при активации точки останова с помощью метода setSuspendPolicy(int policy). На данный момент в JDI возможно 3 значения:</p>
<ul>
<li><strong>SUSPEND_ALL</strong> – останавливать все потоки при активации точки останова</li>
<li><strong>SUSPEND_EVENT_THREAD</strong> – останавливать только поток, активировавший точку останова</li>
<li><strong>SUSPEND_NONE</strong> – не останавливать потоки</li>
</ul>
<h2></h2>
<h2>Главный цикл обработки событий активации точек останова</h2>
<p style="text-align: justify">После создания всех необходимых точек останова и их «включения» (методом enable()) необходимо перейти к ожиданию активации точек останова. Если необходимые классы не были загружены на момент старта JVM и создания точек останова, можно создать дополнительную точку останова, активирующуюся по загрузке класса, и следить за моментом загрузки этого класса (см. полный текст программы в приложении).</p>
<blockquote><p>После создания всех точек останова можно возобновить выполнение JVM, прерванное подключением отладчика, с помощью метода <em>JVM.resume()</em>.</p></blockquote>
<p style="text-align: justify">Для обработки активации точек останова необходимо получить объект типа <em>EventQueue</em> с помощью метода <em>JVM.eventQueue()</em>. Этот объект позволяет получить итератор событий активации точек останова (объектов с интерфейсом Event). Реализацию данных действий иллюстрирует листинг, приведенный ниже:</p>
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aeventqueue+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">EventQueue</span></a> &nbsp;Events <span style="color: #339933">=</span> JVM.<span style="color: #006633">eventQueue</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">while</span><span style="color: #009900">&#040;</span><span style="color: #000066;font-weight: bold">true</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; EventSet ProcessedEvents <span style="color: #339933">=</span> Events.<span style="color: #006633">remove</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">try</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; EventIterator ItEvents <span style="color: #339933">=</span> ProcessedEvents.<span style="color: #006633">eventIterator</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">while</span> <span style="color: #009900">&#040;</span>ItEvents.<span style="color: #006633">hasNext</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Event</span></a> NextEvent <span style="color: #339933">=</span> ItEvents.<span style="color: #006633">nextEvent</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; ...</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span> <span style="color: #000000;font-weight: bold">finally</span> <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; ProcessedEvents.<span style="color: #006633">resume</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span></div>
</li>
</ol>
</div>
</blockquote>
<p><em>Листинг 3. Обработка очереди активированных точек останова</em></p>
<blockquote><p>После обработки всех событий следует вызвать метод <em>resume()</em>, возвращающий управление в отлаживаемую JVM.</p></blockquote>
<h2></h2>
<h2>Обработка событий активации точек останова</h2>
<p style="text-align: justify">Обработку событий активации точек останова удобнее вести в соответствии с реальным типом события, определяемым с помощью конструкции <em>instanceof</em>. Таким образом, можно быстро отделить события активации точек останова, необходимых для модификации логики работы, от, например, событий загрузки классов, необходимых для создания точек останова в классах, загружаемых не сразу.</p>
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>NextEvent <span style="color: #000000;font-weight: bold">instanceof</span> BreakpointEvent<span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; BreakpointEvent <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Event</span></a> <span style="color: #339933">=</span> <span style="color: #009900">&#040;</span>BreakpoinEvent<span style="color: #009900">&#041;</span>NextEvent<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; StackFrame CurrentMethodContext <span style="color: #339933">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Event</span></a>.<span style="color: #006633">thread</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">frame</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; ObjectReference SomeObject <span style="color: #339933">=</span> CurrentMethodContext.<span style="color: #006633">thisObject</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afield+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Field</span></a> SomeFldRef <span style="color: #339933">=</span> SomeObject.<span style="color: #006633">referenceType</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">fieldByName</span><span style="color: #009900">&#040;</span>FieldName<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; StringReference FieldValue <span style="color: #339933">=</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#040;</span>StringReference<span style="color: #009900">&#041;</span>SomeObject.<span style="color: #006633">getValue</span><span style="color: #009900">&#040;</span>SomeFldRef<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">System</span></a>.<span style="color: #006633">out</span>.<span style="color: #006633">println</span><span style="color: #009900">&#040;</span>FieldValue.<span style="color: #006633">value</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">else</span> <span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>NextEvent <span style="color: #000000;font-weight: bold">instanceof</span> ClassPrepareEvent<span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #666666;font-style: italic">//&#1086;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1079;&#1072;&#1075;&#1088;&#1091;&#1079;&#1082;&#1080; &#1082;&#1083;&#1072;&#1089;&#1089;&#1072;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span></div>
</li>
</ol>
</div>
</blockquote>
<p><em>Листинг 4. Обработка события активации точки останова</em></p>
<p style="text-align: justify">В данном листинге стоит обратить внимание на получение объекта <em>this</em> из верхнего окна стека и получение полей объекта <em>this</em>. У событий активации точек останова, реализующих интерфейс <em>LocatableEvent</em> (события о доступе/модификации поля, пошаговом выполнении, выполнении определенного кода и т.д.), есть возможность получить объект потока отлаживаемой JVM, в котором произошла активация точки останова. Данный объект предоставляет крайне широкие возможности: обход окон стека (получение объекта this, локальных переменных и полей объекта в выбранном окне стека), выполнение методов в отлаживаемой JVM.</p>
<h2></h2>
<h2>Выполнение методов в отлаживаемой JVM</h2>
<p style="text-align: justify">Для выполнения метода объекта необходимо первоначально получить объект, описывающий необходимый метод (как Method из reflection)(в данном примере получение метода упрощено). Для передачи параметров выполняемому методу передается массив объектов типа Value. Интерфейс Value представляет собой ссылку на конкретное значение в отлаживаемой JVM. Маршалинг из JVM отладчика в отлаживаемую JVM значений примитивных типов осуществляется с помощью перегруженных методов <em>mirrorOf()</em> интерфейса <em>VirtualMachine</em>, показанных в [1]. Таким же образом можно провести маршалинг строк (точнее, объектов типа <em>java.lang.String</em>).   <em>Таблица 3. Методы для маршалинга примитивных типов в отлаживаемую JVM</em> </p>
<p />
<table border="1">
<tbody>
<tr>
<td width="40%"><strong>Возвращаемое значение</strong></td>
<td width="60%"><strong>Сигнатура метода</strong></td>
</tr>
<tr>
<td>BooleanValue</td>
<td>mirrorOf(boolean value)</td>
</tr>
<tr>
<td>ByteValue</td>
<td>mirrorOf(byte value)</td>
</tr>
<tr>
<td>CharValue</td>
<td>mirrorOf(char value)</td>
</tr>
<tr>
<td>DoubleValue</td>
<td>mirrorOf(double value)</td>
</tr>
<tr>
<td>FloatValue</td>
<td>mirrorOf(float value)</td>
</tr>
<tr>
<td>IntegerValue</td>
<td>mirrorOf(int value)</td>
</tr>
<tr>
<td>LongValue</td>
<td>mirrorOf(long value)</td>
</tr>
<tr>
<td>ShortValue</td>
<td>mirrorOf(short value)</td>
</tr>
<tr>
<td>StringReference</td>
<td>mirrorOf(String value)</td>
</tr>
</tbody>
</table>
<p />
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">static</span> <span style="color: #000000;font-weight: bold">public</span> Value InvokeMethod<span style="color: #009900">&#040;</span>ThreadReference <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acontext+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Context</span></a>, </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; ObjectReference <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Object</span></a>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> MethodName, Value<span style="color: #009900">&#091;</span><span style="color: #009900">&#093;</span> Params<span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Method</span></a> CallMethod <span style="color: #339933">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Object</span></a>.<span style="color: #006633">referenceType</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">methodsByName</span><span style="color: #009900">&#040;</span>MethodName<span style="color: #009900">&#041;</span>.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; List<span style="color: #339933">&lt;</span>Value<span style="color: #339933">&gt;</span> ParamsList <span style="color: #339933">=</span> <span style="color: #000000;font-weight: bold">new</span> ArrayList<span style="color: #339933">&lt;</span>Value<span style="color: #339933">&gt;</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; result <span style="color: #339933">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Object</span></a>.<span style="color: #006633">invokeMethod</span><span style="color: #009900">&#040;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acontext+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Context</span></a>,</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CallMethod,</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarrays+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Arrays</span></a>.<span style="color: #006633">asList</span><span style="color: #009900">&#040;</span>Params<span style="color: #009900">&#041;</span>,</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ObjectReference.<span style="color: #006633">INVOKE_SINGLE_THREADED</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">return</span> result<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span></div>
</li>
</ol>
</div>
</blockquote>
<p><em>Листинг 5. Выполнение метода в отлаживаемой JVM</em></p>
<blockquote><p>При выполнении методов необходимо обратить особое внимание на возможность возникновения взаимоблокировок между вызываемым методом и методов, вызванных самим приложением.</p></blockquote>
<p style="text-align: justify">Еще одной чрезвычайно интересной возможностью JDI является переопределение байт-кода класса на лету, во время выполнения. Доступность данной возможности можно определить с помощью метода <em>canRedefineClasses()</em> интерфейса <em>VirtualMachine</em>. Переопределение байт-кода класса производится с помощью метода <em>redefineClasses(Map&lt;? extends ReferenceType,byte[]&gt; classToBytes)</em> интерфейса <em>VirtualMachine</em>. Данный метод будет успешно выполнен и модификация классов осуществится только если метод canRedefineClasses() вернул истину, т.е. отлаживаемая JVM поддерживает динамическое переопределение классов.</p>
<blockquote><p>В результате выполнения вышеперечисленных пунктов должно быть разработано приложение, которое подключается к модифицируемому приложению через отладочный интерфейс (JDI), создает точки останова, ждет их активации, при которой анализирует состояние внутренних структур данных модифицируемого приложения, возможно, выполняет методы из модифицируемого приложения.</p></blockquote>
<h2></h2>
<h2>Развертывание модифицированного приложения</h2>
<p style="text-align: justify">Для развертывания модифицированного приложения рекомендуется создать bat-файл, запускающий JVM в отладочном режиме (или дописать необходимые параметры в конфиг «стартера» приложения), вида:</p>
<blockquote><p>Java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y –jar ПутьКJARПриложения.jar</p></blockquote>
<blockquote><p>Особо стоит обратить внимание на флаг suspend (ожидание подключение отладчика), установленный в “y” (сокр. от “yes”). Это сделано сознательно, с целью предотвратить запуск приложения отдельно от приложения-отладчика, реализованного в виде стороннего приложения.</p></blockquote>
<p style="text-align: justify">После выполнения данной команды ОС загрузит JVM, которая будет ожидать подключения отладчика на порт 8787. После подключениия отладчика выполнение jar-файла будет продолжено.</p>
<h1></h1>
<h1>Пример работы с JDI</h1>
<p style="text-align: justify">Для запуска примера необходимо:</p>
<ol>
<li>Скомпилировать отлаживаемое приложение.</li>
<li>Запустить отлаживаемое приложение командой вида:<br />
<blockquote><p>Java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n –jar ПутьКJARПриложения.jar</p></blockquote>
</li>
<li>Скомпилировать приложение-отладчик.</li>
<li>Запустить приложение-отладчик командой вида:<br />
<blockquote><p>Java –jar ПутьКJARПриложения.jar</p></blockquote>
</li>
</ol>
<h2>Пример приложения-отладчик</h2>
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">package</span> <span style="color: #006699">Jdi</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.*</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.event.*</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.connect.AttachingConnector</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.connect.Connector.Argument</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.connect.IllegalConnectorArgumentsException</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.request.BreakpointRequest</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">com.sun.jdi.request.EventRequestManager</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">java.util.Map</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">import</span> <span style="color: #006699">java.io.IOException</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">/**</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp;*</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp;* @author Sergey Melnikov</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp;*/</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">public</span> <span style="color: #000000;font-weight: bold">class</span> HelloJDI </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> <span style="color: #000000;font-weight: bold">static</span> <span style="color: #000000;font-weight: bold">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> TRANSPORT <span style="color: #339933">=</span> <span style="color: #0000ff">&quot;dt_socket&quot;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> <span style="color: #000000;font-weight: bold">static</span> <span style="color: #000000;font-weight: bold">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> ClassName <span style="color: #339933">=</span> <span style="color: #0000ff">&quot;Jdi.Main&quot;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> <span style="color: #000000;font-weight: bold">static</span> <span style="color: #000000;font-weight: bold">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> MethodName <span style="color: #339933">=</span> <span style="color: #0000ff">&quot;PrintFieldValue&quot;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> <span style="color: #000000;font-weight: bold">static</span> <span style="color: #000000;font-weight: bold">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> FieldName <span style="color: #339933">=</span> <span style="color: #0000ff">&quot;_someField&quot;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> VirtualMachine JVM<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #666666;font-style: italic">// &#1089;&#1086;&#1079;&#1076;&#1072;&#1077;&#1084; &#1090;&#1086;&#1095;&#1082;&#1091; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1072; &#1076;&#1083;&#1103; &#1082;&#1083;&#1072;&#1089;&#1089;&#1072; ClassName, &#1084;&#1077;&#1090;&#1086;&#1076;&#1072; MethodName</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> BreakpointRequest CreateBreakpointRequest<span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1084;&#1077;&#1085;&#1077;&#1076;&#1078;&#1077;&#1088; &#1090;&#1086;&#1095;&#1077;&#1082; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1072;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; EventRequestManager Manager <span style="color: #339933">=</span> JVM.<span style="color: #006633">eventRequestManager</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1090;&#1080;&#1087;&#1099;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; ReferenceType RefType <span style="color: #339933">=</span> JVM.<span style="color: #006633">classesByName</span><span style="color: #009900">&#040;</span>ClassName<span style="color: #009900">&#041;</span>.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Method</span></a> RefMethod <span style="color: #339933">=</span> RefType.<span style="color: #006633">methodsByName</span><span style="color: #009900">&#040;</span>MethodName<span style="color: #009900">&#041;</span>.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">//&#1089;&#1086;&#1079;&#1076;&#1072;&#1077;&#1084; &#1090;&#1086;&#1095;&#1082;&#1091; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1072;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; BreakpointRequest <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arequest+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Request</span></a> <span style="color: #339933">=</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Manager.<span style="color: #006633">createBreakpointRequest</span><span style="color: #009900">&#040;</span>RefMethod.<span style="color: #006633">location</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arequest+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Request</span></a>.<span style="color: #006633">setSuspendPolicy</span><span style="color: #009900">&#040;</span>BreakpointRequest.<span style="color: #006633">SUSPEND_EVENT_THREAD</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">return</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arequest+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Request</span></a><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #666666;font-style: italic">// &#1087;&#1086;&#1076;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084;&#1089;&#1103; &#1082; &#1091;&#1076;&#1072;&#1083;&#1077;&#1085;&#1085;&#1086;&#1081; JVM, &#1086;&#1078;&#1080;&#1076;&#1072;&#1102;&#1097;&#1077;&#1081; &#1087;&#1086;&#1076;&#1082;&#1083;&#1102;&#1095;&#1077;&#1085;&#1080;&#1103; &#1086;&#1090;&#1083;&#1072;&#1076;&#1095;&#1080;&#1082;&#1072;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">private</span> <span style="color: #000066;font-weight: bold">void</span> ConnectToJVM<span style="color: #009900">&#040;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> Host, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aport+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Port</span></a><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">IOException</span></a>, IllegalConnectorArgumentsException</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; VirtualMachineManager JVMManager <span style="color: #339933">=</span> Bootstrap.<span style="color: #006633">virtualMachineManager</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; AttachingConnector AttConnector <span style="color: #339933">=</span> <span style="color: #000066;font-weight: bold">null</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">for</span> <span style="color: #009900">&#040;</span>AttachingConnector Connector <span style="color: #339933">:</span> JVMManager.<span style="color: #006633">attachingConnectors</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>Connector.<span style="color: #006633">transport</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span> <span style="color: #339933">!=</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;font-weight: bold">null</span> <span style="color: #339933">&amp;&amp;</span> Connector.<span style="color: #006633">transport</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">name</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">equals</span><span style="color: #009900">&#040;</span>TRANSPORT<span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AttConnector <span style="color: #339933">=</span> Connector<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">break</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1103;&#1077;&#1084; &#1087;&#1072;&#1088;&#1072;&#1084;&#1077;&#1090;&#1088;&#1099;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; Map<span style="color: #339933">&lt;</span>String, Argument<span style="color: #339933">&gt;</span> ConnectionParams <span style="color: #339933">=</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; AttConnector.<span style="color: #006633">defaultArguments</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>ConnectionParams.<span style="color: #006633">containsKey</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;port&quot;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ConnectionParams.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;port&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">setValue</span><span style="color: #009900">&#040;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aport+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Port</span></a><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>ConnectionParams.<span style="color: #006633">containsKey</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;hostname&quot;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ConnectionParams.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;hostname&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">setValue</span><span style="color: #009900">&#040;</span>Host<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">if</span> <span style="color: #009900">&#040;</span>ConnectionParams.<span style="color: #006633">containsKey</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;timeout&quot;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ConnectionParams.<span style="color: #006633">get</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;timeout&quot;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">setValue</span><span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;10000&quot;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; JVM <span style="color: #339933">=</span> AttConnector.<span style="color: #006633">attach</span><span style="color: #009900">&#040;</span>ConnectionParams<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">public</span> HelloJDI<span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">public</span> <span style="color: #000066;font-weight: bold">void</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aprocess+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Process</span></a> <span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span> <span style="color: #000000;font-weight: bold">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Exception</span></a> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1087;&#1086;&#1076;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084;&#1089;&#1103; &#1082; JVM</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; ConnectToJVM<span style="color: #009900">&#040;</span><span style="color: #0000ff">&quot;127.0.0.1&quot;</span>, <span style="color: #0000ff">&quot;8787&quot;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #666666;font-style: italic">//&#1089;&#1086;&#1079;&#1076;&#1072;&#1077;&#1084; &#1080; &#1072;&#1082;&#1090;&#1080;&#1074;&#1080;&#1088;&#1091;&#1077;&#1084; &#1090;&#1086;&#1095;&#1082;&#1091; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1072;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; CreateBreakpointRequest<span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">enable</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1074;&#1086;&#1079;&#1086;&#1073;&#1085;&#1086;&#1074;&#1083;&#1103;&#1077;&#1084; &#1074;&#1099;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;&#1080;&#1077; &#1074; JVM</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; JVM.<span style="color: #006633">resume</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000066;font-weight: bold">int</span> i <span style="color: #339933">=</span> <span style="color: #cc66cc">0</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1100;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aeventqueue+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">EventQueue</span></a> &nbsp;Events <span style="color: #339933">=</span> JVM.<span style="color: #006633">eventQueue</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">while</span> <span style="color: #009900">&#040;</span><span style="color: #000066;font-weight: bold">true</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; EventSet ProcessedEvents <span style="color: #339933">=</span> Events.<span style="color: #006633">remove</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">try</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1088;&#1072;&#1079;&#1073;&#1080;&#1088;&#1072;&#1077;&#1084; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1100;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; EventIterator ItEvents <span style="color: #339933">=</span> ProcessedEvents.<span style="color: #006633">eventIterator</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">while</span> <span style="color: #009900">&#040;</span>ItEvents.<span style="color: #006633">hasNext</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Event</span></a> NextEvent <span style="color: #339933">=</span> ItEvents.<span style="color: #006633">nextEvent</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BreakpointEvent MyEvent <span style="color: #339933">=</span> <span style="color: #009900">&#040;</span>BreakpointEvent<span style="color: #009900">&#041;</span> NextEvent<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">// &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1086;&#1082;&#1085;&#1086; &#1089;&#1090;&#1077;&#1082;&#1072;, &#1086;&#1073;&#1098;&#1077;&#1082;&#1090; this &#1080; &#1087;&#1086;&#1083;&#1077; FieldName</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StackFrame CurrentMethodContext <span style="color: #339933">=</span> MyEvent.<span style="color: #006633">thread</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">frame</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">0</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectReference SomeObject <span style="color: #339933">=</span> CurrentMethodContext.<span style="color: #006633">thisObject</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afield+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Field</span></a> SomeFldRef <span style="color: #339933">=</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeObject.<span style="color: #006633">referenceType</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">fieldByName</span><span style="color: #009900">&#040;</span>FieldName<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">//&#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1080; &#1074;&#1099;&#1074;&#1086;&#1076;&#1080;&#1084; &#1079;&#1085;&#1072;&#1095;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1083;&#1103;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StringReference FieldValue <span style="color: #339933">=</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#040;</span>StringReference<span style="color: #009900">&#041;</span>SomeObject.<span style="color: #006633">getValue</span><span style="color: #009900">&#040;</span>SomeFldRef<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">System</span></a>.<span style="color: #006633">out</span>.<span style="color: #006633">println</span><span style="color: #009900">&#040;</span>FieldValue.<span style="color: #006633">value</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeObject.<span style="color: #006633">setValue</span><span style="color: #009900">&#040;</span>SomeFldRef, JVM.<span style="color: #006633">mirrorOf</span><span style="color: #009900">&#040;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a>.<span style="color: #006633">valueOf</span><span style="color: #009900">&#040;</span>i<span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933">++</span>i<span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #009900">&#125;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">finally</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; ProcessedEvents.<span style="color: #006633">resume</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #000000;font-weight: bold">public</span> <span style="color: #000000;font-weight: bold">static</span> <span style="color: #000066;font-weight: bold">void</span> main<span style="color: #009900">&#040;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a><span style="color: #009900">&#091;</span><span style="color: #009900">&#093;</span> Args<span style="color: #009900">&#041;</span> <span style="color: #000000;font-weight: bold">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Exception</span></a></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; HelloJDI Hello <span style="color: #339933">=</span> <span style="color: #000000;font-weight: bold">new</span> HelloJDI<span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; Hello.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aprocess+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Process</span></a><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
</ol>
</div>
</blockquote>
<h2>Тестовое модифицируемое приложение</h2>
<blockquote>
<div class="java" style="font-family:monospace;color: #006;border: 1px solid #d0d0d0;background-color: #f0f0f0">
<ol>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">package</span> <span style="color: #006699">Jdi</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">/**</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp;*</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp;* @author Sergey Melnikov</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp;*/</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #000000;font-weight: bold">public</span> <span style="color: #000000;font-weight: bold">class</span> Main </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a> _someField <span style="color: #339933">=</span> <span style="color: #0000ff">&quot;text&quot;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">public</span> <span style="color: #000066;font-weight: bold">void</span> PrintFieldValue<span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">System</span></a>.<span style="color: #006633">out</span>.<span style="color: #006633">println</span><span style="color: #009900">&#040;</span>_someField<span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #008000;font-style: italic;font-weight: bold">/**</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp; &nbsp; &nbsp;* @param args the command line arguments</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #008000;font-style: italic;font-weight: bold">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #000000;font-weight: bold">public</span> <span style="color: #000000;font-weight: bold">static</span> <span style="color: #000066;font-weight: bold">void</span> main<span style="color: #009900">&#040;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">String</span></a><span style="color: #009900">&#091;</span><span style="color: #009900">&#093;</span> args<span style="color: #009900">&#041;</span> <span style="color: #000000;font-weight: bold">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainterruptedexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">InterruptedException</span></a> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666;font-style: italic">// TODO code application logic here</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; Main obj <span style="color: #339933">=</span> <span style="color: #000000;font-weight: bold">new</span> Main<span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;font-weight: bold">while</span><span style="color: #009900">&#040;</span><span style="color: #000066;font-weight: bold">true</span><span style="color: #009900">&#041;</span> </div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#123;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span style="color: #006633">PrintFieldValue</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Athread+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399">Thread</span></a>.<span style="color: #006633">currentThread</span><span style="color: #009900">&#040;</span><span style="color: #009900">&#041;</span>.<span style="color: #006633">sleep</span><span style="color: #009900">&#040;</span><span style="color: #cc66cc">1000</span><span style="color: #009900">&#041;</span><span style="color: #339933">;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp; &nbsp; <span style="color: #009900">&#125;</span></div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020">&nbsp;</div>
</li>
<li>
<div style="font: normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;color: #000020"><span style="color: #009900">&#125;</span></div>
</li>
</ol>
</div>
</blockquote>
<h1>Список литературы</h1>
<ol>
<li><strong>JavaTM Debug Interface</strong> [Электронный ресурс] : Java SE Technical Documentation. URL: http://download.oracle.com/javase/1.5.0/docs/guide/jpda/jdi/</li>
<li><strong>JPDA Enhancements</strong> [Электронный ресурс] : Java SE Technical Documentation. URL: http://download.oracle.com/javase/1.5.0/docs/guide/jpda/enhancements.html</li>
<li><strong>JavaTM Native Interface (JNI)</strong> [Электронный ресурс] : Java SE Technical Documentation. URL: http://download.oracle.com/javase/1.5.0/docs/guide/jpda/jdi/</li>
<li><strong>Java Art Chapter 3. Tracing with JPDA</strong> [Электронный ресурс] URL: http://fivedots.coe.psu.ac.th/~ad/jg/javaArt3/traceJPDA.pdf </li>
<li><strong>Java Virtual Machine Specification, The class File Forma</strong><strong>t</strong> [Электронный ресурс] URL: http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/11/23/java-jdi-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Озарение о правильном планшете</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/07/08/2004729/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/07/08/2004729/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 10:49:33 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Atom]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[Tablet PC]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/07/08/2004729/</guid>
		<description><![CDATA[На минувшей неделе я очень активно перемещался по России, практически не расставаясь с планшетным компьютером. Интернет у меня почти бесплатный, 130 рублей за 500 мегабайт в месяц, поэтому использовал его крайне активно и за трафиком не следил. Браузер, почта, твиттер- и IM-клиент, Google Reader, игрушки – казалось бы, чего еще в дороге надо? Так вот из недельного опыта я вынес однозначное впечатление: распространенные сейчас планшетники – дорогая игрушка, и заменить даже маленький нетбук они неспособны в принципе.]]></description>
			<content:encoded><![CDATA[<p>На минувшей неделе я очень активно перемещался по России, практически не расставаясь с планшетным компьютером. Интернет у меня почти бесплатный, 130 рублей за 500 мегабайт в месяц, поэтому использовал его крайне активно и за трафиком не следил. Браузер, почта, твиттер- и IM-клиент, Google Reader, игрушки – казалось бы, чего еще в дороге надо? Так вот из недельного опыта я вынес однозначное впечатление: распространенные сейчас планшетники – дорогая игрушка, и заменить даже маленький нетбук они неспособны в принципе.</p>
<p>Как кто-то мудро подметил, планшетные ПК придуманы для потребления контента, а ноутбуки – для его создания. В принципе, так и есть: пока тебе надо что-то просто читать, проблем особых не возникает. Но при малейшей попытке даже не создать, а чуть изменить контент, появляется масса непреодолимых препятствий.</p>
<p>О редактировании чего-либо объемного без клавиатуры и мыши даже говорить не хочу – мучительное и бесполезное занятие. Неприятности возникают даже при банальных ретвитах: так, когда я решил поделиться с читателями линком на <a href="http://software.intel.com/ru-ru/blogs/2011/07/05/2004725/">пост о Козьмодемьянске</a>, коварный клиент где-то потерял http перед ссылкой, так что многие получили ее не кликабельной. Но самый настоящий цирк начался, когда мне понадобилось подключить одну услугу на сайте своего оператора мобильной связи. Там, знаете ли, фрэймы используются, а браузеры Safari и Opera в мобильной инкарнации их отрабатывают отвратительно. Поэтому не прокручивается фрейм – и хоть ты тресни. Выход, конечно, нашелся: будучи в Козьмодемьянске, я при помощи утилиты TeamViewer подключился к NAS на Atom, круглосуточно работающему в Москве (заодно посмотрел через вебкамеры, все ли дома в порядке). Открыл на нем стандартный IE, зашел на сайт оператора и сделал все, что надо. А вот для редактирования статьи, опубликованной на сайте 3DNews, пришлось ждать, пока доберусь до ноутбука: сочетание фреймов и 30 килобайт текста с большими картинками сделало связку iPad+NAS неработоспособной.</p>
<p>Еще у меня в дороге обрушилась файловая система на флэшке с фоторепортажем. Смотреть картинки на iPad и его ARM-собратьях уже  кое-как можно (особенно, говорят, интересно получается с 30-мегабайтными RAW), а восстанавливать карточки – никак. Не будь под рукой ноутбука, потерял бы покой и сон до возвращения в Москву, а так – всего-то часа три понервничал. </p>
<p>Что мы имеем в итоге? Сам планшетный ПК в дороге – штука нужная. Нет, ну серьезно, гораздо удобнее <em>потреблять</em> на большом экране, да еще и особо не задумываясь о времени автономной работы. Но вместо того, чтобы делать сумку путешественника легче, «таблетка» ее наоборот утяжеляет. Ведь без нее после пары месяцев использования уже плохо, а без ноутбука по-прежнему <em>никак</em>. Вот и таскаешь на себе два устройства вместо одного.</p>
<p>Но зато после недели экспериментов над самим собой удалось сформулировать – каким хочется видеть правильный планшет. Внешне он может остаться таким, как сейчас, но в нем непременно должны жить две операционные системы. Одна – чуть урезанная – для мобильно-социальных нужд. MeeGo, Android 3.1, iOS - кому что нравится. При этом частота процессора может быть принудительно уменьшена вдвое для пущей автономности. Но по соседству непременно должно стоять нечто «большое» - Windows или Mac OS. Чтобы можно было за считанные секунды перезагрузиться, подключить мышь с клавиатурой и от <em>потребления</em> перейти к <em>работе</em>.</p>
<p>К этому все, в общем-то, и движется. Просто, несмотря на простоту идеи, ее качественная реализация требует известных усилий. У фирм второго эшелона, уже продающих такие гибриды, таланта инженеров явно не хватает. Но вот, кажется, по осени подтянутся гранды, и тогда, тогда…</p>
<p>Да, и, пожалуй, нет смысла уточнять – на какой платформе всё это будет работать <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/07/08/2004729/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Computex 2011: куда пойдут планшетные ПК?</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/06/07/computex-2011/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/06/07/computex-2011/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 11:33:20 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Конкурсы и мероприятия]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[Atom]]></category>
		<category><![CDATA[Computex]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[Tablet PC]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/06/07/computex-2011/</guid>
		<description><![CDATA[Третьего дня я вернулся с крупнейшей компьютерной выставки Computex. О том, что там показывала и рассказывала Intel, я довольно подробно написал в первый же день прямо с Тайваня. Если интересно – добро пожаловать в блог Intel на Хабре. Повторяться даже не подумаю, и здесь изложу несколько мыслей о планшетных ПК, возникших во время многочасового перелета из Тайбэя в Москву.]]></description>
			<content:encoded><![CDATA[<p>Третьего дня я вернулся с крупнейшей компьютерной выставки Computex. О том, что там показывала Intel, я довольно подробно написал в первый же день прямо с Тайваня. Если интересно – добро пожаловать в <a href="http://habrahabr.ru/company/intel/blog/120329/">блог Intel на Хабре</a>. Повторяться даже не подумаю, и здесь изложу несколько мыслей о планшетных ПК, возникших во время многочасового перелета из Тайбэя в Москву.</p>
<p>Если вы все же проследовали по линку, который я дал выше, то, наверное, знаете, что на Computex показали огромное количество планшетников на Intel Atom. Это чистая правда, но в то же время – лишь половина правды, потому что планшетных ПК НЕ на Atom показали еще больше. Причем я сначала морщился, что варианты с «атомом» отличаются слишком теплой тыльной частью. А потом вдруг выяснилось – мощные двухъядерники на альтернативной архитектуре под нагрузкой лишь немногим холоднее. Особенно если разработчики решили шикануть и сделать корпус потоньше.</p>
<p>Но пока мелкие и средние компании показывали очередные «просто планшеты» (вы не поверите, но один китайский бренд таки сделал планшетник с двумя симками и грозится вот-вот выбросить на рынок улучшенную версию - с телевизором!), гранды прикидывали – как бы довести его до ума? Ведь в нынешнем виде планшетный ПК, к сожалению, не может заменить нетбук и, в силу габаритов, не способен составить конкуренцию плееру. А раз так, при всей кажущейся мегапопулярности, этот тип устройств рискует остаться нишевым. Нет, ну серьезно – только очень состоятельным и продвинутым людям легко убедить себя в необходимости покупки еще одного недешевого гаджета, который ничего не заменяет, но зато мило дополняет. Оно бы и неплохо, но мало, катастрофически мало таких людей – спросите у любой незамужней жительницы мегаполиса с высшим образованием.</p>
<p>Что же делать?</p>
<p>Если смотреть в Computex, как в хрустальный шар, явно вырисовывается два направления развития. Первое – фактические сращивание с клавиатурой. Планшетный ПК превращается в ноутбук с отстегивающимся экраном: поносил полдня отдельно, а потом вернул на место и начинаешь полноценно работать. Лично мне такой вариант очень симпатичен: можно брать в дорогу только вот такой комбайн, а не ноутбук плюс планшетник, как сейчас. Да и люди на такую идею реагируют крайне позитивно.</p>
<p><img src="http://helpix.ru/pic/vilianov/computex_isn/computex_0002.jpg" alt="Computex" /></p>
<p>Второе направление – превращение планшетных ПК во что-то вроде док-станции, или, если угодно, экрана с батарейкой. Внешне такое устройство выглядит крайне похожим на нынешних собратьев, однако делать самостоятельно ничего не способно. Но сверху (или сзади) есть гнездо для мощного смартфона.</p>
<p><img src="http://helpix.ru/pic/vilianov/computex_isn/computex_0001.jpg" alt="Computex" /></p>
<p>Вставляем его туда, и – вуаля! – получаем все телефонные возможности на большом экране, да с могучей батареей и, если разработчик не пожадничал, улучшенным звуковым трактом. Тоже, кстати, отличная тема: я слабо верю в то, что телефон способен вдохнуть жизнь в настоящий мобильный компьютер (одна такая попытка, представленная на CES, с треском провалилась), но на планшет его способностей хватит с запасом. Благо и в «маленьких», и в «больших» зачастую используется одно и то же железо. И чем покупать всю электронную начинку  еще раз, я бы лучше заплатил за дополнительные ячейки батареи. Рраз, и телефон переходит на внешнее питание, весь нужный контент под руками, интернет работает (хочешь 3G, хочешь WiFi), память тоже приросла… Ну и цена такой «док-станции» должна быть довольно гуманной – с учетом того, что оптовая цена роскошного экрана с диагональю 10 дюймов укладывается в $100, а батареи, которой хватает на сутки, в двадцатку.</p>
<p>И вот тут мы подходим к самому интересному. По какому бы из путей не двинулась индустрия, наиболее комфортно и, если хотите, естественно будет использовать платформу х86 и Intel Atom. Нет, я не переел на Тайване местных веселящих орехов. Просто когда речь идет об отстегивающемся экране, можно прекрасно использовать опыт, накопленный за время выпуска нетбуков, разве что немного перекомпоновать конструкцию. В остальном же все действительно просто, а широкий выбор программных платформ  и <a href="http://software.intel.com/ru-ru/blogs/2011/05/30/2004626/">быстрое переключение между ними</a> делает такие устройства весьма удобными для людей.</p>
<p>Что до варианта с док-станцией, то в мире PC такие конструкции уже выпускаются разными компаниями больше десяти лет, и технология отработана до мелочей. Поправьте меня, если ошибаюсь, но с технической точки зрения нет особой разницы  - подключаешь ты маленький ноутбук к базе с жестким диском, батареей и набором внешних интерфейсов, или вставляешь смартфон в гнездо такой же точно базы, но еще и со встроенным сенсорным экраном. Если путь уже успешно пройден – стоит ли тратить немалые средства на организацию новой экспедиции?</p>
<p>Погружаясь в историю нашей индустрии, трудно не заметить, что она стремится к простоте, удобству изготовления и техническому единообразию. Даже очень упорные компании с пассионарными лидерами в итоге не выдерживали и вливались в тренд, не теряя, впрочем, ни в деньгах, ни в любви поклонников. Чисто по-человечески я, конечно, поддерживаю председателя Мао с его высказыванием «Пусть расцветают сто цветов, пусть соперничают сто школ». Однако при нынешнем уровне развития техники разнообразие  аппаратных платформ – слишком большая роскошь, и, помяните мое слово, через поколение или два в Самом Популярном Планшете вдруг обнаружится что-то очень маленькое с архитектурой х86.</p>
<p>Между тем, реальные различия будут. Частично – на уровне дизайна корпуса, но в основном, все же, в сфере ПО. И именно вы, уважаемые разработчики, будете провоцировать людей на холивары в обозримом будущем. Удачи и терпения вам в работе, которая становится все интереснее буквально на глазах.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/06/07/computex-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atom&#039;ное NASшествие продолжается!</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/03/21/atom-nas-2/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/03/21/atom-nas-2/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 07:29:13 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[BlindScanner]]></category>
		<category><![CDATA[Intel Atom]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/03/21/atom-nas-2/</guid>
		<description><![CDATA[Уже больше двух лет твержу всем знакомым, что правильный NAS – неважно, домашний или офисный – должен работать на Intel Atom. Многие верят и потом непременно благодарят за совет. Но до сих пор находится немало людей, предпочитающих NAS на ARM и называющих массу причин, оправдывающих выбор – от более низкого энергопотребления до радости пользоваться «решением из коробки» вместо настройки операционной системы самостоятельно. Разгромить эти предрассудки - дело простое, но зачем обижать людей? Пусть им в итоге будет с чем сравнивать. Но вот по позициям любителей ARM нанесен мощнейший удар: известный писатель и публицист Евгений Козловский со свойственной ему эмоциональностью отрекся от коробочных NAS и перешел на мини-компьютер с Intel Atom внутри.]]></description>
			<content:encoded><![CDATA[<p>Уже больше двух лет твержу всем знакомым, что правильный NAS – неважно, домашний или офисный – должен работать на Intel Atom. Многие верят и потом непременно благодарят за совет. Но до сих пор находится немало людей, предпочитающих NAS на ARM и называющих массу причин, оправдывающих выбор – от более низкого энергопотребления до радости пользоваться «решением из коробки» вместо настройки операционной системы самостоятельно. Разгромить эти предрассудки - дело простое, но зачем обижать людей? Пусть им в итоге будет с чем сравнивать. Но вот по позициям любителей ARM нанесен мощнейший удар: известный писатель и публицист Евгений Козловский со свойственной ему эмоциональностью отрекся от старого мира и перешел на мини-компьютер с Intel Atom внутри.</p>
<p>Полную версию рассказа о переходе вы можете <a href="http://digit.ru/columnists/20110303/381203424.html">почитать сами</a>, но если вкратце – производитель NAS, стоявшего у Евгения Антоновича, выпустил недоделанную прошивку, и  после ее установки посыпались нехорошие ошибки. Назад на старую версию откатиться нельзя – не продумана такая возможность. Сам производитель заниматься работой над ошибками не спешил, и даже прямое обращение в Главный Офис толком не помогло. Стал уважаемый автор смотреть по сторонам, искать альтернативу, и дали ему потестировать «атомный» компьютер. Сразу выяснилось, что стоит такая системка в два с лишним раза дешевле предшественника, она абсолютно бесшумна, а набор возможностей ограничивается лишь фантазией владельца. После суток знакомства не осталось даже тени сомнений, и Козловский обзавелся точно такой же. Ну, если уж такой матерый сибарит остался доволен, нормальному человеку и подавно понравится.</p>
<p>Я уже писал, что правильный NAS может не только работать сетевым диском и торрентораздатчиком, но и конвертировать видео или заменять  домашнюю систему видеонаблюдения. Но недавно он выручил меня еще раз – и очень по-крупному. </p>
<p>Дома уже с год живет МФУ – вполне приличное, но с возможностью подключения к компьютеру только по USB. До поры всех устраивало, что печатать и сканировать можно только с одного компьютера в домохозяйстве, но по мере роста потребностей в комфорте назрела необходимость сделать МФУ сетевым. Но как? Роутер принт-сервером работать не умеет. Держать главный компьютер включенным круглые сутки – неправильно. Что же, покупать новое МФУ с поддержкой Ethernet/WiFi  или, как минимум, более умный роутер? Ничего подобного: просто переподключаем МФУ к NAS, и с него раздаем услуги печати на все компьютеры в сети. Больше того, при помощи специальной программки BlindScanner удалось сделать сетевым не только принтер, но и сканер. Учитывая, что я уже на полном серьезе собирался в магазин – экономия налицо. </p>
<p>Можно сказать: ха-ха, так ведь и к NAS без х86 внутри можно подключать принтеры! Да, действительно, ко многим можно. Но слишком высока зависимость от прошивки NAS: если в ней что-то не дописано, или, наоборот, принтер попадется какой-то кочевряжистый (у меня как раз такой), ничего вы не напечатаете. Если же NAS работает под Windows или другой стандартной операционной системой, в случае каких-то шероховатостей можно найти десятки обходных маневров. Ведь даже относительно редкий дистрибутив Linux все равно на порядки популярнее самоделок, живущей в NAS на ARM, и советчиков в Интернете найти будет проще.</p>
<p>Теперь у меня навязчивая идея подключить к «атомному» NAS обычный беспроводной телефон. В свое время тестировал DECT-адаптер Siemens, который, будучи воткнутым в USB-порт, позволял выбирать – звонить по проводам или через SkypeOut. Сейчас такие на глаза что-то не попадаются, но я парень упорный, найду. </p>
<p>Экономить – так экономить.</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/03/21/atom-nas-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Два ядра - теперь и в жестком диске</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/02/04/2004322/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/02/04/2004322/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 07:06:03 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[dual core]]></category>
		<category><![CDATA[Western Digital]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/02/04/2004322/</guid>
		<description><![CDATA[«Да какие шутки? Правда добавили. С недавних пор винчестеры стали очень сложными – мало того, что головки приблизились к поверхности диска до 2 нанометров (еще недавно было 15), так еще к температурному датчику добавились сенсор давления, гироскоп, специальные «грелки» в головках, чтобы если изменится давление – приподнять или опустить ее над пластиной… Ну и скорость передачи данных серьезно выросла. В общем, одно ядро захлебывается от обработки столь разной информации, поставили еще одно по соседству. Теперь отлично»]]></description>
			<content:encoded><![CDATA[<p>В журналистской среде интервью считается простым и довольно скучным жанром. Мол, придумал вопросы, записал ответы на диктофон, расшифровал слово в слово – и вуаля, все готово. По большому счету, так оно и есть, если, конечно, журналиста не волнуют интересы читателя. Между тем, людей, способных говорить ярко, не банально и логично, на свете вообще немного, а в IT-среде – тем более (попробуйте-ка «зажечь» о новом поколении процессоров – такое, кажется, по силам только Рогачкову). Соответственно, слова собеседника обычно приходится переписывать практически с нуля, сохраняя высказанную им мысль и дополняя ее интересными подробностями из головы и Интернета (что характерно, ни один мой собеседник на такую «вольность» не обиделся – наоборот, обычно благодарят). Плюс, чтобы задать правильные вопросы, надо, во-первых, быть очень основательно «погруженным» в тему, а, во-вторых, иметь представление о чаяниях читателя. И это, мягко говоря, непросто – сегодня нырять в нюансы энергопотребления видеокарт, а завтра – в экономику решений для спутниковой навигации. Поэтому часто бывает, что журналист всеми силами старается перевести беседу хоть в сколько-то знакомое русло («Дорогой разработчик клавиатур, а ну их в баню, эту эргономику и туннельно-карпальный синдром, давайте поговорим об SSD!»), а его собеседник, не чувствуя в интервьюере фидбэка и интереса, начинает злиться и отвечать односложно.</p>
<p>И только в редких случаях, когда оба собеседника на одной волне, и повод для беседы есть интересный, и время не ограничено, получаются действительно интересные интервью (пользуясь случаем, приглашаю побеседовать в таком формате Пола Отеллини – Paul, let’s add a bit more life to ISN Russia!)</p>
<p>С Алексом Блэквеллом, главным полевым инженером Western Digital, мы встретились на днях в третий раз. Названию должности не удивляйтесь – этозападный аналог нашего «инженера по внедрению». Алекс активно перемещается по Европе, Ближнему Востоку и Африке, разъясняет своим подчиненным на местах суть нововведений в жестких дисках, дает консультации заказчикам и собирает отзывы о радостях и печалях последних. Такой опыт в сочетании с великолепным чувством юмора делает Алекса настоящей находкой для журналиста, а ему, в свою очередь, не очень скучно общаться с тем, кто искренне любит жесткие диски (ничего не могу с собой поделать – они ведь такие сложные и полезные). Сидим, общаемся, шутим, и вдруг Алекс говорит: «А мы тут в жесткий диск двухъядерный процессор добавили».</p>
<p>Ха-ха, говорю, отличная шутка! А Алекс серьезно так отвечает: «Да какие шутки? Правда добавили. С недавних пор винчестеры стали очень сложными – мало того, что головки приблизились к поверхности диска до 2 нанометров (еще недавно было 15), так еще к температурному датчику добавились сенсор давления, гироскоп, специальные «грелки» в головках, чтобы если изменится давление – приподнять или опустить ее над пластиной… Ну и скорость передачи данных серьезно выросла. В общем, одно ядро захлебывается от обработки столь разной информации, поставили еще одно по соседству. Теперь отлично».</p>
<p><img class="alignnone" src="http://helpix.ru/pic/vilianov/200501/22/with_blackwell_1.jpg" alt="" width="593" height="600" /></p>
<p>Тут бы мне остановиться в восхищении, но не удержался – начал копать дальше. И обнаружилось, что частота кварцевого резонатора чудо-процессора составляет… 25 мегагерц. Производительность лишь в 50 раз больше, чем у ветхозаветного компьютера IBM PC AT. То есть погонять в Quake на винчестере пока не получится. Но сам факт!</p>
<p>Я поинтересовался – не планируется ли со временем добавить ядер и переложить на процессор часть работы CPU. Например, декодирование видео в специальных версиях HDD для телеприставок. Узнал, что ядер со временем, конечно, станет больше, но вот непрофильные задачи на них повесят вряд ли, потому что а) это потребует существенного изменения интерфейса и б) резко усложнит производство. Последнее очень важно: заводу загружают исходя из предварительных заказов, поступивших от клиентов, и если вдруг кто-то откажется от миллионной партии дисков для телекоробочек, комплектующие можно будет без труда использовать в других моделях. Благо механически все HDD очень похожи и очень многое зависит от прошитой микропрограммы. А излишне умный диск так вот просто не перемаркируешь, его на вторсырье пускать придется.</p>
<p>К чему я все это написал?</p>
<p>Товарищ! Многоядерность – это всерьез и надолго. Она поселилась в CPU, GPU, беспроводных сетевых контроллерах и вот теперь даже в жестких дисках. Обратного пути просто нет. Оптимизируй свое приложение для работы с несколькими ядрами! Вступай в программу <a href="http://www.intel.com/cd/software/partner/emea/rus/index.htm">Intel Software Partner! </a> <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/02/04/2004322/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Мысли о планшетных компьютерах недалекого будущего</title>
		<link>http://software.intel.com/ru-ru/blogs/2011/01/17/2004281/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2011/01/17/2004281/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 08:07:46 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[CES]]></category>
		<category><![CDATA[Core i5]]></category>
		<category><![CDATA[Intel Atom]]></category>
		<category><![CDATA[tablet]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2011/01/17/2004281/</guid>
		<description><![CDATA[Планшетов на CES было – море разливанное, и добрых две трети работают на архитектуре x86 (процессоры от Intel Atom до Core i5). Нет никаких сомнений, что через 2-3 месяца экспонаты выставки в промышленных количествах появятся на прилавках, и, судя по моей почте, многие с нетерпением ждут этого момента. Однако я позволю себе высказать крамольную мысль: планшеты в чистом виде, т.е. один сенсорный экран без клавиатуры, лишь ступень  эволюции. В итоге же клавиатура станет важным элементом сенсорного ПК, который будет эффективно дополнять его функционал. ]]></description>
			<content:encoded><![CDATA[<p>Вернувшись с CES и немного придя в себя после 28 часов в пути, приступил к осмыслению увиденного и услышанного.  И того, и другого очень много – пожалуй, даже слишком. Постоянно вспоминал цитату из раннего «Аквариума» про то, что из моря информации, в котором мы тонем, единственный выход – это саморазрушение. Действительно, такого вала новых знаний мозг просто не выдерживает, 2-3 часа и требуется отдых. Учитывая количество анонсов, не помешало бы в будущем растянуть CES недели на две и перенести с начала января на конец, чтобы за время праздничных выходных была возможность накопить сил на этот бурлящий марафон, кажущийся бесконечным.</p>
<p>Сейчас читаю тексты коллег, причем особенно забавно получилось у тех, кто на CES не летал и отслеживал анонсы по пресс-релизам. Например, десятки изданий написали о планшетном компьютере Motorola с Android 3.0, но на самом-то деле никакого «3.0» на CES не показывали, а сотрудники стенда Motorola совершенно честно признавались, что даже не знают – какой будет это версия. Вместо этого на прототипе планшетника в замкнутом цикле крутился видеоролик, где рассказывалось о некоторых «фичах» новой ОС, и не более того.</p>
<p>Но вообще, как я уже писал, планшетов на CES было – море разливанное, и добрых две трети работают на архитектуре x86 (процессоры от Intel Atom до Core i5). Нет никаких сомнений, что через 2-3 месяца экспонаты выставки в промышленных количествах появятся на прилавках, и, судя по моей почте, многие с нетерпением ждут этого момента. Однако я позволю себе высказать крамольную мысль: планшеты в чистом виде, т.е. один сенсорный экран без клавиатуры, лишь ступень  эволюции. В итоге же клавиатура станет важным элементом сенсорного ПК, который будет эффективно дополнять его функционал.</p>
<p>Объяснюсь. Поначалу всем очень нравится управлять обновкой при помощи пальцев и гироскопа, однако довольно скоро обнаруживается, что эта связка, мягко говоря, неудобна в целом ряде задач. Я молчу про редактирование текстов или работу с таблицами – тут все очевидно. Но даже в играх, на которые планшетники очень даже горазды, одних виртуальных экранных кнопок не хватает. Попробуйте поиграть даже в простенькие гонки – уверяю, надоест очень быстро. А уж о более-менее серьезных шутерах и говорить не приходится, хотя погонять таковые на планшетах с х86 многим ой как захочется. Набор адресов в строке браузера, переписка, вбивание новых контактов в адресную книгу – это и многое другое с виртуальной клавиатурой столь же удобно, как и на лучших моделях смартфонов. То есть при необходимости – вполне себе можно. Но радости никакой.</p>
<p>Возможно, поэтому на CES показали так много способов прикрутить аппаратную клавиатуру к планшетнику. Где-то их объединяли в один корпус, делая сенсорный экран «отстегиваемым» (Lenovo), где-то применили подход из телефонов-слайдеров (Samsung), а некоторые вообще передали пламенный привет Артемию Лебедеву и сделали клавиатуру из маленьких дисплейчиков, где каждая кнопка меняет значение в зависимости от приложения (Razor&amp;Intel). И во всех случаях идея сразу же становилась законченной: можно брать в дорогу всего одно умное устройство, даже если в командировке или на так называемом отдыхе придется поработать. А не так, как сейчас – планшетник и ноутбук. Первый – потому что с ним веселее, а второй – потому что без него никак.</p>
<p>А следующим шагом, скорее всего, станет использование в планшетных ПК 3D-экранов, благо аппаратные возможности позволяют обслуживать их потребности. Плюс, учитывая небольшую диагональ, вполне реально будет устанавливать экраны, не требующие специальных очков для достижения желанного эффекта. Интересно, каким будет первое приложение, использующее возможности 3D и «сенсорности»? Включим фантазию?</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2011/01/17/2004281/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

