<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6635779609176750930</id><updated>2012-02-10T16:12:20.127+04:00</updated><category term='mobile'/><category term='flash'/><category term='habrahabr'/><category term='mac os x 10.6'/><category term='live'/><category term='memory management'/><category term='news'/><category term='html5'/><category term='snow leopard'/><category term='books'/><category term='bug'/><category term='плохо'/><category term='gwt'/><category term='community edition'/><category term='wtf'/><category term='api'/><category term='service'/><category term='chrome'/><category term='windows 7'/><category term='rambler'/><category term='cocoa'/><category term='portraits'/><category term='picasa'/><category term='ndk'/><category term='objective-c'/><category term='htc magic'/><category term='iphone'/><category term='ozon'/><category term='чтобы не забыть'/><category term='spam'/><category term='torrent'/><category term='производительность'/><category term='android api'/><category term='lunar eclipse'/><category term='sun'/><category term='мистика'/><category term='санкт-петербург'/><category term='перевод'/><category term='no warez'/><category term='art work'/><category term='windows mobile'/><category term='flipboard'/><category term='wget'/><category term='технологии'/><category term='dalvik'/><category term='hardware acceleration'/><category term='overview'/><category term='facebook'/><category term='virtualbox'/><category term='монетизация'/><category term='android ndk'/><category term='mysql'/><category term='java'/><category term='google maps'/><category term='adt'/><category term='дизайн интерфейсов'/><category term='dvi'/><category term='kanevsky'/><category term='mac os'/><category term='e3'/><category term='currents'/><category term='textmate'/><category term='prettify'/><category term='ubuntu 9.10'/><category term='ichat'/><category term='хочу'/><category term='выставка'/><category term='sdk r8'/><category term='pdf'/><category term='oracle'/><category term='beta'/><category term='иллюзии'/><category term='j2me'/><category term='android'/><category term='и диоды'/><category term='intel'/><category term='mac'/><category term='куклы'/><category term='yandex maps'/><category term='design'/><category term='highlighting'/><category term='техническая литература'/><category term='thom yorke'/><category term='statistics'/><category term='framework'/><category term='ubuntu'/><category term='часы'/><category term='хорошие люди'/><category term='chess'/><category term='nvidia'/><category term='json'/><category term='google'/><category term='disqus'/><category term='ruby'/><category term='google app engine'/><category term='dubfx'/><category term='proxy'/><category term='nasa'/><category term='всякая фигня'/><category term='gson'/><category term='дизайн'/><category term='vkontakte'/><category term='apple'/><category term='intellijidea'/><category term='IT'/><category term='gc'/><category term='ipad'/><category term='serialization'/><category term='apple script'/><category term='IntelliJ IDEA'/><category term='template'/><category term='странное'/><category term='iclub'/><category term='игры разума'/><category term='peer-to-peer'/><category term='data visualization'/><category term='обман'/><category term='wordle'/><category term='ios'/><category term='opensource'/><category term='cursorily'/><category term='псевдофото'/><category term='amazon'/><category term='concept'/><category term='services'/><category term='books ngram'/><category term='jit'/><category term='update'/><category term='noop'/><category term='жизнь'/><category term='javafx'/><category term='мозг'/><category term='hackday'/><category term='испанцы тоже люди'/><category term='quick search box'/><category term='android sdk'/><category term='translation'/><category term='handmade'/><category term='социальные сети'/><category term='reconnect'/><category term='programming'/><category term='tutorial'/><category term='ubuntu 10.10'/><category term='mac os x'/><category term='games'/><category term='хлебушек'/><category term='freeware'/><category term='yandex'/><category term='anywhere'/><category term='native development kit'/><category term='go'/><category term='gae'/><category term='hints'/><category term='netbeans'/><category term='xorg'/><category term='garbage collector'/><category term='ruby on rails'/><category term='blogger'/><category term='comments system'/><category term='книги'/><category term='garbage collection'/><category term='twitter'/><category term='features'/><category term='source code'/><category term='microsoft'/><category term='chromium'/><category term='google reader'/><category term='gcc'/><category term='steam'/><category term='бдительность'/><category term='ищу работу'/><category term='fail'/><category term='кобрин'/><category term='maps'/><category term='hotkeys'/><category term='ftp'/><title type='text'>dive.home</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default?start-index=101&amp;max-results=100'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>113</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-6953457953401604690</id><published>2012-01-15T01:03:00.000+04:00</published><updated>2012-01-15T01:03:18.233+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os'/><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='hints'/><title type='text'>[Mac OS] User spelling suggestion</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;чтобы отредактировать словарь, в который вы добавляете новые слова (Learn Spelling, так сказать), нужно открыть файл:&lt;/span&gt;&lt;br /&gt;&lt;pre style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="background-color: #eeeeee;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;~/Library/Spelling/LocalDictionary&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;в любом текстовом редакторе и добавить, удалить, отредактировать нужны слова.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lmZ8RYhhx9U/TxHtRjWdI6I/AAAAAAAANm0/1SsGDV63Hq4/s1600/Screen+Shot+2012-01-15+at+12.58.25+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-lmZ8RYhhx9U/TxHtRjWdI6I/AAAAAAAANm0/1SsGDV63Hq4/s1600/Screen+Shot+2012-01-15+at+12.58.25+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-6953457953401604690?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/6953457953401604690/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=6953457953401604690' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6953457953401604690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6953457953401604690'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2012/01/mac-os-user-spelling-suggestion.html' title='[Mac OS] User spelling suggestion'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-lmZ8RYhhx9U/TxHtRjWdI6I/AAAAAAAANm0/1SsGDV63Hq4/s72-c/Screen+Shot+2012-01-15+at+12.58.25+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-1761586867026464719</id><published>2012-01-09T22:15:00.000+04:00</published><updated>2012-01-09T22:15:17.348+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ichat'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>[mac os] iChat как мессенджер для Facebook'а</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;оказывается, iChat вполне себе справляется с должностью десктопного мессенджера для Facebook Chat.&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;запускаем iChat и идем в настройки на вкладку Accounts, нажимаем плюс внизу и вписываем следующее:&lt;/li&gt;&lt;ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cgEt3vNeCbI/Twst3ZFLACI/AAAAAAAANmc/hd56MtmWUC0/s1600/ichat_facebook_settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-cgEt3vNeCbI/Twst3ZFLACI/AAAAAAAANmc/hd56MtmWUC0/s1600/ichat_facebook_settings.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 12px; line-height: 15px; white-space: nowrap;"&gt;Account Type: Jabber&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: nowrap;"&gt;Screen Name: &amp;lt;ваше_имя_на_facebook&amp;gt;@chat.facebook.com (к примеру,&amp;nbsp;artyom.loenko@chat.facebook.com)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;Password: &amp;lt;пароль для Facebook&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px;"&gt;Server: chat.facebook.com&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px;"&gt;Port: 5222&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px;"&gt;галку Use SSL убрать&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 15px;"&gt;нажимаем Done и все работает:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6rb5H0v734w/TwsuVCqqVmI/AAAAAAAANmk/gxNSltLjOrk/s1600/ichat_facebook_window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6rb5H0v734w/TwsuVCqqVmI/AAAAAAAANmk/gxNSltLjOrk/s1600/ichat_facebook_window.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 12px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-1761586867026464719?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/1761586867026464719/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=1761586867026464719' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1761586867026464719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1761586867026464719'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2012/01/mac-os-ichat-facebook.html' title='[mac os] iChat как мессенджер для Facebook&apos;а'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-cgEt3vNeCbI/Twst3ZFLACI/AAAAAAAANmc/hd56MtmWUC0/s72-c/ichat_facebook_settings.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2885938919974034020</id><published>2011-12-14T02:22:00.000+04:00</published><updated>2011-12-14T02:22:54.472+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><category scheme='http://www.blogger.com/atom/ns#' term='cursorily'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>[cursorily] Apple, Microsoft, TextMate, Higgs Boson</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;это я так, рассказать самому себе, что у нас произошло на неделе и о чем почитать подробнее на выходных, а может и попробовать в деле. новая рубрика.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;для начала посмотрим прекрасный ролик о том месте, где мы все живем&amp;nbsp;David Attenborough - Wonderful World - BBC&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/B8WHKRzkCOY/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/B8WHKRzkCOY&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="640" height="360"  src="http://www.youtube.com/v/B8WHKRzkCOY&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://blog.macromates.com/2011/textmate-2-0-alpha/"&gt;TextMate 2.0 Alpha&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote class="tr_bq"&gt;слишком долго я ждал этого. и оно свершилось. "новая" версия отличного редактора под мак. &lt;a href="http://macromates.com/changes"&gt;список изменений&lt;/a&gt; внушает и впечатляет. говорят,&amp;nbsp;&lt;a href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt; круче и быстрее развивается. но мы ведь олдскулл! только хардкор, только macromates!&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.membrana.ru/particle/17257"&gt;Физики уловили возможные следы бозона Хиггса&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;обнадеживает, но на волоске. так что продолжаем митинги. прохоров наш рулевой.&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.humblebundle.com/"&gt;The Humble&amp;nbsp;Indie Bundle #4&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;а вот это отличная подборка инди-игр за смешные деньги. в составе:&amp;nbsp;Super Meat Boy, Shank, Jamestown, Bit.Trip Runner, NightSky,&amp;nbsp;Cave Story+ and Gratuitous Space Battles. обратить внимание стоит как минимум на&amp;nbsp;Super Meat Boy и Shank.&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Microsoft обрушилась на рынок iOS приложений с&amp;nbsp;&lt;a href="http://9to5mac.com/2011/12/12/microsoft-releases-ipad-version-of-onenote-app/"&gt;OneNote&lt;/a&gt;,&amp;nbsp;&lt;a href="http://9to5mac.com/2011/12/13/another-one-from-microsoft-skydrive-hits-the-iphone/"&gt;SkyDrive для iPhone&lt;/a&gt;,&amp;nbsp;&lt;a href="http://9to5mac.com/2011/12/13/microsoft-releases-kinectimals-for-ios-its-first-game-for-iphone-ipad/"&gt;Kinectimals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;весьма советую посмотреть на все эти приложения. вообще, из увиденного у меня складывается впечатление, что отдел разработок для iOS у Microsoft вполне себе без microsoft'а головного мозга. весьма и весьма. &lt;a href="http://itunes.apple.com/us/artist/microsoft-corporation/id298856275"&gt;вот тут&lt;/a&gt; кстати вся продукция Microsoft для iOS.&lt;br /&gt;&lt;a href="http://office.microsoft.com/en-us/onenote/"&gt;OneNote&lt;/a&gt;&amp;nbsp;- весьма неплохой планировщик и штука для заметок. с онлайн версий. входит в состав Microsoft Office. записал себе на посмотреть более детально.&lt;br /&gt;&lt;a href="https://skydrive.live.com/"&gt;SkyDrive&lt;/a&gt;&amp;nbsp;- это ваши 25Гб в облаке бесплатно. весьма занимательная штука и я пойду её трогать, так как &lt;a href="http://dropbox.com/"&gt;DropBox&lt;/a&gt;&amp;nbsp;мне не особо. что-то в нем есть отталкивающее.&lt;br /&gt;&lt;a href="http://kinectimals.frontier.co.uk/"&gt;Kinectimals&lt;/a&gt;&amp;nbsp;- это современный тамогочи. весьма мимими.&amp;nbsp;гладить тигра между ковырянием в нейронных сетях весьма кстати.&lt;br /&gt;&lt;a href="http://kinectforwindows.org/"&gt;Kinect&lt;/a&gt; - ну и кто не знает, &lt;a href="http://blogs.msdn.com/b/kinectforwindows/archive/2011/11/03/it-s-official-kinect-for-windows-is-coming-soon.aspx"&gt;Kinect официально будет в версии для PC&lt;/a&gt;. кушайте рынок пока горячо.&amp;nbsp;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.criticalpast.com/"&gt;CriticalPast&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;57.000 исторических видео, 7 миллионов фотографий - самый большой в мире архив истории. must see.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://academicearth.org/courses/programming-methodology/"&gt;Computer Science I: Programming Methodology&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;лекции Стенфорда о методологиях программирования. бесплатные. прекрасные. поучительные. почитайте, посмотрите. кому нужно.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://insidesearch.blogspot.com/2011/12/showing-some-love-to-math-lovers.html?spref=tw"&gt;Google любит математиков&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;Google научил сам себя рисовать красиво графики от формул. вот вам &lt;a href="https://www.google.com/search?ie=UTF-8&amp;amp;q=%28sqrt%28cos%28x%29%29*cos%28200x%29%2Bsqrt%28abs%28x%29%29-0.7%29*%284-x*x%29%5E0.01%2C+sqrt%289-x%5E2%29%2C+-sqrt%289-x%5E2%29+from+-4.5+to+4.5"&gt;сердечко&lt;/a&gt;&amp;nbsp;от графа&amp;nbsp;(sqrt(cos(x))*cos(200*x)+sqrt(abs(x))-0.7)*(4-x*x)^0.01, sqrt(9-x^2), -sqrt(9-x^2).&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;и еще раз про Microsoft, которая заявила что их TellMe весьма круче Siri, а человек взял и проверил&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/SHoukZpMhDE/0.jpg" height="360" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SHoukZpMhDE&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="640" height="360"  src="http://www.youtube.com/v/SHoukZpMhDE&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;все. до новых встреч.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2885938919974034020?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2885938919974034020/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2885938919974034020' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2885938919974034020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2885938919974034020'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/12/cursorily-apple-microsoft-textmate.html' title='[cursorily] Apple, Microsoft, TextMate, Higgs Boson'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5351557602600877161</id><published>2011-12-10T02:42:00.001+04:00</published><updated>2011-12-10T04:00:58.350+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flipboard'/><category scheme='http://www.blogger.com/atom/ns#' term='плохо'/><category scheme='http://www.blogger.com/atom/ns#' term='currents'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>[Google] Android головного мозга</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Так вот, Google запустила проект &lt;a href="http://googlemobile.blogspot.com/2011/12/google-currents-is-hot-off-press.html"&gt;Currents&lt;/a&gt;&amp;nbsp;(&lt;a href="http://www.wired.com/gadgetlab/2011/12/google-currents-first-look/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed2Ftechbiz+3A+Tech+Biz)"&gt;Wired&lt;/a&gt; про него же). Приложение представляет из себя своеобразную подборку новостей, как рекомендуемых самой Google, так и на базе Google Reader и прочего. Собственно, приложение - продолжение истории о том, как &lt;a href="http://flipboard.com/"&gt;Flipboard&lt;/a&gt;&amp;nbsp;отказался продаваться корпорации добра и зла.&lt;br /&gt;&lt;br /&gt;(с) что-то там:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 15px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="background-color: #eeeeee;"&gt;После запуска приложения и авторизации в Google требуется составить список журналов и газет, а затем добавить их библиотеку (из числа предзагруженных - Forbes и Fast Company). После этого Currents загрузит популярные статьи и новости с каждого издания, а затем сохранит их на устройстве для последующего чтения в офлайне.&lt;/span&gt;&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; line-height: 1.3; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 15px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="background-color: #eeeeee;"&gt;Другой не менее важной функцией Currents является раздел трендов. Здесь пользователи могут выбрать несколько интересующих их категорий, а программа сделает подборку из пяти "топовых" материалов по каждой теме. Поделиться прочитанной статьей можно в любой популярной соцсети.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Приложение вполне себе милое и работает неплохо, и кеширование тоже молодцом. Но! Но навигация - это чистой воды android головного мозга. Я далеко не эстет и не критик великий, но постоянно задумываться перед нажатием на кнопку и постоянно дергать глазом и пальцем к верхней части экрана для перемещения между элементами - это плохо. Настолько, что удовольствие от всего остального сводится к легкому раздражению.&lt;br /&gt;&lt;br /&gt;В картинках:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;нижняя левая кнопка - чистой воды кнопка Back на Android'ах. зачем? почему? HIG?&lt;/li&gt;&lt;li&gt;правая нижняя кнопка листает вправо на один элемент. и пальцем перелистывание работает в обе стороны. зачем она там? где тогда кнопка влево на один элемент?&lt;/li&gt;&lt;li&gt;думаете, псевдоback листает назад на элемент? старайтесь стараться думать лучше! её поведение призрачно.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-R6R_zWyJbAg/TuKebJqKqaI/AAAAAAAANlw/T4ombg52OPE/s1600/currents_first.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/-R6R_zWyJbAg/TuKebJqKqaI/AAAAAAAANlw/T4ombg52OPE/s640/currents_first.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;вот тут псевдоback вообще прекрасен. если выбрать на главном экране Trending, в списке выбрать элемент, то отобразиться то, что на левом скриншоте, затем если нажать "вправо" или листнуть вправо пальцем, то отобразиться то, что справа на скриншоте. внимание! вопрос! куда приведет нас кнопка псевдоback? неправильно! она отправит нас на стартовый экран приложения, а не на предыдущий экран со списком Trending.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-f858rsz5WGM/TuKeMR_gBPI/AAAAAAAANlk/nH_I1-d0DAg/s1600/currents_second.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/-f858rsz5WGM/TuKeMR_gBPI/AAAAAAAANlk/nH_I1-d0DAg/s640/currents_second.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Почему? Зачем? Кто? Непонятно. Впрочем, в остальном приложение отличное. В русском AppStore недоступно. А Flipboard, кстати говоря, &lt;a href="http://inside.flipboard.com/2011/12/07/the-power-of-flipboard-in-your-pocket/"&gt;вышел и для iPhone&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5351557602600877161?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5351557602600877161/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5351557602600877161' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5351557602600877161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5351557602600877161'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/12/google-android.html' title='[Google] Android головного мозга'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-R6R_zWyJbAg/TuKebJqKqaI/AAAAAAAANlw/T4ombg52OPE/s72-c/currents_first.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2704272161461297245</id><published>2011-12-07T15:06:00.001+04:00</published><updated>2011-12-07T15:13:05.970+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='хлебушек'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='yandex maps'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>[Maps] как сходить за хлебушком</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Версия от &lt;a href="http://g.co/maps/hakmf"&gt;Google Maps&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;пешком 4.4км, 55 минут&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://g.co/maps/hakmf" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="436" src="http://1.bp.blogspot.com/-gJ_8UVCTr8U/Tt9IxOpcutI/AAAAAAAANlQ/Q5KTSV2LF_g/s640/Screen+Shot+2011-12-07+at+3.04.14+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Версия от&amp;nbsp;&lt;a href="http://maps.yandex.ru/-/CBxxUG22"&gt;Yandex Maps&lt;/a&gt;:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Пешком (700 м по прямой), 9 минут&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://maps.yandex.ru/-/CBxxUG22" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="414" src="http://4.bp.blogspot.com/-hDU9fRCyBQg/Tt9Ix72IdPI/AAAAAAAANlU/8xK1ROIo-J0/s640/Screen+Shot+2011-12-07+at+3.04.56+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Yandex - Win! ведь по большому счету он прав. никаких непреодолимых причин осуществить подобное путешествие нет.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2704272161461297245?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2704272161461297245/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2704272161461297245' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2704272161461297245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2704272161461297245'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/12/maps.html' title='[Maps] как сходить за хлебушком'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-gJ_8UVCTr8U/Tt9IxOpcutI/AAAAAAAANlQ/Q5KTSV2LF_g/s72-c/Screen+Shot+2011-12-07+at+3.04.14+PM.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8473429725556375546</id><published>2011-12-07T10:19:00.001+04:00</published><updated>2011-12-07T10:30:00.425+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lunar eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='kanevsky'/><category scheme='http://www.blogger.com/atom/ns#' term='live'/><title type='text'>[live] A total lunar eclipse - 10 декабря 2001 года</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" trbidi="on"&gt;Полное лунное затмение 10 декабря 2011 года. На всей территории России, а также в Азии, Австралии и части Северной Америки (Аляска).&lt;br /&gt;в Европейской части России полное - ранним вечером;&lt;br /&gt;в районах Сибири и Дальнего Востока - в первой половине ночи.&lt;br /&gt;Полная фаза лунного затмения продлится в течение 51 минуты.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vDOjB2rvJaM/Tt8HFoM-D9I/AAAAAAAANk4/xc1F7Xlp7To/s1600/%25D0%259F%25D0%25BE%25D0%25BB%25D0%25BD%25D0%25BE%25D0%25B5+%2528%25D1%2584%25D0%25B0%25D0%25B7%25D0%25B0+1.1061%2529+%25D0%25BB%25D1%2583%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25B5+%25D0%25B7%25D0%25B0%25D1%2582%25D0%25BC%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+10+%25D0%25B4%25D0%25B5%25D0%25BA%25D0%25B0%25D0%25B1%25D1%2580%25D1%258F+2011+%25D0%25B3%25D0%25BE%25D0%25B4%25D0%25B0++_+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="547" src="http://2.bp.blogspot.com/-vDOjB2rvJaM/Tt8HFoM-D9I/AAAAAAAANk4/xc1F7Xlp7To/s640/%25D0%259F%25D0%25BE%25D0%25BB%25D0%25BD%25D0%25BE%25D0%25B5+%2528%25D1%2584%25D0%25B0%25D0%25B7%25D0%25B0+1.1061%2529+%25D0%25BB%25D1%2583%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25B5+%25D0%25B7%25D0%25B0%25D1%2582%25D0%25BC%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+10+%25D0%25B4%25D0%25B5%25D0%25BA%25D0%25B0%25D0%25B1%25D1%2580%25D1%258F+2011+%25D0%25B3%25D0%25BE%25D0%25B4%25D0%25B0++_+1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZUSV_sjqPNo/Tt8HGYxs_JI/AAAAAAAANk8/PppRKWnAIqc/s1600/%25D0%259F%25D0%25BE%25D0%25BB%25D0%25BD%25D0%25BE%25D0%25B5+%2528%25D1%2584%25D0%25B0%25D0%25B7%25D0%25B0+1.1061%2529+%25D0%25BB%25D1%2583%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25B5+%25D0%25B7%25D0%25B0%25D1%2582%25D0%25BC%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+10+%25D0%25B4%25D0%25B5%25D0%25BA%25D0%25B0%25D0%25B1%25D1%2580%25D1%258F+2011+%25D0%25B3%25D0%25BE%25D0%25B4%25D0%25B0+_+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="363" src="http://1.bp.blogspot.com/-ZUSV_sjqPNo/Tt8HGYxs_JI/AAAAAAAANk8/PppRKWnAIqc/s640/%25D0%259F%25D0%25BE%25D0%25BB%25D0%25BD%25D0%25BE%25D0%25B5+%2528%25D1%2584%25D0%25B0%25D0%25B7%25D0%25B0+1.1061%2529+%25D0%25BB%25D1%2583%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25B5+%25D0%25B7%25D0%25B0%25D1%2582%25D0%25BC%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+10+%25D0%25B4%25D0%25B5%25D0%25BA%25D0%25B0%25D0%25B1%25D1%2580%25D1%258F+2011+%25D0%25B3%25D0%25BE%25D0%25B4%25D0%25B0+_+2.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Начало полутеневого затмения (вход Луны в полутень) - в 11:31:45 - 11:33:32 - 11:33:36 UT/GMT;&lt;/li&gt;&lt;li&gt;Начало частного теневого затмения -  в 12:45:18 - 12:45:42 - 12:45:43 UT/GMT;&lt;/li&gt;&lt;li&gt;Начало полного затмения - в 14:05:37 - 14:06:16 UT/GMT;&lt;/li&gt;&lt;li&gt;Максимальная фаза затмения - в 14:31:44 - 14:31:49 UT/GMT;&lt;/li&gt;&lt;li&gt;Конец полного затмения - в 14:57:24 - 14:57:53 - 14:57:58 UT/GMT;&lt;/li&gt;&lt;li&gt;Конец частного затмения (выход Луны из тени) - в 16:17:58 - 16:18:12 UT/GMT;&lt;/li&gt;&lt;li&gt;Конец полутеневого затмения (выход Луны из полутени) - в 17:29:57 - 17:30:00 - 17:31:37 UT/GMT.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Links:&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://eclipsegeeks.com/TotalLunarEclipse10December2011.aspx"&gt;eclipsegeeks.com&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://eclipse.gsfc.nasa.gov/OH/OHfigures/OH2011-Fig06.pdf"&gt;Eclipse NASA&lt;/a&gt;&amp;nbsp;(pdf).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: И вот вам немного &lt;a href="http://www.somepaintings.net/Alex.html"&gt;Alex'а Kanevsky&lt;/a&gt;:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KBsE3u8cg2w/Tt8HtJUWruI/AAAAAAAANlI/Omrb0GA8R4A/s1600/heroes_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="http://4.bp.blogspot.com/-KBsE3u8cg2w/Tt8HtJUWruI/AAAAAAAANlI/Omrb0GA8R4A/s640/heroes_01.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8473429725556375546?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8473429725556375546/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8473429725556375546' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8473429725556375546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8473429725556375546'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/12/live-total-lunar-eclipse-10-2001.html' title='[live] A total lunar eclipse - 10 декабря 2001 года'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vDOjB2rvJaM/Tt8HFoM-D9I/AAAAAAAANk4/xc1F7Xlp7To/s72-c/%25D0%259F%25D0%25BE%25D0%25BB%25D0%25BD%25D0%25BE%25D0%25B5+%2528%25D1%2584%25D0%25B0%25D0%25B7%25D0%25B0+1.1061%2529+%25D0%25BB%25D1%2583%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25B5+%25D0%25B7%25D0%25B0%25D1%2582%25D0%25BC%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+10+%25D0%25B4%25D0%25B5%25D0%25BA%25D0%25B0%25D0%25B1%25D1%2580%25D1%258F+2011+%25D0%25B3%25D0%25BE%25D0%25B4%25D0%25B0++_+1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2812737579852165889</id><published>2011-11-20T04:08:00.001+04:00</published><updated>2011-11-20T04:11:12.496+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>[iPhone] видео в 360 градусов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;весьма крутой концепт. надеюсь, дойдет до серийного производства, ибо применение найдет точно. я про практическое, а не для хипстеров.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;iframe frameborder="0" height="410px" src="http://www.kickstarter.com/projects/dot/dot-360o-video-capture-for-the-iphone-4/widget/video.html" width="480px"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2812737579852165889?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2812737579852165889/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2812737579852165889' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2812737579852165889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2812737579852165889'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/11/iphone-360.html' title='[iPhone] видео в 360 градусов'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-854788811685925028</id><published>2011-11-16T17:53:00.001+04:00</published><updated>2011-11-16T17:59:11.949+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><title type='text'>[Yandex] Yandex.Maps update for iOS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://3.bp.blogspot.com/-FHGJvhQOkBw/TsPA_GS4WSI/AAAAAAAANkw/Otv0pkkSej4/s1600/1128-1-yandex.maps.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-FHGJvhQOkBw/TsPA_GS4WSI/AAAAAAAANkw/Otv0pkkSej4/s1600/1128-1-yandex.maps.jpg" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4 style="color: #474747; font-size: 1.4em; font-style: normal; font-weight: bold; line-height: 18px; margin-bottom: 8px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;What's New In &lt;a href="http://mobile.yandex.ru/maps/iphone/"&gt;Version 4.5&lt;/a&gt;&lt;/h4&gt;&lt;div style="color: #898989; margin-bottom: 18px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Возможность скачивать карту.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #898989; font-size: 12px; margin-bottom: 18px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Годится такая возможность. Спасибо.&lt;/div&gt;&lt;div style="color: #898989; font-size: 12px; margin-bottom: 18px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://mobile.yandex.ru/maps/iphone/"&gt;Yandex&lt;/a&gt;, &lt;a href="http://itunes.apple.com/ru/app/id313877526?mt=8"&gt;AppStore&lt;/a&gt;, &lt;a href="http://itunes.apple.com/ru/app/id313877526?mt=8"&gt;iTunes&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-854788811685925028?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/854788811685925028/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=854788811685925028' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/854788811685925028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/854788811685925028'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/11/yandex-yandexmaps-update-for-ios.html' title='[Yandex] Yandex.Maps update for iOS'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-FHGJvhQOkBw/TsPA_GS4WSI/AAAAAAAANkw/Otv0pkkSej4/s72-c/1128-1-yandex.maps.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7282512607853977278</id><published>2011-11-15T17:13:00.001+04:00</published><updated>2011-11-15T17:20:34.794+04:00</updated><title type='text'>[Microsoft, Kinect] потеряли документацию</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Так вот. Microsoft &lt;a href="http://kinectforwindows.org/"&gt;открыла новый сайт&lt;/a&gt; посвященный Kinect. Вялый, неинформативный, блаблабла. &amp;nbsp;Ну да ладно. Понадобился мне тут programming guide for Kinect, &lt;a href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/docs/programmingguide_kinectsdk.pdf"&gt;был у них&lt;/a&gt; такой прекрасный документ с картинками, а нету его нигде. Вернее, он есть по ссылке, но редирект.&lt;br /&gt;Короче, вот копия на &lt;a href="https://docs.google.com/open?id=0B9-7B8mQojIRYTJjZjEyNWUtOTc2YS00NjRiLWIxOWYtZjQ4NGZmNzhjYjVm"&gt;Google Docs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;tags:&amp;nbsp;ProgrammingGuide_KinectSDK.pdf&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7282512607853977278?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7282512607853977278/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7282512607853977278' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7282512607853977278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7282512607853977278'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/11/microsoft-kinect.html' title='[Microsoft, Kinect] потеряли документацию'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2659754526015720407</id><published>2011-07-29T12:50:00.001+04:00</published><updated>2011-07-29T12:50:52.786+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='странное'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>[Java] Java 7 - "наконец-то".</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.oracle.com/ocom/groups/public/@ocom/documents/digitalasset/427163.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.oracle.com/ocom/groups/public/@ocom/documents/digitalasset/427163.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Тут выпустили &lt;a href="http://www.oracle.com/us/corporate/features/java-7-launched-435823.html"&gt;Java 7&lt;/a&gt;. Ну я рад конечно, почему бы и нет. Почитал там анонсы, слова какие то незнакомые, &lt;a href="http://www.oracle.com/us/corporate/events/java7/index.html"&gt;дядька час рассказывает&lt;/a&gt;, логотип попсовый.&lt;br /&gt;&lt;br /&gt;Синтаксический сахар, так синтаксический сахар. Конечно же я первым делом решил попробовать Switch'ить String'и, разогреться так сказать, порадоваться. В общем, чего это я, вот оно так выглядит:&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;public class StringSwitch {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; public static void main(String[] args) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String caseString = "str";&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(caseString) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case "str":&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println("Match!");&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default:&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println("Default break.");&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;А вот так после декомпиляции:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import java.io.PrintStream;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;public class StringSwitch&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; public static void main(String[] paramArrayOfString)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String str1 = "str";&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String str2 = str1; int i = -1; switch (str2.hashCode()) { case 114225:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!str2.equals("str")) break; i = 0; } &lt;/b&gt;switch (i) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Match!");&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Default break.");&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;И не стал я дальше смотреть. Расскажите потом как оно.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2659754526015720407?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2659754526015720407/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2659754526015720407' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2659754526015720407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2659754526015720407'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2011/07/java-java-7.html' title='[Java] Java 7 - &quot;наконец-то&quot;.'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-408027450124804987</id><published>2010-12-18T20:07:00.000+03:00</published><updated>2010-12-18T20:07:07.372+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books ngram'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>[Google Books Ngram Viewer] дворник, чиновник, менеджер, юрист, бухгалтер и программист</title><content type='html'>Может быть кто-то еще не в курсе такого сервиса как &lt;a href="http://ngrams.googlelabs.com/"&gt;Google Books Ngram Viewer&lt;/a&gt;. Вкратце: "В Google создали базу на основе пяти миллионов книг фонда мировой литературы. Посчитали упоминания всех слов. Теперь можно воспользоваться поисковой формой и отследить тенденцию изменения упоминаемости различных слов и выражений на нескольких языках мира."&lt;br&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://lh3.ggpht.com/_ymDymKKKFj4/TQzo2pEcP9I/AAAAAAAANZY/khqlvEWV_g4/s800/chart.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="293" width="800" src="http://lh3.ggpht.com/_ymDymKKKFj4/TQzo2pEcP9I/AAAAAAAANZY/khqlvEWV_g4/s800/chart.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-408027450124804987?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/408027450124804987/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=408027450124804987' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/408027450124804987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/408027450124804987'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/google-books-ngram-viewer.html' title='[Google Books Ngram Viewer] дворник, чиновник, менеджер, юрист, бухгалтер и программист'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/TQzo2pEcP9I/AAAAAAAANZY/khqlvEWV_g4/s72-c/chart.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2155883849330717751</id><published>2010-12-17T16:28:00.000+03:00</published><updated>2010-12-17T16:28:21.053+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='disqus'/><category scheme='http://www.blogger.com/atom/ns#' term='comments system'/><title type='text'>[Blogger] нормальные комментарии? нормальные комментарии!</title><content type='html'>Так вот, система комментариев в Blogger'е убога чуть более, чем полностью, а это плохо. Посему, немного почитав и посмотрев, я выбрал вот такую штуку для комментирования и называется она &lt;a href="http://disqus.com/features/"&gt;DISQUS&lt;/a&gt;.&lt;br /&gt;По ссылке кучка примеров, инструкции по применению. Умеет импорт уже существующих комментариев, аутентификацию из различных источников, треды и бла-бла-бла и мне нра. Выглядит как на картинке и уже прикручено к блогу:&lt;br&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://mediacdn.disqus.com/1292540945/img/marketing/features/realtime.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="730" width="657" src="http://mediacdn.disqus.com/1292540945/img/marketing/features/realtime.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2155883849330717751?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2155883849330717751/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2155883849330717751' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2155883849330717751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2155883849330717751'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/blogger.html' title='[Blogger] нормальные комментарии? нормальные комментарии!'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-3780612862008801384</id><published>2010-12-17T14:44:00.000+03:00</published><updated>2010-12-17T14:44:19.638+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='template'/><title type='text'>[Blogger] Mobile Template</title><content type='html'>Тихо и незаметно &lt;a href="http://www.blogger.com"&gt;Blogger&lt;/a&gt; добавил поддержку Mobile Template в свои блоги, включается автоматически, но я увидел только сегодня. Официального анонса и прочих новостей не нашел, видимо Google стыдно, что они сделали это чуть ли не самыми последними в интернете. Хотя, по-моему, это прекрасно - сначала выпустить и раскрутить операционную систему для мобильных устройств и только потом адаптировать свои решения для устройств тех же.&lt;br /&gt;Вот так вот выглядит мой блог на Nexus One в стандартном браузере:&lt;br&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Zn_lJsaJc_QTRaxeHRG6og?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/TQtLqZiVsiI/AAAAAAAANY8/Oco0NQM-Z9k/s800/blogger.mobile.png" height="800" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-3780612862008801384?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/3780612862008801384/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=3780612862008801384' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3780612862008801384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3780612862008801384'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/blogger-mobile-template.html' title='[Blogger] Mobile Template'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ymDymKKKFj4/TQtLqZiVsiI/AAAAAAAANY8/Oco0NQM-Z9k/s72-c/blogger.mobile.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8931955474478079114</id><published>2010-12-13T22:31:00.000+03:00</published><updated>2010-12-13T22:31:30.363+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='highlighting'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><category scheme='http://www.blogger.com/atom/ns#' term='prettify'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>[Google] спасибо тебе Google и онлайн подсветка синтаксиса</title><content type='html'>Снились велосипеды и мечталось о простой и адекватной подсветке синтаксиса, но всё уже придумано до нас.&lt;br /&gt;Есть такой приятный во всех отношениях проект &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;google-code-prettify&lt;/a&gt; (syntax highlighting of code snippets in a web page), которым пользуется сам Google при подсветке синтаксиса и который мне нравится по эстетическим соображениям.&lt;br /&gt;Использовать данный проект весьма просто, но на всякий случай я покажу как это выглядит в нашем случае в &lt;a href="www.blogger.com"&gt;Blogger&lt;/a&gt;'е:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;идем в настройка блога Design -&gt; Edit HTML и в окошке для редактирования текста под надписью Edit Templates делаем поиск по тегу /head и перед самым закрытием тега вставляем строки:&lt;br /&gt;&lt;pre class="prettyprint lang-html"&gt;&amp;lt;link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/&gt;&lt;br /&gt;&amp;lt;script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;потом ищем тег body и добавляем к тегу команду onload="prettyPrint()", чтобы получилось примерно так:&lt;br /&gt;&lt;pre class="prettyprint lang-html"&gt;&amp;lt;body onload="prettyPrint()"&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;собственно, на этом настройка заканчивается, теперь чтобы воспользоваться подсветкой при составлении поста в режиме правки HTML необходимо писать вот так:&lt;br /&gt;&lt;pre class="prettyprint js"&gt;&amp;lt;pre class="prettyprint"&amp;gt;&lt;br /&gt;    // add your code here&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;собственно, код выше и подсвечен prettify.&lt;/li&gt;&lt;/ul&gt;Конечно же, возможно указание языка для подсветки и делается это указанием желаемого языка в class="prettyprint &lt;b&gt;lang-*&lt;/b&gt;", поддерживаются (то что нужно писать вместо звездочки):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bsh&lt;/li&gt;&lt;li&gt;c&lt;/li&gt;&lt;li&gt;cc&lt;/li&gt;&lt;li&gt;cpp&lt;/li&gt;&lt;li&gt;cs&lt;/li&gt;&lt;li&gt;csh&lt;/li&gt;&lt;li&gt;cyc&lt;/li&gt;&lt;li&gt;cv&lt;/li&gt;&lt;li&gt;htm&lt;/li&gt;&lt;li&gt;html&lt;/li&gt;&lt;li&gt;java&lt;/li&gt;&lt;li&gt;js&lt;/li&gt;&lt;li&gt;m&lt;/li&gt;&lt;li&gt;mxml&lt;/li&gt;&lt;li&gt;perl&lt;/li&gt;&lt;li&gt;pl&lt;/li&gt;&lt;li&gt;pm&lt;/li&gt;&lt;li&gt;py&lt;/li&gt;&lt;li&gt;rb&lt;/li&gt;&lt;li&gt;sh&lt;/li&gt;&lt;li&gt;xhtml&lt;/li&gt;&lt;li&gt;xml&lt;/li&gt;&lt;li&gt;xsl&lt;/li&gt;&lt;/ul&gt;Еще немного важного и интересного:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;тестировалось и поддерживается нормальная работа на &gt;IE 6, &gt;Firefox 1.5 &amp; 2, &gt;Safari 2.0.4, Chrome - весь и целиком, вот &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/tests/prettify_test.html"&gt;тестовая страничка&lt;/a&gt;, где можно посмотреть как оно будет выглядеть в вашем браузере;&lt;/li&gt;&lt;li&gt;не работает в Wordpress из-за "smart quoting", читать &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/tests/prettify_test.html"&gt;здесь&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;можно включить нумерацию строк вот так:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;pre class="prettyprint linenums:&lt;b&gt;4&lt;/b&gt;"&lt;br /&gt;&amp;gt;// This is line 4.&lt;br /&gt;foo();&lt;br /&gt;bar();&lt;br /&gt;baz();&lt;br /&gt;boo();&lt;br /&gt;far();&lt;br /&gt;faz();&lt;br /&gt;&amp;lt;pre&amp;gt;&lt;/pre&gt;т.е. указанием &lt;b&gt;:4&lt;/b&gt; вы говорите, чтобы отсчет начинался с 4, если не указывать, то с единицы - &lt;br /&gt;&lt;pre class="prettyprint linenums:4"&gt;// This is line 4.&lt;br /&gt;foo();&lt;br /&gt;bar();&lt;br /&gt;baz();&lt;br /&gt;boo();&lt;br /&gt;far();&lt;br /&gt;faz();&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;еще чуть-чуть можно почитать в &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html"&gt;README&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;В общем, мне нравится и немного еще теста:&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;public class HelloWorld {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    System.out.println("Здравствуй, мир!");&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;По моему, прекрасно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8931955474478079114?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8931955474478079114/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8931955474478079114' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8931955474478079114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8931955474478079114'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/google-google.html' title='[Google] спасибо тебе Google и онлайн подсветка синтаксиса'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8414181725438878128</id><published>2010-12-07T14:19:00.002+03:00</published><updated>2010-12-07T18:28:01.137+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdk r8'/><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ IDEA'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android] IntelliJ IDEA X EAP и Android SDK Tools r8</title><content type='html'>Вчера, как вы наверное заметили, вышло обновление &lt;a href="http://developer.android.com/sdk/tools-notes.html"&gt;Android SDK Tools r8&lt;/a&gt; (предыдущая запись об этом). В данном обновлении изменилась структура каталогов утилит и теперь часть утилит перекочевала из ${ANDROID.HOME}/tools в ${ANDROID.HOME}/platform-tools, в связи с чем IntelliJIDEA "теряет" SDK и ни в какую не хочет работать с adb и прочими нужностями.&lt;br /&gt;Баг в трекере JetBrains уже завели &lt;a href="http://youtrack.jetbrains.net/issue/IDEA-62526"&gt;IDEA-62526&lt;/a&gt; [&lt;b&gt;UPD. уже Fixed, Next Build&lt;/b&gt;], думаю быстро поправят. Пока же решить данную проблему можно путем копирования всех исполняемых файлов и библиотек из ${ANDROID.HOME}/platform-tools в ${ANDROID.HOME}/tools, затем сделать:&lt;br /&gt;&lt;pre&gt;adb kill-server&lt;br /&gt;adb start-server&lt;/pre&gt;и перезапустить IntellijIDEA. У меня всё заработало, по крайней необходимые вещи в лице adb, ddms и списка подключенных девайсов.&lt;br /&gt;&lt;br /&gt;p.s. и да. я таки созрел чтобы в очередной, сто двадцать пятый, раз попробовать Eclipse.&lt;br /&gt;p.p.s попробовал Eclipse... результат таков:&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/TP5HhQ9ujyI/AAAAAAAANX4/X8YxeIYss5A/s800/idea_vs_eclipse.png" align="center" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8414181725438878128?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8414181725438878128/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8414181725438878128' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8414181725438878128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8414181725438878128'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/android-intellij-idea-x-eap-android-sdk.html' title='[Android] IntelliJ IDEA X EAP и Android SDK Tools r8'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ymDymKKKFj4/TP5HhQ9ujyI/AAAAAAAANX4/X8YxeIYss5A/s72-c/idea_vs_eclipse.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-1005740932163465133</id><published>2010-12-06T19:40:00.001+03:00</published><updated>2010-12-06T19:43:24.905+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='android ndk'/><category scheme='http://www.blogger.com/atom/ns#' term='adt'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android] Android 2.3 Platform и обновление SDK Tools</title><content type='html'>Xavier Ducrohet по должности Android SDK Tech Lead порадовал нас сегодня вот такими вот новостями:&lt;br /&gt;&lt;br /&gt;Анонсирована новая версия платформы Android — Android 2.3 (Gingerbread), которая включает в себя ряд новых возможностей и расширяет текущие API, в своем стремлении помочь разработчикам создавать великолепные приложения. Вот некоторые из новых возможностей:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Game Development&lt;/b&gt;: значительно улучшены средства для разработки игровых приложений: добавлен &lt;i&gt;новый сборщик мусора&lt;/i&gt;, который значительно влияет (в лучшую сторону) на отзывчивость приложений на действия пользователя, оптимизировано в целом поведение платформы при обработке событий. Так же, разработчикам предоставлен &lt;i&gt;доступ к новым native (через NDK) компонентам системы через стабильное API&lt;/i&gt;. Через NDK приложения теперь могут получить доступ в системе ввода, событиям сенсоров, EGL/OpenGL ES, OpenSL ES, а также к новому фреймворку, который может контролировать жизненный цикл приложения и непосредственно интерфейса. Для точной обработки перемещений устройства в пространстве, разработчики могут использовать &lt;i&gt;несколько новых типов датчиков, включая гироскоп&lt;/i&gt;; &lt;/li&gt;&lt;li&gt;&lt;b&gt;Rich Multimedia&lt;/b&gt;: Чтобы обеспечить все мультимедийные возможности в играх и других приложениях, добавлена поддержка новых видео форматов &lt;i&gt;VP8 и WebM&lt;/i&gt;, а также поддержка &lt;i&gt;AAC и AMR&lt;/i&gt; (широкополосное кодирование). Платформа также предоставляет новые звуковые эффекты, такие как реверберация, эквалайзер, виртуализация звуковых эффектов через наушники, а также усиление низких частот;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Новые формы коммуникации&lt;/b&gt;: платформа теперь включает поддержку &lt;i&gt;фронтальных камер&lt;/i&gt;, &lt;i&gt;SIP/VOIP и Near Field Communications (NFC&lt;/i&gt;), что позволит разработчикам реализовать новые возможности в своих приложениях не прикладывая чрезмерных усилий.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Для того, чтобы ознакомиться с полным списком нововведений - читайте &lt;a href="http://developer.android.com/sdk/android-2.3-highlights.html"&gt;Android 2.3 Platform Highlights (English)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Наряду с новой платформой, выпущены &lt;b&gt;обновления SDK Tools (R8), NDK и ADT плагина для Eclipse (8.0.0)&lt;/b&gt;. Среди новых функций:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Упрощенна система сборки отладочных версий&lt;/b&gt;: разработчики могут легко создавать версии приложения для отладки без необходимости вручную вносить изменения в манифест приложения;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Интегрирована поддержка ProGuard&lt;/b&gt;: ProGuard теперь поставляется в комплекте с SDK Tools. Разработчики могут обфусцировать свой код прямо во время сборки проектов, без необходимости дополнительных настроек;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Улучшен HierarchyViewer&lt;/b&gt;: инструмент HierarchyViewer включает обновленный пользовательский интерфейс и теперь доступен напрямую из плагина ADT;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Предварительная версия нового редактора пользовательского интерфейса (UI Builder)&lt;/b&gt;: новый визуальный редактор шаблонов позволяет разработчикам создавать макеты в ADT путем перетаскивания элементов пользовательского интерфейса из контекстного меню непосредственно на layout. В этом направлении ведется активная работы и команда разработчиков намерена значительно улучшить работоспособность в ближайшее время.&lt;/li&gt;&lt;/ul&gt;Для начала разработки и тестирования приложений на Android 2.3, посетите &lt;a href="http://developer.android.com/sdk/index.html"&gt;сайт разработчиков Android&lt;/a&gt; для получения информации об &lt;a href="http://developer.android.com/sdk/android-2.3.html"&gt;Android 2.3&lt;/a&gt;, новых &lt;a href="http://developer.android.com/sdk/tools-notes.html"&gt;SDK Tools&lt;/a&gt;, &lt;a href="http://developer.android.com/sdk/eclipse-adt.html"&gt;ADT плагине&lt;/a&gt; и &lt;a href="http://developer.android.com/sdk/ndk/index.html"&gt;нового NDK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Оригинал новости &lt;a href="http://android-developers.blogspot.com/2010/12/android-23-platform-and-updated-sdk.html"&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;И немного видео:&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Jx3pdWBlZ34?hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Jx3pdWBlZ34?hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_ymDymKKKFj4/TP0Scn8BFfI/AAAAAAAANXU/CFSokluc4Zo/s800/gingerbread-ofc-1.jpg" height="485" width="600" align="center" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-1005740932163465133?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/1005740932163465133/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=1005740932163465133' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1005740932163465133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1005740932163465133'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/android-android-23-platform-sdk-tools.html' title='[Android] Android 2.3 Platform и обновление SDK Tools'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ymDymKKKFj4/TP0Scn8BFfI/AAAAAAAANXU/CFSokluc4Zo/s72-c/gingerbread-ofc-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8952177478437067816</id><published>2010-12-02T11:15:00.002+03:00</published><updated>2010-12-02T11:15:46.540+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='монетизация'/><title type='text'>[mobile] монетизация и здравый смысл в двух абзацах</title><content type='html'>пяти часовая лекция о монетизации приложений для мобильных устройств на различных платформах...&lt;br /&gt;у меня есть своя версия, очень короткая и полученная весьма опытным путем:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Android - бесплатные приложения со встроенной рекламой;&lt;/li&gt;&lt;li&gt;iPhone - платные приложения по адекватной цене + ограниченная по функционалу версия со встроенной рекламой;&lt;/li&gt;&lt;li&gt;Windows Mobile, Symbian, J2ME - выкладываем приложения на rutracker, при старте приложения слезно просим о donate; вариант второй - зарабатывать на социальности: социальность via смс, отправка смс с рекордами и результатами и т.д. или же предоставляем платные сервисы, а приложение используем как тонкий клиент;&lt;/li&gt;&lt;li&gt;Windows Mobile 7 - пишем "Hello, World", хвастаемся перед друзьями и забиваем на полгода-год; можно поучаствовать в конкурсах;&lt;/li&gt;&lt;li&gt;Blackberry - полгода бьемся со службой поддержки RIM. пока бьемся - обнаруживаем рабочую версию своего приложения на crackberry, забиваем на него и возвращаемся к монетизации через сервисы, а не через продажу.&lt;/li&gt;&lt;/ul&gt;выводы таковы: монетизировать приложение "в себе" на данный момент реально возможно только на iPhone и Android, если же приложение - это врата в другой внешний сервис (телефония, справочники, карты и т.д.), то можно рассматривать вопрос монетизации на всех платформах, но это уже другая опера.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8952177478437067816?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8952177478437067816/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8952177478437067816' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8952177478437067816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8952177478437067816'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/mobile.html' title='[mobile] монетизация и здравый смысл в двух абзацах'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-4994629077606067337</id><published>2010-12-02T09:36:00.000+03:00</published><updated>2010-12-02T09:36:39.228+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google reader'/><category scheme='http://www.blogger.com/atom/ns#' term='translation'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android, перевод] Приложение Google Reader для Android</title><content type='html'>&lt;img src="http://1.bp.blogspot.com/_UymlGMFE2rA/TPQwxJ8i_vI/AAAAAAAAAF4/1xTNVdHoabM/s320/reader-border.png" alt="image" align="left" vspace=15px hspace=15px/&gt;Свершилось. Официальное приложения для Google Reader пришло на Android. И сразу же поговорим о возможностях приложения.&lt;br /&gt;Google Reader для Android поддерживает все основные возможности реализованные в веб-интерфейсе: показ количества непрочитанных записей, поддерживает функцию "друзья", расшаривание записей, функцию "Like" и "добавить в избранное", а так же умеет кое-что еще. К примеру:&lt;br /&gt;&lt;ul&gt; &lt;li&gt;поддерживает несколько аккаунтов;&lt;/li&gt; &lt;li&gt;умеет синхронизировать настройки;&lt;/li&gt; &lt;li&gt;полностью поддерживает функции подписки на RSS каналы;&lt;/li&gt; &lt;li&gt;поддерживает полноценный поиск.&lt;/li&gt;&lt;/ul&gt;И еще несколько неочевидных возможностей, о которых хотелось бы сказать:&lt;br /&gt;&lt;ul&gt; &lt;li&gt;навигация посредством кнопок регулировки громкости (если вы включите эту функцию в настройках, то вы сможете переключаться между следующей и предыдущей записью посредством кнопок регулировки громкости);&lt;/li&gt; &lt;li&gt;если нажать на каталог или подписку и подождать, то появится контекстное меню, в котором вы сможете переименовать элемент, отменить подписку или сменить каталог в котором он располагается;&lt;/li&gt; &lt;li&gt;если вы вызовите меню опций при чтении конкретной записи, то вы сможете использовать возможность "отправить запись", которая интегрируется с другими приложениями на вашем телефоне и добавляет возможность отправки записи в сторонние приложения.&lt;/li&gt;&lt;/ul&gt;&lt;habracut text="и еще немного деталей..."/&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://3.bp.blogspot.com/_UymlGMFE2rA/TPQw6r9ygDI/AAAAAAAAAGA/AuAbHtZTNc0/s320/send-resized.png" alt="image" align="center"/&gt;&lt;/div&gt;&lt;br /&gt;Мы очень взволнованны релизом первой версии нашего приложения и надеемся, что вы опробуете его и сообщите нам о ваших впечатлениях в &lt;a href="http://twitter.com/googlereader"&gt;Твиттере&lt;/a&gt; или же на &lt;a href="http://www.google.com/support/forum/p/reader?hl=en&amp;utm_source=HC&amp;utm_medium=leftnav&amp;utm_campaign=reader"&gt;нашем форуме&lt;/a&gt;.&lt;br /&gt;А вот и ссылка на приложение. Оно работает на системах с Donut и старше.&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://1.bp.blogspot.com/_O3jT2uzrsQE/TPaz2lF2ePI/AAAAAAAAAe0/yU7KundRBGU/s320/chart.png" alt="image" align="center"/&gt;&lt;/div&gt;&lt;br /&gt;поведал нам Peter Baldwin, в блоге &lt;a href="http://googlereader.blogspot.com/2010/11/android-google-reader-app-is-here.html"&gt;GoogleReader&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-4994629077606067337?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/4994629077606067337/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=4994629077606067337' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/4994629077606067337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/4994629077606067337'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/android-google-reader-android.html' title='[Android, перевод] Приложение Google Reader для Android'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UymlGMFE2rA/TPQwxJ8i_vI/AAAAAAAAAF4/1xTNVdHoabM/s72-c/reader-border.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7961024509074374399</id><published>2010-12-01T21:39:00.001+03:00</published><updated>2010-12-01T21:40:57.560+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndk'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android] Hello, NDK!</title><content type='html'>&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/TPZYJ4QAhjI/AAAAAAAANWk/tI5H075R8UE/s288/android_ndk.jpg" alt="android-ndk" align="left" hspace=10px vspace=10px /&gt; Когда-нибудь, у вас обязательно встанет вопрос о производительности некоторых операций на Android SDK и вам захочется ускориться, а может вы пишете приложения на OpenGL и перестанет хватать скорости на уровне SDK и тогда вы узнаете о или познакомитесь поближе с Android Native Development Kit (NDK). Собственно, сейчас я постараюсь познакомить вас с этим зверем на элементарном уровне и немного объяснить то, что знать необходимо. И раз уж тема NDK не очень здесь популярна, то начну я с теории, а закончим мы уже вместе некоторым работоспособным приложением, в которое и воплотим полученные знания.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/ndk/index.html"&gt;Android NDK&lt;/a&gt; по своей сути дополнение к стандартному &lt;a href="http://developer.android.com/sdk/index.html"&gt;Android SDK&lt;/a&gt;, которое позволяет разработчику реализовать критически важные по скорости участки кода на более низком уровне (будем говорить native code). Использовать NDK можно только совместно с SDK, т.е. полноценное приложение для Android невозможно написать только лишь на NDK.&lt;br /&gt;NDK позволяет реализовать части вашего приложения, используя такие языки как C и C++. Т.е. вы можете реализовать какие-либо дополнительные библиотеки и повторно их использовать в других проектах, так же зачастую реализация на NDK позволяет выиграть в скорости исполнения кода.&lt;br /&gt;&lt;br /&gt;На текущий момент NDK обеспечивает следующие возможнсти (в версии 4b):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;предоставляет набор инструментов для создания собственных библиотек кода на C и C+;&lt;/li&gt;&lt;li&gt;содержит в себе инструменты по внедрению созданных библиотек в приложение (.apk);&lt;/li&gt;&lt;li&gt;содержит набор собственных заголовочных файлов системы и дополнительных библиотек, которые будут поддерживаться во всех будущих версиях Android, начиная с Android 1.5;&lt;/li&gt;&lt;li&gt;предоставляет документацию, примеры и дополнительные материалы.&lt;/li&gt;&lt;/ul&gt;Последняя версия NDK поддерживает следующие наборы инструкций ARM:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ARMv5TE (включая инструкции Thumb-1);&lt;/li&gt;&lt;li&gt;ARMv7-А (в том числе  инструкции Thumb-2 и VFPv3-D16, с опциональной поддержкой инструкций NEON/VFPv3-D32).&lt;/li&gt;&lt;/ul&gt;Будущие версии NDK также будут поддерживать:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;инструкции x86.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;Машинный код ARMv5TE будет работать на всех ARM-устройств на базе Android. ARMv7-А будет работать только на таких устройствах, как Verizon Droid или Google Nexus One. Основное различие между двумя наборами инструкций это то, что ARMv7-поддерживает аппаратное FPU, Thumb-2 и инструкции NEON. &lt;br /&gt;NDK обеспечивает стабильные заголовки Libc (библиотеки C), libm (математическая библиотека), OpenGL ES (3D графическая библиотека), интерфейс JNI, и другие библиотеки.&lt;br /&gt;Google предупреждает нас, что NDK не всегда так полезен, как может казаться. Как разработчик, вы должны балансировать между преимуществами и недостатками NDK, важно понимать, что использование native code не всегда приводит к увеличению производительности, но всегда приложение усложняет. Типичными хорошими кандидатами для переноса на уровень NDK являются автономные, интенсивно использующие CPU участки кода, под которые не нужно выделять много памяти, такие как моделирование физики, работа с графикой OpenGL и так далее. В большинстве случаев (и это правда), перенос кода на Си и в NDK не дает значительного прироста производительности, однако зачастую очень удобно использовать уже некогда написанный код на Си, C++ в своем приложении для платформы Android.&lt;br /&gt;И я повторюсь в унисон Google - &lt;i&gt;NDK не позволяте писать полноценные приложения без использования SDK, первичной средой исполнения все равно остается виртуальная машина Dalvik&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;NDK включает в себя набор кроссплатформенных toolchains (компилятор, линкер и т.д.), которые могут генерировать родной код ARM под платформы Linux, OS X и Windows (через Cygwin, еще коснемся этого вопроса).&lt;br /&gt;&lt;br /&gt;Предоставляются следующие заголовочные файлы:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Libc;&lt;/li&gt;&lt;li&gt;libm (математическая библиотека);&lt;/li&gt;&lt;li&gt;JNI интерфейс;&lt;/li&gt;&lt;li&gt;libz (Zlib сжатие);&lt;/li&gt;&lt;li&gt;liblog (логгирование приложений);&lt;/li&gt;&lt;li&gt;OpenGL ES 1.1 и OpenGL ES 2.0 (3D графические библиотеки);&lt;/li&gt;&lt;li&gt;libjnigraphics (для Android 2.2 и выше);&lt;/li&gt;&lt;li&gt;минимальный набор заголовочных файлов для поддержки C++.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Что понадобится&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;Android SDK&lt;/a&gt; (в версии не ниже 1.5);&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/sdk/ndk/index.html"&gt;Android NDK&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;поддерживаемые операционные системы:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows XP (32-bit), Vista (32- or 64-bit);&lt;/li&gt;&lt;li&gt;Mac OS X 10.4.8 и далее (только x86);&lt;/li&gt;&lt;li&gt;Linux (32- или 64-bit);&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;для всех платформ нужны будут:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GNU Make 3.81 и старше;&lt;/li&gt;&lt;li&gt;последние версии GNU Awk или Nawk;&lt;/li&gt;&lt;li&gt;для Windows нужен &lt;a href="http://cygwin.com/"&gt;Cygwin&lt;/a&gt; 1.7 и старше;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;Скомпилированные NDK библиотеки можно использовать только на Android 1.5 и выше, поэтому лучше сразу запомнить то, что в AndroidManifest.xml следует указывать минимальную версию:&lt;br /&gt;&lt;blockquote&gt;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;manifest&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;... &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;uses-sdk&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;android:minSdkVersion&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;3&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;... &lt;br /&gt;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;/manifest&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;br /&gt;Предположим, что вам еще интересно, вы скачали всё что нужно и установили. Тогда начнем немного писать и много комментировать.&lt;br /&gt;Создайте новый Android проект в любимой IDE, назовите его &lt;i&gt;HelloNDK&lt;/i&gt; и создайте Activity с таким же именем &lt;i&gt;HelloNDK&lt;/i&gt;. Если вам лениво, то можно забрать уже готовый проект на GitHub вот &lt;a href="https://github.com/dive/HelloNDK"&gt;по этой ссылке&lt;/a&gt; (все примеры файлов, которые я буду здесь приводить, будут ссылаться на свои копии на GitHub).&lt;br /&gt;&lt;br /&gt;Создадим простейший интерфейс, переписав Layout &lt;a href="https://github.com/dive/HelloNDK/blob/master/res/layout/main.xml"&gt;main&lt;/a&gt; следующим образом:&lt;br /&gt;&lt;blockquote&gt;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;?xml&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;version&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;1.0&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;encoding&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;utf-8&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;?&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;LinearLayout&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;xmlns:android&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:orientation&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;vertical&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:layout_width&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;fill_parent&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:layout_height&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;fill_parent&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;TextView&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;android:id&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;@+id/textView&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:layout_width&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;fill_parent&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:layout_height&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;wrap_content&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:padding&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;20dip&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:text&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;Hello&amp;nbsp;NDK!&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;Button&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;android:id&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;@+id/runAgainButton&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:layout_width&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;fill_parent&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:layout_height&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;wrap_content&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:padding&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;20dip&amp;quot;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;android:text&lt;/font&gt;=&lt;font color="#ff0000"&gt;&amp;quot;Run&amp;nbsp;Again&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&lt;font color="#000000"&gt;&amp;lt;/LinearLayout&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;br /&gt;Оформим нашу Activity &lt;a href="https://github.com/dive/HelloNDK/blob/master/src/org/divenvrsk/android/hellondk/HelloNDK.java"&gt;HelloNDK &lt;/a&gt;следующим образом:&lt;br /&gt;&lt;blockquote&gt;&lt;font color="#000000"&gt;package&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;org.divenvrsk.android.hellondk&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;android.app.Activity&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;android.os.Bundle&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;android.util.Log&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;android.view.View&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;android.widget.TextView&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;java.util.Arrays&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#000000"&gt;import&lt;/font&gt;&amp;nbsp;&lt;font color="#006699"&gt;java.util.Random&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;font color="#000000"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;class&lt;/font&gt;&amp;nbsp;HelloNDK&amp;nbsp;&lt;font color="#000000"&gt;extends&lt;/font&gt;&amp;nbsp;Activity&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;static&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;final&lt;/font&gt;&amp;nbsp;&lt;font color="#003399"&gt;String&lt;/font&gt;&amp;nbsp;TAG&amp;nbsp;=&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;HelloNDK!&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;static&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;final&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;ARRAY_SIZE&amp;nbsp;=&amp;nbsp;&lt;font color="#cc66cc"&gt;10000&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006600"&gt;long&lt;/font&gt;&amp;nbsp;timeUsedByNativeSort&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@&lt;font color="#003399"&gt;Override&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;void&lt;/font&gt;&amp;nbsp;onCreate&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;Bundle&amp;nbsp;savedInstanceState&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;super&lt;/font&gt;.&lt;font color="#006633"&gt;onCreate&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;savedInstanceState&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;R.&lt;font color="#006633"&gt;layout&lt;/font&gt;.&lt;font color="#006633"&gt;main&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;findViewById&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;R.&lt;font color="#006633"&gt;id&lt;/font&gt;.&lt;font color="#006633"&gt;runAgainButton&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;.&lt;font color="#006633"&gt;setOnClickListener&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#000000"&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color="#003399"&gt;View&lt;/font&gt;.&lt;font color="#006633"&gt;OnClickListener&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;void&lt;/font&gt;&amp;nbsp;onClick&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#003399"&gt;View&lt;/font&gt;&amp;nbsp;view&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startSorting&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startSorting&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006600"&gt;void&lt;/font&gt;&amp;nbsp;startSorting&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;unsortedArray&amp;nbsp;=&amp;nbsp;&lt;font color="#000000"&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;ARRAY_SIZE&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#003399"&gt;Random&lt;/font&gt;&amp;nbsp;random&amp;nbsp;=&amp;nbsp;&lt;font color="#000000"&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color="#003399"&gt;Random&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#003399"&gt;System&lt;/font&gt;.&lt;font color="#006633"&gt;currentTimeMillis&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;for&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;&lt;font color="#cc66cc"&gt;0&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;counter&amp;nbsp;&lt;font color="#339933"&gt;&amp;lt;&lt;/font&gt;&amp;nbsp;ARRAY_SIZE&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;counter++&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsortedArray&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;counter&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;=&amp;nbsp;random.&lt;font color="#006633"&gt;nextInt&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sortBubble&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;unsortedArray,&amp;nbsp;unsortedArray.&lt;font color="#006633"&gt;length&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;javaNativeSort&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;unsortedArray,&amp;nbsp;unsortedArray.&lt;font color="#006633"&gt;length&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;TextView&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;findViewById&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;R.&lt;font color="#006633"&gt;id&lt;/font&gt;.&lt;font color="#006633"&gt;textView&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;.&lt;font color="#006633"&gt;setText&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;Sorted&amp;nbsp;&amp;quot;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;ARRAY_SIZE&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;&amp;nbsp;items:&lt;font color="#000099"&gt;\n&lt;/font&gt;&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;+ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;NDK:&lt;font color="#000099"&gt;\t&lt;/font&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;&lt;font color="#003399"&gt;String&lt;/font&gt;.&lt;font color="#006633"&gt;valueOf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;getExecutionTime&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;/&amp;nbsp;&lt;font color="#cc66cc"&gt;1000&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;&amp;nbsp;milliseconds&amp;nbsp;(&amp;quot;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;getExecutionTime&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;&amp;nbsp;microseconds&amp;quot;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;)&amp;quot;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;SDK:&lt;font color="#000099"&gt;\t&lt;/font&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;timeUsedByNativeSort&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;&amp;nbsp;milliseconds&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;javaNativeSort&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;unsorted,&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;array_size&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006600"&gt;long&lt;/font&gt;&amp;nbsp;startTime,&amp;nbsp;endTime&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;bubbles_array&amp;nbsp;=&amp;nbsp;&lt;font color="#000000"&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;array_size&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#003399"&gt;System&lt;/font&gt;.&lt;font color="#006633"&gt;arraycopy&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;unsorted,&amp;nbsp;&lt;font color="#cc66cc"&gt;0&lt;/font&gt;,&amp;nbsp;bubbles_array,&amp;nbsp;&lt;font color="#cc66cc"&gt;0&lt;/font&gt;,&amp;nbsp;array_size&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startTime&amp;nbsp;=&amp;nbsp;&lt;font color="#003399"&gt;System&lt;/font&gt;.&lt;font color="#006633"&gt;currentTimeMillis&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#003399"&gt;Arrays&lt;/font&gt;.&lt;font color="#006633"&gt;sort&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;bubbles_array&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endTime&amp;nbsp;=&amp;nbsp;&lt;font color="#003399"&gt;System&lt;/font&gt;.&lt;font color="#006633"&gt;currentTimeMillis&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeUsedByNativeSort&amp;nbsp;=&amp;nbsp;endTime&amp;nbsp;-&amp;nbsp;startTime&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.&lt;font color="#006633"&gt;d&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;TAG,&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;Native&amp;nbsp;Sort&amp;nbsp;(Arrays.sort(...)).&amp;nbsp;Sorted&amp;nbsp;in:&amp;nbsp;&amp;quot;&lt;/font&gt;&amp;nbsp;+&amp;nbsp;timeUsedByNativeSort&amp;nbsp;+&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;quot;&amp;nbsp;milliseconds.&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;return&lt;/font&gt;&amp;nbsp;bubbles_array&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;native&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;getExecutionTime&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;native&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;sortBubble&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;array_to_sort&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;,&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;array_length&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;static&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#003399"&gt;System&lt;/font&gt;.&lt;font color="#006633"&gt;loadLibrary&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;quot;bubble-sort&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;/blockquote&gt;Как видно из кода, я ради примера буду сортировать массив методами SDK и через вызов метода NDK. Это чисто синтетический тест из которого не стоит делать никаких выводов, спорить с его результатами и поощрять прочие холивары. Это просто пример. Соответственно, код я тоже пишу не оптимальный, а такой, чтобы было понятно, что оно делает. Но любые комментарии, замечания и пожелания естественно принимаются. Просто не воспринимайте результаты этих сортировок слишком близко к сердцу.&lt;br /&gt;&lt;br /&gt;В Activity нас интересуют следующий строки:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;native&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;getExecutionTime&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;native&lt;/font&gt;&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;sortBubble&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;array_to_sort&lt;font color="#009900"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#93;&lt;/font&gt;,&amp;nbsp;&lt;font color="#006600"&gt;int&lt;/font&gt;&amp;nbsp;array_length&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;static&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#003399"&gt;System&lt;/font&gt;.&lt;font color="#006633"&gt;loadLibrary&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;quot;bubble-sort&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;/blockquote&gt;Это описание нашей еще не написаной native code библиотеки и её методов. Вернемся к документации и вникнем немного в теорию. &lt;br /&gt;Самое главное - все вызовы методов native code будут осуществляться через &lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface"&gt;JNI&lt;/a&gt; и если вы не знакомы с таким словом, то я очень советую почитать, понять, принять и смириться. &lt;br /&gt;Использование JNI приводит нас к следующим фактам:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;вы можете объявлять и реализовывать сколько угодно методов в вашей native code библиотеке;&lt;/li&gt;&lt;li&gt;чтобы дать понять коду на SDK, что вы будете вызывать native code метод, нужно указать ключевое слово &lt;i&gt;native&lt;/i&gt; и далее описание метода (смотри пример выше);&lt;/li&gt;&lt;li&gt;native code библиотека должна быть именована в соответствии с соглашением об именовании UNIX: lib&lt;имя&gt;.so (к примеру, libFileLoader.so);&lt;/li&gt;&lt;li&gt;чтобы подгрузить библиотеку при старте приложения нужно вызвать System.loadLibrary("&lt;имя_библиотеки&gt;"); , причем без указания &lt;i&gt;lib&lt;/i&gt; перед именем и без расширения;&lt;/li&gt;&lt;li&gt;у вас нет возможности получить прямой доступ к объектам Dalvik VM через &lt;b&gt;указатели&lt;/b&gt; (это важно);&lt;/li&gt;&lt;li&gt;вам нужно будет напрямую управлять ссылками на объекты, если вы хотите хранить данные об объектах VM между вызовами методов JNI;&lt;/li&gt;&lt;/ul&gt;Не очень страшно, но неприятно. Будем оптимистами, кто предупрежден - тот вооружен.&lt;br /&gt;&lt;br /&gt;Теперь поговорим о структуре проекта, который использует native code:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;native code должен находится в каталоге &lt;b&gt;&lt;ваш_проект&gt;/jni/...&lt;/b&gt;;&lt;/li&gt;&lt;li&gt;должен присутствовать файл описания процедуры сборки в виде &lt;b&gt;&lt;ваш_проект&gt;/jni/Android.mk&lt;/b&gt; (вернемся к нему);&lt;/li&gt;&lt;li&gt;опционально можно управлять дополнительными правилами сборки библиотеки через &lt;b&gt;&lt;ваш_проект&gt;/jni/Application.mk&lt;/b&gt; (не обязательно, поэтому - в следующий раз);&lt;/li&gt;&lt;li&gt;собирается native code библиотека средствами NDK и только потом собирается .apk файл приложения средствами SDK.&lt;/li&gt;&lt;/ul&gt;К делу, создаем файл &lt;i&gt;&lt;ваш_наш_проект&gt;/jni/&lt;a href="https://github.com/dive/HelloNDK/blob/master/jni/bubble-sort.c"&gt;bubble-sort.c&lt;/a&gt;&lt;/i&gt; и пишем туда:&lt;br /&gt;&lt;blockquote&gt;&lt;font color="#339933"&gt;#include&amp;nbsp;&amp;lt;jni.h&amp;gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#339933"&gt;#include&amp;nbsp;&amp;lt;android/log.h&amp;gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#339933"&gt;#include&amp;nbsp;&amp;lt;time.h&amp;gt;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;jint&amp;nbsp;cpu_time_used&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;jint&amp;nbsp;Java_org_divenvrsk_android_hellondk_HelloNDK_getExecutionTime&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;JNIEnv&lt;font color="#339933"&gt;*&lt;/font&gt;&amp;nbsp;env&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;jobject&amp;nbsp;this&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;return&lt;/font&gt;&amp;nbsp;cpu_time_used&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;int_cmp&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#993333"&gt;const&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;void&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;a&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;const&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;void&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;b&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#993333"&gt;const&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;ia&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#993333"&gt;const&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;a&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#993333"&gt;const&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;ib&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#993333"&gt;const&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;b&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;ia&amp;nbsp;&amp;nbsp;&lt;font color="#339933"&gt;-&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;ib&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;jintArray&amp;nbsp;Java_org_divenvrsk_android_hellondk_HelloNDK_sortBubble&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&amp;nbsp;JNIEnv&lt;font color="#339933"&gt;*&lt;/font&gt;&amp;nbsp;env&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;jobject&amp;nbsp;this&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;jintArray&amp;nbsp;array_to_sort&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;array_size&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__android_log_print&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;ANDROID_LOG_INFO&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;&amp;quot;HelloNDK!&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;&amp;quot;array&amp;nbsp;size&amp;nbsp;=&amp;nbsp;%d&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;array_size&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#993333"&gt;struct&lt;/font&gt;&amp;nbsp;timeval&amp;nbsp;start_time&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;end_time&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jint&amp;nbsp;&lt;font color="#339933"&gt;*&lt;/font&gt;bubbles_array&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#339933"&gt;*&lt;/font&gt;env&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;-&amp;gt;&lt;/font&gt;GetIntArrayElements&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;env&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;array_to_sort&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;start_time&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;NULL&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qsort&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;bubbles_array&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;array_size&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#993333"&gt;sizeof&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#993333"&gt;int&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;int_cmp&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;end_time&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;NULL&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cpu_time_used&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;end_time.&lt;font color="#202020"&gt;tv_usec&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;-&lt;/font&gt;&amp;nbsp;start_time.&lt;font color="#202020"&gt;tv_usec&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__android_log_print&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;ANDROID_LOG_INFO&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;&amp;quot;HelloNDK!&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;&amp;quot;Start&amp;nbsp;=&amp;nbsp;%ld,&amp;nbsp;End&amp;nbsp;=&amp;nbsp;%ld&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;start_time.&lt;font color="#202020"&gt;tv_usec&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;end_time.&lt;font color="#202020"&gt;tv_usec&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__android_log_print&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;ANDROID_LOG_INFO&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;&amp;quot;HelloNDK!&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;&amp;quot;Sorted&amp;nbsp;in:&amp;nbsp;%ld&amp;nbsp;microseconds&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;cpu_time_used&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#339933"&gt;*&lt;/font&gt;env&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;-&amp;gt;&lt;/font&gt;SetIntArrayRegion&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;env&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;array_to_sort&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;array_size&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;bubbles_array&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;return&lt;/font&gt;&amp;nbsp;array_to_sort&lt;font color="#339933"&gt;;&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;/blockquote&gt;По порядку о файле:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;не забывайте об #include &lt;jni.h&gt;;&lt;/li&gt;&lt;li&gt;в этом примере мы будет использовать возможность писать в лог Android'a, да так, чтобы сообщения было видно в LogCat, для этого мы инклюдим &lt;android/log.h&gt;;&lt;/li&gt;&lt;li&gt;что такое &lt;i&gt;jint&lt;/i&gt;? вы забыли прочитать про &lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface#Mapping_types"&gt;JNI Mapping Types&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;что за странности в сигнатуре метода &lt;i&gt;jint Java_org_divenvrsk_android_hellondk_HelloNDK_getExecutionTime(JNIEnv* env, jobject this)&lt;/i&gt;? вы забыли прочитать &lt;a href="http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615"&gt;JNI Resolving Native Method Names&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;не нервничайте, во всем этом действительно не просто разобратся и не ругайтесь, что я тыкаю в документацию, тут Veni, vidi, vici не получится;&lt;/li&gt;&lt;li&gt;надеюсь, прочитали. как вы поняли, типы данных соотносятся по именам (jint -&gt; long), это сделано для того, чтобы вы не мучались и не держали в голове две кучки сущностей, а просто писали;&lt;/li&gt;&lt;li&gt;сигнатура методов для вызова через JNI формируется следующим образом: ключевое слово &lt;i&gt;Java_&lt;/i&gt;, потом полный путь к классу, где будет использоваться метод, потом нижнее подчеркивание _ и собственно имя метода по которому будете к нему обращаться (проще будет сопоставить вызов в нашей Activity и сигнатуру в bubble-sort.c);&lt;/li&gt;&lt;li&gt;в параметры native code метода передаются сначала JNIEnv (JNI interface pointer), потом ссылка на сам объект Java (jobject) и только потом параметры, которые вы будете указывать при вызове метода (TODO: прочитать дважды и посмотреть примеры);&lt;/li&gt;&lt;li&gt;вызов __android_log_print(...) как вы догадались позволяет нам использовать штатное логгирование;&lt;/li&gt;&lt;li&gt;и на этом я остановлюсь, остальное сейчас нам не особо важно.&lt;/li&gt;&lt;/ul&gt;Как не сложно заметить, всё просто и сложно одновременно. Изучите JNI, без этого ничего более сложного, чем этот бесполезный пример у вас не получится. Если остались вопросы - отвечу в комментариях и дополню текст.&lt;br /&gt;&lt;br /&gt;Пришло время написать build script. Создаем файл &lt;i&gt;&lt;ваш_наш_проект&gt;/jni/&lt;a href="https://github.com/dive/HelloNDK/blob/master/jni/Android.mk"&gt;Android.mk&lt;/a&gt;&lt;/i&gt;:&lt;br /&gt;&lt;blockquote&gt;LOCAL_PATH&amp;nbsp;&lt;font color="#339933"&gt;:=&lt;/font&gt;&amp;nbsp;$&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;call&amp;nbsp;my&lt;font color="#339933"&gt;-&lt;/font&gt;dir&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt; &lt;br /&gt;include&amp;nbsp;$&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;CLEAR_VARS&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;LOCAL_MODULE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#339933"&gt;:=&lt;/font&gt;&amp;nbsp;libbubble&lt;font color="#339933"&gt;-&lt;/font&gt;sort &lt;br /&gt;LOCAL_SRC_FILES&amp;nbsp;&lt;font color="#339933"&gt;:=&lt;/font&gt;&amp;nbsp;bubble&lt;font color="#339933"&gt;-&lt;/font&gt;sort.&lt;font color="#202020"&gt;c&lt;/font&gt; &lt;br /&gt;LOCAL_CFLAGS&amp;nbsp;&lt;font color="#339933"&gt;:=&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;-&lt;/font&gt;DANDROID_NDK &lt;br /&gt;LOCAL_LDLIBS&amp;nbsp;&lt;font color="#339933"&gt;:=&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;-&lt;/font&gt;llog &lt;br /&gt;&amp;nbsp; &lt;br /&gt;include&amp;nbsp;$&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;BUILD_SHARED_LIBRARY&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;/blockquote&gt;И разбираемся:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;LOCAL_MODULE - задает имя нашей библиотеке;&lt;/li&gt;&lt;li&gt;LOCAL_SRC_FILES - указывает на файл с исходным кодом;&lt;/li&gt;&lt;li&gt;&lt;i&gt;LOCAL_LDLIBS := -llog&lt;/i&gt; - подключает библиотеку для того, чтобы использовать возможности записи в лог.&lt;/li&gt;&lt;/ol&gt;Так вот, теперь мы &lt;b&gt;запускаем Cygwin&lt;/b&gt;, если мы в Windows (именно Cygwin, а не Command Promt), переходим в каталог с нашим проектом и пытаемся скомпилировать нашу библиотеку:&lt;br /&gt;&lt;pre&gt;$ cd &lt;project&gt;&lt;br /&gt;$ &lt;ndk_dir&gt;/ndk-build&lt;br /&gt;&lt;/pre&gt;и в ответ должны услышать что-нибудь вот такое:&lt;br /&gt;&lt;pre&gt;artyom.loenko@dive /cygdrive/c/Projects/My/HelloNDK&lt;br /&gt;$ ndk-build&lt;br /&gt;Compile thumb  : bubble-sort &lt;= /cygdrive/c/Projects/My/HelloNDK/jni/bubble-sort.c&lt;br /&gt;SharedLibrary  : libbubble-sort.so&lt;br /&gt;Install        : libbubble-sort.so =&gt; /cygdrive/c/Projects/My/HelloNDK/libs/armeabi&lt;br /&gt;&lt;/pre&gt;Наша библиотека готова к использованию. Возвращаемся в IDE и теперь уже собираем проект средствами SDK и пробуем запустить. Мы должны получить вот такое вот приложение:&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_ymDymKKKFj4/TPaSLNiFoAI/AAAAAAAANWw/iBRlBAn5GFo/s800/device.png" align="center" height="561" width="480" /&gt;&lt;br /&gt;Скачать собранный APK файл можно &lt;a href="https://github.com/downloads/dive/HelloNDK/HelloNDK.apk"&gt;вот здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Голопом, понимаю. Но всё не так страшно, как может показатся, а если у вас есть опыт написания приложений на Си или С++, то и вообще будет просто. Главное понять как эта штука работает, не пытайтесь анализировать код, который к NDK отношения не имеет - просто поймите как оно работает и всё у вас получится.&lt;br /&gt;&lt;br /&gt;И немного ссылок:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/dive/HelloNDK"&gt;проект на GitHub&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;Android SDK / NDK&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html"&gt;документация по JNI&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/search/label/NDK"&gt;заметки об NDK в официальном блоге Android&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/android-ndk"&gt;Android NDK Google Group&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com"&gt;Google&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;P.S. Спрашивайте, ругайте, советуйте и не грустите. Зима в этом году хороша, а сегодня и вообще прекрасно в Санкт-Петербурге.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7961024509074374399?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7961024509074374399/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7961024509074374399' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7961024509074374399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7961024509074374399'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/12/android-hello-ndk.html' title='[Android] Hello, NDK!'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ymDymKKKFj4/TPZYJ4QAhjI/AAAAAAAANWk/tI5H075R8UE/s72-c/android_ndk.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-1386663474767599352</id><published>2010-10-19T13:48:00.000+04:00</published><updated>2010-10-19T13:48:29.036+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ IDEA'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android] IntelliJ IDEA 10 Community Edition будет включать в себя Android development plugin</title><content type='html'>&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/TL1nR3SCpCI/AAAAAAAANNU/UXAJetBRKzM/s800/ad9xdxhtb4_11sjkgrmfb_b.png" alt="image" align=left vspace="10dip" hspace="10dip" /&gt;&lt;img src="http://www.jetbrains.com/img/logo.gif" alt="image" align=left  vspace="10dip" hspace="10dip" /&gt;&lt;br /&gt; Сегодня &lt;a href="http://www.jetbrains.com/company/people/Toporov_Eugene.html"&gt;Евгений Топоров&lt;/a&gt; поздравил всех с годовщиной &lt;a href="http://www.jetbrains.com/idea/free_java_ide.html"&gt;IntelliJIDEA Community Edition&lt;/a&gt; в блоге &lt;a href="http://jetbrains.dzone.com/articles/open-source-intellij-idea"&gt;Jetbrains на DZone&lt;/a&gt;, а так же сообщил, что начиная с версии 10 IntelliJIDEA Community Edition будет включать в себя &lt;a href="http://www.jetbrains.com/idea/features/google_android.html"&gt;Android development plugin&lt;/a&gt;.&lt;br /&gt;С чем всех и поздравляю.&lt;br /&gt;Версия IntelliJIDEA под номер 10 находится в стадии Early Access Program и её можно получить &lt;a href="http://confluence.jetbrains.net/display/IDEADEV/IDEA+X+EAP"&gt;вот здесь&lt;/a&gt;. Весьма стабильна, кстати говоря, и буквально пестрит новыми возможностями.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-1386663474767599352?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/1386663474767599352/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=1386663474767599352' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1386663474767599352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1386663474767599352'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/10/android-intellij-idea-10-community.html' title='[Android] IntelliJ IDEA 10 Community Edition будет включать в себя Android development plugin'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/TL1nR3SCpCI/AAAAAAAANNU/UXAJetBRKzM/s72-c/ad9xdxhtb4_11sjkgrmfb_b.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-358805805442070800</id><published>2010-10-11T13:36:00.000+04:00</published><updated>2010-10-11T13:36:32.078+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 10.10'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='чтобы не забыть'/><category scheme='http://www.blogger.com/atom/ns#' term='proxy'/><title type='text'>[Ubuntu 10.10] Proxy for apt &amp;&amp; VirtualBox x11 driver</title><content type='html'>Так вот, чтобы настроить proxy для apt (чтобы использовать apt из коммандной строки), нужно создать файл /etc/apt/apt.conf.d/proxy и туда запихать такие строки:&lt;br /&gt;&lt;pre&gt;Acquire::http::Proxy "http://username@password:your_proxy_url:port";&lt;br /&gt;Acquire::ftp::Proxy "http://username@password:your_proxy_url:port";&lt;br /&gt;Acquire::::Proxy "true";&lt;br /&gt;&lt;/pre&gt;&lt;hr/&gt;А чтобы получить работающий драйвер для X11 в VirtualBox (родной не встает, говорит "не знаю, что еще за версия X11"), нужно выполнить следующие процедуры:&lt;br /&gt;&lt;pre&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install build-essential linux-headers-$(uname -r)&lt;br /&gt;sudo apt-get install virtualbox-ose-guest-x11&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-358805805442070800?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/358805805442070800/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=358805805442070800' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/358805805442070800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/358805805442070800'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/10/ubuntu-1010-proxy-for-apt-virtualbox.html' title='[Ubuntu 10.10] Proxy for apt &amp;&amp; VirtualBox x11 driver'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-792778300442535361</id><published>2010-10-05T12:52:00.000+04:00</published><updated>2010-10-05T12:52:42.524+04:00</updated><title type='text'>Skype now available for Android phones</title><content type='html'>&lt;a href="http://blogs.skype.com/en/2010/10/android.html"&gt;Skype now available for Android phones&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-792778300442535361?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.skype.com/en/2010/10/android.html' title='Skype now available for Android phones'/><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/792778300442535361/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=792778300442535361' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/792778300442535361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/792778300442535361'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/10/skype-now-available-for-android-phones.html' title='Skype now available for Android phones'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8010025700640457839</id><published>2010-09-06T19:02:00.002+04:00</published><updated>2010-09-06T19:02:55.415+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='service'/><category scheme='http://www.blogger.com/atom/ns#' term='services'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android] Сервисы - это просто.</title><content type='html'>Сегодня мы напишем сервис для &lt;a href="http://developer.android.com/index.html"&gt;Android'а&lt;/a&gt;, который будет работать в фоне, срабатывать через определенный интервал времени и автоматически перезапускаться после перезагрузки телефона. Казалось бы ничего сложного в этом нет, но очень много людей сталкиваются с проблемами, когда пытаются разобраться с этими самыми пресловутыми &lt;a title="" href="http://developer.android.com/reference/android/app/Service.html"&gt;Services&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Сначала немного пустых разговоров про сервисы из официальной документации, чтобы дальше стало понятно что, да как.&lt;br /&gt;Сервис - это компонент приложения, который позволяет приложению осуществлять те или иные длящиеся операции без взаимодействия с пользователем напрямую или позволяющий осуществлять взаимодействие с другими приложениями. Каждый сервис должен быть объявлен в AndroidManifest.xml с тегом "&lt;a href="http://developer.android.com/reference/android/R.styleable.html#AndroidManifestService"&gt;service&lt;/a&gt;". Сервисы могут быть запущены командами &lt;a href="http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)"&gt;Context.startService()&lt;/a&gt; и &lt;a href="http://developer.android.com/reference/android/content/Context.html#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int)"&gt;Context.bindService()&lt;/a&gt;.&lt;br /&gt;Обратите внимание, что сервисы, как и другие приложения, запускаются в основном потоке своего хост процесса, который их инициировал. Это значит, что если ваш сервис активно использует ресурсы CPU или блокирующие операции (работа с сетью), то он должен порождать свой собственный поток, в котором и будут осуществляться все "дорогие" операции. Более подробно об это можно прочитать тут &lt;a href="http://developer.android.com/guide/topics/fundamentals.html#procthread"&gt;Application Fundamentals: Processes and Threads&lt;/a&gt; (на английском). Класс &lt;a href="http://developer.android.com/reference/android/app/IntentService.html"&gt;IntentService&lt;/a&gt; доступен в виде стандартной реализации сервиса, который исполняется в своем собственном потоке и работает по заданному расписанию.&lt;br /&gt;Класс Service очень важная часть &lt;a href="http://developer.android.com/guide/topics/fundamentals.html#lcycles"&gt;жизненного цикла приложения&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Большинство проблем с пониманием работы сервисов связано со следующими факторами:&lt;br /&gt;- сервис - это &lt;b&gt;не отдельный процесс&lt;/b&gt;. Сервис не может запустить сам себя; если не указано иное, то сервис запускается в рамках приложения частью которого он является (об этом поговорим чуть позже, особенно важен момент запуска сервиса при загрузке телефона);&lt;br /&gt;- сервис - это &lt;b&gt;не поток&lt;/b&gt; (thread). Это конечно же не значит, что сервис может работать только в основном потоке приложения, он может породить и свой поток (дабы избежать проблем с ошибками Application Not Responding).&lt;br /&gt;&lt;br /&gt;Таким образом, сервис сам по себе очень простой элемент, который поможет вам делать две вещи:&lt;br /&gt;- сообщить системе, что приложение желает совершать какие-либо операции в фоновом режиме (даже тогда, когда пользователь не взаимодействует с приложением напрямую. т.е. не тыкает шаловливыми пальчиками по экрану). Данное желание соотносится с вызовом метода Context.startService(), который попросит систему запланировать работу сервиса и зарегистрировать его в системе, чтобы в дальнейшем этот сервис можно было вызвать по таймеру или напрямую, а также чтобы можно было этот сервис остановить.&lt;br /&gt;- сообщить системе, что приложение желает предоставить доступ другим приложениям к своим данным или методам (т.е. организовать взаимодействие между приложениями, подобно тому, как можно получать данные из адресной книги Android непосредственно в ваше приложение). За это отвечает метод Context.bindService(), который позволяет системе зарегистрировать сервис для доступа к данными вашего приложения или к вызовам его методов.&lt;br /&gt;&lt;br /&gt;После того, как вы запускаете сервис, всё что делает система, так это вызывает метод &lt;a href="http://developer.android.com/reference/android/app/Service.html#onCreate()"&gt;onCreate()&lt;/a&gt; вашего сервиса. Так что вам самому нужно озаботиться такими вещами как создание отдельного потока для длительных операций, подготовка данных и другими.&lt;br /&gt;Запомните, сам по себе сервис - это очень простая структура и только вам решать насколько сложна будет его логика: от банальных вызовов методов сервиса, до предоставления удаленных интерфейсов доступа с использованием AIDL.&lt;br /&gt;&lt;br /&gt;Есть две причины, по которым система может запустить сервис. Если кто-то вызовет метод Context.startService(), то система запросит у приложения сервис (создаст его и вызовет метод onCreate(), если это необходимо) и потом выполнит &lt;a href="http://developer.android.com/reference/android/app/Service.html#onStartCommand(android.content.Intent,%20int,%20int)"&gt;onStartCommand(Intent, int, int)&lt;/a&gt; с аргументами, которые указаны в сервисе. Такой сервис будет работать до тех пор, пока не будет вызван метод &lt;a href="http://developer.android.com/reference/android/content/Context.html#stopService(android.content.Intent)"&gt;Context.stopService()&lt;/a&gt; или &lt;a href="http://developer.android.com/reference/android/app/Service.html#stopSelf()"&gt;stopSelf()&lt;/a&gt;. Так же запомните, что множественные вызовы Context.startService() не будут создавать несколько экземпляров сервиса.&lt;br /&gt;Для запущенных сервисов предусмотрено два основных режима в которых они могут быть запущены: &lt;a href="http://developer.android.com/reference/android/app/Service.html#START_STICKY"&gt;START_STICKY&lt;/a&gt; используется для сервисов, которые явно запускаются и останавливаются, а &lt;a href="http://developer.android.com/reference/android/app/Service.html#START_NOT_STICKY"&gt;START_NOT_STICKY&lt;/a&gt; или &lt;a href="http://developer.android.com/reference/android/app/Service.html#START_REDELIVER_INTENT"&gt;START_REDELIVER_INTENT&lt;/a&gt; используются для сервисов, которые обрабатывают какие-либо команды посланные им. &lt;br /&gt;&lt;br /&gt;Клиенты так же могут использовать метод Context.bindService(), чтобы получить доступ к сервису. После вызова Context.bindService() так же создается сервис (вызов onCreate()), но метод onStartCommand() не вызывается. Вместо этого, клиент получает объект &lt;a href="http://developer.android.com/reference/android/os/IBinder.html"&gt;IBinder&lt;/a&gt;, который ему возвращает сервис из метода &lt;a href="http://developer.android.com/reference/android/app/Service.html#onBind(android.content.Intent)"&gt;onBind(Intent)&lt;/a&gt;, через который и осуществляется взаимодействие с сервисом. Сервис будет работать ровно столько времени, сколько клиент будет удерживать соединение через IBinder и сервис будет остановлен, когда клиент уничтожит объект.&lt;br /&gt;&lt;br /&gt;Один и тот же сервис можно запустить одновременно обоими путями. В таком случае, система будет держать сервис запущенным до того момента, пока его явно не остановят и пока не будут уничтожены все соединения с сервисом через флаг &lt;a href="http://developer.android.com/reference/android/content/Context.html#BIND_AUTO_CREATE"&gt;Context.BIND_AUTO_CREATE&lt;/a&gt;. Когда же условия будут выполнены, система вызовет метод сервиса &lt;a href="http://developer.android.com/reference/android/app/Service.html#onDestroy()"&gt;onDestroy()&lt;/a&gt;. Так что все действия по остановке дополнительных потоков, по остановке регистраций ресиверов и другие, должны быть выполнены именно в методе onDestroy().&lt;br /&gt;&lt;br /&gt;Как то так всё выглядит. Надеюсь понятно. В нашем случае, мы будет писать сервис, которые непосредственно контролируется пользователем (т.е. явно запускается и останавливается). У нас будет просто интерфейс по запуску и остановке сервиса, а так же Toast всплывающие уведомления о том, что сервис работает.&lt;br /&gt;&lt;br /&gt;Начнем с интерфейса (я работаю в &lt;a href="http://www.jetbrains.com/idea/"&gt;IntellijIdea&lt;/a&gt;, если кому интересно).&lt;br /&gt;Создадим проект ServiceExample в вашей любимой IDE, автоматически генерировать никакие Activities не будет, чтобы потом помойку не разгребать (это я про Eclipse). Создадим файл ServiceActivity.java со следующим содержимым (я не привожу классы целиком, ниже дам ссылку на весь и проект и на отдельные классы (&lt;b&gt;под каждым исходным кодом есть ссылка на оригинальный файл на Github&lt;/b&gt;)):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;...&lt;br /&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; ServiceActivity extends Activity &lt;font color="#0000ff"&gt;implements&lt;/font&gt; View.OnClickListener {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Button buttonStart, buttonStop;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; void onCreate(Bundle savedInstanceState) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonStart = (Button) findViewById(R.id.buttonStart);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonStop = (Button) findViewById(R.id.buttonStop);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonStart.setOnClickListener(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonStop.setOnClickListener(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; void onClick(View view) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (view.getId()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;case&lt;/font&gt; R.id.buttonStart:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(this.getClass().getName(), &lt;font color="#A31515"&gt;"onClick: Starting service."&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startService(&lt;font color="#0000ff"&gt;new&lt;/font&gt; Intent(this, ServiceExample.&lt;font color="#0000ff"&gt;class&lt;/font&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;case&lt;/font&gt; R.id.buttonStop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(this.getClass().getName(), &lt;font color="#A31515"&gt;"onClick: Stopping service."&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stopService(&lt;font color="#0000ff"&gt;new&lt;/font&gt; Intent(this, ServiceExample.&lt;font color="#0000ff"&gt;class&lt;/font&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;[&lt;a href="http://github.com/dive/ServiceExample/blob/master/src/org/divenvrsk/examples/service/ServiceActivity.java"&gt;ServiceActivity.java&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Тут должно быть всё понятно, в методе onCreate(...) мы устанавливает &lt;i&gt;ContentView&lt;/i&gt; на наш &lt;i&gt;Layout&lt;/i&gt; (который чуть ниже этого абзаца тоже показан), связываем два объекта &lt;i&gt;Button&lt;/i&gt; с объектами на &lt;i&gt;Layout&lt;/i&gt; и устанавливает обработчиком событий нажатия на кнопки наш же класс, для этого наш класс &lt;i&gt;ServiceActivity implements View.OnClickListener&lt;/i&gt;. Затем в методе onClick(...) обрабатываем события, находим на какую из кнопок пользователь нажал и вызываем соответствующий метод нашего сервиса, который мы и пишем.&lt;br /&gt;Собственно, &lt;i&gt;Layout&lt;/i&gt; (который должен быть сохранен в файл ./res/layout/main.xml):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;&amp;#60;?&lt;/font&gt;&lt;font color="#800000"&gt;xml&lt;/font&gt; &lt;font color="#ff0000"&gt;version&lt;/font&gt;&lt;font color="#0000ff"&gt;="1.0"&lt;/font&gt; &lt;font color="#ff0000"&gt;encoding&lt;/font&gt;&lt;font color="#0000ff"&gt;="utf-8"&lt;/font&gt;?&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;LinearLayout&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;xmlns:android&lt;/font&gt;&lt;font color="#0000ff"&gt;="http://schemas.android.com/apk/res/android"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:orientation&lt;/font&gt;&lt;font color="#0000ff"&gt;="vertical"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_width&lt;/font&gt;&lt;font color="#0000ff"&gt;="fill_parent"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_height&lt;/font&gt;&lt;font color="#0000ff"&gt;="fill_parent"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:gravity&lt;/font&gt;&lt;font color="#0000ff"&gt;="center"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;TextView&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_width&lt;/font&gt;&lt;font color="#0000ff"&gt;="fill_parent"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_height&lt;/font&gt;&lt;font color="#0000ff"&gt;="wrap_content"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:text&lt;/font&gt;&lt;font color="#0000ff"&gt;="Service demo"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:gravity&lt;/font&gt;&lt;font color="#0000ff"&gt;="center"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:textSize&lt;/font&gt;&lt;font color="#0000ff"&gt;="20sp"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:padding&lt;/font&gt;&lt;font color="#0000ff"&gt;="20dp"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;Button&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_width&lt;/font&gt;&lt;font color="#0000ff"&gt;="fill_parent"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_height&lt;/font&gt;&lt;font color="#0000ff"&gt;="wrap_content"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:id&lt;/font&gt;&lt;font color="#0000ff"&gt;="@+id/buttonStart"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:text&lt;/font&gt;&lt;font color="#0000ff"&gt;="Start service"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;Button&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;Button&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_width&lt;/font&gt;&lt;font color="#0000ff"&gt;="fill_parent"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:layout_height&lt;/font&gt;&lt;font color="#0000ff"&gt;="wrap_content"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:text&lt;/font&gt;&lt;font color="#0000ff"&gt;="Stop service"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:id&lt;/font&gt;&lt;font color="#0000ff"&gt;="@+id/buttonStop"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;Button&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;LinearLayout&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;[&lt;a href="http://github.com/dive/ServiceExample/blob/master/res/layout/main.xml"&gt;main.xml&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Теперь создаем класс ServiceExample:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; ServiceExample extends Service {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; final &lt;font color="#0000ff"&gt;int&lt;/font&gt; INTERVAL = 10000; &lt;font color="#008000"&gt;// 10 sec&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; final &lt;font color="#0000ff"&gt;int&lt;/font&gt; FIRST_RUN = 5000; &lt;font color="#008000"&gt;// 5 seconds&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt; REQUEST_CODE = 11223344;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;AlarmManager alarmManager;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; onCreate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onCreate();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startService();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"onCreate(..)"&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; IBinder onBind(Intent intent) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"onBind(..)"&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#0000ff"&gt;null&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; onDestroy() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (alarmManager != &lt;font color="#0000ff"&gt;null&lt;/font&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent intent = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Intent(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, RepeatingAlarmService.&lt;font color="#0000ff"&gt;class&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alarmManager.cancel(PendingIntent.getBroadcast(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, REQUEST_CODE, intent, 0));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toast.makeText(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, &lt;font color="#A31515"&gt;"Service Stopped!"&lt;/font&gt;, Toast.LENGTH_LONG).show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"Service onDestroy(). Stop AlarmManager at "&lt;/font&gt; + &lt;font color="#0000ff"&gt;new&lt;/font&gt; java.sql.Timestamp(System.currentTimeMillis()).toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; startService() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent intent = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Intent(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, RepeatingAlarmService.&lt;font color="#0000ff"&gt;class&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PendingIntent pendingIntent = PendingIntent.getBroadcast(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, REQUEST_CODE, intent, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alarmManager.setRepeating(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AlarmManager.ELAPSED_REALTIME_WAKEUP,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SystemClock.elapsedRealtime() + FIRST_RUN,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERVAL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pendingIntent);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toast.makeText(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, &lt;font color="#A31515"&gt;"Service Started."&lt;/font&gt;, Toast.LENGTH_LONG).show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"AlarmManger started at "&lt;/font&gt; + &lt;font color="#0000ff"&gt;new&lt;/font&gt; java.sql.Timestamp(System.currentTimeMillis()).toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;[&lt;a href="http://github.com/dive/ServiceExample/blob/master/src/org/divenvrsk/examples/service/ServiceExample.java"&gt;ServiceExample.java&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Тут все несколько сложнее, как я рассказывал выше, система будет вызывать метод onCreate(...) нашего сервиса, так что мы в этот метод помещаем вызов нашего метода &lt;b&gt;startService()&lt;/b&gt;;, который и будет проводить дополнительную работу с целью работы сервиса и его вызова с определенным интервалом. Немного подробностей метода &lt;b&gt;startService()&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#008000"&gt;// создаем объект Intent, в качестве параметра передает ему класс RepeatingAlarmService (допишем чуть позже)&lt;/font&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// этот класс отвечает за обработку событий и будет вызываться по нашему таймеру.&lt;/font&gt;&lt;br /&gt;Intent intent = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Intent(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, RepeatingAlarmService.&lt;font color="#0000ff"&gt;class&lt;/font&gt;);&lt;br /&gt;&lt;font color="#008000"&gt;// REQUEST_CODE - простой набор цифр, параметр остался, но от его использования отказались в новых версиях SDK&lt;/font&gt;&lt;br /&gt;PendingIntent pendingIntent = PendingIntent.getBroadcast(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, REQUEST_CODE, intent, 0);&lt;br /&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// создаем AlarmManager&lt;/font&gt;&lt;br /&gt;alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);&lt;br /&gt;&lt;font color="#008000"&gt;// устанавливаем параметры AlarmManager:&lt;/font&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// AlarmManager.ELAPSED_REALTIME_WAKEUP - значит, что время мы используем системное;&lt;/font&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// SystemClock.elapsedRealtime() + FIRST_RUN - второй параметр отвечает за время, когда будет запущен AlarmManager;&lt;/font&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// INTERVAL - отвечает за интервал между вызовами AlarmManager&lt;/font&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// и последним параметром передаем наш Intent, который собственно и будет вызываться по расписанию.&lt;/font&gt;&lt;br /&gt;alarmManager.setRepeating(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AlarmManager.ELAPSED_REALTIME_WAKEUP,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SystemClock.elapsedRealtime() + FIRST_RUN,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERVAL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pendingIntent);&lt;br /&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// выводим сообщение на экран, что сервис запущен&lt;/font&gt;&lt;br /&gt;Toast.makeText(&lt;font color="#0000ff"&gt;this&lt;/font&gt;, &lt;font color="#A31515"&gt;"Service Started."&lt;/font&gt;, Toast.LENGTH_LONG).show();&lt;br /&gt;&lt;font color="#008000"&gt;// пишем в лог&lt;/font&gt;&lt;br /&gt;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"AlarmManger started at "&lt;/font&gt; + &lt;font color="#0000ff"&gt;new&lt;/font&gt; java.sql.Timestamp(System.currentTimeMillis()).toString());&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;Многие пытаются тут использовать &lt;i&gt;Timer&lt;/i&gt;, а не &lt;i&gt;AlarmManager&lt;/i&gt;. Но тут есть проблема: &lt;i&gt;Timer&lt;/i&gt; не будит сервис, если телефон находится в режиме ожидания, а вот &lt;i&gt;AlarmManager&lt;/i&gt; будит и в режиме ожидания.&lt;br /&gt;&lt;br /&gt;Теперь собственно &lt;b&gt;RepeatingAlarmService.java&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; RepeatingAlarmService extends BroadcastReceiver {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; onReceive(Context context, Intent intent) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toast.makeText(context, &lt;font color="#A31515"&gt;"It's Service Time!"&lt;/font&gt;, Toast.LENGTH_LONG).show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"Timed alarm onReceive() started at time: "&lt;/font&gt; + &lt;font color="#0000ff"&gt;new&lt;/font&gt; java.sql.Timestamp(System.currentTimeMillis()).toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;[&lt;a href="http://github.com/dive/ServiceExample/blob/master/src/org/divenvrsk/examples/service/RepeatingAlarmService.java"&gt;RepeatingAlarmService.java&lt;/a&gt;]&lt;br /&gt;Тут все предельно просто, наш класс &lt;b&gt;RepeatingAlarmService&lt;/b&gt; расширяет &lt;i&gt;BroadcastReceiver&lt;/i&gt;, о чем мы сообщим позже системе в &lt;b&gt;манифесте&lt;/b&gt;. Реализуем метод onReceive(...), в котором просто выводим тоаст на экран с текстом "It's Service Time!" и пишем в лог о том, что метод был вызван.&lt;br /&gt;&lt;br /&gt;Теперь создадим класс &lt;b&gt;OnBootReceiver.java&lt;/b&gt;, который будет отвечать за то, чтобы сервис запускался после перезагрузки телефона:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; OnBootReceiver extends BroadcastReceiver {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; onReceive(Context context, Intent intent) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#A31515"&gt;"android.intent.action.BOOT_COMPLETED"&lt;/font&gt;.equals(intent.getAction())) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent serviceLauncher = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Intent(context, ServiceExample.&lt;font color="#0000ff"&gt;class&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.startService(serviceLauncher);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.v(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.getClass().getName(), &lt;font color="#A31515"&gt;"Service loaded while device boot."&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;[&lt;a href="http://github.com/dive/ServiceExample/blob/master/src/org/divenvrsk/examples/service/OnBootReceiver.java"&gt;OnBootReceiver.java&lt;/a&gt;]&lt;br /&gt;Опять же расширяем &lt;i&gt;BroadcastReceiver&lt;/i&gt;, перегружаем метод onReceive(...), внутри метода проверяем (на всякий случай), что мы получили событие &lt;i&gt;android.intent.action.BOOT_COMPLETED&lt;/i&gt; и если это так, то запускаем наш сервис.&lt;br /&gt;&lt;br /&gt;С программированием закончили, теперь очередь манифеста (&lt;b&gt;AndroidManifest.xml&lt;/b&gt;):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;&amp;#60;?&lt;/font&gt;&lt;font color="#800000"&gt;xml&lt;/font&gt; &lt;font color="#ff0000"&gt;version&lt;/font&gt;&lt;font color="#0000ff"&gt;="1.0"&lt;/font&gt; &lt;font color="#ff0000"&gt;encoding&lt;/font&gt;&lt;font color="#0000ff"&gt;="utf-8"&lt;/font&gt;?&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;manifest&lt;/font&gt; &lt;font color="#ff0000"&gt;xmlns:android&lt;/font&gt;&lt;font color="#0000ff"&gt;="http://schemas.android.com/apk/res/android"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;package&lt;/font&gt;&lt;font color="#0000ff"&gt;="org.divenvrsk.examples.service"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;android:versionCode&lt;/font&gt;&lt;font color="#0000ff"&gt;="1"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:versionName&lt;/font&gt;&lt;font color="#0000ff"&gt;="1.0"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;application&lt;/font&gt; &lt;font color="#ff0000"&gt;android:icon&lt;/font&gt;&lt;font color="#0000ff"&gt;="@drawable/icon"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:label&lt;/font&gt;&lt;font color="#0000ff"&gt;="ServiceExample"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;activity&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;=".ServiceActivity"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:label&lt;/font&gt;&lt;font color="#0000ff"&gt;="Service Example"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;intent-filter&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;action&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;="android.intent.action.MAIN"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;category&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;="android.intent.category.LAUNCHER"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;intent-filter&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;activity&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;receiver&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;=".RepeatingAlarmService"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:process&lt;/font&gt;&lt;font color="#0000ff"&gt;=":remote"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;receiver&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;=".OnBootReceiver"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:enabled&lt;/font&gt;&lt;font color="#0000ff"&gt;="true"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:exported&lt;/font&gt;&lt;font color="#0000ff"&gt;="false"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;intent-filter&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;action&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;="android.intent.action.BOOT_COMPLETED"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;intent-filter&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;receiver&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;service&lt;/font&gt; &lt;font color="#ff0000"&gt;android:enabled&lt;/font&gt;&lt;font color="#0000ff"&gt;="true"&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;=".ServiceExample"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;application&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;uses-sdk&lt;/font&gt; &lt;font color="#ff0000"&gt;android:minSdkVersion&lt;/font&gt;&lt;font color="#0000ff"&gt;="3"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;#60;&lt;/font&gt;&lt;font color="#800000"&gt;uses-permission&lt;/font&gt; &lt;font color="#ff0000"&gt;android:name&lt;/font&gt;&lt;font color="#0000ff"&gt;="android.permission.RECEIVE_BOOT_COMPLETED"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;#62;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#60;/&lt;/font&gt;&lt;font color="#800000"&gt;manifest&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#62;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;[&lt;a href="http://github.com/dive/ServiceExample/blob/master/AndroidManifest.xml"&gt;AndroidManifest.xml&lt;/a&gt;]&lt;br /&gt;Итак, в манифесте мы определяем &lt;i&gt;Activity&lt;/i&gt;, это наш класс &lt;b&gt;ServiceActivity&lt;/b&gt;. Устанавливаем два ресивера, один на &lt;b&gt;RepeatingAlarmService&lt;/b&gt;, который будет вызываться &lt;i&gt;AlarmManager&lt;/i&gt; (указываем, что вызывать будет &lt;u&gt;remote&lt;/u&gt; процесс, так как вызов будет осуществляться сервисом) и второй на &lt;b&gt;OnBootReceiver&lt;/b&gt;, который будет срабатывать при загрузке телефона (для этого ставим &lt;u&gt;intent-filter&lt;/u&gt; на &lt;i&gt;android.intent.action.BOOT_COMPLETED&lt;/i&gt;).&lt;br /&gt;Потом объявляем наш сервис, чтобы система могла понять кого звать к телефону и в конце говорим, что нужно разрешением на доступ к &lt;i&gt;android.permission.RECEIVE_BOOT_COMPLETED&lt;/i&gt;, чтобы наш ресивер получил сигнал о том, что загрузка телефона завершена.&lt;br /&gt;&lt;br /&gt;Итого, мы получим работоспособный каркас сервиса, который можно запускать и останавливать. После того, как вы запустите приложение, вы увидите вот такой вот экран:&lt;br /&gt;&lt;br /&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/TIT_e3SPuSI/AAAAAAAANHM/e5lw8cDc39Y/s400/device.png" /&gt;&lt;br /&gt;Вы можете запустить сервис и остановить его. Если вы запустите сервис, то он продолжит работать и после того, как вы выйдите из приложения и каждые 10 секунд будет выводить на экран надпись "It's Service Time". В том, что сервис работает так же можно убедиться, если зайти в Settings -&gt; Applications -&gt; Running services, там в списке будет ServiceExample:&lt;br /&gt;&lt;br /&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/TIUAr3DzaCI/AAAAAAAANHY/eZfOWYd9wQQ/s400/device.png" /&gt;&lt;br /&gt;&lt;br /&gt;Полностью проект можно взять на &lt;a href="http://github.com/dive/ServiceExample"&gt;Github&lt;/a&gt;. &lt;br /&gt;Или вот так:&lt;br /&gt;&lt;pre&gt;git://github.com/dive/ServiceExample.git&lt;br /&gt;&lt;/pre&gt;Скачать APK можно &lt;a href="http://github.com/downloads/dive/ServiceExample/ServiceExample.apk"&gt;тут&lt;/a&gt;.&lt;br /&gt;Удачных вам сервисов.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8010025700640457839?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8010025700640457839/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8010025700640457839' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8010025700640457839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8010025700640457839'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/09/android.html' title='[Android] Сервисы - это просто.'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/TIT_e3SPuSI/AAAAAAAANHM/e5lw8cDc39Y/s72-c/device.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-211339889057793405</id><published>2010-08-12T16:44:00.000+04:00</published><updated>2010-08-12T16:44:08.331+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='и диоды'/><title type='text'></title><content type='html'>Тут одному чуваку не спалось и он в проекте на пару десятков тысяч строк кода на Java сменил тип переменной с класса Integer на примитивный тип int. Безобидно конечно, если бы только не пестрящие в коде:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if (x == null || y == null || str == null || b == null || bb == null || l == null || ll == null || check == null || sf_check == null) {...}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ну и всё отвалилось на &lt;br /&gt;&lt;code&gt;incomparable types: int and nulltype&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;На резонный вопрос "какого хрена?" прозвучало фаулеровское и гордое "рефакторинг ведь!".&lt;br /&gt;Ребзики, но нельзя же так. 21 век на дворе, хочется вам проверить миллион переменных на null - проверяйте, только не надо этих двухкилометровых if'ов. Перечитали исходников Microsoft SDK?&lt;br /&gt;Понятно, что строгая типизация, но примитивные типы же.&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;class&lt;/span&gt; IsNull &lt;span style='color:#800080; '&gt;{&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;static&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; main&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;String&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt; args&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        CheckClass check &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;new&lt;/span&gt; CheckClass&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        check&lt;span style='color:#808030; '&gt;.&lt;/span&gt;run&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;    &lt;br /&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;class&lt;/span&gt; CheckClass &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#bb7977; '&gt;int&lt;/span&gt; x&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#bb7977; font-weight:bold; '&gt;Integer&lt;/span&gt; y&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#bb7977; font-weight:bold; '&gt;String&lt;/span&gt; str&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#bb7977; '&gt;boolean&lt;/span&gt; b&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    Boolean bb&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#bb7977; '&gt;long&lt;/span&gt; l&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#bb7977; font-weight:bold; '&gt;Long&lt;/span&gt; ll&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    CheckClass check&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;static&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;final&lt;/span&gt; CheckClass sf_check &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;new&lt;/span&gt; CheckClass&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; run&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#696969; '&gt;// if (x == null || y == null || str == null || b == null || bb == null || l == null || ll == null || check == null || sf_check == null) {}&lt;/span&gt;&lt;br /&gt;        isNullWithInfo&lt;span style='color:#808030; '&gt;(&lt;/span&gt;x&lt;span style='color:#808030; '&gt;,&lt;/span&gt; y&lt;span style='color:#808030; '&gt;,&lt;/span&gt; str&lt;span style='color:#808030; '&gt;,&lt;/span&gt; b&lt;span style='color:#808030; '&gt;,&lt;/span&gt; bb&lt;span style='color:#808030; '&gt;,&lt;/span&gt; l&lt;span style='color:#808030; '&gt;,&lt;/span&gt; ll&lt;span style='color:#808030; '&gt;,&lt;/span&gt; check&lt;span style='color:#808030; '&gt;,&lt;/span&gt; sf_check&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        isNull&lt;span style='color:#808030; '&gt;(&lt;/span&gt;x&lt;span style='color:#808030; '&gt;,&lt;/span&gt; y&lt;span style='color:#808030; '&gt;,&lt;/span&gt; str&lt;span style='color:#808030; '&gt;,&lt;/span&gt; b&lt;span style='color:#808030; '&gt;,&lt;/span&gt; bb&lt;span style='color:#808030; '&gt;,&lt;/span&gt; l&lt;span style='color:#808030; '&gt;,&lt;/span&gt; ll&lt;span style='color:#808030; '&gt;,&lt;/span&gt; check&lt;span style='color:#808030; '&gt;,&lt;/span&gt; sf_check&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#bb7977; '&gt;boolean&lt;/span&gt; isNullWithInfo&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;Object&lt;/span&gt; &lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt; objects&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\n&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;isNullWithInfo:"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;    &lt;br /&gt;            &lt;br /&gt;        &lt;span style='color:#bb7977; '&gt;boolean&lt;/span&gt; result &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;false&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;Object&lt;/span&gt; object &lt;span style='color:#808030; '&gt;:&lt;/span&gt; objects&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\t&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;object &lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;null&lt;/span&gt; &lt;span style='color:#808030; '&gt;?&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"unknown type = null"&lt;/span&gt; &lt;span style='color:#808030; '&gt;:&lt;/span&gt; object&lt;span style='color:#808030; '&gt;.&lt;/span&gt;getClass&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;" = not null, value = "&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; object&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;!&lt;/span&gt;result &lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt; object &lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;null&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;                result &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;true&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; result&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#bb7977; '&gt;boolean&lt;/span&gt; isNull&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;Object&lt;/span&gt; &lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt; objects&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\n&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;isNull:"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;Object&lt;/span&gt; object &lt;span style='color:#808030; '&gt;:&lt;/span&gt; objects&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\t&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;object &lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;null&lt;/span&gt; &lt;span style='color:#808030; '&gt;?&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"unknown type = null"&lt;/span&gt; &lt;span style='color:#808030; '&gt;:&lt;/span&gt; object&lt;span style='color:#808030; '&gt;.&lt;/span&gt;getClass&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;" = not null, value = "&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; object&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;object &lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;null&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\t&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;Finished. Have null value."&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;true&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;false&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-211339889057793405?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/211339889057793405/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=211339889057793405' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/211339889057793405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/211339889057793405'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/08/java-integer-int.html' title=''/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7831150965945240218</id><published>2010-06-04T23:12:00.000+04:00</published><updated>2010-06-04T23:12:43.218+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='всякая фигня'/><title type='text'>coffee cup. идеально.</title><content type='html'>&lt;a href="http://picasaweb.google.com/lh/photo/xX5dG3q9T0sjaOPepOtYPw?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/TAlP-962iOI/AAAAAAAAMwY/ZxM6ndelZX0/s800/coffeecup2.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7831150965945240218?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7831150965945240218/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7831150965945240218' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7831150965945240218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7831150965945240218'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/06/coffee-cup.html' title='coffee cup. идеально.'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/TAlP-962iOI/AAAAAAAAMwY/ZxM6ndelZX0/s72-c/coffeecup2.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-6801895950373787664</id><published>2010-06-04T22:20:00.000+04:00</published><updated>2010-06-04T22:20:17.262+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='всякая фигня'/><title type='text'>[всякая фигня]</title><content type='html'>кладбище запорожцев&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/XbXSJsbHIhT2KqhbszxU9w?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/TAlCJNYU3wI/AAAAAAAAMvk/UEvpF8xN83c/s400/IMG_20100604_204055.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/divenvrsk/DropBox?feat=embedwebsite"&gt;Drop Box&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;котэ в неволе&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/iuLNtlG3qpkJnArYiujpcQ?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/TAlChqV2bCI/AAAAAAAAMv4/i7E2HGzFbTY/s400/IMG_20100531_155922.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/divenvrsk/DropBox?feat=embedwebsite"&gt;Drop Box&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;близнецы&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/r2loSR7D9kTSjhUg83034w?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/TAlCzuLnQLI/AAAAAAAAMwI/SsJ1G5RF3kI/s400/2010-05-22%2016.16.21.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/divenvrsk/DropBox?feat=embedwebsite"&gt;Drop Box&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-6801895950373787664?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/6801895950373787664/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=6801895950373787664' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6801895950373787664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6801895950373787664'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/06/blog-post.html' title='[всякая фигня]'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ymDymKKKFj4/TAlCJNYU3wI/AAAAAAAAMvk/UEvpF8xN83c/s72-c/IMG_20100604_204055.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-4525081626294506601</id><published>2010-05-26T15:19:00.000+04:00</published><updated>2010-05-26T15:19:20.659+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='jit'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>[Android] Dalvik JIT</title><content type='html'>[это перевод &lt;a href="http://android-developers.blogspot.com/2010/05/dalvik-jit.html"&gt;вот этой&lt;/a&gt; статьи]&lt;br /&gt;&lt;img align="left" hspace="10px" vspace="5px" src="http://lh4.ggpht.com/_ymDymKKKFj4/S_z-xV5iFFI/AAAAAAAAMuU/gQHH3vDWmcc/s800/df-dalvik.png" /&gt;Как технический руководитель команды Dalvik в рамках проекта Android, я провел много времени работая над виртуальной машиной (VM) и основными библиотеками классов, которые работают на системном уровне приложений для Android. Этот слой в основном невидим для конечных пользователей, но сделан он качественно и с умом, это помогает устройствам на Android работать стабильно, быстро и иметь весьма отзывчивый интерфейс, плюс ко всему, это повышает производительность разработчиков.&lt;br /&gt;&lt;habracut /&gt;&lt;br /&gt;Релиз Android в версии 2.2 особенно приятен для меня, так как это первый релиз с версии 1.0, в котором мы смогли внести существенно новые технологии в работу виртуальной машины (VM). И в отличие от многих других разработчиков, то, что делаем я и моя команда, может ощутить непосредственно конечный пользователь.&lt;br /&gt;&lt;br /&gt;"Dalvik" является не совсем привычным словом (по крайней мере в моей стране), и большинство людей не имеют понятия о виртуальной машине, до той поры, как непосредственно не столкнется с принципами работы Android, но если вы скажете, что смогли значительно улучшить работу устройства, максимально оптимизировать использование батареи - тогда они на самом деле обратят внимание на ваш труд!&lt;br /&gt;&lt;br /&gt;Благодаря чему мы этого добились?&lt;br /&gt;&lt;br /&gt;Мы добавил компилятор Just In Time (JIT) в Dalvik VM. JIT это программный компонент, который берет код приложения, анализирует его и активно переводит его в такую форму псевдокода, которая работает быстрее, при этом происходит это в то время, как приложение продолжает работать. Если вы хотите узнать больше о дизайне Dalvik JIT, пожалуйста, посмотрите отличную презентацию, представленную на Google I/O 2010 моими коллегами Билли Базби и Беном Ченгом, которая должна быть размещена на YouTube в ближайшее время.&lt;br /&gt;&lt;br /&gt;(прим. переводчика: вот часть из презентации по поводу Dalvik JIT (начинает на девятой минуте, вот ссылка на нужный &lt;a href="http://www.youtube.com/watch?v=IY3U2GXhz44&amp;cc=1#t=542s"&gt;фрагмент&lt;/a&gt;), более подробный доклад будет позже)&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IY3U2GXhz44&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/IY3U2GXhz44&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Чтобы было ясно, эти изменения не критичны, и они не применяются единообразно ко всем приложениям. Код, который ранее полностью загружал процессор, теперь может сделать гораздо больше за то же самое количество времени, а код, который написан с учетом ограничения используемых ресурсов, теперь используют меньше времени и менее нагружает процессор (соответственно, используя меньше заряда аккумулятора). В тестах производительности, в частности, мы видели, реальные улучшения от 2x до 5и раз для кода, которые полностью нагружал CPU (в сравнению с предыдущей версией Dalvik VM). Это приблизительно эквивалентно от 4х до 10ти кратному увеличению производительности в сравнении с традиционной реализацией интерпретатора.&lt;br /&gt;&lt;br /&gt;Команда Android гордится нашим новым JIT в целом, но мы особенно гордимся двумя его аспектами:&lt;br /&gt;&lt;br /&gt;Многие предыдущие реализации JIT медленно реагируют, обеспечивая повышение производительности только после продолжительного периода разогрева (долгий старт). В некоторых случаях, разные реализации JIT могут тратить от нескольких минут или даже часов до того момента, пока код не заработает максимально производительно. В нашем же случае, Dalvik JIT реагирует очень быстро, так что сразу после запуска вашей любимой игры, вы уже извлекаете пользу от работы нашей версии JIT.&lt;br /&gt;&lt;br /&gt;Мы также очень довольны тем, как мало памяти использует JIT. Код JIT занимает примерно 100Кб, и каждый процесс, который выполняется в JIT, как правило, использует еще 100Кб RAM или около того. На нынешнем поколение телефонов Android, пользователи устройства даже не замечают этого дополнительного расхода памяти; на моем собственном телефоне, я могу хранить буквально десятки приложений в памяти, готовыми к работе.&lt;br /&gt;&lt;br /&gt;Команда Dalvik не особо почивает на лаврах. Мы надеемся увидеть Dalvik JIT установленным на многих устройствах в ближайшие месяцы. Заглядывая вперед, у команды есть бесконечный список идей для улучшения VM и библиотечного кода, над чем мы сейчас усердно работаем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-4525081626294506601?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/4525081626294506601/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=4525081626294506601' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/4525081626294506601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/4525081626294506601'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/05/android-dalvik-jit.html' title='[Android] Dalvik JIT'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ymDymKKKFj4/S_z-xV5iFFI/AAAAAAAAMuU/gQHH3vDWmcc/s72-c/df-dalvik.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7283386587883094515</id><published>2010-04-23T15:36:00.000+04:00</published><updated>2010-04-23T15:36:43.337+04:00</updated><title type='text'>iPhone OS 4 Multitasking Fast App Switching Animation</title><content type='html'>&lt;object style="background-image:url(http://i2.ytimg.com/vi/m2pyfERqMjE/hqdefault.jpg)"  width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/m2pyfERqMjE&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/m2pyfERqMjE&amp;amp;hl=en_US&amp;amp;fs=1" width="480" height="295" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7283386587883094515?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7283386587883094515/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7283386587883094515' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7283386587883094515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7283386587883094515'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/04/iphone-os-4-multitasking-fast-app.html' title='iPhone OS 4 Multitasking Fast App Switching Animation'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7978717580756190069</id><published>2010-04-22T15:29:00.001+04:00</published><updated>2010-04-22T15:30:52.801+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sun'/><category scheme='http://www.blogger.com/atom/ns#' term='nasa'/><title type='text'>папарацци NASA и Солнце</title><content type='html'>NASA недавно запустила Solar Dynamics Observatory (SDO) и вот получены первые изображения, которые подтвердили беспрецедентные возможности по изучению Солнца с помощью SDO. Такие снимки активности Солнца еще никому и никогда не удавалось получить.&lt;br /&gt;&lt;br /&gt;"Эти изображения показывают активность Солнца настолько детально, что я не видел подобных изображений за все 40 лет, которые я занимаюсь своими исследованиями", сказал Ричард Фишер (директор отдела геофизики в штаб-квартире НАСА Вашингтон).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nasa.gov/images/content/446589main_fulldiskmulticolor-orig_full.jpg"&gt;&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/S9AyspBYPCI/AAAAAAAAMq4/6QKE3c7VZF4/s800/446667main1_sdo-fulldisk-670.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Подробности на сайте &lt;a href="http://www.nasa.gov/mission_pages/sdo/news/first-light.html"&gt;NASA&lt;/a&gt;.&lt;br /&gt;Вот и &lt;a href="http://hab.kp.ru/daily/24478.4/635563/"&gt;на русском языке новость&lt;/a&gt;, аккуратнее только, ибо "комсомольская правда".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7978717580756190069?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7978717580756190069/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7978717580756190069' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7978717580756190069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7978717580756190069'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/04/nasa.html' title='папарацци NASA и Солнце'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/S9AyspBYPCI/AAAAAAAAMq4/6QKE3c7VZF4/s72-c/446667main1_sdo-fulldisk-670.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-3392041986925239369</id><published>2010-04-22T15:11:00.000+04:00</published><updated>2010-04-22T15:11:47.461+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>App Engine SDK 1.3.3 Released</title><content type='html'>&lt;img align="left" vspace="10px" hspace="10px" src="http://code.google.com/appengine/images/appengine_lowres.gif"&gt;&lt;br /&gt;Вышла минорная версия Google App Engine SDK 1.3.3. В основном, исправлены ошибки.&lt;br /&gt;Из разумных новостей в новой версии, стоит упомянуть разве что экспериментальную поддержку &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt; в Python SDK. Что, по мнению разработчиков, должно увеличить производительность при работе с dev_appserver с локальными данными, когда вы проводите тестирование на большом объеме данных. Т.е. это вовсе не значит, что в App Engine SDK добавлена поддержка SQL. А жаль.&lt;br /&gt;&lt;br /&gt;Полный список изменения для &lt;a href="http://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes"&gt;Java&lt;/a&gt; и &lt;a href="http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes"&gt;Python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://googleappengine.blogspot.com/2010/04/app-engine-sdk-133-released.html"&gt;Тут&lt;/a&gt; официальное заявление.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-3392041986925239369?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/3392041986925239369/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=3392041986925239369' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3392041986925239369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3392041986925239369'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/04/app-engine-sdk-133-released.html' title='App Engine SDK 1.3.3 Released'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2741352264019767572</id><published>2010-04-22T15:03:00.001+04:00</published><updated>2010-08-24T20:33:39.849+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>Graph API от Facebook</title><content type='html'>Facebook свернул свой Connect и представил новое Graph API для разработчиков. Человеческая и продуманная система ID для элементов, удобочитаемые и легкие ответы сервера в формате JSON.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;{&lt;br /&gt;   "name": "Facebook Platform",&lt;br /&gt;   "type": "page",&lt;br /&gt;   "website": "http://developers.facebook.com",&lt;br /&gt;   "username": "platform",&lt;br /&gt;   "founded": "May 2007",&lt;br /&gt;   "company_overview": "Facebook Platform enables anyone to build...",&lt;br /&gt;   "mission": "To make the web more open and social.",&lt;br /&gt;   "products": "Facebook Application Programming Interface (API)...",&lt;br /&gt;   "fan_count": 449921,&lt;br /&gt;   "id": 19292868552,&lt;br /&gt;   "category": "Technology"&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Теперь авторизация происходит посредством &lt;a href="http://github.com/theRazorBlade/draft-ietf-oauth/raw/master/draft-ietf-oauth.txt"&gt;OAuth 2.0&lt;/a&gt;, что очень даже хорошо. Упоминания о том, сколько будет сохраняться работоспособность предыдущего метода авторизации, отсутствуют. Но всем разработчикам очень рекомендуют использовать новое API.&lt;br /&gt;В общем, мне нравится. К примеру, чтобы отправить сообщение на стену, достаточно выполнить вот такой вот простой HTTP Post:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;curl -F 'access_token=...' \&lt;br /&gt;     -F 'body=Hello, Arjun. I like this new API.' \&lt;br /&gt;     https://graph.facebook.com/arjun/feed&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Подробности &lt;a href="http://developers.facebook.com/docs/api"&gt;тут&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2741352264019767572?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2741352264019767572/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2741352264019767572' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2741352264019767572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2741352264019767572'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/04/graph-api-facebook.html' title='Graph API от Facebook'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-1091252577606783315</id><published>2010-04-22T14:54:00.000+04:00</published><updated>2010-04-22T14:54:02.447+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='steam'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Steam for Mac</title><content type='html'>Дождались. Появилась &lt;a href="http://www.macstories.net/news/exclusive-first-screenshots-of-steam-for-mac/"&gt;более подробная информация&lt;/a&gt; о Steam для Маков.&lt;br /&gt;Жду, надеюсь, верю. Человеческая система доставки контента должна заменить все эти нынешние ухищрения. В порыве радости, пойду напишу очередное письмо в Apple по поводу iTunes и России.&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CKPxl5qdYhU&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CKPxl5qdYhU&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;саундтрек радует.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-1091252577606783315?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/1091252577606783315/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=1091252577606783315' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1091252577606783315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1091252577606783315'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/04/steam-for-mac.html' title='Steam for Mac'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-652546853854677938</id><published>2010-04-21T15:02:00.000+04:00</published><updated>2010-04-21T15:02:23.901+04:00</updated><title type='text'>Hmmm... Which mode?</title><content type='html'>&lt;img align="center" src="http://s75125.gridserver.com/sites/default/files/WTD953.gif" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-652546853854677938?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://s75125.gridserver.com/sites/default/files/WTD953.gif' title='Hmmm... Which mode?'/><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/652546853854677938/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=652546853854677938' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/652546853854677938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/652546853854677938'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/04/hmmm-which-mode.html' title='Hmmm... Which mode?'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7987274637827315237</id><published>2010-03-28T01:43:00.000+03:00</published><updated>2010-03-28T01:43:50.322+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='habrahabr'/><title type='text'>[бес]полезной статистики пост</title><content type='html'>Немного визуализировал данные, которые собрал с сайта Хабрахабр. Как-нибудь еще и проанализирую.&lt;br /&gt;&lt;a href="http://habrahabr.ru/blogs/statistics/89153/"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S65wUgAaCNI/AAAAAAAAMmM/R2BEDeVENjE/s800/chart-3.png" /&gt;&lt;/a&gt;&lt;br /&gt;картинка кликабельная на весь пост.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7987274637827315237?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7987274637827315237/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7987274637827315237' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7987274637827315237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7987274637827315237'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/blog-post_28.html' title='[бес]полезной статистики пост'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/S65wUgAaCNI/AAAAAAAAMmM/R2BEDeVENjE/s72-c/chart-3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7723547415528232069</id><published>2010-03-25T20:53:00.000+03:00</published><updated>2010-03-25T20:53:50.747+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portraits'/><category scheme='http://www.blogger.com/atom/ns#' term='thom yorke'/><title type='text'>Typography Portraits: Thom Yorke</title><content type='html'>&lt;a href="http://www.smashinglists.com/25-stunning-typography-portraits-of-celebrities/"&gt;&lt;img src="http://lh5.ggpht.com/_ymDymKKKFj4/S6uipLNRW9I/AAAAAAAAMlE/-MBeaNhHDq0/s800/Thom-Yorke-Typography-Portrait-472x600.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote align="center"&gt;остальные по клику на картинку&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7723547415528232069?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7723547415528232069/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7723547415528232069' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7723547415528232069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7723547415528232069'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/typography-portraits-thom-yorke.html' title='Typography Portraits: Thom Yorke'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ymDymKKKFj4/S6uipLNRW9I/AAAAAAAAMlE/-MBeaNhHDq0/s72-c/Thom-Yorke-Typography-Portrait-472x600.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8777432468308185356</id><published>2010-03-25T01:09:00.000+03:00</published><updated>2010-03-25T01:09:27.708+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='иллюзии'/><title type='text'>Оптические иллюзии - мозг видит то, что он ожидает увидеть</title><content type='html'>Еще один пример того, как мозг заполняет недостающие пробелы воображением. Если вы &lt;a href="http://www.wired.com/wiredscience/2009/04/schizoillusion/#Replay"&gt;не один из людей, страдающих от шизофрении&lt;/a&gt;, то вы не сможете заставить ваш мозг заново увидеть полую часть маски.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QbKw0_v2clo&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QbKw0_v2clo&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8777432468308185356?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8777432468308185356/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8777432468308185356' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8777432468308185356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8777432468308185356'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/blog-post_25.html' title='Оптические иллюзии - мозг видит то, что он ожидает увидеть'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-3982269683607432492</id><published>2010-03-23T12:23:00.000+03:00</published><updated>2010-03-23T12:23:54.722+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ IDEA'/><category scheme='http://www.blogger.com/atom/ns#' term='community edition'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>IntelliJ IDEA Editions Comparison</title><content type='html'>Я обрадовался очень, когда узнал, что у &lt;a href="http://www.jetbrains.com/idea/index.html"&gt;IntelliJ IDEA&lt;/a&gt; появилась версия &lt;a href="http://www.jetbrains.com/idea/free_java_ide.html"&gt;Community Edition&lt;/a&gt;. Бесплатная. Open Source. Apache 2.0 license. Скачал конечно же. После чего упростил их табличку &lt;a href="http://www.jetbrains.com/idea/features/editions_comparison_matrix.html"&gt;IntelliJ IDEA Editions Comparison&lt;/a&gt;:&lt;br /&gt;&lt;img align="vcenter" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6iCxmIhb0I/AAAAAAAAMjk/f-66lZVLnZ0/s800/Screen-shot-2010-03-23-at-11.54.19-AM.png" /&gt;&lt;br /&gt;&lt;br /&gt;Я, что естественно, отдельный индивид, поэтому это мое личное мнение. И оно таково: посмотрел я на свои проекты и начал думать, как мне эту Community Edition использовать:&lt;br /&gt; - Android -&gt; вольно, боец!;&lt;br /&gt; - Ruby -&gt; и тут не угадал;&lt;br /&gt; - HTML, XHTML, CSS -&gt; даже и не ожидал такого подвоха;&lt;br /&gt; - JavaScript -&gt; не удивительно после предыдущего пункта;&lt;br /&gt; - GWT, Spring, JSP, etc. -&gt; ну уж это точно интепрайз, куда мне с бесплатной то версией.&lt;br /&gt;&lt;br /&gt;Я всё понимаю, бесплатное, радоваться, хвалить. Меня так просто не сломишь. И пошел я искать информацию о том, как плагины писать. Нашел &lt;a href="http://www.jetbrains.com/idea/documentation/howto_03.html"&gt;тут&lt;/a&gt; и &lt;a href="http://confluence.jetbrains.net/display/IDEADEV/PluginDevelopment"&gt;тут&lt;/a&gt;. Подумаешь, что для версии 5.1 и дальше, подумаешь, что &lt;a href="http://confluence.jetbrains.net/display/IDEADEV/API+changes+in+IntelliJ+IDEA+9+%28Maia%29"&gt;API changes&lt;/a&gt; не охватывает всех изменений, подумаешь, что по Open API документации не особо. Не привыкать.&lt;br /&gt;Настроил всё, почитал, метод проб и ошибок никогда меня не подводил. Когда чуть разобрался, задумался: написать к примеру Android плагин, более-менее вменяемый, самый простой, займет 2-3 месяца (не очень с документацией, да). Хм. За потраченное время я уж точно заработаю больше чем $249, которые стоит версия Ultimate. А ведь это только плагин для Android...&lt;br /&gt;Пошел к умным дядькам в рассылку и их мнение оказалось точным отражением моего: купи и работай.&lt;br /&gt;А раз уж и умные дядьки не хотят писать еще раз то, что уже написано (DRTW, DRY, все дела), то надежды мои рухнули окончательно.&lt;br /&gt;В общем, я не понимаю такой политики. Те, кто могут эти плагины писать, писать их не хотят, ибо они _уже написаны_ и работают. Те, кто не может купить IDE, писать эти плагины не могут. Да и вообще, кто в здравом уме будет писать _заново_ уже имеющиеся плагины?&lt;br /&gt;&lt;br /&gt;Объясните мне, дураку, в чем подвох?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-3982269683607432492?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/3982269683607432492/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=3982269683607432492' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3982269683607432492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3982269683607432492'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/intellij-idea-editions-comparison.html' title='IntelliJ IDEA Editions Comparison'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ymDymKKKFj4/S6iCxmIhb0I/AAAAAAAAMjk/f-66lZVLnZ0/s72-c/Screen-shot-2010-03-23-at-11.54.19-AM.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7142821098841981971</id><published>2010-03-21T22:36:00.000+03:00</published><updated>2010-03-21T22:36:37.981+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='wget'/><title type='text'>GNU Wget &amp; Mac OS X</title><content type='html'>&lt;img align="left" hspace="15px" vspace="15px" src="http://www.gnu.org/graphics/heckert_gnu.small.png"/&gt;&lt;br /&gt;Постоянно забываю, что в стандартной поставке Mac OS X отсутствует &lt;a href="http://www.gnu.org/software/wget/"&gt;GNU Wget&lt;/a&gt;, а так как всякие package-manager'ы я не очень люблю, то собрал себе простой инсталятор GNU Wget текущей версии 1.12. Всё что он делает, так это просто копирует собранный под Mac OS X Wget в каталог /usr/local/bin, а там уж пользуйтесь на здоровье. Только Terminal.app перезапустите.&lt;br /&gt;Собственно, инсталятор можно скачать &lt;a href="http://divenvrsk.org/downloads/GNU%20Wget%201.12.pkg"&gt;отсюда&lt;/a&gt; (180Кб).&lt;br /&gt;&lt;br /&gt;Для любителей собирать руками, вот алгоритм действий (должен быть установлен XCode):&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#696969; '&gt;# скачиваем последнюю версию&lt;/span&gt;&lt;br /&gt;curl -C - &lt;span style='color:#44aadd; '&gt;-O&lt;/span&gt; http&lt;span style='color:#808030; '&gt;:&lt;/span&gt;&lt;span style='color:#40015a; '&gt;/&lt;/span&gt;&lt;span style='color:#40015a; '&gt;/ftp&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;gnu&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;&lt;span style='color:#40015a; '&gt;org/gnu/wget/wget&lt;/span&gt;-latest&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;tar&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;gz&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;# распаковываем&lt;/span&gt;&lt;br /&gt;tar xzfv wget-latest&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;tar&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;gz&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;# переходим в каталог, куда распаковали (версия может меняться)&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;cd&lt;/span&gt; wget-&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;&lt;span style='color:#008c00; '&gt;12&lt;/span&gt;&lt;span style='color:#40015a; '&gt;/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;# проверяет зависимости и конфигурацию (нужен XCode)&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;.&lt;/span&gt;&lt;span style='color:#40015a; '&gt;/configure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;# компилируем&lt;/span&gt;&lt;br /&gt;make&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;# инсталируем (по умолчанию, в /usr/local/bin, есть в PATH)&lt;/span&gt;&lt;br /&gt;sudo make install&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7142821098841981971?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7142821098841981971/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7142821098841981971' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7142821098841981971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7142821098841981971'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/gnu-wget-mac-os-x.html' title='GNU Wget &amp; Mac OS X'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5475673658228616658</id><published>2010-03-20T00:28:00.000+03:00</published><updated>2010-03-20T00:28:31.078+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='часы'/><category scheme='http://www.blogger.com/atom/ns#' term='технологии'/><category scheme='http://www.blogger.com/atom/ns#' term='дизайн'/><category scheme='http://www.blogger.com/atom/ns#' term='хочу'/><title type='text'>30 удивительных часов</title><content type='html'>[это &lt;a href="http://www.smashinglists.com/30-amazing-watches-youd-love-to-own/"&gt;перевод&lt;/a&gt;]&lt;br /&gt;&lt;a href="http://www.devicedaily.com/gadgets/the-thumbnail-watch.html"&gt;&lt;img align="center"  src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcRNBsHyI/AAAAAAAAMbw/iPgvdjcewgo/s800/thumbnail-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;1. миниатюрные часы Timex&lt;/h4&gt;Эти часы все еще на стадии разработки, но это самые технологичные часы, которые вы только могли себе представить. Удивительный дизайн заново открывает наше представление о часах. Концепт разработан в ходе конкурса дизайнеров, организованного Timex для поиска новых идеи для будущих проектов. Nail Watch (часы с ноготок), как они называются, позволяют узнать время с помощью беглого взгляда по вашей руке. Функционально предусмотрены следующие режимы: калькулятор, дата, календарь и т.д., а также будет возможно выбрать цвет. Эти часы пожалуй будут самыми стильными часами и все известные компании обронят слезу, если этот концепт таки попадает на рынок.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;2. наручные часы Tiwe OLED&lt;/h4&gt;&lt;a href="http://nexus404.com/Blog/2007/11/25/tiwe-oled-wrist-watch-concept-shake-the-watch-to-form-the-time-from-chaos/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcLe8tUII/AAAAAAAAMaY/f2ZkbgeuhM4/s800/iwe-OLED-Wrist-Watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Наручные часы Tiwe OLED работают по принципу отображения ряда точек, которые располагаются в совершенно случайном порядке ровно до того момента, пока вы не потрясете часы или пока не коснетесь экрана, - в этот момент OLED точки быстро соберутся из хаотического порядка в форму представления времени, а после того, как время будет показано, точки опять заживут своей хаотичной жизнью. Let’s Shake the Watch to Form the Time from Chaos.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;3. Seiko (часы с Bluetooth)&lt;/h4&gt;&lt;a href="http://www.slashphone.com/106/3799.html"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S6PcP8MO_XI/AAAAAAAAMbY/jZJ2guO9sB8/s800/seiko-bluetooth_watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Эти часы Seiko показывают не только время, но и уведомляют вас о телефонных звонах или текстовых сообщениях с вашего телефона используя технологию Bluetooth. Они также отображают уровень заряда батареи и уровень сигнала сети. SII (Seiko Instruments) в Японии сделала прототип своих bluetooth часов для пользователей мобильных телефонов.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;4. двоичные часы&lt;/h4&gt;&lt;a href="http://www.iwantoneofthose.com/binary-watch/index.html"&gt;&lt;img align="center"  src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcHVbjXoI/AAAAAAAAMZg/jtvcipfXbHc/s800/binary-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Если вы хотите стать абсолютным компьютерным гиком, то эти часы должны обязательно попасть в ваше поле зрения. Но сначала нужно выучить двоичную систему исчисления, если вы еще с ней не знакомы, потому что иначе вы просто не сможете узнать время.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;5. часы Storm Circuit&lt;/h4&gt;&lt;a href="http://technabob.com/blog/2007/10/02/storm-circuit-modern-led-watch-has-retro-spirit/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcQdk_e-I/AAAAAAAAMbg/ppqp5SA4Qhg/s800/storm-mk2-circuit-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Часы Circuit используют пару окольцованных светодиодных сегментов для представления время. Столбик слева показывает текущий час, а столбик справа разбит на два раздела, один из которых отображает десяток минут, а другой показывает отдельные минуты.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;6. AoTimeFlexa&lt;/h4&gt;&lt;a href="http://www.yankodesign.com/2006/02/28/timeflex-stick-on-watch-by-igor-solovyov-maria-solovyova/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcGevrbbI/AAAAAAAAMZQ/DUZk25PEx8U/s800/aotimeflexa.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Это самоклеющиеся часы, которые могут быть прикреплены практически к чему угодно, начиная с руки и заканчивая вашей курткой. AoTimeFlexa основаны на технологии гибкого дисплея и их можно сгибать и сворачивать, как бумагу. Они также снабжены сенсорным экраном, поэтому не имеют каких-либо физических кнопок. Будучи очень тонкими и небольшими, они могут быть использованы в любой ситуации.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;7. часы Abacus Hands Free Ball&lt;/h4&gt;&lt;a href="http://www.kenmarwatches.com/abacus/861049/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcGAIaKII/AAAAAAAAMZI/KAzwaO6U8D8/s800/abacus-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Наручные часы не могут быть более минималистичны, чем часы Abacus Hands Free Ball Watch , которые используют металлический шар для отображения времени, а так же используют скрытый магнит. Это часы не для тех, кто не может жить не зная точного времени, но они идеально подходят тем, кто ищет стильные часы, которые больше подчеркивают стиль, нежели позволять вам установить точное текущее время.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;8. часы Equilibrium Wrist&lt;/h4&gt;&lt;a href="http://nexus404.com/Blog/2007/10/18/equilibrium-wrist-watch-inspired-by-aircraft-instrumentation/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcH1slBHI/AAAAAAAAMZo/UihpByu5_CQ/s800/Equilibrium-Wrist-Watch_B7ECDFA5.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Вдохновленные пилотажно-навигационным оборудованием, в частности датчиком искусственного горизонта на самолете, часы Equilibrium Wrist Watch являются настоящим аналогом датчика и разработаны Daniel Will-Harris, который предлагает "чувство перспективы во все смены горизонта".&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;9. жидкие часы&lt;/h4&gt;&lt;a href="http://www.inewidea.com/2009/11/26/12777.html"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S6PcL0TiZFI/AAAAAAAAMag/9Zsf_-tEuGU/s800/liquid-408x600.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;У этих часов есть два названия: "Жидкое время" и "Из ниоткуда в никуда". Жидкие часы используют два ЖК-экрана, которые были специально созданы для этого концепта.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;10. часы Nixie&lt;/h4&gt;&lt;a href="http://www.cathodecorner.com/nixiewatch/index.html"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcN9z57aI/AAAAAAAAMa4/_1RL2a9LsHA/s800/nixie-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Эти часы выглядят так, как будто разработаны специально для научных гиков, потому что они показывают время с помощью газоразрядных индикаторов. Для тех, кто не знает, что такое газоразрядные индикаторы: они использовались еще в 1969 году в калькуляторах и причудливых неоновых дисплеях. Эти часы требует лишь взмаха руки для отображения текущего часа, минуты и секунд. В качестве преимущества можно указать на то, что часы ударо и водостойкие.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;11. часы Matrix M6001 LCD&lt;/h4&gt;&lt;a href="http://nexus404.com/Blog/2008/01/11/matrix-m6001-series-neo-retro-lcd-wrist-watch-offers-classic-abstraction/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcNMYk4OI/AAAAAAAAMaw/ogHamVkb5gc/s800/matrix-m6001-lcd-wrist-watch-t10.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Восхитительные ретро ЖК наручные часы Matrix M6001 LCD хранят в себе частичку прошлого совмещая его с современными технологиями, чего поверьте очено нелегко добиться. Созданные одновременно простыми и гламурными, часы Matrix M6001 LCD являются работающим ретро шедевром, вне всякого сомнения.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;12. часовая сфера Giovannoni&lt;/h4&gt;&lt;a href="http://gizmodo.com/gadgets/gadgets/giovannoni-timesphere-alarm-clock-178758.php"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcIsrtTQI/AAAAAAAAMZ4/rlbD32NU0Yg/s800/g4.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;При цене в $150, часовая сфера Giovannoni - это отличный будильник, а помимо этого она способна проецировать время практически на любую поверхность. Находясь на базе для зарядки, беспроводной шар заряжается путем индукции и когда он будет полностью заряжен, вы сможете разместить его где угодно, именно в том месте, где требуются часы. Шар может проецировать время на стену или на любую другую поверхность.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;13. наручные часы ON AIR&lt;/h4&gt;&lt;a href="http://www.behance.net/Gallery/ON-AIR-Wrist-Watch/188767"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S6PcPE5Jy7I/AAAAAAAAMbI/RFlr_wEiEIA/s800/ON-AIR-Wrist-Watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;ON AIR - это наручные часы, которые показывают время в чрезвычайно минималистической манере. Светодиодный индикатор показывает текущую минуту и в тоже время указывает на текущий час. Дисплей так же используется для настройки и как фонарик. Если вы нажмете на экран один раз, он загорается ярким светом. Чтобы установить время вам всего лишь нужно нажать в центре дисплея в течении 5 секунд, теперь вы сможете установить время.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;14. часы Fossil Starck&lt;/h4&gt;&lt;a href="http://www.amazon.com/dp/B001934YFO/ref=nosim/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcIKKaGII/AAAAAAAAMZw/g1-4Sn0fMbw/s800/Fossil-Starck-Watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Эти электронные стильные часы отображают время с помощью уникального дизайна. В кольцах дисплея, часы отображаются в виде чисел, а минуты отображаются в сегментах. Эти сегменты описывают полный круг каждый час.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;15. часы Zihotch&lt;/h4&gt;&lt;a href="http://fake.topaz.ne.jp/images/zihotch.avi"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcU4LjbiI/AAAAAAAAMco/czjZuFZt6pg/s800/zihotch-watch.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;Эти часы настолько странно выглядят, что вы, вероятно, не захотите носить их с собой, если вы конечно не японец. Эти часы выглядит как старый телефон и вам необходимо набрать "117", чтобы услышать время на японском языке.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;16. The ORB - часы Time Orbit&lt;/h4&gt;&lt;a href="http://www.behance.net/Gallery/ORB-Bracelet-Watch/88527"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcPQkid5I/AAAAAAAAMbQ/z3lXGF_NW4k/s800/orb.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Идея этих часов заключена в классическом пластиковом браслете, в который добавили линии, показывающие текущее время. Эти три линии вращаются вокруг браслета и показывают время, а секундная линия вращается все время. Первая линия - час, минута - за второй линией и третья для секунд и три различных цвета для каждой. Эта простая концепция очень привлекательна и притягивает к себе взгляды. The ORB продаются в двух цветовых гаммах: черная и белая. Настроить часы легко с помощью сенсорного экрана, все, что вам нужно сделать, это прикоснуться к линии, зажать значок настройки и перетянуть текущую линию на правильное время.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;17. Horological Machine No. 2&lt;/h4&gt;&lt;a href="http://gizmodo.com/319801/horological-machine-no2-brings-steampunk-to-your-wrist-bankruptcy-to-your-life"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcKYUSI0I/AAAAAAAAMaI/UeIwwxvuW78/s800/Horological-Machine-No.-2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Эти элитные часы, созданные на основе Horological Machine No. 2, уникальны в первую очередь тем, что большая часть их корпуса изготовлена из сапфирового стекла, закрепленного на титановой пластине нарочито заметными болтами. Толщина стекла равна 3,6 мм. Благодаря прозрачному корпусу можно наблюдать за работой часового механизма, который усложнен тем, что в часах используются сразу два циферблата: один из них отображает время, а второй дату.&lt;br /&gt;HM2 - это бог часов. Впрочем, кого это волнует? Они просто потрясающие! Это безупречная красота стоит $59000.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;18. часы с телефоном и фотокамерой&lt;/h4&gt;&lt;a href="http://www.tecnocino.it/s/cellulari/page/195/"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S6PcQm3fuGI/AAAAAAAAMbo/WqNyDR5aEvI/s800/Telson%E2%80%99s-TWC-1150.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Telson’s TWC 1150 являются первыми часами в мире с камерой. Они поддерживают карты RUIM, которые можно использовать в GSM телефонах для международного роуминга. Другие функции: цветной ЖК дисплей 256 цветов, подключаемый модуль камеры, инфракрасные беспроводные наушники, громкая связь, секундомер и планировщик дел.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;19. часы Ultra-Violet&lt;/h4&gt;&lt;a href="http://gadgets.fosfor.se/ultra-violet-by-infinity/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcSTltkwI/AAAAAAAAMcI/ZqL5-mdcDj0/s800/Ultra-Violet-Watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Часы Infinity Optics Ultra-Violet выглядят, как оптическая иллюзия. Хромированный корпус, ремень из натуральной кожи. Зеркальное стекло. Конструкция часов состоит из нескольких зеркал. Стрелки часов покрыты люминофором. При нажатии на кнопку, свет внутренней ультрафиолетовой лампы, освещая стрелки и подсвечивая зеркала, демонстрирует оптический эффект бесконечности.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;20. часы Luna Crystal&lt;/h4&gt;&lt;a href="http://www.bornrich.org/entry/luna-crystal-watch-by-john-pszeniczny/"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S6PcMrSvZeI/AAAAAAAAMao/2Ik-IwNLwe0/s800/luna-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Время волшебным образом плавает внутри этих часов. Часы сделанные с применением кристаллов, нержавеющей стали и спессартитовых гранатов, создают иллюзию хрустального шара. Их слабое свечение, как тайный ключ к волшебному миру, часы Luna Crystal находят идеальный баланс между функциональностью и эстетикой, что делает их просто идеальным модным аксессуаром.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;21. высокотехнологичные военные наручные часы&lt;/h4&gt;&lt;a href="http://www.therawfeed.com/2006/02/dick-tracy-video-wristwatch-developed.html"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcTuBonVI/AAAAAAAAMcY/2dwjAiaRjQc/s800/v-rambo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Tadiran Communications разработала новые коммуникационные видео технологии, которые обеспечивает отображение на 3-дюймовов ЖК-дисплее, в режиме реального времени, снимков, которые сделанных с вертолетов. Эти наручные часы позволяют солдату видеть всё происходящее на поле боя прямо на дисплее, с частотой 30 кадров в секунду. За $50000 вы получите приемник, передатчик и батареи.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;22. часы Issey Miyake OVO&lt;/h4&gt;&lt;a href="http://nexus404.com/Blog/2007/05/26/issey-miyake-ovo-designer-minimalist-wrist-watch/"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcK-aMDDI/AAAAAAAAMaQ/SsdMz-MbDt4/s800/issey-miyake-ovo-designer-minimalist-wrist-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Что мы можем сказать о совершенно замечательных наручных часах Issey Miyake OVO? Они смотрятся крайне модернистско, OVO видимому, являются одними из (если не самыми) наиболее яркими наручными часами из тех, с которыми мы постоянно сталкиваемся или с которыми можем столкнуться. Просто шедевр японского мастера.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;23. часы Tokyo Flash Twelve 5-9 Q&lt;/h4&gt;&lt;a href="http://www.tokyoflash.com/en/watches/twelve5-9/qversion/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S6PcR7LtFII/AAAAAAAAMcA/CMx1xEP_894/s800/Tokyo-Flash-Twelve-5-9-Q-Watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Как и предыдущие модели от Twelve 5-9, данная модель отображает только время, но весьма в оригинальной манере. Первый луч (по часовой стрелке от воображаемой цифры 12) показывает часы от одного до шести, второй луч - часы от семи до двенадцати, третий - десятки минут, четвертый - минуты от одной до пяти, пятый луч - минуты от шести до девяти. Корпус часов выполнен из качественной стали с покрытием под "нержавейку".&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;24. часы Azimuth SP-1 Mecanique&lt;/h4&gt;&lt;a href="http://www.azimuthwatch.com/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcHMOq3sI/AAAAAAAAMZY/EJIP7rFQChs/s800/Azimuth-SP-1-Mecanique.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Концепт часов Azimuth SP-1 Mecanique. Прозвище "часы - космический корабль", эти перспективные часы являются авантюрной помесью смелости, футуристического дизайна и прогрессивных технических технологий. Эти так называемые "часы - космический корабль" отображают вид Земли из космоса, который перемещается каждые шестьдесят секунд.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;25. часы OLED Linux&lt;/h4&gt;&lt;a href="http://www.research.ibm.com/WearableComputing/linuxwatch/oledwatch/oledwatch.html"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcObCiUwI/AAAAAAAAMbA/Hu8DRY0BCoY/s800/oledwatch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Созданные совместными усилиями IBM и eMagin, эти часы OLED Linux обогнали свое время. Они имеют ряд функций КПК (адресная книга, планировщик, просмотр изображений и т.д.) и включают в себя монохромный дисплей VGA 640 х 480 пикселей.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;26. часы URWERK UR-202 AlTiN&lt;/h4&gt;&lt;a href="http://www.urwerk.com/watches_202_AlTiN.asp"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcTHknwfI/AAAAAAAAMcQ/_j2_NHzKoaw/s800/urwerk-ur-202-altin-full1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Компания Urwerk смогла создать невероятно сложный часовой механизм. Оборудованные миниатюрными турбинами-компрессорами воздуха, часы обладают автоподзаводом и снабжены телескопическими стрелками. Во-первых, забудьте о привычных стрелках. Часы UR-202 оборудованы тремя вращающимися кубическими модулями на конгломерате. Время определяется по арабским числам 0-14, 15-44 и 45-60 на гранях вращающихся кубов. Минуты определяются по показаниям выдвигающейся телескопической стрелки, точность которой составляет 1/1000 мм. Новаторский механизм символизирует футуристичное будущее наручных часов, которое каждый часовщик видит по-своему.&lt;br /&gt;Во-вторых, не забивайте голову мыслями о том, что утром часы нужно подзавести. Многочисленные индикаторы UR-202 с обоих сторон корпуса сами вовремя оповестят Вас о том, сколько осталось запаса энергии. Более того, если Вас ненароком заперли в темном чулане, часы с фирменной подсветкой SuperLumiNova в любую секунду оповестят не только о времени суток, но и о фазе луны. Наверное, в зависимости от этого некоторые мужчины способны строить свои планы на вечер, ведь менструальный календарь многих женщин строится именно на лунных фазах.&lt;br /&gt;В-третьих, привычный пружинный часовой механизм дополнен работой… воздуха. Да, крохотные турбины на обратной стороне циферблата самостоятельно подзаводят гаджет с помощью мельчайших потоков воздуха, а также смягчают ход работы роторного механизма благодаря отлаженной работе микрокомпрессоров в корпусе. Это позволяет значительно увеличить запас хода часов и сделать его более точным. Механизм надежно скрыт в титановом корпусе под прочным сапфировым стеклом. Для состоятельных гиков предусмотрены красно-золотой, бело-золотой, черно-платиновый или титановый корпуса. Есть из чего выбрать!&lt;br /&gt;Из минусов можно отметить отсутствие элементарного будильника, а также необходимость раз в три года менять масло. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;27. часы ZeroPointZero&lt;/h4&gt;&lt;a href="http://berumendesign.com/2007/02/zeropointzero/"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcUd1CrrI/AAAAAAAAMcg/1Qd5Mgoxk3k/s800/ZeroPointZero-Watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Этот необычный прототип часов в виде наручников разработал дизайнер Луис Беруман. Трудно сказать, на кого они рассчитаны больше – на фетишистов или просто тех, кто любит выделиться, а может на тех, кого вдохновляет тюремная тематика.. Тем не менее, такие часы имеют два встроенных LCD дисплея, на одном из которых, надо полагать, будут отображаться минуты, на другом – часы. Концепция вдохновлена фразой "мы все рабы времени".&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;28. часы NOOKA ZOT V&lt;/h4&gt;&lt;a href="http://us.nooka.com/buy/index.php?main_page=product_info&amp;cPath=1_5_21&amp;products_id=10"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S6PcVZ0NMOI/AAAAAAAAMcw/ytdxyz5Ltyk/s800/Nooka-ZOT-V-Watch.png" /&gt;&lt;/a&gt;&lt;br /&gt;Второй вариант часов NOOKA ZOT V (V серия). Часы имеют стекло из минерального кристалла, что позволяет их легко чистить. Nooka Zot-V также имеет ряд некоторых функций: хронограф, чтобы не пропустить вашу игру в покер и будильник, чтобы вставать по утрам. Верхние точки — часы (в режиме даты — месяцы), нижняя полоса — минуты. Корпус из нержавеющей стали с ЖК-дисплей, EL подсветка, кожаный ремень и пряжки из нержавеющей стали.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;29. светодиодные часы Gucci&lt;/h4&gt;&lt;a href="http://www.inewidea.com/2008/01/21/4465.html"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S6PcJuz7yqI/AAAAAAAAMaA/hQ_I9Df_uik/s800/Gucci-LED-watch.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Роскошный бренд, часы Gucci сама элегантность. Эта новая конструкция снабжена сдвигающейся крышкой, скрывающей светодиодный дисплей.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;30. часы Tokyo Flash Barcode IP LED&lt;/h4&gt;&lt;a href="http://www.tokyoflash.com/en/watches/tokyotimeevolution/barcodeipblack/"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6PcRhbBTcI/AAAAAAAAMb4/6D4krb1e3gE/s800/tokyo_flash_barcode-400-400.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Для светодиодных часов, которые хотят выглядеть, как никакие другие часы, есть выход - выглядеть как штрих-код. Четыре индикаторных столбика. В первом столбике каждая точка обозначает 5 часов, в втором — один час, в третьем — 10 минут каждый индикатор, и в четвертом — по одной минуте на точку. Таким образом, отображается вся информация, необходимая для отсчета времени.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5475673658228616658?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5475673658228616658/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5475673658228616658' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5475673658228616658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5475673658228616658'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/30.html' title='30 удивительных часов'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ymDymKKKFj4/S6PcRNBsHyI/AAAAAAAAMbw/iPgvdjcewgo/s72-c/thumbnail-watch.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5759954205344832029</id><published>2010-03-18T17:17:00.003+03:00</published><updated>2010-03-18T17:18:24.544+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='peer-to-peer'/><category scheme='http://www.blogger.com/atom/ns#' term='испанцы тоже люди'/><category scheme='http://www.blogger.com/atom/ns#' term='torrent'/><title type='text'>Испания: некоммерческое использование общего доступа к файлам является законным</title><content type='html'>&lt;img align="left" hspace="10px" src="http://lh3.ggpht.com/_ymDymKKKFj4/S6IwyYTLMSI/AAAAAAAAMXo/hkF6HmGWCHI/s800/hometaping1.gif" /&gt;[это перевод &lt;a href="http://mashable.com/2010/03/16/file-sharing-legal-ispain/"&gt;статьи&lt;/a&gt;] Когда мы говорим об обмене файлами, существует целый спектр вопросов, которые обычно путают или рассматриваться как одну сущность, хотя в действительности вопросы эти относятся к абсолютно разным вещам.&lt;br /&gt;Считается ли нормальным одолжить аудио CD, который я только что купил? Можно ли проигрывать его на вечеринке с друзьями? Могу ли я конвертировать его в MP3 файлы или сделать копию? Нормально ли то, что я поместил его в общую папку P2P такого приложения как eMule?&lt;br /&gt;На другом конце, вы получите создателей приложений P2P, владельцев сайтов со списком ссылок на контент (сайтов фактически не хранящих контент, а хранящих только ссылки) и торрент трекеры.&lt;br /&gt;Частенько вы будете слышать, что всё вышеперечисленное, являются незаконными. Часто, такие примеры, как "прослушивание CD с друзьями", вызывают смех (конечно, вы можете делать это), но когда речь идет о простом создании резервной копии, это уже будет пиратская копия и вполне может быть объявлена незаконной .&lt;br /&gt;Практически невозможно услышать о том, что суд принял решение о том, что ссылки на защищенные авторским правом материалы законны, но это именно то решение, которое принял испанский судья Рауль Гарсия Орехуда (Raul N. García Orejudo) по делу "испанское Общество авторов и издателей (&lt;a href="http://www.sgae.es/home/en/Home.html"&gt;SGAE&lt;/a&gt;, Sociedad General de Autores y Editores) против Джисуса Герры (Jesus Guerra)", владельца сайта &lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.elrincondejesus.com%2F&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEHFN8V3ngfrSTvfHcurrE7EdbQ0Q"&gt;Elrincondejesus.com&lt;/a&gt;, на котором размещается коллекция ссылок для файлообменной сети eDonkey.&lt;br /&gt;&lt;br /&gt;Есть ли смысл в аргументах судьи Рауля? Во-первых, &lt;a href="http://torrentfreak.com/file-sharing-and-link-sites-declared-legal-in-spain-100315/"&gt;он отверг просьбу SGAE's о закрытии сайта&lt;/a&gt; Гуэрра в июне, заявив, что "сети P2P просто передают данные между пользователями интернета и не нарушают в принципе любые права на интеллектуальную собственность".&lt;br /&gt;&lt;br /&gt;Теперь он решил, что "хранение индекса ссылок и / или ссылки на материалы защищенные авторским правом не являются распространением" (а если быть точным, то предоставление ссылок на произведения, защищенные авторским правом, нельзя приравнивать к размещению таких материалов в общем доступе). Его решение во многом основывается на том факте, что Герра не получает никаких прямых или косвенных прибылей от своего сайта.&lt;br /&gt;Не вдаваясь в моральную сторону этой истории, очевидно, что разница между www.elrincondejesus.com и Google не очень велика. А если начать размышлять дальше, то вы получите странные юридические прецеденты, такие, как недавнее &lt;a href="http://mashable.com/2010/02/24/google-italy-executives-guilty/"&gt;решение итальянского суда&lt;/a&gt;, в котором постановили признать Google виновным в размещении оскорбительного видео и в том, что оно не было своевременно удалено.&lt;br /&gt;&lt;br /&gt;Нет сомнений, что SGAE будет обжаловать это решение. Но это постановление в очередной раз показывает, что не все так гладко в мире обмена файлами, как звукозаписывающей индустрии хотелось бы видеть. Это первый случай, когда суд постановил о том, что использование пиринговых сетей (таких как BitTorrent) в некоммерческих целях является абсолютно законным, даже если пользователи скачивают «пиратские» фильмы и музыку.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5759954205344832029?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5759954205344832029/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5759954205344832029' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5759954205344832029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5759954205344832029'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/blog-post_18.html' title='Испания: некоммерческое использование общего доступа к файлам является законным'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ymDymKKKFj4/S6IwyYTLMSI/AAAAAAAAMXo/hkF6HmGWCHI/s72-c/hometaping1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5702720423574877373</id><published>2010-03-16T17:05:00.000+03:00</published><updated>2010-03-16T17:05:15.533+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordle'/><title type='text'>сервис Wordle</title><content type='html'>Приятный сервис &lt;a href="http://www.wordle.net/"&gt;Wordle&lt;/a&gt;. Строит вот такую вот псевдо-диграмму по содержимому вашего блога, сайта или же просто по набору слов.&lt;br /&gt;&lt;a href="http://www.wordle.net/"&gt;&lt;img src="http://lh5.ggpht.com/_ymDymKKKFj4/S5-P5O0hORI/AAAAAAAAMWk/LtGBXzB28A8/s800/Screen%20shot%202010-03-16%20at%205.02.31%20PM.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5702720423574877373?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5702720423574877373/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5702720423574877373' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5702720423574877373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5702720423574877373'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/wordle.html' title='сервис Wordle'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ymDymKKKFj4/S5-P5O0hORI/AAAAAAAAMWk/LtGBXzB28A8/s72-c/Screen%20shot%202010-03-16%20at%205.02.31%20PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-3181817167193147569</id><published>2010-03-15T23:12:00.003+03:00</published><updated>2010-03-15T23:13:52.016+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='anywhere'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter @anywhere, встречайте!</title><content type='html'>[это перевод &lt;a href="http://blog.twitter.com/2010/03/anywhere.html"&gt;этой статьи&lt;/a&gt;] Когда мы разрабатывали Twitter, мы применили иной подход - мы не требовали такой модели отношений пользователей, которая присуща социальным сетям. Сохранение открытого доступа к данным означало, что можно свободно путешествовать по нашему сайту, читая твиты друзей, знаменитостей, компаний, СМИ, вымышленных персонажей и многих других. Вы можете следовать за любым аккаунтом, так же как и за вами может следовать любой. В результате, компании начали взаимодействовать с клиентами, знаменитости с фанатами, правительство стало более прозрачным и люди начали получать информацию и обмениваться ей в новой манере общего информационного пространства.&lt;br /&gt;&lt;br /&gt;Мы разработали новый набор фреймворков для распространения нашего опыта повсеместно в интернете. Вскоре, сайты, которые многие из нас посещают каждый день, смогут заново открыть себя, привлекая пользователей новыми возможностями взаимодействия и при этом не перенаправляя их на Twitter.com. Наша открытая технологическая платформа хорошо известна и Twitter API уже используется во многих проектах, но это другой подход, потому что мы создали нечто невероятно простое. Вместо того, чтобы заниматься реализацией API, владельцу сайта нужна лишь капля в несколько строк JavaScript'a. Этот новый набор фреймворков называется @anywhere.&lt;br /&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S56R9XZtdhI/AAAAAAAAMVw/B0z9HZuBKRI/s800/logos.png" /&gt;&lt;br /&gt;&lt;i&gt;Twitter будет частью наших любимых сайтов!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Когда мы будем готовы к запуску, первоочередными сайтами-участниками станут &lt;i&gt;Amazon, AdAge, Bing, Citysearch, Digg, eBay, The Huffington Post, Meebo, MSNBC.com, The New York Times, Salesforce.com, Yahoo!&lt;/i&gt; и &lt;i&gt;YouTube&lt;/i&gt;. Представьте себе возможность следовать за журналистом New York Times непосредственно по ее имени, твитить о видео не покидая YouTube и находить новых знакомых в Твиттере во время посещения домашней страницы Yahoo! - и это только начало. Твиттер доказал свою востребованность в различных направлениях. С @anywhere, владельцы веб-сайтов и компании смогут предложить посетителям больше с минимальными усилиями.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-3181817167193147569?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/3181817167193147569/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=3181817167193147569' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3181817167193147569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3181817167193147569'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/twitter-anywhere.html' title='Twitter @anywhere, встречайте!'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ymDymKKKFj4/S56R9XZtdhI/AAAAAAAAMVw/B0z9HZuBKRI/s72-c/logos.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-3047236755172685980</id><published>2010-03-15T22:13:00.000+03:00</published><updated>2010-03-15T22:13:42.582+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ IDEA'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>IntelliJ IDEA 9.0.1 + Google App Engine (GAE) + Google Web Toolkit (GWT)</title><content type='html'>Вот в такой вот связке проект изначально не работает, т.е. не запускается AppEngine Dev, завершая свой взлет сообщением о том, что:&lt;br /&gt;&lt;pre&gt;Caused by: java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteService&lt;/pre&gt;Проблема в том, что в Artifact не добавлена библиотека gwt-servlet.jar. Решается тривиально, добавляем gwt-servlet.jar (находится в корне GWT SDK) сначала в Libraries в свойствах проекта, а затем добавляем её в Artifact: WEB-INF/lib. Для наглядности:&lt;br /&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S56Gld_sLlI/AAAAAAAAMVU/WIZFC2cUc4o/s800/Screen%20shot%202010-03-15%20at%2010.10.59%20PM.png" /&gt;&lt;br /&gt;Теперь взлетит.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-3047236755172685980?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/3047236755172685980/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=3047236755172685980' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3047236755172685980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3047236755172685980'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/intellij-idea-901-google-app-engine-gae.html' title='IntelliJ IDEA 9.0.1 + Google App Engine (GAE) + Google Web Toolkit (GWT)'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ymDymKKKFj4/S56Gld_sLlI/AAAAAAAAMVU/WIZFC2cUc4o/s72-c/Screen%20shot%202010-03-15%20at%2010.10.59%20PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2650975293680857485</id><published>2010-03-14T23:18:00.000+03:00</published><updated>2010-03-14T23:18:10.343+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='иллюзии'/><category scheme='http://www.blogger.com/atom/ns#' term='бдительность'/><category scheme='http://www.blogger.com/atom/ns#' term='мозг'/><category scheme='http://www.blogger.com/atom/ns#' term='обман'/><title type='text'>10 трюков для вашего мозга</title><content type='html'>[это перевод вот &lt;a href="http://www.smashinglists.com/10-amazing-tricks-to-play-with-your-brain/"&gt;этой&lt;/a&gt; статьи]&lt;br /&gt;Разум есть та сторона интеллекта и сознания, которая воспринимается как комбинация мыслей, восприятия, памяти, эмоций, воли и воображения, включая все бессознательные когнитивные процессы. Разум проявляется как субъективный поток сознания. Нейроанатомисты обычно считают, что мозг является ключевой составляющей того, что мы называем разумом. Мозг человека шутит с нами всякий раз, когда это возможно. Вы можете фактически не воспринимать окружающую вас реальность или можете чувствовать запахи, которых на самом деле нет. Пришло время сыграть шутку с человеческим мозгом. Уверяю, все изложенные здесь методы абсолютно безопасны.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;10. Метод Ganzfeld'а&lt;/h4&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S509aSHiIqI/AAAAAAAAMTQ/3_gC__Yl7Pk/s800/11brain2axx4.jpg" /&gt;&lt;br /&gt;Настройте радио так, чтобы транслировались помехи. Затем лягте на диван и приклейте по половине шарика от пинг-понга к вашим глазам, как на картинке. Через несколько минут вы должны начать видеть сенсорные искажения.&lt;br /&gt;&lt;br /&gt;Некоторые люди видят скачущих лошадей в облаках или слышат голос мертвого родственника. Оказывается, что ум - настоящий наркоман чувств и ощущений и, когда в происходящем мало смысла (в нашем случае, это шарики для пинг-понга и шум радио), ваш мозг заканчивает картинку происходящего своими собственными "домыслами".&lt;br /&gt;&lt;a href="http://dbem.ws/ganzfeld.html"&gt;Источник&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;9. Уменьшите свою боль&lt;/h4&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S509aOwDz4I/AAAAAAAAMTM/giAPccDPgms/s800/11brain2axx__12344.jpg" /&gt;&lt;br /&gt;В случае, если у вас есть травма, посмотрите на поврежденную часть тела в перевернутый бинокль, скоро вам будет казаться, что боль отступает.&lt;br /&gt;&lt;br /&gt;Недавно, исследования в Оксфордском университете привели к открытию нового убийцы боли - перевернутому биноклю. Ученые продемонстрировали, что те люди, которые смотрели на свою травму руки через перевернутый бинокль (что создает эффект того, что объект находится гораздо дальше от вас, чем на самом деле), ощущали, что боль утихает, а их отеки уменьшились. По мнению исследователей, это доказывает то, что даже телесные ощущения, такие как боль, смоделированы тем, что мы видим. Поэтому в следующий раз, когда вы повредите себе палец или другую часть тела, отведите взгляд, научно доказано - это поможет!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://scienceblogs.com/neurophilosophy/2008/12/disowning_pain_with_binoculars.php"&gt;Источник&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;8. Запутайте свои пространственные ощущения&lt;/h4&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S509aKXBm-I/AAAAAAAAMTI/_-z_54K4HNQ/s800/11brain2axx__544.jpg" /&gt;&lt;br /&gt;Для этого требуются два стула и повязка на глаза. Человек, с повязкой на глазах, должен сидеть на кресле сзади, уставившись в затылок того, кто сидит перед ним. Человек с завязанными глазами должен дотронуться рукой до носа другого человека. В то же время он должен коснуться другой своей рукой собственного носа, при этом нужно нежно гладить оба носа. Примерно через минуту, более чем у 50% испытуемых возникает ощущение того, что их нос невероятно длинный. Такой феномен еще называют Эффектом Пиноккио.&lt;br /&gt;&lt;br /&gt;Эффект Пиноккио - это иллюзия того, что ваш нос растет, как это случилось с литературным героем Пиноккио, когда он лгал. Эта иллюзия искажения пространственных ощущений открыта Лакнером (Lackner) (1988).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;7. Запутайте мышление&lt;/h4&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S509iSTJhGI/AAAAAAAAMTo/_4lEEsy73qE/s800/legs-595x600.jpg" /&gt;&lt;br /&gt;Поднимите правую ногу на несколько сантиметров над полом (как на картинке), затем перемещайте ее по часовой стрелке. Пока вы крутите ногой, используйте указательный палец правой руки, чтобы нарисовать цифру 6 в воздухе. Ваша нога непроизвольно начнет вращение против часовой стрелки и вы ничего не сможете с этим поделать.&lt;br /&gt;&lt;br /&gt;Левое полушарие мозга управляет правой стороной тела и отвечает за ритм и продолжительность движений. Левое полушарие вашего мозга не может справиться с двумя одновременными противоположными движениями и поэтому старается объединить их в одно.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sciencemadesimple.co.uk/page76g.html"&gt;Источник&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;6. Запутайте слух&lt;/h4&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S509icBHjyI/AAAAAAAAMTk/eGDIG7AvVig/s800/ear-600x555.jpg" /&gt;&lt;br /&gt;Для этого трюка потребуются три человека, один из которых будет испытуемым, а двое других будут помогать, нам также понадобятся две обычные пластиковые трубы. Попросите помощников сесть на стульях на одинаковом расстоянии от вас. Теперь каждый из помощников должен взять по трубе и друг за другом сказать что-нибудь в трубу. Испытуемый правильно определит направление звука. Теперь обменяйтесь трубами и произнесите что-нибудь в них опять. Мозг испытуемого будут путаться, и будет указывать на противоположенные направления источника звука.&lt;br /&gt;&lt;br /&gt;Локализации звучания, является способностью слушателя для определения местонахождения или места происхождения звука, его направлении и расстоянии до источника, что используется для моделировании размещения акустических сигналов в виртуальном 3D пространстве. Слуховая системы человека имеет лишь ограниченные возможности для определения расстояния до источника звука и основана главным образом на интерслуховой разнице во времени, обмен трубами приведет к восприятию дезориентации нейронов в мозгу и тем самым испытуемый не сможет локализовать источник звука.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;5. Запутайте свое восприятие&lt;/h4&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S509iSdlxhI/AAAAAAAAMTs/MrOubX59UG4/s800/opticalillusion1-600x451.jpg" /&gt;&lt;br /&gt;Глубина восприятия - это способность воспринимать визуальный мир в трех измерениях (3D). Глядя на что-то, чего вы раньше не видели или входя в 3D-кинотеатр с одним закрытым глазом, ваш разум будет пытаться настроить свое восприятие нового объекта.&lt;br /&gt;&lt;br /&gt;Этого не произойдет для большинства вещи, которые вы уже видели, потому что ваш мозг уже настроен на такие объекты должным образом. Тем не менее, ваш мозг не сможет заполнить эти пробелы, если вы используете только один глаз. Восприятие глубины возникает из различных сигналов. Они, как правило, подразделяются на бинокулярные сигналы, которые требуют использования обоих глаз и монокулярные сигналы, которые требуют использования только одного из глаз. Бинокулярные сигналы относятся к стереоданным, улучшая восприятия глубины за счет параллакса. Так как (по определению), бинокулярное восприятие глубины требует, чтобы функционировали оба глаза, люди с одним глазом не воспринимают бинокулярную глубину изображения. И, следовательно, такие люди не ощущают 3D эффекта в кинотеатрах.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;4. Фантомные ощущения&lt;/h4&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/TCQbygjG0RU&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/TCQbygjG0RU&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Фантомные ощущения - это феномен, когда человек ощущает свои конечности или органы, которые фактически уже не являются частью его тела. Такие ощущения чаще всего возникают после ампутации руки или ноги, но также могут возникать после удаления молочной железы или внутренних органов.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;3. Синусоида 18000 Гц&lt;/h4&gt;&lt;img align="center"  src="http://lh3.ggpht.com/_ymDymKKKFj4/S509iChBKjI/AAAAAAAAMTg/AMiGU_MKQ4Y/s800/ComplexSinInATimeAxe.gif" /&gt;&lt;br /&gt;Скачать: &lt;a href="http://www.smashinglists.com/wp-content/uploads/2010/03/highfreq1.mp3"&gt;18000Гц (20с)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Попробуйте послушать этот звук. Он называется "под 20", так как люди в более старшем возрасте не могут его воспринимать. Это синусоидальная волна на частоте 18000 Гц (для сравнения, свисток для собаки звучит на 16000 - 22000 Гц - то есть собака может услышать этот звук). Этот звук используется некоторыми подростками в качестве мелодии звонка на мобильный телефон, для того, чтобы только они (а также другие лица их возрастной группы) могли слышать звонок. Он также иногда используется в Англии, его воспроизводят очень громко в тех районах, где власти пытаются разогнать подростков.&lt;br /&gt;&lt;br /&gt;Внутреннее ухо человека имеет такой функциональный дизайн, что слышит звуки только в определенном диапазоне частот. Слух - это функция не только ушей, но амплитуда колебаний передаваемая в мозг. Когда люди становятся старше, они теряют способность слышать высокие звуки.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;2. Запутать фоторецепцию&lt;/h4&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S509iv2EKWI/AAAAAAAAMTw/NBPMCZ_Ypc4/s800/rickroll-illusion.gif" /&gt;&lt;br /&gt;Пристально смотрите в центральную точку (крестик) на черно-белой картинке как минимум 30 секунд, а затем посмотрите на стену, вы увидите яркое пятно, моргните несколько раз, что вы видите? или даже, кого вы видите?&lt;br /&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S509aojkPcI/AAAAAAAAMTY/9UHUVs_LJOs/s800/bird.jpg" /&gt;&lt;br /&gt;Задержите свой взгляд на красном попугае и медленно сосчитайте до 20, затем сразу посмотрите в одно из пустых окошек клетки. Слабый, призрачный образ сине-зеленых птиц должен появиться в клетке. Попробуйте то же самое с зеленым попугаем, тогда должна появится птица со слабым пурпурным свечением.&lt;br /&gt;&lt;br /&gt;Когда вы смотрите на изображение длительное время (обычно около 30 секунд), а затем переводите взгляд на белое, проявляется эффект, называемый остаточное изображение. Общепринятое объяснение такого поведения зрения заключается в том, что остаточные фоторецепторы (палочки и колбочки) в глазах "устают" и не работают так, как положено фоторецепторам ("усталость" на самом деле вызвана временным обесцвечиванием из-за светочувствительных пигментов, содержащихся в фоторецепторах). Это приводит к тому, что информация, предоставляемая фоторецепторами разбалансируется, в результате чего появляется эффект остаточного изображения. Когда фоторецепторы вернутся в норму (обычно от десяти до тридцати секунд), восстанавливается баланс, в результате чего остаточное изображение исчезает.&lt;br /&gt;&lt;a href="http://serendip.brynmawr.edu/bb/neuro/neuro06/web2/aschmid.html"&gt;Источник&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Теперь применим еще одну хитрость, чтобы запутать фоторецепторы. Вам нужно будет временно ослепить одним глаз (примерно в течении 30 секунд, не переживайте, от этого не будет никакого вреда). Идите в темную комнату, закройте дверь и потушите свет. Подождите, пока ваши глаза адаптируются к темноте. Вы должны быть в состоянии различить основные формы комнаты и предметов от света, поступающего из-под двери. Затем закройте правый глаз и прикройте его рукой. Включите свет, держите глаз закрытым и прикрытым рукой. Оставьте свет примерно на минуту, до того момента, пока левый глаз не адаптируется к свету. Открой правый глаз и обведите взглядом комнату.&lt;br /&gt;&lt;br /&gt;Что вы видите? Данную иллюзию обнаружил ученый Ута Вулф, вам будет казаться, что левый глаз закрыт, несмотря на то, что он открыт.&lt;br /&gt;&lt;br /&gt;Объясняется это тем, что визуальный цикл занимает некоторое время связанное с адаптацией, и если адаптация для левого глаза еще не произошла, глаза посылают неправильные сигналы в мозг, в связи с чем, изображение будет затемнено для левого глаза, пока он не адаптируется.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;1. Запутать когнитивную способность&lt;/h4&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S509aXoIf0I/AAAAAAAAMTU/ihkVKKneJxY/s800/2007b.gif" /&gt;&lt;br /&gt;Взгляните на крутящуюся девушку. Вращается ли она по часовой стрелке или против часовой стрелки? Я вижу, что она вращается против часовой стрелки, но мне удалось переключить её в другом направлении, это очень сложно для многих людей. Попробуйте.&lt;br /&gt;&lt;br /&gt;Крутящаяся девушка является одной из форм более общей иллюзии крутящегося силуэта. Изображение объективно не "вращается" ни в одну, ни в другую сторону. Это двухмерное изображение, которое просто перемещается назад и вперед. Но наш мозг не предназначен для интерпретации двумерных представлений о мире, так как фактически обитаем мы в мире трехмерном. Таким образом, наше визуальное восприятие предполагает, что мы смотрим на 3D изображение и использует общепринятые ключи для того, чтобы изображение интерпретировать. А без адекватных подсказок, мозг может предположить о направлении вращения только произвольно, т.е. мы решили в какую сторону девушка будет вращаться. Когда же подгонка под наше восприятие завершена, мозг воссоздает полную иллюзию - мы видим вращающееся 3D изображение.&lt;br /&gt;&lt;br /&gt;Если присмотреться вокруг изображения, сосредоточив внимание на тень или на какой-нибудь другое точке, вы можете заставить вашу зрительную систему заново оценить изображение и она может выбрать направление вращения в противоположном направлении, и вдруг вы и вправду сможете увидеть, что изображение вращается в другом направлении.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theness.com/neurologicablog/?p=27"&gt;Источник&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2650975293680857485?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2650975293680857485/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2650975293680857485' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2650975293680857485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2650975293680857485'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/10.html' title='10 трюков для вашего мозга'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ymDymKKKFj4/S509aSHiIqI/AAAAAAAAMTQ/3_gC__Yl7Pk/s72-c/11brain2axx4.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-6136336731268409835</id><published>2010-03-13T23:33:00.000+03:00</published><updated>2010-03-13T23:33:45.449+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware acceleration'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Flash, HTML5, Apple. Небольшое тестирование</title><content type='html'>&lt;img align="left" src="http://lh6.ggpht.com/_ymDymKKKFj4/S5vvXOpasJI/AAAAAAAAMRk/87XC0U6aXU0/s800/flash_jan_09.jpg" /&gt;[Это перевод &lt;a href="http://www.readwriteweb.com/archives/does_html5_really_beat_flash_surprising_results_of_new_tests.php"&gt;вот этой статьи&lt;/a&gt;] В преддверии запуска &lt;a href="http://apple.com/ipad"&gt;Apple iPad&lt;/a&gt;, дискуссии по поводу отказа компания из Cupertino от технологии Adobe Flash вышли на первое место в различных дискуссиях. Одно дело было отказаться от Flash на маленьких, мобильных устройства, таких как iPhone или iPod Touch, но некоторые задаются вопросом, не станет ли отсутствие поддержки Flash своеобразным "сделай или умри" для нового устройства, запуск которого запланирован на следующий месяц - устройства, которое, если верить главе Apple Стиву Джобсу - "лучше, чем нетбуки".&lt;br /&gt;С другой стороны, сторонники Apple поддакивают настроению компании, что "Flash - это прожорливая свинья для процессора", в том числе, в качестве довода против, приводится тот факт, что поддержка технологии негативно скажется на длительности работы от аккумулятора.&lt;br /&gt;Однако, недавнее тестирование столкнуло Flash и HTML5, новый язык разметки, который способен исключить необходимость в плагине от Adobe. Результаты этих тестов показывают, что это не просто вопрос о сравнении черного с белым. Действительно ли Flash прожорливая свинья для процессора? Да, в некоторых случаях. Но, что удивительно, далеко не всегда. На самом деле, иногда HTML5 показывает гораздо худшую производительность.&lt;br /&gt;&lt;h4&gt;Тестирование Flash и HTML5&lt;/h4&gt;&lt;a href="http://www.streaminglearningcenter.com/users/jan-ozer-1.html"&gt;Ян Озер&lt;/a&gt; является специалистом в области технологий кодирования видео, работает на рынке цифрового видео с 1990 года и является автором 13 книг, связанных с этой темой [Примечание редактора: Некоторые люди отмечают, что Озер проводил семинары и писал книги о продуктах Adobe, поэтому его заработок зависитот от успеха Adobe Flash. Мы не думаем, что это оказало влияние на результаты тестирования, но мы подумали, что стоит отметить этот факт.] Недавно он столкнул HTML5 против Flash в ряде тестов, в которых технологии противостоят друг другу на Mac и PC, в разных браузерах, включая Internet Explorer 8, Google Chrome, Apple Safari и Mozilla Firefox.&lt;br /&gt;Результаты тестирования в полном объеме опубликованы &lt;a href="http://www.streaminglearningcenter.com/articles/flash-player-cpu-hog-or-hot-tamale-it-depends-.html"&gt;здесь, на StreamingLearningCenter.com&lt;/a&gt;. Результаты в двух словах? Flash не всегда "пожирает" процессор, иногда такая честь перепадает и HTML5.&lt;br /&gt;Некоторые из основных выводов Озера приведены ниже и разбиты на секции с результатами тестирования для Mac и Windows.&lt;br /&gt;&lt;h4&gt;Тесты на компьютерах Macintosh&lt;/h4&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S5vvXLY5yhI/AAAAAAAAMRo/I7EbmY4_8UU/s800/mac.jpeg" /&gt;&lt;br /&gt;&lt;ul&gt; &lt;li&gt;В &lt;b&gt;Safari&lt;/b&gt;, HTML5 работает наиболее эффективно и потребляет процессорного времени меньше, чем Flash, используя только 12,39% CPU. При использовании Flash 10.0, загрузка процессора составила 37,41%, с Flash 10.1, она снизилась до 32,07%;&lt;/li&gt; &lt;li&gt;При использовании &lt;b&gt;Google Chrome&lt;/b&gt;, Flash и HTML5 были одинаково прожорливы (оба использовали около 50% CPU);&lt;/li&gt; &lt;li&gt;В &lt;b&gt;Firefox&lt;/b&gt;, Flash показал себя менее эффективным, чем в Safari, но лучше, чем в Google Chrome.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Тесты Windows&lt;/h4&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S5vvXYhg9GI/AAAAAAAAMRs/DuC25P0PSU8/s800/windows.jpeg" /&gt;&lt;br /&gt;&lt;ul&gt; &lt;li&gt;&lt;b&gt;Safari&lt;/b&gt; не стал воспроизводить видео в HTML5, поэтому не было возможности его протестировать. Однако, Flash 10.0 использовал 23,22% CPU, а Flash 10.1 использует только 7,43%;&lt;/li&gt; &lt;li&gt;&lt;b&gt;Google Chrome&lt;/b&gt; был более эффективен в Windows, чем на Mac'е. Воспроизведение с помощью Flash Player 10.0 примерно на 24% более эффективно, чем с использованием HTML5, а Flash Player 10.1 и того на 58% более эффективен, чем HTML5;&lt;/li&gt; &lt;li&gt;В &lt;b&gt;Firefox&lt;/b&gt;, с использованием Flash 10.1 загрузка процессора упала до 6% с 22% в случае в Flash 10.0;&lt;/li&gt; &lt;li&gt;В &lt;b&gt;IE8&lt;/b&gt;, Flash 10.0 использовал 22,41% CPU, а Flash 10.1 использовал 14,62% CPU.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Аппаратное ускорение и производительность Flash&lt;/h4&gt;Анализируя результаты тестирования, Озер установил, что аппаратное ускорение имеет ключевое значение в случае с производительностью Flash. Эта функция, которая была включена в версию Flash 10.1, позволяет плагину использовать графический процессор (GPU) для декодирования видео. В зависимости от видео карты и драйвера (NVIDIA, AMD / ATI и Intel поддерживают эту технологию), процесс декодирования видео в Flash 10.1 теперь может работать для всех видео, а не только в случае использования полноэкранного режима, как это было в Flash 10.0.&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/flashplayer/articles/fplayer10.1_hardware_acceleration_02.html"&gt;По словам Adobe&lt;/a&gt;, аппаратное ускорение не поддерживается ни под Linux, ни под Mac OS X, так как последняя версия Mac OS X не обеспечивает доступа к необходимым для этого API. Adobe говорит, что "команда Flash Player'а продолжит оценку возможности добавление аппаратного ускорения для Linux и Mac OS X в будущих версиях".&lt;br /&gt;Вот, что всё это означает с точки зрения непрофессионала: Apple не позволяет Flash стать более эффективным на Mac OS X и в Safari (так же как и на IPod / iPhone / iPad), не предоставляя доступ к необходимому аппаратному обеспечению, с целью уменьшить нагрузку на процессор. Adobe выжидает и наблюдает, ожидая момента, когда они смогут реализовать эту фичу, но, как говорит Озер, "мяч находится во дворе Apple".&lt;br /&gt;Будет ли Apple шевелиться? На данный момент, это маловероятно. При блокировании Flash на устройствах Apple, компания может легко утверждать, что Flash просто неэффективная технология... и на данный момент это верно, учитывая то, как она сейчас работает. Однако, если компания хочет разрешить использование этой технологии и сделать её действительно рабочей, разумно полагать, что они могут это сделать. Это именно то, что заставляет некоторых инсайдеров считать, что решение о блокировании Flash - это скорее поддержка единомышленников по бизнесу, нежели какие-то проблемы, связанные с технологиями. В конце концов, если бы вы могли легко посетить сайт Hulu.com для потокового вещания телевизионных шоу и фильмов, то зачем вам тогда покупать для этого приложения из iTunes Store?&lt;br /&gt;Таким образом, хотя "поедание процессорного времени Flash'ем" и может быть фактором, способствующим решению Apple не поддерживать технологию Flash на своих мобильных устройствах, но очень вероятно, что это не единственная причина такой блокировки.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;тут перевод заканчивается&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Товарищ &lt;hh user="Tylerskald"/&gt; ранее уже рассказывал о том, что &lt;a href="http://habrahabr.ru/blogs/apple/84892/"&gt;думает по поводу Flash&lt;/a&gt; Стив Джобс. Я к чему это перевел, а вот к чему: я не люблю Flash. Потому что медленно, ресурсоемко, порой бездумно, но если вопрос сейчас стоит именно так "Apple не хочет, чтобы Flash нормально работал даже на Mac OS X", то мне однозначно не нравится такая позиция Apple. Пусть Adobe и не мои любимцы (дело личное и каждого, не принимайте близко к сердцу), но они приложили усилия, чтобы заставить своё творение работать сносно, за что им спасибо. И минус в карму Apple, если они действительно не дают возможности использовать аппаратное ускорение в Mac OS X.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-6136336731268409835?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/6136336731268409835/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=6136336731268409835' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6136336731268409835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6136336731268409835'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/flash-html5-apple.html' title='Flash, HTML5, Apple. Небольшое тестирование'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ymDymKKKFj4/S5vvXOpasJI/AAAAAAAAMRk/87XC0U6aXU0/s72-c/flash_jan_09.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-367420772874864409</id><published>2010-03-12T08:08:00.000+03:00</published><updated>2010-03-12T08:09:43.928+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data visualization'/><title type='text'>Прекрасные примеры визуализации данных</title><content type='html'>Есть такой вполне объяснимый феномен: если данные красиво визуализированы, то волей-неволей вы задерживаете на визуализации свой взгляд, вне зависимости от того, нужны вам эти данные или нет. Чего не скажешь об обыденных графиках и унылых схемах.&lt;br /&gt;В связи с чем, я решил собрать коллекцию прекрасных попыток визуализации. Чтобы вдохновляться. Помогает. Поэтому делюсь. Возможно, гляда на эти красоты, и вам прийдет в голову замечательная концепция.&lt;br /&gt;&lt;strong&gt;Warning: большой трафик.&lt;/strong&gt;&lt;br /&gt;В большинстве случаев, картинки кликабальны и ведут на источник.&lt;br /&gt;&lt;a href="http://amaztype.tha.jp/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S5nLK3D_LfI/AAAAAAAAMNQ/_kkMzO9Smtg/s800/Screen%20shot%202010-03-12%20at%208.02.55%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://labs.digg.com/arc/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S5m-IWW_7CI/AAAAAAAAMJE/zukdyjejzGE/s800/Screen%20shot%202010-03-12%20at%207.07.06%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.matthiasdittrich.com/projekte/narratives/visualisation/index.html"&gt;&lt;img align="center"   src="http://lh3.ggpht.com/_ymDymKKKFj4/S5m9gTlwoZI/AAAAAAAAMI8/koA2cci7QcQ/s800/2-we-will-rock-you.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kunalanand.com/delicious/"&gt;&lt;img align="center" src="http://lh4.ggpht.com/_ymDymKKKFj4/S5m-cLROGzI/AAAAAAAAMJM/6Uea87uUvWE/s800/mann_big.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.taggalaxy.de/"&gt;&lt;img align="center"   src="http://lh3.ggpht.com/_ymDymKKKFj4/S5m_IDmJFGI/AAAAAAAAMJo/95ZZYmHwuyQ/s800/Screen%20shot%202010-03-12%20at%207.11.41%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.twingly.com/screensaver"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S5m_ndsXMmI/AAAAAAAAMJw/YsvKDdcIukA/s800/20090706212237392.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Nu-qem7hOHFc-yUaM1x94A?feat=embedwebsite"&gt;&lt;img align="center"   src="http://lh6.ggpht.com/_ymDymKKKFj4/S5nAZmLm56I/AAAAAAAAMKQ/4YtEWX5ilgk/s800/Pik5g.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.universetoday.com/2009/10/22/missions-to-mars-poster/"&gt;&lt;img align="center"  src="http://lh6.ggpht.com/_ymDymKKKFj4/S5nBQGEcxYI/AAAAAAAAMKY/FbFLhLkznQo/s800/tumblr_kr6bi5O0P71qz7z7io1_500.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opte.org/maps/"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S5nB0N83k9I/AAAAAAAAMK4/xrqAWE5z7RU/s800/1069646562.LGL.2D.700x700.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.chrisharrison.net/projects/amazonviz/index.html"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S5nG3gfTO7I/AAAAAAAAMLY/CHwF8K4aL-Y/s800/amazonMapSmall.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nytimes.com/interactive/2008/02/23/movies/20080223_REVENUE_GRAPHIC.html"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S5nHKSEwyJI/AAAAAAAAMLg/AdAcH7e_wvw/s800/Screen%20shot%202010-03-12%20at%207.45.59%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ruderfinn.com/rfrelate/intent/intent-index.html"&gt;&lt;img align="center" src="http://lh3.ggpht.com/_ymDymKKKFj4/S5nHeqE72jI/AAAAAAAAMLo/svZ7g7VZK28/s800/Screen%20shot%202010-03-12%20at%207.47.23%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.subblue.com/"&gt;&lt;img align="center" src="http://lh6.ggpht.com/_ymDymKKKFj4/S5nIaWqzutI/AAAAAAAAML4/FEnO8Ii8zxQ/s800/Cubic_crumble_large.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ownyourc.com/"&gt;&lt;img align="center" src="http://lh5.ggpht.com/_ymDymKKKFj4/S5nJOry1AzI/AAAAAAAAMMY/i2b0XRGVTQM/s800/Screen%20shot%202010-03-12%20at%207.54.47%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://moodstream.gettyimages.com/"&gt;&lt;img align="center"  src="http://lh6.ggpht.com/_ymDymKKKFj4/S5nKfd_LAhI/AAAAAAAAMNE/BYK-An8nEmA/s800/Screen%20shot%202010-03-12%20at%207.58.56%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Если есть интересные примеры визуализации, не поленитесь, поделитесь в комментариях.&lt;br /&gt;Удачной творческой пятницы вам.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-367420772874864409?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/367420772874864409/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=367420772874864409' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/367420772874864409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/367420772874864409'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/blog-post.html' title='Прекрасные примеры визуализации данных'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ymDymKKKFj4/S5nLK3D_LfI/AAAAAAAAMNQ/_kkMzO9Smtg/s72-c/Screen%20shot%202010-03-12%20at%208.02.55%20AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5999270952617734869</id><published>2010-03-11T20:13:00.002+03:00</published><updated>2010-03-11T20:18:00.756+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='serialization'/><category scheme='http://www.blogger.com/atom/ns#' term='gson'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>преобразование объектов Java в формат JSON и обратно</title><content type='html'>В поисках библиотеки для работы с JSON в Java, наткнулся на интересный проект &lt;a href="http://code.google.com/p/google-gson/"&gt;google-gson&lt;/a&gt;.&lt;br /&gt;В кратце, Gson - это Java библиотека, которая может быть использована для преобразования Java объектов в представление JSON, а так же для обратного преобразования JSON в объекты Java. Gson может работать с произвольными объектами Java, включая объекты к исходным кодам которых вы не имеете доступа.&lt;br /&gt;&lt;br /&gt;Существует несколько подобных проектов, но большинство из них требует размещения аннотаций в исходном коде, для того, чтобы была возможность сериализации в JSON, что является проблемой, когда доступа к исходным кодам нет.&lt;br /&gt;&lt;br /&gt;Основыми целями Gson являются:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;простота использования, методы toJson() и fromJson() для преобразования Java объектов в JSON и обратно;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;работа с уже существующими немодифицируемыми объектами, доступ к исходным кодам которых ограничен;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;широкая поддержка Java Generics&lt;/li&gt;&lt;br /&gt;&lt;li&gt;представление данных в виде ваших собственных объектов;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;поддержка произвольно сложных объектов (с глубокой иерархией наследования и с широким использованием общих типов)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Это все лирика, более подробно читайте на &lt;a href="http://code.google.com/p/google-gson/"&gt;сайте проекта&lt;/a&gt;, я вам просто приведу пример.&lt;br /&gt;За основу я возьму JSON из Twitter API, который возвращает текущие тренды в твиттере, выглядит этот JSON так:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;{&lt;br /&gt;&amp;nbsp; "as_of": "Thu, 11 Mar 2010 15:48:02 +0000",&lt;br /&gt;&amp;nbsp; "trends" :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"name": "#textsihate",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"url": "search.twitter.com/search?q=%23textsihate"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"name": "President Pinera's",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"url": "search.twitter.com/search?q=%22President+Pinera%27s%22"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Я обрезал JSON, всего возвращается 10 элементов trends, по &lt;a href="http://search.twitter.com/trends.json"&gt;этому адресу&lt;/a&gt; можно посмотреть весь код.&lt;br /&gt;Весьма несложная структура JSON выбрана для того, чтобы было проще понять, как эта библиотека работает.&lt;br /&gt;Теперь собственно к коду, который прочитает этот JSON, разберет его и вернет вам Java класс с полученным содержимым:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;package org.divenvrsk.gson.example;&lt;br /&gt;&lt;br /&gt;import com.google.gson.Gson;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.net.URL;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; GSonTest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; final &lt;font color="#2B91AF"&gt;String&lt;/font&gt; TWITTER_TRENDS_URL = &lt;font color="#A31515"&gt;"http://search.twitter.com/trends.json"&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; main(&lt;font color="#2B91AF"&gt;String&lt;/font&gt;[] argc) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer buffer = &lt;font color="#0000ff"&gt;null&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;try&lt;/font&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URL url = &lt;font color="#0000ff"&gt;new&lt;/font&gt; URL(TWITTER_TRENDS_URL);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader &lt;font color="#0000ff"&gt;in&lt;/font&gt; = &lt;font color="#0000ff"&gt;new&lt;/font&gt; BufferedReader(&lt;font color="#0000ff"&gt;new&lt;/font&gt; InputStreamReader(url.openStream()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2B91AF"&gt;String&lt;/font&gt; inputLine;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer = &lt;font color="#0000ff"&gt;new&lt;/font&gt; StringBuffer();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;while&lt;/font&gt; ((inputLine = &lt;font color="#0000ff"&gt;in&lt;/font&gt;.readLine()) != &lt;font color="#0000ff"&gt;null&lt;/font&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer.append(inputLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;in&lt;/font&gt;.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;catch&lt;/font&gt; (IOException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TwitterTrends trends = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Gson().fromJson(buffer.toString(), TwitterTrends.&lt;font color="#0000ff"&gt;class&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; counter = 0; counter &amp;#60; trends.getTrends().length; counter++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.&lt;font color="#0000ff"&gt;out&lt;/font&gt;.println(trends.getTrends(counter));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; TwitterTrends {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; as_of;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private&lt;/font&gt; Trends[] trends;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; getAs_of() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; as_of;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; setAs_of(&lt;font color="#2B91AF"&gt;String&lt;/font&gt; as_of) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;this&lt;/font&gt;.as_of = as_of;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; Trends[] getTrends() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; trends;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; Trends getTrends(&lt;font color="#0000ff"&gt;int&lt;/font&gt; counter) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; trends[counter];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; setTrends(Trends[] trends) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;this&lt;/font&gt;.trends = trends;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; toString() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#A31515"&gt;"Trends at "&lt;/font&gt; + as_of + &lt;font color="#A31515"&gt;". Count: "&lt;/font&gt; + trends.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; Trends {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; url;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; getName() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; setName(&lt;font color="#2B91AF"&gt;String&lt;/font&gt; name) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;this&lt;/font&gt;.name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; getUrl() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; url;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; setUrl(&lt;font color="#2B91AF"&gt;String&lt;/font&gt; url) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;this&lt;/font&gt;.url = url;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#2B91AF"&gt;String&lt;/font&gt; toString() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#A31515"&gt;"name: "&lt;/font&gt; + name + &lt;font color="#A31515"&gt;"; url: "&lt;/font&gt; + url;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Результатом выполнения этого кода, будет подобный список:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;name: #textsihate; url: http://search.twitter.com/search?q=%23textsihate&lt;br /&gt;name: #nowplaying; url: http://search.twitter.com/search?q=%23nowplaying&lt;br /&gt;name: #textihate; url: http://search.twitter.com/search?q=%23textihate&lt;br /&gt;name: #dontcallyourself; url: http://search.twitter.com/search?q=%23dontcallyourself&lt;br /&gt;name: Chile; url: http://search.twitter.com/search?q=Chile&lt;br /&gt;name: #justcausewecool; url: http://search.twitter.com/search?q=%23justcausewecool&lt;br /&gt;name: Betty White; url: http://search.twitter.com/search?q=%22Betty+White%22&lt;br /&gt;name: SXSW; url: http://search.twitter.com/search?q=SXSW+OR+%23sxsw&lt;br /&gt;name: Santiago; url: http://search.twitter.com/search?q=Santiago&lt;br /&gt;name: USGS; url: http://search.twitter.com/search?q=USGS&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Как видно из кода, всё что от вас требуется, это реализовать класс, который будет повторять структуру желаемого JSON и сгенерировать геттеры и сеттеры для всех объектов (класс TwitterTrends в нашем случае), затем вы получаете нужный вам JSON и вызываете метод fromJson(...) в качестве параметров указав источник данных и класс для сериализации:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;TwitterTrends trends = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Gson().fromJson(buffer.toString(), TwitterTrends.&lt;font color="#0000ff"&gt;class&lt;/font&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;И вуаля, у вас полноценный объект Java, с которым можно работать. К примеру, в случае с твиттером, где API стандартизировано и упорядочено, очень удобно вытаскивать данные таким способом, получая полноценный объект для работы, а не ворочая кучу строчек, как происходит в большинстве случаев. Так же, очень удобно формировать такой класс в коде, привести его к JSON и отправить POST в твиттер, не переживая за формат данных.&lt;br /&gt;&lt;br /&gt;В общем, мне пригодилась эта библиотека, может быть понравится и вам.&lt;br /&gt;Спасибо за внимание.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5999270952617734869?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5999270952617734869/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5999270952617734869' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5999270952617734869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5999270952617734869'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/java-json.html' title='преобразование объектов Java в формат JSON и обратно'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-2785390301254797866</id><published>2010-03-07T01:45:00.001+03:00</published><updated>2010-03-07T01:45:43.512+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='android api'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>различия между API Android SDK Platform</title><content type='html'>Когда я в двадцатый раз принялся искать какие пакеты в какой версии Android SDK были добавлены и в какой версии SDK появился тот или иной метод, я решил нарисовать себе табличку с этими самыми изменениями. Сказано - сделано. &lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/jzsUJddoQpZ0kXtwCfILcQ?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_ymDymKKKFj4/S5LUWn4D0KI/AAAAAAAAMHo/sQBQxjQ157A/s800/Android%20SDK%20Diff.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Немного о самом псевдографике-табличке:&lt;br /&gt; - охвачены изменения начиная с версии Android Platfrom SDK 1.5 (API Level 3) и вплоть до версии 2.1 (API Level 7);&lt;br /&gt; - на каждое изменение есть ссылка на описание в официальной документации;&lt;br /&gt; - указаны все вновь добавленные методы и интерфейсы со ссылками на их описание (я специально не стал указывать классы и интерфейсы, в которых лишь произошли изменения, чтобы не загромождать это дело);&lt;br /&gt; - если в пакете произошли важные изменения, но при этом не были добавлены новые методы, то такой пакет отмечен иконкой "восклицательный знак", чтобы привлечь ваше внимание.&lt;br /&gt;&lt;br /&gt;Визуально думаю будет понятнее:&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/qKJy2ra-f6z4-n0DS2Bvzw?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/S5LYawFEMcI/AAAAAAAAMII/Haht40fmeIM/s800/Screen%20shot%202010-03-07%20at%201.23.29%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Такая штука не идеальна, я понимаю, но мне очень экономит время при поиске соответствия "метод - версия SDK" и быстрому переходу к документации.&lt;br /&gt;&lt;br /&gt;Ссылки:&lt;br /&gt; - &lt;a href="http://divenvrsk.org/android/android_sdk_diff.pdf"&gt;PDF&lt;/a&gt; (2.7Mb, если кто-нибудь сожмет - буду благодарен);&lt;br /&gt; - &lt;a href="http://divenvrsk.org/android/android_sdk_diff.swf"&gt;Online Flash версия&lt;/a&gt; (1.8Mb).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-2785390301254797866?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/2785390301254797866/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=2785390301254797866' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2785390301254797866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/2785390301254797866'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/03/api-android-sdk-platform.html' title='различия между API Android SDK Platform'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ymDymKKKFj4/S5LUWn4D0KI/AAAAAAAAMHo/sQBQxjQ157A/s72-c/Android%20SDK%20Diff.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-8468402654519793681</id><published>2010-02-09T01:27:00.001+03:00</published><updated>2010-02-09T01:27:35.509+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='социальные сети'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>завтра Google начнет делать из Gmail социальную сеть?</title><content type='html'>Сервис &lt;a href="http://mail.google.com"&gt;Gmail&lt;/a&gt; станет следующим большим шагом Google в стройный ряд социальных ресурсов. Согласно сведениям &lt;a href="http://online.wsj.com/article/SB10001424052748703630404575053480962942848.html?mod=WSJ_Tech_LEADTop"&gt;The Wall Street Journal&lt;/a&gt;, популярный почтовый сервис скоро обзаведется дополнительными возможностями, такими как обмен контентом с друзьями и обновление статуса пользователя.&lt;br /&gt;&lt;br /&gt;Как отмечает WSJ, пользователи Gmail уже могут изменять свой статус, используя для этого чат встроенный в веб интерфейс Gmail. Сейчас, эта функция больше походит на статусы традиционных клиентов мгновенных сообщений, однако, после нового шага к социальной платформе, Gmail предоставит возможность просматривать единый список обновления статусов ваших друзей, отсортированный по времени добавления, как это происходит на &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; или в &lt;a href="https://twitter.com/"&gt;Twitter'е&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Обновление статусов будут происходить как непосредственно из Gmail, так и из ряда других сервисов. По мнению WSJ, принадлежащие Google сервисы &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; и &lt;a href="http://picasa.google.com/"&gt;Picasa&lt;/a&gt; так же будут интегрированы в эту систему. Несомненно, загадкой является то, будет ли эта система от Google поддерживать интеграцию с Twitter'ом и Facebook'ом.&lt;br /&gt;&lt;br /&gt;Если так, то новый сервис Google скорее будет походить на &lt;a href="http://www.tweetdeck.com/"&gt;TweetDeck&lt;/a&gt; или &lt;a href="http://seesmic.com/"&gt;Seesmic&lt;/a&gt;, т.е. будет просто агрегировать активность ваших друзей из различных социальных сервисов в одном месте, а так же предоставлять возможность обновлять статусы в этих службах непосредственно из Gmail. Если же нет, то новый сервис Gmail можно рассматривать, как серьезного конкурента Twitter'у и Facebook'у, учитывая многомиллионную аудиторию почтового сервиса от Google, приверженцы которого вполне могут создать социальный медиа сервис нового поколения.&lt;br /&gt;&lt;br /&gt;Как бы то ни было, проблема с Gmail заключается в том, что исторически так сложилось, что люди добавляются к вам в список контактов автоматически, исходя из того, с кем вы ведете переписку по почте. Следовательно, этот список контактов зачастую разительно отличается от ваших реальных друзей, пусть и в социальных сетях, где вы устанавливаете отношения непосредственно по собственному желанию.&lt;br /&gt;&lt;br /&gt;Иначе говоря, в списке ваших контактов в Gmail могут оказаться совсем не те люди, с которыми вам бы хотелось поделиться своими статусами, фотографиями или видео. Этот вопрос не следует упускать из виду при оценке нового сервиса Google, который, как мы надеемся, должен быть скоро анонсирован.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;тут перевод заканчивается и говорит переводчик:&lt;/b&gt;&lt;br /&gt;Подобные слухи ходили давно. Есть &lt;a href="http://www.orkut.com"&gt;Orkut&lt;/a&gt;, очень популярный в Бразилии; есть задатки социальных движений на YouTube и уж точно в &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt;. Осталось только по умному, рассудительно и не спеша, соединить это в единое целое. А уж рассудительности Google не занимать.&lt;br /&gt;Кто за?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-8468402654519793681?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/8468402654519793681/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=8468402654519793681' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8468402654519793681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/8468402654519793681'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/02/google-gmail.html' title='завтра Google начнет делать из Gmail социальную сеть?'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-3345924496087338535</id><published>2010-02-06T23:10:00.000+03:00</published><updated>2010-02-06T23:11:20.784+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='кобрин'/><title type='text'>сайт о Владимире Кобрине</title><content type='html'>Восстановил &lt;a href="http://cobrin.divenvrsk.org/"&gt;сайт о Владимире Кобрине&lt;/a&gt;, человеке, которого на Западе называли концептуалистом, основателем русского авангарда в научном кино. Если вы не видели его работ - вы многое потеряли.&lt;br /&gt;Если у вас есть дополнительная информация о Кобрине, сообщите мне. С миру по нитке.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-3345924496087338535?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/3345924496087338535/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=3345924496087338535' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3345924496087338535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/3345924496087338535'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/02/blog-post.html' title='сайт о Владимире Кобрине'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-933544560774802226</id><published>2010-02-05T22:39:00.001+03:00</published><updated>2010-02-05T22:39:33.877+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Новый интерфейс и навигация Facebook</title><content type='html'>Последние пару месяцев мы тестировали несколько разных вариантов дизайна домашней страницы и собирали статистику по самым используемым компонентам страницы. Сегодня, мы начали выкладывать последние обновления интерфейса и навигации, чтобы помочь вам в поиске того, что вы ищете на Facebook'е. Теперь вы можете получить мгновенный доступ к новостям и важной информации с помощью обновленного верхнего меню и навигационного меню слева.&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Оставайтесь в курсе событий с помощью верхнего меню&lt;/h5&gt;&lt;br /&gt;В верхнем меню вы найдете ваши последние уведомления, запросы и сообщения. К примеру, когда вы получите уведомление о том, что кто-то написал на вашей стене или отметил ваше фото - вы увидите как появится красный пузырек в левом углу, около строки поиска. Когда вы нажмете на эту иконку, вы увидите выпадающее меню со списком последний уведомлений.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos-d.ak.fbcdn.net/hphotos-ak-snc3/hs157.snc3/18459_328161741728_20531316728_4628102_864178_n.jpg" alt="image"/&gt;&lt;br /&gt;&lt;br /&gt;Ссылки на "Профиль" (Profile) и "Домашнюю страницу" (Home) теперь расположены в верхнем правом углу, рядом с меню "Аккаунт" (Account), которое включает в себя настройки приватности и функцию выхода из аккаунта.&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Исследуйте контент из левого меню&lt;/h5&gt;&lt;br /&gt;Левое меню теперь организовано так, чтобы упростить ваше общение с друзьями, а так же сделать удобной навигацию по контенту, добавленному вашими друзьями. Теперь вы можете получить доступ к сообщениям и другим основным функциям в одном месте, слева от вашей ленты новостей (News Feed).&lt;br /&gt;&lt;br /&gt;С помощью панели фотографий (Photos dashboard) вы можете просматривать недавние фотографии ваших друзей. Панель событий (Events dashboard) отображает список ваших грядущих событий, вместе с событиями, на которые обратили внимание ваши друзья. Панель друзей (Friends dashboard) поможет вам найти друзей, увидеть какие из друзей недавно обновили свои профили, а так же фильтровать ленту новостей (News Feed) из списка друзей (Friend Lists).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos-h.ak.fbcdn.net/hphotos-ak-snc3/hs157.snc3/18459_328183786728_20531316728_4628210_6680001_n.jpg" alt="image"/&gt;&lt;br /&gt;&lt;br /&gt;Так же, мы сделали чат (Chat) в меню слева более заметным с помощью отображения списка некоторых ваших друзей, которые находятся онлайн. Этот список не полный, он включает в себя тех людей, с которыми вы общаетесь чаще всего. Чтобы увидеть весь список ваших друзей, которые находятся онлайн, вы можете открыть панель чата в нижнем правом углу или нажать "Показать всех" (See All) внизу вашего левого меню.&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Взаимодействие с играми и приложениями&lt;/h5&gt;&lt;br /&gt;Вы упростили для вас поиск и взаимодействие с приложениями с новой панелью "Приложения и игры" (Applications and Games), доступной через ссылки "Приложения" (Applications) и "Игры" (Games) на домашней странице. Панель отображает приложения, которые вы используете чаще всего, а так же приложения, которые вы и ваши друзья недавно использовали.&lt;br /&gt;&lt;br /&gt;Вы так же увидите счетчик приложений, которые вы добавили в закладки на своей домашней странице. Счетчики будут уведомлять вас о каких-либо действиях, которые вы должны выполнить, так что теперь вы никогда не пропустите свой ход в игре или какое-либо уведомление от друга в приложении.&lt;br /&gt;&lt;br /&gt;Вы можете занести в закладки ваши любимые приложения используя кнопку "Добавить закладку" (Add Bookmark) в приложении, тем самым вы сможете перейти в приложение одним кликом из левого меню под панелью "Приложения и игры" (Applications and Games). Нажмите ссылку "Еще" (More), чтобы увидеть список всех ваших последних закладок.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos-c.ak.fbcdn.net/hphotos-ak-snc3/hs137.snc3/18459_328187581728_20531316728_4628216_2185588_n.jpg" alt="image"/&gt;&lt;br /&gt;&lt;br /&gt;На панеле "Приложения и игры" (Applications and Games) присутствует еще одна возможность получения персональных уведомлений из приложений. Новые уведомления будут появляться рядом с панелью приложений с таким текстом как "Почисти Stinky" (Clean Stinky) из приложения Pet Society или "Джо только что побил ваш рекорд" из Bejeweled Blitz.&lt;br /&gt;&lt;br /&gt;Мы считаем, что обмен информацией о приложениях, которые вы используете, помогает вам и ваших друзьям обмениваться опытом. В тоже время, мы твердо уверены, что контроль является важным элементом при обмене информацией в Facebook. Именно поэтому эти новые возможности можно включить только с помощью настроек приватности (Privacy Settings).&lt;br /&gt;Т.е. если вы не хотите, чтобы вашим друзьям были доступны последние новости и уведомления о ваших последних действиях в приложениях, вы всегда можете изменить эти настройки в &lt;a href="http://www.facebook.com/settings/?tab=privacy&amp;section=applications"&gt;свойствах приватности (Privacy Settings)&lt;/a&gt;. Мы так же работает над более детальным контролем для отдельных приложений, так, чтобы вы могли включать и отключать эти функции для отдельных приложений, а не для всех сразу. В скором времени мы опубликуем дополнительную информацию по этому поводу.&lt;br /&gt;&lt;br /&gt;Мы надеемся, что упрощенный дизайн вашей домашней странички поможет вам больше и проще общаться с людьми, использовать приложения и просматривать последние обновления, которые важны для вас. Чтобы узнать больше о новом дизайне, вы можете использовать &lt;a href="http://www.facebook.com/sitetour/homepage.php"&gt;тур по сайту&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Тут перевод заканчивается и начинает говорить переводчик.&lt;/b&gt;&lt;br /&gt;Далеко не все сервера уже обновились, что значит новый интерфейс доступен еще не всем пользователям Facebook. Обещают обновить все сервера через пару дней. У меня тоже еще не обновился.&lt;br /&gt;Как и водится, многим пришлось не по вкусе изменение &lt;i&gt;привычного&lt;/i&gt;, поэтому Facebook кишит группами, типа "&lt;a href="http://www.facebook.com/group.php?v=info&amp;ref=search&amp;gid=143958055205"&gt;We Hate The New Facebook Design!!!&lt;/a&gt;". Но исходя из того, что я прочитал и что увидел, дизайн стал чуть лучше, а навигация и того похорошела. Ждем когда все обновится.&lt;br /&gt;&lt;s&gt;Целую&lt;/s&gt;. Всего хорошего!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-933544560774802226?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/933544560774802226/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=933544560774802226' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/933544560774802226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/933544560774802226'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/02/facebook.html' title='Новый интерфейс и навигация Facebook'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-1992785008615573829</id><published>2010-02-04T12:02:00.002+03:00</published><updated>2010-02-04T12:04:40.473+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Blogger разрешил создавать статические странички</title><content type='html'>Теперь вы можете добавить к блогу статические странички с описанием блога или портфолио, да с чем захотите.&lt;br /&gt;Инструкция &lt;a href="http://buzz.blogger.com/2010/02/create-pages-in-blogger.html"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-1992785008615573829?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/1992785008615573829/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=1992785008615573829' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1992785008615573829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1992785008615573829'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/02/blogger.html' title='Blogger разрешил создавать статические странички'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5305747885307918155</id><published>2010-02-02T09:56:00.000+03:00</published><updated>2010-02-02T09:57:00.593+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='производительность'/><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Производительность автоматически сгенирированных методов доступа в Core Data</title><content type='html'>В Mac OS X 10.5, &lt;i&gt;&lt;a href="http://developer.apple.com/macosx/coredata.html"&gt;CoreData&lt;/a&gt;&lt;/i&gt; фреймворк перешел от использования метода &lt;i&gt;valueForKey:&lt;/i&gt;, как рекомендованного способа доступа к атрибутам CoreData, к методу с автоматически генерируемыми методами доступа. Этот новый подход хорош для быстрого получения значений переменных, но проигрывает &lt;i&gt;NSKeyValueCoding&lt;/i&gt; с его возможностью объединения значений, извлеченных из каждого объекта со связями "to-many", путем вызова одного метода.&lt;br /&gt;&lt;br /&gt;В этой статье я рассмотрю возможность замены методов NSKeyValueCoding по обходу и объединению NSSet на вызовы автоматически сгенированных методов доступа к полям, чтобы сравнить производительность нового и старого методов.&lt;br /&gt;&lt;habracut /&gt;&lt;br /&gt;&lt;h4&gt;Доступ к атрибутам и связям NSManagedObject&lt;/h4&gt;&lt;br /&gt;Давайте рассмотрим вопрос производительности в приложениях CoreData, используя следующую модель:&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/DTiJVR0K6vCMpxPD9CfkKQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_ymDymKKKFj4/S2exqL-dJFI/AAAAAAAAKgA/RjeBnHEsTig/s800/modelentities.png" /&gt;&lt;/a&gt;&lt;br /&gt;Если вы не знакомы с диаграммами CoreData, то важным моментом здесь является то, что каждая &lt;i&gt;Company&lt;/i&gt; может иметь несколько &lt;i&gt;Project&lt;/i&gt; и каждый &lt;i&gt;Project&lt;/i&gt; может иметь несколько &lt;i&gt;Employee&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;С учетом этой модели, если у меня есть указатель, &lt;i&gt;aCompany&lt;/i&gt;, который указывает на один из объектов &lt;i&gt;Company&lt;/i&gt;, получить название компании довольно просто:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSString *companyName = aCompany.name;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Доступ к &lt;i&gt;name&lt;/i&gt; здесь осуществляется с помощь автоматически генерируемых методов доступа, которые &lt;i&gt;NSManagedObject&lt;/i&gt; предоставляет для нас.&lt;br /&gt;&lt;br /&gt;До Mac OS X 10.5, единственным способом доступа к значениям полей в Core Data было использование метода &lt;a href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/KeyValueCoding.html"&gt;Key Value Coding&lt;/a&gt; "ключ-значение" (key-value):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSString *companyName = [aCompany valueForKey:&lt;font color="#A31515"&gt;@"name"&lt;/font&gt;];&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Так почему же решили уйти от использования метода "ключ-значение"? Основной причиной является производительность (хотя улучшился и синтаксис, и безопасность типов). Извлечение переменной миллион раз при использовании метода "ключ-значение" занимает 0.284016 секунд, а использование автоматически генерируемых методов доступа занимает 0.109017 секунд, что в 2,6 раза быстрее.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Обход значений&lt;/h4&gt;&lt;br /&gt;Но метод "ключ-значение" (старый метод) имеет одно важное преимущество перед автоматически сгенерированными методами: он очень быстр при обходе набора данных со связями "to-many".&lt;br /&gt;&lt;br /&gt;Например, если я хочу получить полный набор имен &lt;i&gt;Project&lt;/i&gt; используемых &lt;i&gt;aCompany&lt;/i&gt;, то с Key Value Coding я могу сделать это очень легко:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSSet *projectNames = [aCompany valueForKeyPath:&lt;font color="#A31515"&gt;@"projects.name"&lt;/font&gt;];&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Это сработает, потому что реализация &lt;i&gt;NSSet&lt;/i&gt; из &lt;i&gt;NSKeyValueCoding&lt;/i&gt; умеет автоматически обходить себя, чтобы получить имена для каждого объекта &lt;i&gt;Project&lt;/i&gt;, который она содержит.&lt;br /&gt;&lt;br /&gt;Эквивалентом с использованием методов доступа было бы:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSMutableSet *result = [NSMutableSet &lt;font color="#0000ff"&gt;set&lt;/font&gt;];&lt;br /&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (Project *project &lt;font color="#0000ff"&gt;in&lt;/font&gt; aCompany.projects)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSString *name = project.name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#0000ff"&gt;value&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[result addObject:&lt;font color="#0000ff"&gt;value&lt;/font&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Нам потребовалось не только написать больше кода, чем при использовании метода "ключ-значение", но и этот метод действительно медленнее. Для 10000 объектов &lt;i&gt;Company&lt;/i&gt;, каждый из которых содержит 100 объектов &lt;i&gt;Project&lt;/i&gt;, обход с использованием метода "ключ-значение" займет 0,25692 секунды, а подход, с использованием автоматически сгенерированных методово доступа, занимает 0,52873 секунды.&lt;br /&gt;&lt;br /&gt;Новый и усовершенствованный подход прошел свой путь от "в 2,6 раза быстрее", в случае с доступом к полю, к "2 раза медленнее", в случае с обходом множества полей приведенным выше.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Исправление проблем со скоростью&lt;/h4&gt;&lt;br /&gt;&lt;h5&gt;Старый метод все еще быстрее&lt;/h5&gt;&lt;br /&gt;Прежде чем я объясню, почему новый метод медленнее, важно понять, что метод "ключ-значение" на самом деле быстрее при использовании обхода набора данных. Несмотря на дополнительную работу, связанную с обходом полей &lt;i&gt;Company&lt;/i&gt; в &lt;i&gt;Project&lt;/i&gt; и помещением значений в &lt;i&gt;NSSet&lt;/i&gt;, метод "ключ-значение" потратил лишь 0,25692 секунды, что извлечь один миллион имен из &lt;i&gt;Project&lt;/i&gt;, по сравнению с 0,284016 секунд затраченных на извлечение одного миллиона имен &lt;i&gt;Company&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Это не глюк, и, несмотря на больший объем работы, при использовании метода "ключ-значение" производительность заметно увеличивается при множестве внутренних итераций (в рамках пути по ключу), а не извне (как я делал при переборе более одного миллиона объектов &lt;i&gt;Company&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Несмотря на заметные улучшения, мы должны таки побить &lt;i&gt;Key Value Coding&lt;/i&gt;, используя наш подход с автоматически генерируемыми методами доступа, но разница в производительности будет незначительно менее эффективной, чем это было при итерации &lt;i&gt;aCompany.name&lt;/i&gt;...&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Исправление проблем с новым методом&lt;/h4&gt;&lt;br /&gt;Простой профайлинг быстро обнаруживает, что имеющиеся здесь проблемы имеют мало общего с методами доступа к объектам. Медленная скорость в первую очередь объясняется вызовом &lt;i&gt;addObject:&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Посмотрев на вызов private методов стека в профайлере, стало ясно, что причиной всех проблем является перераспределение данных. Каждый раз, когда &lt;i&gt;NSMutableSet&lt;/i&gt; необходимо увеличится в размерах, происходит перераспределение памяти, что и приводит к низкой производительности.&lt;br /&gt;&lt;br /&gt;Мы можем предварительно выделить память для всего набора данных на основе наибольшего размера (подразумевая, что все имена &lt;i&gt;Project&lt;/i&gt; уникальны). Наш код становится таким:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSSet *projects = aCompany.projects;&lt;br /&gt;NSMutableSet *result = [NSMutableSet setWithCapacity:[projects count]];&lt;br /&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (Project *project &lt;font color="#0000ff"&gt;in&lt;/font&gt; projects)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSString *name = project.name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#0000ff"&gt;value&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[result addObject:&lt;font color="#0000ff"&gt;value&lt;/font&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Победа! Эта версия работает за 0,19104 секунд (по сравнению с полученными ранее 0,52873 секунд), что на 25% быстрее, чем подход с использованием метода "ключ-значение".&lt;br /&gt;&lt;br /&gt;Уже не в 2,6 раза быстрее, но реализация Key Value Coding в NSSet имеет ряд преимуществ: поскольку имеется внутренний доступ к хранилищу, NSSet может оптимизировать итерации со связами "to-many" и, соответственно, может создавать новые наборы данных быстрее, чем мы.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Реализация категории&lt;/h4&gt;&lt;br /&gt;(&lt;a href="http://macdevelopertips.com/objective-c/objective-c-categories.html"&gt;Category&lt;/a&gt; (категория). Objective-C позволяет очень просто расширять функциональность имеющихся классов. Он поддерживает так называемые категории, которые позволяют модифицировать существующие классы «на месте». С помощью категорий можно добавить требуемую функциональность, не внося в них изменений и даже вообще не имея доступа к исходному коду существующих классов).&lt;br /&gt;Для повторного использования этого подхода в будущем, мы можем реализовать категории для NSSet.&lt;br /&gt;&lt;br /&gt;Там будет два метода:&lt;br /&gt;&lt;br /&gt; * objectValuesForProperty:&lt;br /&gt; * coalescedValuesForProperty:&lt;br /&gt;&lt;br /&gt;Первый будет осуществлять упомянутое в примере выше (где NSSet содержит основные объекты).&lt;br /&gt;&lt;br /&gt;Второй будет реплицировать оператор Key Value Coding &lt;i&gt;@distinctUnionOfSets&lt;/i&gt; (обрабатывать случай, когда NSSet содержит &lt;i&gt;NSSet&lt;/i&gt; и нужно объединять объекты внутри множества).&lt;br /&gt;&lt;br /&gt;Примером второго метода будет получение всех объектов &lt;i&gt;Employee&lt;/i&gt; в &lt;i&gt;Company&lt;/i&gt;. В случае использования Key Value Coding мы должны написать:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSSet *allEmployees = [aCompany valueForKeyPath:&lt;font color="#A31515"&gt;@"projects.@distinctUnionOfSets.employees"&lt;/font&gt;];&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;С методом coalescedValuesForProperty:, мы можем написать:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSSet *allEmployees = [aCompany.projects coalescedValuesForProperty:@selector(employees)];&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Реализация:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;#import &amp;#60;objc/message.h&amp;#62;&lt;br /&gt;&lt;br /&gt;@implementation NSSet (PropertyCoalescing)&lt;br /&gt;&lt;br /&gt;- (NSSet *)objectValuesForProperty:(SEL)propertySelector&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSMutableSet *result = [NSMutableSet setWithCapacity:[self count]];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (id &lt;font color="#0000ff"&gt;object&lt;/font&gt; &lt;font color="#0000ff"&gt;in&lt;/font&gt; self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id &lt;font color="#0000ff"&gt;value&lt;/font&gt; = objc_msgSend(&lt;font color="#0000ff"&gt;object&lt;/font&gt;, propertySelector);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#0000ff"&gt;value&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[result addObject:&lt;font color="#0000ff"&gt;value&lt;/font&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (NSSet *)coalescedValuesForProperty:(SEL)propertySelector&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSInteger count = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (id &lt;font color="#0000ff"&gt;object&lt;/font&gt; &lt;font color="#0000ff"&gt;in&lt;/font&gt; self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += [objc_msgSend(&lt;font color="#0000ff"&gt;object&lt;/font&gt;, propertySelector) count];&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSMutableSet *result = [NSMutableSet setWithCapacity:count];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (id &lt;font color="#0000ff"&gt;object&lt;/font&gt; &lt;font color="#0000ff"&gt;in&lt;/font&gt; self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id &lt;font color="#0000ff"&gt;value&lt;/font&gt; = objc_msgSend(&lt;font color="#0000ff"&gt;object&lt;/font&gt;, propertySelector);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#0000ff"&gt;value&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[result unionSet:&lt;font color="#0000ff"&gt;value&lt;/font&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;С методом coalescedValuesForProperty: мы перебираем набор данных дважды, чтобы получить размер, но это по-прежнему самый быстрый вариант - на самом деле, этот метод примерно на 35% быстрее, чем при использовании Key Value Coding. В сравнении с objectValuesForProperty: прирост производительности составит 25%.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Заключение&lt;/h4&gt;&lt;br /&gt;По просьбе читателей, вот код, который я использовал в тестировании: &lt;a href="http://projectswithlove.com/projects/PropertyAccessors.zip"&gt;PropertyAccessors.zip&lt;/a&gt; (32kB). Это наспех написанный код для этой заметки, так что код не очень хорошо написан, но он есть, если он вам нужен.&lt;br /&gt;&lt;br /&gt;Я написал этот код и провел тесты производительности, потому что у меня много кода, который использует Key Value Coding для обхода данных с отношениями "to-many". Я был обеспокоен тем, что CoreData предлагает использовать автоматически генерируемые методы доступа из соображений производительности и мои методы с использованием "ключ-значение" будут значительно медленнее в этих случаях, чем следовало бы.&lt;br /&gt;&lt;br /&gt;Результатом является то, что производительность Key Value Coding для обхода набора данных в CoreData дает прирост производительности лишь 25-35%, а не на 260% в сравнении с заменой Key Value Coding на использование индивидуального доступа к свойствам объекта. Key Value Coding достаточно эффективен при работе с наборами данных - безусловно, более эффективен, чем доступ к уникальным полям.&lt;br /&gt;&lt;br /&gt;Безусловно, улучшение производительности на 35% будет полезным в критически важных участках кода.&lt;br /&gt;&lt;br /&gt;Что касается непосредственно реализации: не стоит недооценивать влияния на производительность фактора перераспределения памяти. Постоянный растущий с помощью &lt;i&gt;addObject: NSSet&lt;/i&gt; работает в 3 раза медленнее, чем если бы вы выделили память на весь набор данных сразу.&lt;br /&gt;&lt;br /&gt;Удобно заранее выделить память для &lt;i&gt;NSMutableSet&lt;/i&gt;, чтобы вместить все объекты, но, если не все объекты будут уникальными, то вы выделите больше памяти, чем требуется. Если лишняя трата памяти имеет для вас значение, вы можете скопировать множество в момент его создания. Копия будет такого размера, как вам требуется и вы сможете удалить из памяти оригинал. Недостатком такого меода является то, что процесс копирования добавит еще 10-15% ко времени исполнения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5305747885307918155?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5305747885307918155/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5305747885307918155' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5305747885307918155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5305747885307918155'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/02/core-data.html' title='Производительность автоматически сгенирированных методов доступа в Core Data'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ymDymKKKFj4/S2exqL-dJFI/AAAAAAAAKgA/RjeBnHEsTig/s72-c/modelentities.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-7215745918035608163</id><published>2010-02-01T13:25:00.002+03:00</published><updated>2010-02-01T13:27:19.609+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='всякая фигня'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>потоки сознания в Java</title><content type='html'>люблю когда if (true &amp;&amp; false)&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;class&lt;/span&gt; True &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;static&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;boolean&lt;/span&gt; aha&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;static&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; main&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;String&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt; argc&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;new&lt;/span&gt; Thread&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; run&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#800000; font-weight:bold; '&gt;while&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;true&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;                    aha &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#808030; '&gt;!&lt;/span&gt;aha&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;start&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;while&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;true&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;aha &lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt;&lt;span style='color:#808030; '&gt;&amp;amp;&lt;/span&gt; &lt;span style='color:#808030; '&gt;!&lt;/span&gt;aha&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"AHAA!!! "&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; aha &lt;span style='color:#808030; '&gt;+&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;":"&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; aha&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;    &lt;br /&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-7215745918035608163?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/7215745918035608163/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=7215745918035608163' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7215745918035608163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/7215745918035608163'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/02/java.html' title='потоки сознания в Java'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-5831455319222264369</id><published>2010-01-30T15:08:00.004+03:00</published><updated>2010-01-30T15:11:16.441+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='hotkeys'/><title type='text'>Twitter Hotkeys</title><content type='html'>С удивлением обнаружил, что в веб интерфейсе Твиттера работают горячие клавиши (во всяком случае в Safari под Mac'ом). Стало в разы удобнее.&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Q6zBxsNcDvNu8pg80j7r4g?authkey=Gv1sRgCI3uqdTfhLHRcg&amp;feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/S2QhiQ10W-I/AAAAAAAAKfA/IWG5h8Stx9U/s800/Twitter%20Hotkeys.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PDF &lt;a href="http://files.me.com/artyom.loenko/o2uezh"&gt;тут&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-5831455319222264369?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/5831455319222264369/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=5831455319222264369' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5831455319222264369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/5831455319222264369'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/01/twitter-hotkeys.html' title='Twitter Hotkeys'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ymDymKKKFj4/S2QhiQ10W-I/AAAAAAAAKfA/IWG5h8Stx9U/s72-c/Twitter%20Hotkeys.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-4970658780862444834</id><published>2010-01-30T12:23:00.002+03:00</published><updated>2010-01-30T12:27:06.405+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='техническая литература'/><category scheme='http://www.blogger.com/atom/ns#' term='книги'/><title type='text'>техническая литература в Санкт-Петербурге</title><content type='html'>Товарищи, а давайте организуем небольшой клуб по поиску, обмену, покупке и продаже технической литературы в Санкт-Петербурге.&lt;br /&gt;Книги валяются наверняка у всех и наверняка какую то книгу найти вы не можете, так давайте поможем друг другу. Техническая литература такая штука непостоянная, устаревает очень быстро, а после прочтения ряда книг вы частенько к ним больше не возвращаетесь.&lt;br /&gt;В общем, кто за, добро пожаловать в ненавистный вконтакт &lt;a href="http://vkontakte.ru/club14986489"&gt;http://vkontakte.ru/club14986489&lt;/a&gt;.&lt;br /&gt;Спасибо за внимание.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-4970658780862444834?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/4970658780862444834/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=4970658780862444834' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/4970658780862444834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/4970658780862444834'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/01/blog-post_30.html' title='техническая литература в Санкт-Петербурге'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-6755244990701364947</id><published>2010-01-29T07:46:00.001+03:00</published><updated>2010-01-29T16:22:32.775+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='vkontakte'/><category scheme='http://www.blogger.com/atom/ns#' term='мистика'/><title type='text'>«количество дебилов в России» или Яндекс наносит ответный удар</title><content type='html'>Многие помнят &lt;a href="http://habrahabr.ru/blogs/yandex/80975/"&gt;недавний топик&lt;/a&gt; о том, как Яндекс не очень адекватно реагирует на всевозможные запросы легкого характера и пытается рассказать нам о социальной сети &lt;a href="http://vkontakte.ru/"&gt;Вконтакте&lt;/a&gt;. История получает свое продолжение. И продолжение надо сказать очень странное.&lt;br /&gt;В настоящий момент, по всем тем поисковым запросам, что обсуждались в прошлом топике, никаких Вконтакте вы не увидите. Более того, вы не увидите в выдаче даже Хабрахабра. По порядку:&lt;br /&gt;&lt;br /&gt; 1. Первый запрос, с которого все началось "количество дебилов в России". Яндекс нам уже не советует Вконтакте, но и не видит очевидного, а точнее Хабрахабра с его высоким PR: &lt;a href="http://yandex.ru/yandsearch?text=количество+дебилов+в+россии&amp;lr=2&amp;stpar2=%2Fh1%2Ftm9%2Fs2&amp;stpar4=%2Fs2"&gt;Яндекс&lt;/a&gt;, &lt;a href="http://www.google.ru/search?hl=ru&amp;source=hp&amp;q=количество+дебилов+в+россии&amp;btnG=Поиск+в+Google&amp;lr=&amp;aq=f&amp;oq="&gt;Google&lt;/a&gt;, &lt;a href="http://www.bing.com/search?q=количество+дебилов+в+россии&amp;go=&amp;form=QBLH&amp;filt=all"&gt;Bing&lt;/a&gt;, &lt;a href="http://search.yahoo.com/search?p=количество+дебилов+в+россии&amp;toggle=1&amp;cop=mss&amp;ei=UTF-8&amp;fr=yfp-t-701"&gt;Yahoo&lt;/a&gt;. А вот Google, Bing и даже Yahoo на Хабрахабр внимание обращают, как на очевидное;&lt;br /&gt; 2. Другие поисковые запросы Яндексу, которые обсуждались ранее, тоже не приводят нас к результату выдачи с Вконтакте: &lt;a href="http://yandex.ru/yandsearch?text=количество+самых+тупых+в+россии&amp;lr=2&amp;stpar2=%2Fh0%2Ftm0%2Fs1&amp;stpar4=%2Fs1"&gt;количество самых тупых в россии&lt;/a&gt;, &lt;a href="http://yandex.ru/yandsearch?text=количество+чего-то+в+России&amp;lr=2"&gt;количество чего-то в России&lt;/a&gt;, &lt;a href="http://yandex.ru/yandsearch?text=самые+нормальные+девушки+в+России&amp;lr=2"&gt;самые нормальные девушки в России&lt;/a&gt;, &lt;a href="http://yandex.ru/yandsearch?text=всякая+фигня+и+лажа+в+России&amp;lr=2"&gt;всякая фигня и лажа в России&lt;/a&gt;. Более того, эти запросы так же не расскажут нам ничего о Хабрахабре, хотя тот же Google в большинстве случаев ставит Хабр на первое место в выдаче;&lt;br /&gt; 3. Запрос же &lt;a href="http://yandex.ru/yandsearch?text=количество+друзей+в+России&amp;lr=2&amp;stpar2=%2Fh1%2Ftm7%2Fs2&amp;stpar4=%2Fs2"&gt;количество друзей в России&lt;/a&gt; приведет нас к Вконтакте. Видимо его посчитали таки политически верным?&lt;br /&gt;&lt;br /&gt;И лирика. Понятно, что произошло это не просто так, а явно что-то изменилось. Только вот что изменилось? Если так работал так называемый AI поискового робота, то зачем было так все резать и кромсать? Если это была ошибка, то куда пропал из выдачи Хабрахабр, после того как ошибку поправили? &lt;br /&gt;&lt;br /&gt;В прошлый раз в комментариях довольно много было высказано версий происходящего, а есть версии теперь?&lt;br /&gt;Вы хотите об этом поговорить? Еще как.&lt;br /&gt;&lt;br /&gt;вот &lt;a href="http://habrahabr.ru/blogs/yandex/82436/#comment_2448052"&gt;ответ&lt;/a&gt; появился на тему происходящего от Ильи Сегаловича из Яндекса:&lt;br /&gt;"Во-первых хабр есть в выдаче (на первой странице), и это нормально — тема сама по себе почти не существует, а вот обсуждение обработки запроса Яндексом на Хабре — вполне заметная вещь&lt;br /&gt;&lt;br /&gt;Во-вторых, мы конечно отрабатываем баги, но не ручной правкой выдачи, которой в Яндексе не существует и никогдо не существовало (нам бы пришлось перестать работать, есть, пить и спать, увеличить штат вдесятеро и забыть свои семьи, но и тогда мы бы не справились) — а анализом факторов и обнаружением причин (глубоких) ошибки. &lt;br /&gt;&lt;br /&gt;В данном случае мы нашли ошибку в комбинированном факторе (мономе), сочетающем анализ текста и ссылок, внесли в него исправление: от баг-репорта (17-е число) до исправления (в четверг на прошлой недели) прошло примерно 4 дня, нам вполне хватило этого времени. &lt;br /&gt;&lt;br /&gt;Кстати по этому запросу вконтакте не исчез, он опустился но не пропал.&lt;br /&gt;&lt;br /&gt;(и кстати не все так уж замечтельно, есть еще запросы в которых есть проблемы)&lt;br /&gt;&lt;br /&gt;С уважением,"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-6755244990701364947?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/6755244990701364947/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=6755244990701364947' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6755244990701364947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/6755244990701364947'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/01/blog-post_29.html' title='«количество дебилов в России» или Яндекс наносит ответный удар'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-1220422048094990338</id><published>2010-01-28T08:30:00.000+03:00</published><updated>2010-01-28T08:31:55.544+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='go'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>поддержка языка программирования Go будет включена в GCC</title><content type='html'>&lt;img src="http://golang.org/doc/logo-153x55.png" alt="image" align="left"/&gt;Проект &lt;a href="http://gcc.gnu.org/"&gt;GCC&lt;/a&gt; объявил, что gccgo фронтенд (для нового языка программирования от &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt; с гордым именем &lt;a href="http://golang.org/"&gt;Go&lt;/a&gt;) был принят в мейнстрим.&lt;br /&gt;&lt;br /&gt;Вот, что пишет &lt;a href="http://alumnus.caltech.edu/~dje/"&gt;David Edelsohn&lt;/a&gt; &lt;a href="http://lwn.net/Articles/371466/"&gt;на LWN&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"Я рад объявить, что комитет по управлению GCC разрешил принять фронтенд gccgo и среду исполнения gccgo для языка программирования Go. В качестве ведущего разработчика выступает &lt;a href="http://www.airs.com/ian/"&gt;Ian Taylor&lt;/a&gt;. Менеджеры GCC занимающиеся релизами сообщат позже дополнительную информацию о времени объединения веток и включении в GCC 4.5 или в более позднюю версию.&lt;br /&gt;&lt;br /&gt;Присоединяйтесь в моих поздравлениях в адрес Яна и разработчиков языка программирования Go. &lt;br /&gt;&lt;br /&gt;Happy Hacking!&lt;br /&gt;Дэвид"&lt;br /&gt;&lt;br /&gt;Очень быстро и очень неожиданно.&lt;br /&gt;Новость на &lt;a href="http://lwn.net/Articles/371466/"&gt;LWN&lt;/a&gt;. В комментариях к новости уже зарождаются интересные споры.&lt;br /&gt;О самом языке уже &lt;a href="http://habrahabr.ru/blogs/google/75012/"&gt;тут писали&lt;/a&gt; и рассказывали об &lt;a href="http://habrahabr.ru/blogs/google/75025/"&gt;использовании и установке&lt;/a&gt;.&lt;br /&gt;Версии для Windows так и &lt;a href="http://golang.org/doc/install.html#tmp_33"&gt;не появилось&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hack the Planet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6635779609176750930-1220422048094990338?l=blog.divenvrsk.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.divenvrsk.org/feeds/1220422048094990338/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6635779609176750930&amp;postID=1220422048094990338' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1220422048094990338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6635779609176750930/posts/default/1220422048094990338'/><link rel='alternate' type='text/html' href='http://blog.divenvrsk.org/2010/01/go-gcc.html' title='поддержка языка программирования Go будет включена в GCC'/><author><name>Artyom Loenko</name><uri>https://profiles.google.com/104777627359132965604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-NFwkcYQPLo0/AAAAAAAAAAI/AAAAAAAANg8/aLo-YWL6124/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6635779609176750930.post-6706880500206255077</id><published>2010-01-27T07:14:00.000+03:00</published><updated>2010-01-27T07:15:46.979+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>просто о Objective-C</title><content type='html'>просто об Objective-C&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Немного истории&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Как-то за завтраком, &lt;a href="http://www.virtualschool.edu/cox/"&gt;Brad Cox&lt;/a&gt; решил, что настало время, чтобы мир двинулся в сторону более модульного стиля написания программ. Язык программирования &lt;a href="http://ru.wikipedia.org/wiki/Си_(язык_программирования)"&gt;Си&lt;/a&gt; был популярным и мощным языком. &lt;a href="http://ru.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt; был элегантным объекто-ориентированным языком с динамической типизацией. Brad Cox начал с того, что добавил в Си Smalltalk-like классы и механизмы отправки сообщений объектам. В результате, Objective-C - это очень простое расширение языка программирования Си. По факту же, Objective-C - это просто оригинальный Си предпроцессор и библиотека.&lt;br /&gt;Objective-C не пропиетарный язык программирования. Это открытый стандарт, включенный в Free Software Foundation's GNU C компилятор (gcc) уже долгое время. Cocoa разработан с помощью Objective-C и большинство его кода написано именно на Objective-C.&lt;br /&gt;Подробнее же, можно почитать в &lt;a href="http://ru.wikipedia.org/wiki/Objective-C"&gt;википедии&lt;/a&gt;. А у нас задача иная, нам нужно разобраться в основах, которые помогут нам при написании приложений с использованием Cocoa.&lt;br /&gt;Эта заметка не будет широкой вводной в Objective-C, я постараюсь охватить то, что поможет вам понимать и писать элементарное с помощью Cocoa, поэтому я сознательно не буду описывать глубоко - отправляю вас к документации по Objective-C.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Создание и использование объектов&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Вы должны понимать как минимум то, что классы используются для того, чтобы создавать объекты, объекты имеют методы и вы можете посылать объекту сообщения, вызывая соответствующие методы. &lt;br /&gt;Для примера, мы будем использовать класс &lt;b&gt;NSMutableArray&lt;/b&gt;. Вы можете создать экземпляр &lt;strong&gt;NSMutableArray&lt;/strong&gt; послав сообщение &lt;strong&gt;alloc&lt;/strong&gt;, вот так:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;[NSMutableArray alloc];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Вызод метода &lt;strong&gt;alloc&lt;/strong&gt; вернет вам указатель на память, которая была выделена для объекта. Вы можете присвоить полученный указатель на объект переменной вот так:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSMutableArray *foo;&lt;br /&gt;foo = [NSMutableArray alloc];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Когда вы работаете с Objective-C, важно помнить, что переменная &lt;em&gt;foo&lt;/em&gt; это всего лишь указатель (ссылка). В нашем случае, указатель, который ссылается на объект.&lt;br /&gt;Перед тем, как вы сможете использовать объект, на который ссылается &lt;em&gt;foo&lt;/em&gt;, вы должны убедиться, что объект целиком проинициализирован. За инициализацию отвечает метод &lt;strong&gt;init&lt;/strong&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSMutableArray *foo;&lt;br /&gt;foo = [NSMutableArray alloc];&lt;br /&gt;[foo init];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Посмотрите на последнюю строку кода, она посылает сообщение &lt;strong&gt;init&lt;/strong&gt; объекту на который ссылается &lt;em&gt;foo&lt;/em&gt;. Формат отправки сообщения состоит в простейшем случае из получателя (в нашем случае это объект &lt;em&gt;foo&lt;/em&gt;) и собственно соощения (init). Как вы заметили на примере выделения памяти для NSMutableArray (init), сообщения можно отправлять и классам.&lt;br /&gt;Метод &lt;strong&gt;init&lt;/strong&gt; вернет полностью проинициализированный объект. Создание и инициализацию объекта можно сократить до двух строчек:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSMutableArray *foo;&lt;br /&gt;foo = [[NSMutableArray alloc] init];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Многие методы могут содержать дополнительные аргументы. К примеру, чтобы добавить объект в конец массива, вы вызываете метод &lt;strong&gt;addObject:&lt;/strong&gt; (подразумевается, что &lt;em&gt;bar&lt;/em&gt; - это указатель на другой объект):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;[foo addObject:bar];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Так же аргументов может быть несколько:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;[foo insertObject:bar atIndex:5];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Тут важно понимать, что приведенный код вызовет один метод, но с двумя аргументами, а не два различных метода. Зачастую это приводит к путанице среди программистов на Си или Java, поэтому примеры. Довольно обычный вызод метода на Си:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (x.intersectsArc(35.0, 19.0, 23.0, 90.0, 120.0))&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;выглядит на Objective-C вот так:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; ([x intersectsArcWithRadius:35.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;centeredAtX:19.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Y:23.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fromAngle:90.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toAngle:120.0])&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Из примера должно стать ясно, что на самом деле вызывается один метод с множеством аргументов. Кому то такая запись кажется дикостью из-за своего размера, а кто-то боготворит за возможность читать код as-is. Решать вам.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Использование классов&lt;/b&gt;&lt;br /&gt;Запустите Xcode, создайте новый проект New Project... -&gt; Application -&gt; Command Line Tool и в Type выберите &lt;strong&gt;Foundation&lt;/strong&gt;:&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/tj3VATmI_Cj8SycqXtKjvQ?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/S1-QedvWBkI/AAAAAAAAKZU/6BzyRPXP-Xs/s800/Screen%20shot%202010-01-27%20at%204.01.21%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Наше приложение с &lt;em&gt;Foundation Tool&lt;/em&gt; не имеет графического интерфейса и обычно выполняется из командной строки или на заднем фоне в виде демона.&lt;br /&gt;Назовите проект &lt;strong&gt;lottery&lt;/strong&gt;. Когда проект создастся, выделите &lt;em&gt;lottery.m&lt;/em&gt; в Source и отредактируйте его следующим образом:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;#import &amp;#60;Foundation/Foundation.h&amp;#62;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt; main (&lt;font color="#0000ff"&gt;int&lt;/font&gt; argc, &lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#0000ff"&gt;char&lt;/font&gt; * argv[]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSMutableArray *array;&lt;br /&gt;&amp;nbsp;&amp;nbsp;array = [[NSMutableArray alloc] init];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt; i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (i = 0; i &amp;#60; 10; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSNumber *newNumber = [[NSNumber alloc] initWithInt:(i * 3)];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[array addObject:newNumber];&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (i = 0; i &amp;#60; 10; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSNumber *numberToPrint = [array objectAtIndex:i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSLog(&lt;font color="#A31515"&gt;@"The number at index %d is %@"&lt;/font&gt;, i, numberToPrint);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[pool drain];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; 0;&lt;br /&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Разберемся построчно:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;#import &amp;#60;Foundation/Foundation.h&amp;#62;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Подключаем заголовочный файл для всех классов фреймворка Foundation.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt; main (&lt;font color="#0000ff"&gt;int&lt;/font&gt; argc, &lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#0000ff"&gt;char&lt;/font&gt; * argv[])&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Метод &lt;em&gt;main&lt;/em&gt; должен быть вам знаком, если вы знакомы с Си или Java, если нет - добро пожаловать в раздел документации по языку.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Инициализация пула для работы с объектами и памятью. О памяти и сборщике мусора я уже говорил вот &lt;a title="" href="http://habrahabr.ru/blogs/macosxdev/59310/"&gt;тут&lt;/a&gt;. Если хотите - почитайте.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;NSMutableArray *array;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Декларируем переменную: &lt;em&gt;array&lt;/em&gt; это указатель на экземпляр класса &lt;strong&gt;NSMutableArray&lt;/strong&gt;. Помните, пока еще никакого &lt;em&gt;array&lt;/em&gt; не существует, мы просто объявили переменную, которая будет ссылаться на возможно созданный объект.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;array = [[NSMutableArray alloc] init];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Вот теперь мы создаем экземпляр &lt;strong&gt;NSMutableArray&lt;/strong&gt; и устанавливаем указатель на нее.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (i = 0; i &amp;#60; 10; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSNumber *newNumber = [[NSNumber alloc] initWithInt:(i * 3)];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[array addObject:newNumber];&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Внутри цикла мы создаем локальную переменную newNumber и говорим, что это экземпляр &lt;strong&gt;NSNumber&lt;/strong&gt;. Затем, добавляем этот объект в массив.&lt;br /&gt;Внутри массива не создаются копии объектов NSNumber. Массив просто хранит ссылки на объекты NSNumber (надеюсь вы прочитали про память).&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (i = 0; i &amp;#60; 10; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSNumber *numberToPrint = [array objectAtIndex:i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSLog(&lt;font color="#A31515"&gt;@"The number at index %d is %@"&lt;/font&gt;, i, numberToPrint);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Здесь мы просто выводит содержимое массива на консоль. &lt;strong&gt;NSLog&lt;/strong&gt; это метод который очень похож на метод языка Си &lt;strong&gt;printf()&lt;/strong&gt;; метод берет строку определенного формата и список переменных и подставляет их в вывод на консоль. Когда NSLog выводи строку на консоль, он так же дописывает timestamp и номер строки в коде.&lt;br /&gt;NSLog работает также как и printf, а так же имеет аттрибут &lt;strong&gt;%@&lt;/strong&gt; для отображения объектов. Объекты отдают свое описание из description в виде строки, мы погорим об этом чуть позже.&lt;br /&gt;Допустимые аттрибуты:&lt;br /&gt;&lt;table border="0" cellspacing="0" cellpadding="4"&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%@&lt;/td&gt;&lt;td&gt;id&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%d, %D, %i&lt;/td&gt;&lt;td&gt;long&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%u, %U&lt;/td&gt;&lt;td&gt;unsigned long&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%hi&lt;/td&gt;&lt;td&gt;short&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%hu&lt;/td&gt;&lt;td&gt;unsigned short&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%qi&lt;/td&gt;&lt;td&gt;long long&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%qu&lt;/td&gt;&lt;td&gt;unsigned long long&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%x, %X&lt;/td&gt;&lt;td&gt;unsigned long в формате hexdecimal&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%o, %O&lt;/td&gt;&lt;td&gt;unsigned long в восьмеричном формате&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%f, %e, %E, %g, %G&lt;/td&gt;&lt;td&gt;double&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%c&lt;/td&gt;&lt;td&gt;unsigned char в формате ACSII&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%C&lt;/td&gt;&lt;td&gt;char в формате Unicode&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;char *&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%S&lt;/td&gt;&lt;td&gt;char * в формате Unicode&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%p&lt;/td&gt;&lt;td&gt;void * (адрес памяти в формате 0x)&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%%&lt;/td&gt;&lt;td&gt;символ %&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;Примечание: Символ &lt;strong&gt;@&lt;/strong&gt; перед строками позволяет компилятору понять, что строка хранится и выводится в формате &lt;strong&gt;NSString&lt;/strong&gt;. Это связано с тем, что в языке Си строки хранятся в виде указателя на буфер с символами, который заканчивается нулевым символом. В своих программах вы можете использовать и стандартные структуры Си и NSString:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#008000"&gt;// C String&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;char&lt;/font&gt; *foo;&lt;br /&gt;&lt;font color="#008000"&gt;// NSString&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;NSString *bar;&lt;br /&gt;&lt;br /&gt;foo = &lt;font color="#A31515"&gt;"this is a C string"&lt;/font&gt;;&lt;br /&gt;bar = &lt;font color="#A31515"&gt;@"this is an NSString"&lt;/font&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Так же вы можете свободно конвертировать строки из языка Си в NSString:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#0000ff"&gt;char&lt;/font&gt; *foo = &lt;font color="#A31515"&gt;"Blah blah"&lt;/font&gt;;&lt;br /&gt;NSString *bar;&lt;br /&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// создаем NSString из строки на Си&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;bar = [NSString stringWithUTF8String:foo];&lt;br /&gt;&lt;br /&gt;&lt;font color="#008000"&gt;// создаем строку Си из NSString&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;foo = [bar UTF8String];&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Так как NSString замечательно работает с юникодом, рекомендуется использовать именно NSString в приложениях Cocoa.&lt;br /&gt;Так, вернемся к коду, последние строки:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&amp;nbsp;&amp;nbsp;[pool drain];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; 0;&lt;br /&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Строка про пул опять же отправляет вас к статье про управление памятью. Ну и return 0 это стандартная оконцовка метода main().&lt;br /&gt;&lt;br /&gt;Вернемся в Xcode. Слева вверху тулбара вы видите выпадающее меню в &lt;em&gt;Overview&lt;/em&gt; (1) и там в Active Configuration есть два пункта: &lt;strong&gt;Debug и Release&lt;/strong&gt;. Пока вы пишите свое приложение вы должны использовать конфигурацию Debug и только перед тем как приложение нужно отправить на тестирование или распространение - выбирайте конфигурацию Release. Разница в том, что в конфигурации Release автоматически обрезана практически вся полезная информация для отладки приложения, в связи с чем отладка сильно затруднена. Жмем &lt;strong&gt;Build &amp; Run&lt;/strong&gt; (2) для запуска нашего супер приложения.&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/iT8QbN9NnWMDrr6Q4m3p2g?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_ymDymKKKFj4/S1-dnwe-3QI/AAAAAAAAKZ0/SD0iap3sv-o/s800/Screen%20shot%202010-01-27%20at%204.55.58%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;После запуска вы должны увидеть вот такое вот окошко консоли с выводом приложения:&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Tn_oKxV2im52vULmToYzug?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/S1-dnyWYgaI/AAAAAAAAKZ4/ik7JvzFW2kc/s800/Screen%20shot%202010-01-27%20at%204.57.28%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Если консоль не появилась, вызовите её в меню &lt;em&gt;Run -&gt; Console&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Отправка сообщений nil&lt;/b&gt;&lt;br /&gt;В большинстве объектно-ориентированных языков программирования обращение к объекту, экземпляр которого не существует, считается ошибкой времени исполнения и обычно приводит к исключению (exception) или же к прекращению выполнения программы. Поэтому так часто в языках подобных Java можно увидеть множество проверок на &lt;strong&gt;nil&lt;/strong&gt; (null), к примеру:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (foo != &lt;font color="#0000ff"&gt;null&lt;/font&gt;) {&lt;br /&gt; foo.doThatThingYouDo();&lt;br /&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;В Objective-C это нормально, когда вы посылаете сообщение nil. В случае, если происходит такой вызов - сообщение просто игнорируется, что позволяет не осуществлять множество проверок на nil. К примеру, это код будет работать без проблем:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;id foo;&lt;br /&gt;foo = nil;&lt;br /&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt; bar = [foo count];&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Поэтому будьте внимательны и если вы ломаете голову, почему же не работает вызываемый вами метод - проверьте, не равен ли объект nil. Многим (читай программистам Java, C# и другим) такая практика не нравится, мне, кстати, тоже. Куда человечнее кидать exception разработчику, но со временем привыкаешь и иногда даже радуешься.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Создаем собственный класс&lt;/b&gt;&lt;br /&gt;По традиции, напишем простейшее приложение, которое позволит нам немного углубится в то, о чем мы говорим. Напишем приложение-лоторею, которое будет выдавать нам два номера победителей от 1 до 100 на последующие 10 недель.&lt;br /&gt;Для начала вернитесь в ранее созданный проект &lt;em&gt;lottery&lt;/em&gt; и создайте класс LotteryEntry: File -&gt; New File... -&gt; Objective-C:&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/G8PwT3FkRV1TD_ARMVSqgw?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_ymDymKKKFj4/S1-pXj2VdSI/AAAAAAAAKa4/uyXqUQDSsAI/s800/Screen%20shot%202010-01-27%20at%205.46.31%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/88fVcYzLiLLx6zN583cgbg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_ymDymKKKFj4/S1-pXjVQMEI/AAAAAAAAKa8/g6QqNQEM33U/s800/Screen%20shot%202010-01-27%20at%205.46.48%20AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;Отредактируйте LotteryEntry.h следующим образом:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;#import &amp;#60;Cocoa/Cocoa.h&amp;#62;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@&lt;font color="#0000ff"&gt;interface&lt;/font&gt; LotteryEntry : NSObject {&lt;br /&gt;&amp;nbsp;&amp;nbsp;NSCalendarDate *entryDate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt; firstNumber;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt; secondNumber;&lt;br /&gt;}&lt;br /&gt;- (&lt;font color="#0000ff"&gt;void&lt;/font&gt;)prepareRandomNumbers;&lt;br /&gt;- (&lt;font color="#0000ff"&gt;void&lt;/font&gt;)setEntryDate:(NSCalendarDate *)date;&lt;br /&gt;- (NSCalendarDate *)entryDate;&lt;br /&gt;- (&lt;font color="#0000ff"&gt;int&lt;/font&gt;)firstNumber;&lt;br /&gt;- (&lt;font color="#0000ff"&gt;int&lt;/font&gt;)secondNumber;&lt;br /&gt;@end&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Мы создали заголовочный файл для нового класса &lt;b&gt;LotteryEntry&lt;/b&gt;, который унаследован от класса &lt;i&gt;NSObject&lt;/i&gt;. Заголовочный файл включает в себя три переменных: 
