<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>STUNNED PIXEL</title><link>http://stunpix.com/</link><description></description><language>ru</language><generator>e2 (http://blogengine.ru/)</generator><item><title>Angry Birds в Mac AppStore</title><guid isPermaLink="true">http://stunpix.com/2012/02/19/1/</guid><link>http://stunpix.com/2012/02/19/1/</link><comments>http://stunpix.com/2012/02/19/1/</comments><description>У вас из ниоткуда появилось обновление для&amp;nbsp;Angry Birds? Вы никогда её не покупали, но и обновление тоже не можете установить? При этом обновление для какого-то аккаунта&amp;nbsp;asdfff2011@mail.ru?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/43857-114144-72ac4309ceb3387feb14f8e128cce07b.jpg" alt="AngryBirds в Mac AppStore" /&gt;&lt;br /&gt;&lt;br /&gt;Дайте угадаю... У вас стоит нелицензионный Final Cut Pro X? =) Проблема в нём. Пираты распространяют FCPX c информацией об аккаунте AppStore с которого по всей видимости и была скачана эта программа. AppStore находя эту информацию сразу же предлагает скачать обновления для птичек. Удалить это очень просто. Надо сделать следующие шаги для всех компонентов: Final Cut Pro X, Compressor, Motion.&lt;br /&gt;&lt;br /&gt;1. Открыть содержимое.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/Snimok-ekrana-2012-02-19-v-17.09.05.png" alt="AngryBirds в Mac AppStore" /&gt; &lt;br /&gt;&lt;br /&gt;2. Удалить папку _MASReceipt&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/Snimok-ekrana-2012-02-19-v-17.09.44.png" alt="AngryBirds в Mac AppStore" /&gt;&lt;hr /&gt;&lt;small&gt;&lt;/small&gt;</description><pubDate>Sun, 19 Feb 2012 18:15:11 +0300</pubDate></item><item><title>Google TV и медиаплееры на базе Android</title><guid isPermaLink="true">http://stunpix.com/2012/01/28/1/</guid><link>http://stunpix.com/2012/01/28/1/</link><comments>http://stunpix.com/2012/01/28/1/</comments><description>В поисках идеального медиапроигрывателя для своей кинотеки и домашнего кинотеатра, мой взгляд упал на устройства основанные на&amp;nbsp;Android. Китайские производители уже наштамповали не один десяток проигрывателей на базе ARM и Андроида, но даже учитывая их дешевизну, перед покупкой я решил не &amp;laquo;играть в слепую&amp;raquo;, а пробежаться по инету и выяснить стоит ли игра свеч. Если избежать долгих речей, то вывод у меня только один: &lt;b&gt;не стоит&lt;/b&gt;. Китайцы&amp;nbsp;&amp;mdash; это китайцы и качество их продукции не вызывает восторга, а плюс учитывая, что обычный андроид не разрабатывался с учётом медиа потребностей, то мои поиски только подтвердили мои домыслы&amp;nbsp;&amp;mdash; андроид не может быть полноценным медиа проигрывателем моей кинотеки. Обычные сетевые медиапроигрыватели мне не нравятся как класс: мне не нравятся их меню и однобокость в возможностях&amp;nbsp;&amp;mdash; они умеют только играть видео (&lt;i&gt;хоть и делают это хорошо&lt;/i&gt;), а хочется нормальной поддержки сети, виджетов с погодой, интернет радио и прочих привычных вещей.&lt;br /&gt;&lt;br /&gt;Хоть мои запросы к видео проигрывателю весьма скромны (&lt;i&gt;xvid, h264 до 20-30mbit, avi, mkv, mp4, dts/ac3 + passthrough, mp3, aac и желательно субтитры&lt;/i&gt;), но китайцы все поголовно имеют проблемы с проигрыванием. Даже брендовый Logitech Revue работающий на заточенном под медиа нужды Google TV и тот имеет ряд проблем со звуком. Цитата с &lt;a href="http://www.gtvbox.net/2011/09/logitech-revue-honeycomb.html"&gt;блога&lt;/a&gt; посвящённого&amp;nbsp;Google TV:&lt;br /&gt;&lt;br /&gt;&amp;laquo;&lt;i&gt;Переходим к аудио. Вот тут начинаются косяки. Самый главный косяк, из которого проистекают остальные &#8212; отсутствие pass-through битстрима напрямую на ресивер. Вместо этого весь входящий звук от приложений и поключенных DVRов декодируется (с учетом многоканальности!), микшируется и кодируется обратно в&amp;nbsp;DolbyDigital 5.1 (для&amp;nbsp;Spdif-выхода) или в&amp;nbsp;PCM 2.0 (для&amp;nbsp;HDMI и&amp;nbsp;Spdif). Итого получается, что по&amp;nbsp;HDMI только стерео, по&amp;nbsp;Spdif либо стерео, либо перепакованный 5.1. &lt;nobr&gt;Т.&amp;nbsp;е.&lt;/nobr&gt; полноценного качественного&amp;nbsp;Surround не будет.&lt;br /&gt;Также на данный момент девайс не умеет распаковывать DTS, хотя в спецификациях он есть. Кроме того, из тех же спецификаций вытекает, что, когда &amp;laquo;поддержка&amp;nbsp;DTS&amp;raquo; все-таки появится, она, похоже, будет работать в виде транскодирования&amp;nbsp;DTS в&amp;nbsp;Dolby. Тут же еще один минус: если звуковая дорожка фильма 2.0, а выход Spdif выставлен в DD 5.1, то стереоканалы тупо замапятся во&amp;nbsp;Front Left/Right. Никакого&amp;nbsp;Pro logic не будет и центральный канал вашей 5.1 системы будет просто молчать.&lt;/i&gt;&amp;raquo;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/Logitech_Revue.png" alt="Google TV и медиаплееры на базе Android" /&gt;&lt;br /&gt;&lt;br /&gt;Но и на этом мои удивления не закончились, оказалось, что некоторые Google TV вообще считают тупиковым развитием и стараются на связываться с ним. Цитата с 3dnews:&lt;br /&gt;&lt;br /&gt;&amp;laquo;&lt;i&gt;Вторая версия платформы основана на&amp;nbsp;Android 3.1 Honeycomb и представляет собой новую попытку выхода&amp;nbsp;Google на рынок телевизоров. Оригинальная ОС не получила должной поддержки со стороны кабельных сетей и агрегаторов контента и не смогла предоставить пользователям широкий выбор видеоматериалов. ... Стоит отметить, что&amp;nbsp;Logitech, понёсшая от выпуска&amp;nbsp;Revue гигантские убытки, оцениваемые аналитиками в $100 млн, не желает далее сотрудничать с&amp;nbsp;Google в этом направлении и официально сообщила о том, что новой версии&amp;nbsp;Revue не будет. Компания отмечает, что&amp;nbsp;Google TV не может предоставить безукоризненного окружения и даже выпуск&amp;nbsp;Honeycomb-версии не решает эту проблему.&lt;/i&gt;&amp;raquo;&lt;br /&gt;&lt;br /&gt;В общем андроид попросту не дорос до того, чтобы стать серьёзным игроком на рынке медиаконтента. Я хоть и не аналитик, но моё скромное мнение простое: гугл должен предоставить монолитную платформу как это сделала&amp;nbsp;Apple: устройство + программное ядро + контент. Из всего этого у Гугл есть только &amp;laquo;программное ядро&amp;raquo;. Как можно ожидать, что это &amp;laquo;выстрелит&amp;raquo;? А учитывая, что&amp;nbsp;Google TV это проект с закрытным исходным кодом, то при отсутствии 2х других составляющих&amp;nbsp;&amp;mdash; это только усугубляет ситуацию.&lt;br /&gt;&lt;br /&gt;На данный момент гугл заявляет, что тесно сотрудничает в частности с&amp;nbsp;Samsung и LG в плане&amp;nbsp;Google TV и в 2012 году собираются показать миру новые решения. Что ж, поживём&amp;nbsp;&amp;mdash; увидим.&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/android/"&gt;android&lt;/a&gt;&lt;/small&gt;</description><pubDate>Sat, 28 Jan 2012 18:43:16 +0300</pubDate></item><item><title>Проблемы с "рвущимися" видео и окнами в Gnome 3</title><guid isPermaLink="true">http://stunpix.com/2011/12/09/1/</guid><link>http://stunpix.com/2011/12/09/1/</link><comments>http://stunpix.com/2011/12/09/1/</comments><description>Столкнулся с неприятной особенностью Gnome 3 на своей системе Sandy Bridge с&amp;nbsp;Intel Core i3-2100T и интегрированной графикой Intel HD 2000&amp;nbsp;&amp;mdash; картинка видео при проигрывании очень неприятно разрывается (&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/File:Tearing_(simulated).jpg"&gt;video tearing&lt;/a&gt;&lt;/i&gt;). Это крайне неприятно выглядит и очень сильно раздражает при просмотре на большом экране. То же самое касается окон при перетаскивании&amp;nbsp;&amp;mdash; они выглядят рваными когда их двигаешь.&lt;br /&gt;&lt;br /&gt;Эта проблема была известна на линуксах ещё с 2008 года и корень зла находился в менеджере compiz (&lt;i&gt;разработчик&amp;nbsp;gnome &lt;a href="http://blog.fishsoup.net/2011/06/13/benchmarking-compositor-performance/"&gt;объяснил причины&lt;/a&gt; такого поведения&lt;/i&gt;). Решением является избваление от&amp;nbsp;compiz в пользу&amp;nbsp;mutter. И Gnome 3 использует mutter как композиционный менеджер по умолчанию. Но вот Гном 3 уже тут, а проблема никуда не делась: видео рвётся, хоть сам плачь.&lt;br /&gt;&lt;br /&gt;Но решение наконец-то нашлось и оно к счастью очень простое. Требуется всего-то открыть в редакторе &amp;laquo;/etc/environment&amp;raquo; и добавить туда строчку:&lt;br /&gt;&lt;br /&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #007800;"&gt;CLUTTER_PAINT&lt;/span&gt;=disable-clipped-redraws:disable-culling&lt;/pre&gt;&lt;br /&gt;и проблемы как не бывало.&lt;br /&gt;&lt;br /&gt;Что эта магическая строчка делает&amp;nbsp;&amp;mdash; я не стал разобраться, главное что проблема была решена.&lt;br /&gt;&lt;br /&gt;Happy using! =)&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/gnome/"&gt;gnome&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/video/"&gt;video&lt;/a&gt;&lt;/small&gt;</description><pubDate>Fri, 09 Dec 2011 01:53:08 +0300</pubDate></item><item><title>Хорошая CAPTCHA, это мёртвая CAPTCHA</title><guid isPermaLink="true">http://stunpix.com/2011/11/16/1/</guid><link>http://stunpix.com/2011/11/16/1/</link><comments>http://stunpix.com/2011/11/16/1/</comments><description>В разных местах неоднократно ведутся разговоры про усовершенствование &lt;a href="http://ru.wikipedia.org/wiki/CAPTCHA"&gt;каптчи&lt;/a&gt; и как она помогает решить проблемы со спамом. Я категорически против каптчи! Я не люблю когда за мой счёт, кто-то решает свои проблемы. У вас спам и боторегистрация? Решите &lt;i&gt;сами&lt;/i&gt; свою проблему, а не заставляйте &lt;i&gt;меня&lt;/i&gt; решать её. Я ваш пользователь и клиент, почему &lt;i&gt;я&lt;/i&gt; должен что-то доказывать? Как я могу доверять вебсервису, который априори не доверяет мне? Где в конце-концов &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B7%D1%83%D0%BC%D0%BF%D1%86%D0%B8%D1%8F_%D0%BD%D0%B5%D0%B2%D0%B8%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8"&gt;презумпция невиновности&lt;/a&gt;?!&lt;br /&gt;&lt;br /&gt;CAPTCHA не даёт 100% гарантии по защите от спама. Любой метод защиты, который не требует усилий со стороны пользователя &lt;i&gt;так же&lt;/i&gt; не даёт 100% защиты от спама. А раз сервис не может достигнуть 100% защиты в &lt;i&gt;любом&lt;/i&gt; варианте, то какой глубокий смысл в том, что ещё и пользователю надо создавать неудобство, чтобы пользователь шёл с поклоном к вебсервису и что-то доказывал?&lt;br /&gt;&lt;br /&gt;Уважайте своих пользователей&amp;nbsp;&amp;mdash; удалите каптчу и поставьте защиту не требующую действий со стороны пользователя.&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/usability/"&gt;usability&lt;/a&gt;&lt;/small&gt;</description><pubDate>Wed, 16 Nov 2011 12:00:32 +0300</pubDate></item><item><title>Parallels Desktop 5 и Mac OS X Lion 10.7</title><guid isPermaLink="true">http://stunpix.com/2011/11/06/1/</guid><link>http://stunpix.com/2011/11/06/1/</link><comments>http://stunpix.com/2011/11/06/1/</comments><description>Примерно года 1,5 назад я для себя купил лицензию на&amp;nbsp;Parallels Desktop 5 чтобы не выходя с мака работать на&amp;nbsp;windows (&lt;i&gt;работа требует&lt;/i&gt;). Пользовался я этим инструментом с большим удовольствием и горя не знал, но так было до тех пор пока я этим летом не установил обновление до&amp;nbsp;Mac OS X Lion. В тот же момент Parallels Desktop напрочь отказался работать. Гугло-поиск не дал совершенно никаких ответов, а поддержка&amp;nbsp;parallels твёрдо стояла &lt;a href="http://kb.parallels.com/en/111578"&gt;на своём&lt;/a&gt; &amp;laquo;&lt;i&gt;купите нашу новенькую 7-ю версию и будет вам счастье&lt;/i&gt;&amp;raquo;. А меня это зацепило &amp;laquo;&lt;i&gt;да что за ерунда такая&amp;nbsp;&amp;mdash; купил продукт, а мне отказываются помочь решить проблему, ведь всего-то год прошёл с момента покупки!&lt;/i&gt;&amp;raquo;. Это при том, что по меркам почти любого бизнеса 1 год&amp;nbsp;&amp;mdash; мелочь. Microsoft свои продукты поддерживает до 10 лет: патчи и апдейты выпускает, а тут год прошёл и до свидания гражданин, мы вас знать не знаем&amp;nbsp;&amp;mdash; купите новую версию и не морочьте нам голову!&lt;br /&gt;&lt;br /&gt;Но это лирика. А теперь практика. Проанализировав системные логи и глянув в файловую систему я понял, что система всего-то не может найти&amp;nbsp;kext (kernel extension) от&amp;nbsp;parallels desktop, хотя они на диске есть, но просто немного не в той директории&amp;nbsp;&amp;mdash; похоже в 10.7 изменились правила поиска&amp;nbsp;kext. Я попробовал загрузить эти&amp;nbsp;kext-ы вручную и, о чудо, parallels запустился! Дальше было просто дело техники, я написал пару строчек в консоли и вуаля, программа снова работает как ни в чём не бывало.&lt;br /&gt;&lt;br /&gt;Вот и сам магический скрипт ценой в 50$ (столько стоит апгрейд на работающую версию):&lt;br /&gt;&lt;br /&gt;&lt;font color="#7a0874"&gt;cd&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;/&lt;/font&gt;Library&lt;font color="#000000"&gt;/&lt;/font&gt;Parallels&lt;font color="#000000"&gt;/&lt;/font&gt;Parallels\&amp;nbsp;Service.app&lt;font color="#000000"&gt;/&lt;/font&gt;Contents&lt;font color="#000000"&gt;/&lt;/font&gt;Kexts&lt;br/&gt;
&lt;font color="#c20cb9"&gt;sudo&lt;/font&gt;&amp;nbsp;&lt;font color="#c20cb9"&gt;ln&lt;/font&gt;&amp;nbsp;&lt;font color="#660033"&gt;-s&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;10.6&lt;/font&gt;&lt;font color="#000000"&gt;/&lt;/font&gt;prl_hid_hook.kext&amp;nbsp;prl_hid_hook.kext&lt;br/&gt;
&lt;font color="#c20cb9"&gt;sudo&lt;/font&gt;&amp;nbsp;&lt;font color="#c20cb9"&gt;ln&lt;/font&gt;&amp;nbsp;&lt;font color="#660033"&gt;-s&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;10.6&lt;/font&gt;&lt;font color="#000000"&gt;/&lt;/font&gt;prl_hypervisor.kext&amp;nbsp;prl_hypervisor.kext&lt;br/&gt;
&lt;font color="#c20cb9"&gt;sudo&lt;/font&gt;&amp;nbsp;&lt;font color="#c20cb9"&gt;ln&lt;/font&gt;&amp;nbsp;&lt;font color="#660033"&gt;-s&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;10.6&lt;/font&gt;&lt;font color="#000000"&gt;/&lt;/font&gt;prl_netbridge.kext&amp;nbsp;prl_netbridge.kext&lt;br/&gt;
&lt;font color="#c20cb9"&gt;sudo&lt;/font&gt;&amp;nbsp;&lt;font color="#c20cb9"&gt;ln&lt;/font&gt;&amp;nbsp;&lt;font color="#660033"&gt;-s&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;10.6&lt;/font&gt;&lt;font color="#000000"&gt;/&lt;/font&gt;prl_usb_connect.kext&amp;nbsp;prl_usb_connect.kext&lt;br/&gt;
&lt;font color="#c20cb9"&gt;sudo&lt;/font&gt;&amp;nbsp;&lt;font color="#c20cb9"&gt;ln&lt;/font&gt;&amp;nbsp;&lt;font color="#660033"&gt;-s&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;10.6&lt;/font&gt;&lt;font color="#000000"&gt;/&lt;/font&gt;prl_vnic.kext&amp;nbsp;prl_vnic.kext&lt;br /&gt;&lt;br /&gt;Задача скрипта простая: в нужном для системы месте создать линки на&amp;nbsp;kext-ы.&lt;br /&gt;&lt;br /&gt;На мой взгляд, такое простое решение проблемы ну никак не тянет на то, чтобы я должен был покупать новую версию программы. &lt;br /&gt;&lt;br /&gt;Но и это ещё не всё. Выяснилось, что компания программно заблокировала возможность устанавливать Parallels Desktop 5 на системы старше 10.6, но это мне не помешало распотрошить установочный пакет и вручную запустить установку. Я не был удивлён, когда в итоге всё прекрасно установилось и заработало. Это окончательно испортило впечатления от этой компании: продукты выпускают хорошие, а выкалачивание денег из клиентов&amp;nbsp;&amp;mdash; не лицеприятный шаг. Вот вам и коммерческое ПО во всей красе...&lt;br /&gt;&lt;br /&gt;Happy using!&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/mac/"&gt;mac&lt;/a&gt;&lt;/small&gt;</description><pubDate>Sun, 06 Nov 2011 03:56:59 +0300</pubDate></item><item><title>GStreamer audio plugin для QNX</title><guid isPermaLink="true">http://stunpix.com/2011/11/01/1/</guid><link>http://stunpix.com/2011/11/01/1/</link><comments>http://stunpix.com/2011/11/01/1/</comments><description>В процессе портирования&amp;nbsp;WebKit в нашем проекте мне пришлось написать аудио плагин для&amp;nbsp;GStreamer, который позволяет выводить звук в этом мультимедийном framework&amp;rsquo;е на&amp;nbsp;qnx . На текущий момент мне известен только один выход для пользователей qnx&amp;nbsp;&amp;mdash; это использовать SDL gst plugin. Хотя как по мне &#8212; это совсем не элегантное решение тащить огромную библиотеку за собой ради простого вывода звука.&lt;br /&gt;&lt;br /&gt;Поскольку в основу моего плагина лёг другой open source плагин (&lt;i&gt;от него правда осталось не более 5% кода&lt;/i&gt;), то я в скором времени выложу исходники своего плагина на&amp;nbsp;github, естественно предварительно убрав все проектно специфичные куски кода. Надеюсь моя работа будет кому-то полезна.&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/gstreamer/"&gt;gstreamer&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/qnx/"&gt;qnx&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/webkit/"&gt;webkit&lt;/a&gt;&lt;/small&gt;</description><pubDate>Tue, 01 Nov 2011 17:53:13 +0300</pubDate></item><item><title>Rapoo E9080: Обзор очень компактной клавиатуры с тачпадом.</title><guid isPermaLink="true">http://stunpix.com/2011/09/26/1/</guid><link>http://stunpix.com/2011/09/26/1/</link><comments>http://stunpix.com/2011/09/26/1/</comments><description>&lt;img src="http://stunpix.com/pictures/37a81ef5_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;Я не любитель писания обзоров железа, но поскольку я стал обладателем клавиатуры заслуживающей внимания, то посчитал, что надо поделится.&lt;br /&gt;&lt;br /&gt;Задался я как-то поиском компактной беспроводной клавиатуры для своего&amp;nbsp;HTPC и зашедши на&amp;nbsp;ebay я нашёл прекрасную клавиатуру такую, какую я очень хотел. Rapoo не очень известный у нас китайский производитель, но забегая вперёд скажу, что я не в первый раз покупаю их продукты, и я постоянно доволен качеством их продуктов не смотря на репутацию китайских производителей. В данном случае&amp;nbsp;&amp;mdash; производитель серьёзно подходит к качеству своей продукции. Держать клавиатуру в руках приятно и чувствуется качество сборки.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Основные характеристики&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Частота&lt;/i&gt;: 2.4GHz&lt;br /&gt;&lt;i&gt;OS&lt;/i&gt;: Windows XP, Windows 7, Mac OS X (мак ось я сам проверял, &lt;nobr&gt;т.&amp;nbsp;к.&lt;/nobr&gt; производитель умолчал о какой-либо совместимости)&lt;br /&gt;&lt;i&gt;Толщина&lt;/i&gt;: 5.6мм&lt;br /&gt;&lt;i&gt;Радиус&lt;/i&gt;: 10м&lt;br /&gt;&lt;i&gt;Приёмник&lt;/i&gt;: nano&lt;br /&gt;&lt;i&gt;Цена&lt;/i&gt;: ~50$&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Комплектация&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Клавиатура, нано приёмник, 2 батарейки&amp;nbsp;ААА и документация.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Толщина&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Толщина у клавиатуры действительно очень маленькая, всего 5.6мм, что сродни маковским алюминиевым клавиатурам.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/1a218dca_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/bb79cdc2_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Клавиатура&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пластик клавиш шершавый и очень приятный на ощупь. Дополнительные клавиши доступны через кнопку Fn. Скажу сразу: Fn расположена там где ей и место&amp;nbsp;&amp;mdash; между&amp;nbsp;Ctrl и&amp;nbsp;Win, что будет оценено почти всеми пользователями.&lt;br /&gt;&lt;br /&gt;Ход у клавиш при такой толщине корпуса, конечно же короткий, ноутбучный. Тут никаких нареканий&amp;nbsp;&amp;mdash; приятно и комфортно работать (&lt;i&gt;я вообще любитель короткого хода, так что это субъективно&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Дополнительные клавиши стандартные&amp;nbsp;&amp;mdash; это навигация в браузере, медиа плеер и громкость. Стоит отметить, что на клавиатуре так же присутствует Insert, который любят иногда выкидывать.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/54cea1f4_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/91545aeb_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Тачпад&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Тачпад выполнен из точно такого же пластика как и клавиши, что совсем не пошло ему на пользу&amp;nbsp;&amp;mdash; скользить пальцами по нему менее удобно чем, к примеру, на том же макбуке, где тачпад гладкий. Поэтому создаётся впечатление, что тачпад немного сопротивляется скольжению.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/e0dc4dd6_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;Как можно заметить, на самом тачпаде нанесены символы дополнительной цифровой клавиатуры. Переключение между тачпадом и клавиатурой осуществляется слайдовым движением аля &amp;laquo;айфон анлок&amp;raquo; по надписи &amp;laquo;SLIDE HERE&amp;raquo;. После чего возле слайдера 3-4 раза мигнёт светодиод сообщающий о переключении. Никакой другой индикации на клавиатуре нет. Если вы забыли в каком режиме вы оставили клавиатуру, в тачпаде или в режиме клавиатуры, вспоминать прийдётся только экспериментальным путём.&lt;br /&gt;&lt;br /&gt;Тачпад распознаёт следующие жесты:&lt;br /&gt;&lt;br /&gt; Один палец&amp;nbsp;&amp;mdash; управление движением курсора мышки.&lt;br /&gt; Два раза стукнуть пальцем&amp;nbsp;&amp;mdash; щелчёк левой кнопкой мышки.&lt;br /&gt; Касание тремя пальцами&amp;nbsp;&amp;mdash; щелчёк правой кнопкой мышки (слегка не удобно).&lt;br /&gt; Два пальца&amp;nbsp;&amp;mdash; скроллирование (&lt;i&gt;я смог заставить работать только вертикальную прокрутку&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Обратите внимание: &lt;i&gt;распознование жестов и касаний несколькими пальцами реализовано ПО встроенным в клавиатуру! &lt;nobr&gt;Т.&amp;nbsp;е.&lt;/nobr&gt; windows ничего не знает о том, сколькими пальцами были сделаны нажатия и как вы ими скользили по сенсорной панели. Из этого следует только один вывод: вы никак не сможете переназначить жесты или изменить их значение&amp;nbsp;&amp;mdash; они вшиты в клавиатуру. Windows считает что получает сигналы от обычной мышки&amp;nbsp;&amp;mdash; поэтому об расширении сенсорного функционала и распозновании новых жестов можно, увы, забыть.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Поскольку никаких дисков и утилит в поставке не шло, то и настраивать тачпад можно только стандартными утилитами операционной системы. А настраивать многим вероятно прийдётся, &lt;nobr&gt;т.&amp;nbsp;к.&lt;/nobr&gt; на мониторах 1900х1200 курсор двигается не так быстро как хотелось бы. За одно касание курсор с одного края экрана в другой не успевает передвинуться и требуется 2-3 касания чтобы сделать это. Вполне вероятно, что на мониторах поменьше настройка скорости курсора может не понадобиться.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ресивер&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Тут сказать особо нечего&amp;nbsp;&amp;mdash; стандартный нано-ресивер.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/51572403_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Обратная сторона&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Обратная сторона клавиатуры выполненна из металла на котором очень аккуратно выгравированы логотип производителя и значки соответствия стандартам. Металл очень маркий и следы на нём остаются мгновенно, а оттираются достаточно сложно. Сам металл выглядит очень солидно за счёт аккуратной и не броской текстуры.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/051934df_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Батарейный отсек&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Батареи используются формата&amp;nbsp;AAA (&lt;i&gt;маленький &amp;laquo;пальчик&amp;raquo;&lt;/i&gt;). Как было сказано в начале&amp;nbsp;&amp;mdash; батарейки входят в комплект поставки.&lt;br /&gt;&lt;br /&gt;Рядом с батарейным отсеком есть место для ресивера. Там же рядом располагается переключатель включения питания. Больше никаких других кнопок и рычажков нету (&lt;i&gt;например сброс или соединение как в клавиатурах Logitech&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/dc9a9398_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;В интерьере&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/c199b997_1.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/b3a23187.jpg" alt="Rapoo E9080: очень компактная клавиатура с тачпадом." /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Впечатления&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Впечатления как я уже говорил&amp;nbsp;&amp;mdash; положительные. Единственный небольшой минус&amp;nbsp;&amp;mdash; это не слишком скользкая поверхность тачпада. По большому счёту недостатоков у клавиатуры нет, но вот использовать её с тачпадом как полноценный рабочий инструмент 8 часов в день, без мышки&amp;nbsp;&amp;mdash; будет сложновато, это всё же не эппловский тачпад с широким функционалом. Но вот как дополнительная клавиатура (&lt;i&gt;для&amp;nbsp;HTPC как в моём случае&lt;/i&gt;) она в самый раз.&lt;br /&gt;&lt;br /&gt;Rapoo это один из тех немногих самодостаточных китайских производителей, которые заботятся о качестве своей продукции без какого либо постороннего контроля западных менеджеров. Держа в руках эту клавиатуру чувствуется, что она сделана добротно: никаких люфтов, разболтанностей и качественные материалы. Однако на 25 сентября, на сайте &lt;a href="http://www.rapoo.com/"&gt;производителя&lt;/a&gt; по каким-то причинам попасть на страницу с этим продуктом нет возможности, хотя на главной большой рекламный баннер имеется.&lt;br /&gt;&lt;br /&gt;Предугадывая возможный вопрос: статистикой по долговечности работы от батареек я не обладаю, &lt;nobr&gt;т.&amp;nbsp;к.&lt;/nobr&gt; клавиатура у меня всего второй день.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Добавлено месяц спустя&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;После месяца использования клавиатуры, могу сказать, что она просто нормальная. Не плохая, не отличная, а нормальная. Я разбалован тачпадами&amp;nbsp;Apple, вот они&amp;nbsp;&amp;mdash; отличные. Я же эту клавиатуру использую только с&amp;nbsp;FullHD телевизором и лично мне не хватает быстроты курсора&amp;nbsp;&amp;mdash; двигать курсор в разные части экрана приходится за несколько касаний, &lt;nobr&gt;т.&amp;nbsp;е.&lt;/nobr&gt; быстро метнуться из одного края в другой&amp;nbsp;&amp;mdash; не получится. Если надо сделать что-то быстро, то это слегка раздражает. Моя жена вообще со своими ногтями очень нервничает&amp;nbsp;&amp;mdash; аккуратно работать ей очень сложно. Так же иногда бывают ложные срабатывания, но это больше случается тогда, когда забываешься и случайно касаешься тачпада пальцем или ладонью&amp;nbsp;&amp;mdash; это минус того, что тач в непосредственной близости от клавиатуры. Ну и относительно шероховатости тачпада: было бы намного лучше с более гладкой поверхностью.&lt;br /&gt;&lt;br /&gt;В качестве основного рабочего инструмента (&lt;i&gt;если вы работаете за клавиатурой 6-8 часов&lt;/i&gt;)&amp;nbsp;&amp;mdash; использовать не советую: я подозреваю, что досадные мелочи с тачпадом тут же превратятся в серьёзные недостатки и будут портить нервы. [&lt;i&gt;Добавлено ещё через пару недель: довелось поработать целый день с клавиатурой переустанавливая систему. Использовать её всё же очень сложно из-за огромного количества ложных срабатываний тачпада&amp;nbsp;&amp;mdash; руки попадая в ту часть клавиатуры (курсорные клавиши, клавиша&amp;nbsp;Enter) часто цепляют тачпад и курсор мыши на экране начинает творить мелкие пакости которые изрядно раздражают.&lt;/i&gt;]&lt;br /&gt;&lt;br /&gt;К клавиатуре вопросов нет, но замена мышки сенсорной панелью в этом случае не пройдёт. Дизайнерам и художникам этот продукт я совершенно не рекомендую. Даже на эппловских тачпадах работать в графических редакторах очень сложно (&lt;i&gt;проверено лично&lt;/i&gt;), а с этим тачпадом можно вообще загреметь в больницу с расшатанной психикой и нервными срывами. Он попросту не проектировался для такого. Так к примеру тут нет возможности &amp;laquo;перехватывать&amp;raquo; объекты. Перехватом я называю момент, когда надо перетащить объект на большое расстояние (&lt;i&gt;файл к примеру&lt;/i&gt;), но дотащив &amp;laquo;объект&amp;raquo; до края тача дальше двигаться не можешь, тогда ставишь второй палец в начало тача и продолжаешь тянуть дальше&amp;nbsp;&amp;mdash; именно так реализовано в тачах от&amp;nbsp;Apple. Тут, увы, такого нет и в помине. Тут реализован очень и очень простой тач (&lt;i&gt;Apple не зря покрыла патентами свои разработки в области сенсорных технологий&lt;/i&gt;). Да и&amp;nbsp;Windows совсем не&amp;nbsp;touch ориентированная система в отличие от&amp;nbsp;Mac OS X, в которой без тача уже сложновато. Это тоже играет свою роль в удобстве использования.&lt;br /&gt;&lt;br /&gt;Есть ещё один неудобный момент. Если клавиатуру не использовать 1-2 минуты, то она впадает в режим сна с пониженным энергопотреблением, тачпад перестаёт функционировать и не реагирует на касания, пока любая из клавиш не будет нажата. Таким образом, к примеру, вывести компьютер из режима энергосбережения просто касанием к тачпаду (&lt;i&gt;по аналогии с мышкой&lt;/i&gt;)&amp;nbsp;&amp;mdash; нельзя. Но я для себя уже приловчился выводить клавиатуру из сна нажатием кнопки Fn&amp;nbsp;&amp;mdash; это самая безопасная кнопка и не произойдёт ненужных действий.&lt;br /&gt;&lt;br /&gt;Как итог тачпад отлично выполняет основные функции: &lt;i&gt;движение мышкой, перетаскивание объектов, скроллинг и вызов контекстного меню&lt;/i&gt;. Но всё это прекрасно, ровно до того момента, пока не требуется действие упирающееся в края тачпада: &lt;i&gt;двигать курсором по большим экранам и перетаскивать объекты на дальние расстояния&lt;/i&gt;. Таким образом этот тач удобен пока ваше действие происходит на экране в небольших пределах.&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/zhelezo/"&gt;железо&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/obzor/"&gt;обзор&lt;/a&gt;&lt;/small&gt;</description><pubDate>Mon, 26 Sep 2011 12:01:06 +0300</pubDate></item><item><title>Как определить, что клиент закрыл соединение</title><guid isPermaLink="true">http://stunpix.com/2011/08/23/1/</guid><link>http://stunpix.com/2011/08/23/1/</link><comments>http://stunpix.com/2011/08/23/1/</comments><description>Мне тут на днях потребовалось в клиент-серверном коде моментально определить, закрыл ли клиент соединение или оно всё ещё держится. Решение требовалось сделать как на .NET так и на&amp;nbsp;POSIX с помощью обычного C. Быстрый анализ различных документаций показал, что решения &amp;laquo;в лоб&amp;raquo; в виде вызова некоторой функции аля &amp;laquo;getConnectionState(soket)&amp;raquo; просто не существует ни в&amp;nbsp;posix, ни в .NET.&lt;br /&gt;&lt;br /&gt;Самое интересное, что по спецификации&amp;nbsp;TCP этот протокол позволяет вполне точно определить когда клиент отсоединился. Речь конечно идёт о корректном завершении соединения, а не о физическом обрыве связи которое нельзя определить штатными средствами&amp;nbsp;tcp протокола.&lt;br /&gt;&lt;br /&gt;Требование к задаче следующее:&lt;ol start="1"&gt;&lt;li&gt;Должна быть функция которая гарантированно получает N байт из сокета.&lt;/li&gt;&lt;li&gt;Функция должна без промедлений определять отвалившегося клиента.&lt;/li&gt;&lt;li&gt;.NET C# версия должна выбрасывать свой ConnectionLostException в случае разрыва соединения.&lt;/li&gt;&lt;li&gt;POSIX C/C++ версия должна возвращать количество полученных байт или ноль в случае разрыва соединения.&lt;/li&gt;&lt;/ol&gt;Решение конечно же есть, но для этого требуется задействовать вспомогательную функцию poll(). Эта функция существует как в обычной posix среде, так и в .NET, и имеет одинаковое название в обоих случаях. Разница лишь в том, что в .NET среде она сугубо сокетная, а в&amp;nbsp;posix ею можно любые файловые дискрипторы обрабатывать. Необычность этой функции заключается в том, что определение разрыва соединения это её далеко не основная задача. Этой функцией можно определить разные состояния/события сокета (&lt;i&gt;для .NET&lt;/i&gt;) или файлового дискриптора (&lt;i&gt;для&amp;nbsp;posix&lt;/i&gt;). По большому счёту эта функция&amp;nbsp;&amp;mdash; слуга двух господ, &lt;nobr&gt;т.&amp;nbsp;к.&lt;/nobr&gt; в разные моменты времени в зависимости от контекста она сигнализирует о совершенно разных событиях в сокете/дискрипторе.&lt;br /&gt;&lt;br /&gt;В нашем частном случае после того как соединение было успешно установлено, poll() возвращает true/non zero если сокет имеет данные, либо соединение разорвано (&lt;i&gt;наша задача затем определить что именно произошло: пришли данные или соединение закрыто&lt;/i&gt;). В противном случае по таймауту возвращает false/zero (&lt;i&gt;&lt;nobr&gt;т.&amp;nbsp;е.&lt;/nobr&gt; за время таймаута событий в сокете не случилось&lt;/i&gt;). Если к примеру сокет находится только в состоянии установки соединения, то результат возвращённый poll() будет указывать на другие события связанные с сокетом. Это стоит помнить.&lt;br /&gt;&lt;br /&gt;Теперь код.&lt;br /&gt;&lt;br /&gt;C#:&lt;br /&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0600FF"&gt;static&lt;/font&gt;&amp;nbsp;&lt;font color="#0600FF"&gt;public&lt;/font&gt;&amp;nbsp;&lt;font color="#0600FF"&gt;void&lt;/font&gt;&amp;nbsp;ReceiveBytes&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;Socket&amp;nbsp;sock,&amp;nbsp;&lt;font color="#FF0000"&gt;byte&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#91;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#93;&lt;/font&gt;&amp;nbsp;data&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color="#000000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#FF0000"&gt;int&lt;/font&gt;&amp;nbsp;totalReceived&amp;nbsp;&lt;font color="#008000"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="#008000"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#FF0000"&gt;int&lt;/font&gt;&amp;nbsp;size&amp;nbsp;&lt;font color="#008000"&gt;=&lt;/font&gt;&amp;nbsp;data.&lt;font color="#0000FF"&gt;Length&lt;/font&gt;&lt;font color="#008000"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;//&amp;nbsp;Цикл&amp;nbsp;до&amp;nbsp;тех&amp;nbsp;пор&amp;nbsp;пока&amp;nbsp;не&amp;nbsp;получим&amp;nbsp;все&amp;nbsp;данные&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0600FF"&gt;while&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;totalReceived&amp;nbsp;&lt;font color="#008000"&gt;&amp;lt;&lt;/font&gt;&amp;nbsp;size&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;//&amp;nbsp;Ждём&amp;nbsp;0.1&amp;nbsp;секунду&amp;nbsp;события:&amp;nbsp;или&amp;nbsp;новые&amp;nbsp;данные&amp;nbsp;или&amp;nbsp;обрыв&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0600FF"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;sock.&lt;font color="#0000FF"&gt;Poll&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#FF0000"&gt;100000&lt;/font&gt;,&amp;nbsp;SelectMode.&lt;font color="#0000FF"&gt;SelectRead&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008080"&gt;//&amp;nbsp;Проверяем&amp;nbsp;есть&amp;nbsp;ли&amp;nbsp;какие-то&amp;nbsp;данные&amp;nbsp;у&amp;nbsp;сокета&amp;nbsp;для&amp;nbsp;нас&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0600FF"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;sock.&lt;font color="#0000FF"&gt;Available&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;==&lt;/font&gt;&amp;nbsp;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008080"&gt;//&amp;nbsp;Данных&amp;nbsp;нет,&amp;nbsp;но&amp;nbsp;раз&amp;nbsp;Poll()&amp;nbsp;вернул&amp;nbsp;true&amp;nbsp;&amp;mdash;&amp;nbsp;это&amp;nbsp;обрыв&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008080"&gt;//&amp;nbsp;поэтому&amp;nbsp;бросаем&amp;nbsp;свой&amp;nbsp;ConnectionLostException&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0600FF"&gt;throw&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;new&lt;/font&gt;&amp;nbsp;ConnectionLostException&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#008000"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0600FF"&gt;try&lt;/font&gt;&lt;/li&gt;&lt;li&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;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008080"&gt;//&amp;nbsp;Получаем&amp;nbsp;данные&lt;/font&gt;&lt;/li&gt;&lt;li&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;totalReceived&amp;nbsp;&lt;font color="#008000"&gt;+=&lt;/font&gt;&amp;nbsp;sock.&lt;font color="#0000FF"&gt;Receive&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;data,&amp;nbsp;totalReceived&amp;nbsp;&lt;font color="#008080"&gt;/*&amp;nbsp;offset&amp;nbsp;*/&lt;/font&gt;,&lt;/li&gt;&lt;li&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;&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;size&amp;nbsp;&lt;font color="#008000"&gt;-&lt;/font&gt;&amp;nbsp;totalReceived&amp;nbsp;&lt;font color="#008080"&gt;/*&amp;nbsp;size&amp;nbsp;to&amp;nbsp;recieve&amp;nbsp;*/&lt;/font&gt;,&lt;/li&gt;&lt;li&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;&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;SocketFlags.&lt;font color="#0000FF"&gt;None&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#008000"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0600FF"&gt;catch&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;SocketException&amp;nbsp;ex&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008080"&gt;//&amp;nbsp;В&amp;nbsp;зависимости&amp;nbsp;от&amp;nbsp;того&amp;nbsp;как&amp;nbsp;сконфигурирован&amp;nbsp;сокет&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008080"&gt;//&amp;nbsp;мы&amp;nbsp;можем&amp;nbsp;поймать&amp;nbsp;таймаут&amp;nbsp;или&amp;nbsp;попытку&amp;nbsp;заблокировать&amp;nbsp;сокет&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0600FF"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#40;&lt;/font&gt;ex.&lt;font color="#0000FF"&gt;SocketErrorCode&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;==&lt;/font&gt;&amp;nbsp;SocketError.&lt;font color="#0000FF"&gt;TimedOut&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;||&lt;/font&gt;&lt;/li&gt;&lt;li&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;ex.&lt;font color="#0000FF"&gt;SocketErrorCode&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;==&lt;/font&gt;&amp;nbsp;SocketError.&lt;font color="#0000FF"&gt;WouldBlock&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#000000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&lt;font color="#008080"&gt;//&amp;nbsp;Это&amp;nbsp;не&amp;nbsp;критично&amp;nbsp;и&amp;nbsp;мы&amp;nbsp;продолжаем&amp;nbsp;цикл&lt;/font&gt;&lt;/li&gt;&lt;li&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;continue&lt;font color="#008000"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#000000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0600FF"&gt;else&lt;/font&gt;&lt;/li&gt;&lt;li&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="#000000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&lt;font color="#008080"&gt;//&amp;nbsp;Остальные&amp;nbsp;исключения&amp;nbsp;говорят&amp;nbsp;о&amp;nbsp;какой-то&amp;nbsp;ошибке&lt;/font&gt;&lt;/li&gt;&lt;li&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;break&lt;font color="#008000"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#000000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&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;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color="#000000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;С/С++:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&amp;nbsp;recieveData&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&amp;nbsp;socket,&amp;nbsp;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&amp;nbsp;&lt;font color="#000040"&gt;*&lt;/font&gt;&amp;nbsp;buffer,&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&amp;nbsp;size&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color="#008000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&amp;nbsp;totalRecieved&amp;nbsp;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;,&amp;nbsp;arrived&amp;nbsp;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;struct&lt;/font&gt;&amp;nbsp;pollfd&amp;nbsp;pfd&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#666666"&gt;//&amp;nbsp;Подготавливаем&amp;nbsp;структуру&amp;nbsp;для&amp;nbsp;вызова&amp;nbsp;функции&amp;nbsp;poll()&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pfd.&lt;font color="#007788"&gt;fd&lt;/font&gt;&amp;nbsp;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;socket&lt;font color="#008080"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#666666"&gt;//&amp;nbsp;Указываем&amp;nbsp;дискриптор&amp;nbsp;сокета&amp;nbsp;который&amp;nbsp;интересует&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pfd.&lt;font color="#007788"&gt;events&lt;/font&gt;&amp;nbsp;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;POLLIN&amp;nbsp;&lt;font color="#000040"&gt;|&lt;/font&gt;&amp;nbsp;POLLHUP&amp;nbsp;&lt;font color="#000040"&gt;|&lt;/font&gt;&amp;nbsp;POLLRDNORM&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#666666"&gt;//&amp;nbsp;Цикл&amp;nbsp;пока&amp;nbsp;не&amp;nbsp;получим&amp;nbsp;все&amp;nbsp;данные&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;totalRecieved&amp;nbsp;&lt;font color="#000080"&gt;&amp;lt;&lt;/font&gt;&amp;nbsp;size&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#666666"&gt;//&amp;nbsp;Ожидаем&amp;nbsp;событие&amp;nbsp;в&amp;nbsp;сокете&amp;nbsp;с&amp;nbsp;таймаутом&amp;nbsp;100&amp;nbsp;миллисекунд&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;poll&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#000040"&gt;&amp;amp;&lt;/font&gt;pfd,&amp;nbsp;&lt;font color="#0000dd"&gt;1&lt;/font&gt;,&amp;nbsp;&lt;font color="#0000dd"&gt;100&lt;/font&gt;&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000080"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#666666"&gt;//&amp;nbsp;Произошло&amp;nbsp;какое-то&amp;nbsp;событие&amp;nbsp;&amp;mdash;&amp;nbsp;пытаемся&amp;nbsp;получить&amp;nbsp;данные&lt;/font&gt;&lt;/li&gt;&lt;li&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;arrived&amp;nbsp;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;recv&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;socket,&amp;nbsp;&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000ff"&gt;char&lt;/font&gt;&lt;font color="#000040"&gt;*&lt;/font&gt;&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;buffer&amp;nbsp;&lt;font color="#000040"&gt;+&lt;/font&gt;&amp;nbsp;totalRecieved,&amp;nbsp;size&amp;nbsp;&lt;font color="#000040"&gt;-&lt;/font&gt;&amp;nbsp;totalRecieved,&amp;nbsp;MSG_DONTWAIT&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&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="#666666"&gt;//&amp;nbsp;Если&amp;nbsp;данных&amp;nbsp;не&amp;nbsp;пришло&amp;nbsp;после&amp;nbsp;того&amp;nbsp;как&amp;nbsp;poll()&amp;nbsp;вернул&amp;nbsp;не&amp;nbsp;нулевой&lt;/font&gt;&lt;/li&gt;&lt;li&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="#666666"&gt;//&amp;nbsp;результат&amp;nbsp;&amp;mdash;&amp;nbsp;это&amp;nbsp;означает&amp;nbsp;только&amp;nbsp;обрыв&amp;nbsp;соединения&lt;/font&gt;&lt;/li&gt;&lt;li&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="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#008000"&gt;&amp;#40;&lt;/font&gt;arrived&amp;nbsp;&lt;font color="#000080"&gt;==&lt;/font&gt;&amp;nbsp;&lt;font color="#000040"&gt;-&lt;/font&gt;&lt;font color="#0000dd"&gt;1&lt;/font&gt;&amp;nbsp;&lt;font color="#000040"&gt;||&lt;/font&gt;&amp;nbsp;totalRecieved&amp;nbsp;&lt;font color="#000080"&gt;==&lt;/font&gt;&amp;nbsp;arrived&lt;font color="#008000"&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008000"&gt;&amp;#123;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#666666"&gt;//&amp;nbsp;Сбрасываем&amp;nbsp;счётчик&amp;nbsp;полученных&amp;nbsp;данных,&amp;nbsp;что&amp;nbsp;скажет&amp;nbsp;об&amp;nbsp;разрыве&amp;nbsp;соединения&lt;/font&gt;&lt;/li&gt;&lt;li&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;totalRecieved&amp;nbsp;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&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;break&lt;/font&gt;&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&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="#008000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&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="#666666"&gt;//&amp;nbsp;Продолжаем&amp;nbsp;получать&amp;nbsp;данные&lt;/font&gt;&lt;/li&gt;&lt;li&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;totalRecieved&amp;nbsp;&lt;font color="#000040"&gt;+&lt;/font&gt;&lt;font color="#000080"&gt;=&lt;/font&gt;&amp;nbsp;arrived&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&amp;nbsp;totalRecieved&lt;font color="#008080"&gt;;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color="#008000"&gt;&amp;#125;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;Приведенный выше код прекрасно отрабатывает и мгновенно отлавливает ситуации когда клиент закрывает соединение.&lt;br /&gt;&lt;br /&gt;Ну и в заключение хочется сказать, что данные куски кода были написаны для внутренних тестирующих утилит и посему к ним никаких сверх требований не предъявлялось, как следствие вероятно их можно даже оптимизировать.&lt;br /&gt;&lt;br /&gt;Happy coding! =)&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/posix/"&gt;posix&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/net/"&gt;net&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/c-and-cpp/"&gt;c&amp;amp;cpp&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/c/"&gt;c#&lt;/a&gt;&lt;/small&gt;</description><pubDate>Tue, 23 Aug 2011 18:40:30 +0300</pubDate></item><item><title>Aperture 3 и линейный DNG</title><guid isPermaLink="true">http://stunpix.com/2011/08/02/1/</guid><link>http://stunpix.com/2011/08/02/1/</link><comments>http://stunpix.com/2011/08/02/1/</comments><description>Вполне вероятно, что если бы в мире не было проблем, то и писать было бы не о чем. =) В общем есть у&amp;nbsp;Apple Aperture 3 два недостатка, которые омрачили мне впечатление от программы. Первый &#8212; программа из рук вон плохо поддерживает поиск на русском языке (Вася &amp;#8800; вася), а с нечётким поиском совсем худо. Второй недостаток многие вероятно никогда даже и не заметят, уж очень он специфический. Проявляется он только в связке Aperture 3 + DNG + (плёночный) сканер. Однажды домой ко мне попал плёночный сканер с помощью которого я отсканировал несколько цветных плёнок. Результат работы вышел на многие гигабайты, &lt;nobr&gt;т.&amp;nbsp;к.&lt;/nobr&gt; софт сканера умел сохранять 16-битные сканы только в&amp;nbsp;TIFF. Чтобы хоть как-то вернуть украденное таким расточительством место &#8212; решил перегнать tiff в&amp;nbsp;dng. Само конвертирование не заняло много времени, а вот попытка загрузить получившиеся&amp;nbsp;dng файлы в&amp;nbsp;Aperture 3 неожиданно провалилась. Aperture упорно ругалась на то, что &amp;laquo;&lt;i&gt;извините, но линейные DNG мы не кушаем&lt;/i&gt;&amp;raquo;. Это что ещё такое?&lt;br /&gt;&lt;br /&gt;Сходил на сайт технической поддержки&amp;nbsp;Apple &#8212; не помогло. Интернеты так же молчали. В итоге после нескольких экспериментов я всё же пришёл к выводу в чём загвоздка.&lt;br /&gt;&lt;br /&gt;Aperture прекрасно открывает dng файлы полученные из&amp;nbsp;raw фотографий с цифровых фотокамер и напрочь отказывается от&amp;nbsp;dng созданных после сканирования. Значит разница в том, как хранятся пиксели внутри&amp;nbsp;dng. Тут я вспомнил о том, что у цифровых камер RGB пиксели матрицы располагаются особым образом (фильтр Байера):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/260px-Bayer_pattern_on_sensor.svg.png" alt="Aperture 3 и линейный DNG" /&gt;&lt;br /&gt;&lt;br /&gt;Этот формат используется большинством камер (кроме Sigma c их X3 Foveon матрицами и некоторыми&amp;nbsp;Fuji на сколько мне известно). А сканер в силу иной природы получения картинки создаёт линейную картинку:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://stunpix.com/pictures/linear-rgb-pattern.png" alt="Aperture 3 и линейный DNG" /&gt;&lt;br /&gt;&lt;br /&gt;Сама спецификация&amp;nbsp;dng определяет, что внутри&amp;nbsp;dng файла картинка может быть сохранена в любом из этих форматов, а вот купертиновцы похоже подумали &amp;laquo;&lt;i&gt;99% камер использует формат пекселов на основе Байера. Если кто-то и конвертирует в формат DNG, то только из&amp;nbsp;raw формата камер. Так зачем какие-то редкие линейные форматы поддерживать в&amp;nbsp;dng?&lt;/i&gt;&amp;raquo; и отбросили поддержку. Другого объяснения для себя не нашёл. С одной стороны &#8212; они съэкономили время на разработке, а с другой сделали кривую поддержку &lt;i&gt;открытой&lt;/i&gt; спецификации.&lt;br /&gt;&lt;br /&gt;По итогу окончательного решения нет. Если вам довелось с этим столкнуться &#8212; ищите обходные пути: используйте другой формат или другую программу. Если не принципиально &#8212; используйте Adobe Lightroom, там поддержка&amp;nbsp;dng отличная. Если принципиально, то можете сохранить не в&amp;nbsp;dng, а в&amp;nbsp;psd &#8212; он более менее нормально поддерживается&amp;nbsp;Aperture.&lt;br /&gt;&lt;br /&gt;Happy using! =)&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/tsvet/"&gt;цвет&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/mac/"&gt;mac&lt;/a&gt;, &lt;a href="http://stunpix.com/tags/aperture/"&gt;aperture&lt;/a&gt;&lt;/small&gt;</description><pubDate>Tue, 02 Aug 2011 16:58:28 +0300</pubDate></item><item><title>Возможно самое короткое преобразование в bool</title><guid isPermaLink="true">http://stunpix.com/2011/07/17/2/</guid><link>http://stunpix.com/2011/07/17/2/</link><comments>http://stunpix.com/2011/07/17/2/</comments><description>В нашем текущем проекте мы портируем WebKit под проект заказчика и приходится крайне много копаться в эппловском WebKit&amp;rsquo;е и немного в гуглевском Chromiume. Сколько бы я не занимался C++ , я постоянно нахожу что-то интересное. Поскольку&amp;nbsp;chromium пишут достаточно серьёзные спецы, то я периодически наталкиваюсь на занимательные (на мой взгляд) куски кода на которых можно поучиться.&lt;br /&gt;&lt;br /&gt;Так например совсем недавно я увидел выражение вида:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;return !!count;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;В первую секунду было удивление, а в следующую секунду стало понятно, что эта запись преобразует любое числовое значение к&amp;nbsp;bool. Очень лаконично и красиво как по мне, вместо привычного:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;return (bool)count;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;В принципе такое преобразование должно так же работать в&amp;nbsp;java, c#, да и наверное во всех производных от С языках.&lt;br /&gt;&lt;br /&gt;Happy coding! =)&lt;hr /&gt;&lt;small&gt;&lt;a href="http://stunpix.com/tags/c-and-cpp/"&gt;c&amp;amp;cpp&lt;/a&gt;&lt;/small&gt;</description><pubDate>Sun, 17 Jul 2011 18:08:50 +0300</pubDate></item></channel></rss>
