...

суббота, 4 января 2014 г.

Инициатива против снижения лимита покупок за рубежом с 1000 до 150 евро в месяц


сегодня в 23:28



С Новым Годом друзья! К сожалению в этом году лимит беспошлинного ввоза интернет-покупок из-за рубежа в России может быть снижен с 1000 евро в месяц до 150 евро. У нас есть шанс повлиять на это.



Это несомненно очень неприятная новость. Минфин РФ предлагает ограничить сумму беспошлинного ввоза товаров из-за границы, приобретенных через Интернет с 1000 Евро в месяц на одного человека сейчас, до 150 Евро в месяц в будущем. Так же есть вероятность того, что беспошлинно можно будет получить только одну посылку в месяц! При превышении данного лимита так же планируется взимать с человека 30% от суммы превышения установленного лимита.


Более подробную информацию об этом можно найти например здесь:


www.rg.ru/2013/12/23/poshlina-online-site.html

www.newsru.com/finance/26dec2013/internet150.html

vz.ru/economy/2013/12/26/666193.html


У нас есть шанс повлиять на это, выразив свое мнение на сайте Российской Общественной Инициативы по адресу: https://www.roi.ru/6536/


Для этого необходимо быть зарегистрированным на сайте Госуслуг (www.gosuslugi.ru). Давайте выразим своё мнение и оставим себе возможность покупать качественные вещи по приятным ценам!





Свежий взгляд

на бег


протестируй кроссовки

нового поколения




Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»




Возьми Lumia 925 на тест-драйв сейчас.




Впечатляющие возможности

в стильном тонком корпусе из металла




Boomburum

исследует LTE


Эволюция средств связи

в путешествии по России




Проблемы коммуникации внутри бизнеса?



Смотри бесплатные курсы

и выиграй Xbox




Нет времени

на счета?


MasterCard

Mobile



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


2014 год глазами Айзека Азимова: предсказания из 1964 года


Вероятно, большей части хабрасообщества в 1964 году даже в проекте не было. Однако, в то время жил и работал великий (не побоюсь этого слова) писатель-фантаст, мыслитель, ученый, популяризатор науки и просто человек Айзек Азимов. В 1964 году, находясь под впечатлением от Всемирной выставки, проходившей в Нью-Йорке, он решил представить, как будет выглядеть мир через полвека. В этом, 2014 году, как раз исполняется 50 лет этому предсказанию, поэтому предлагаю вспомнить те предсказания Азимова, что сбылись.


Предсказания расположены не в порядке приоритетности, а хаотично, проранжировать их в порядке важности не представляется возможным, все эти достижения одинаково важны. По крайней мере, большинство.


1. Через 50 лет большая часть рутинных задач будет переложена на плечи техники. На кухне будут работать устройства с функцией «автоготовкой», которые будут готовить тосты, готовить яйца, жарить бекон, варить кофе.


Завтрак можно будет заказывать уже за сутки до необходимого времени.


2. В 2014 году население Земли достигнет 6,5 миллиардов человек, а население США увеличится до 350 миллионов.


Регион Бостон-Вашингтон сольется в один мегаполис с населением 40 миллионов человек (это предсказание не сбылось, и уже вряд ли сбудется).


3. Что касается телевидения, то настенные экраны заменят обычные телеприемники, кроме того, появятся 3D телевизоры (тут, правда, имелись в виду не стереоскопические дисплеи, которые не являются особо чем-то новым, а именно объемное ТВ).


4. Коммуникации уйдут далеко вперед, при этом во время разговора можно будет видеть своего собеседника. Плюс ко всему, телефоны будут оснащены экранами, и работать с экранами можно будет не только для того, чтобы видеть человека, но и для выполнения прочих функций, вроде чтения книг, заметок, работы с фото и изображениями.


Спутники позволят совершать звонки из конца в конец нашей планеты, причем для связи будет достаточно просто набрать номер.


5. В 2014 году некоторые виды работ будут выполняться машинами лучше, чем кем-либо из людей.


6. Школы будут автоматизироваться, а студенты высших учебных заведений будут обучаться компьютерным наукам, кроме того, будут изучать «компьютерные языки» которые будут развиваться из нынешнего «Fortran» (от«formula translation»).


7. Роботы не будут очень распространены в 2014 году, но они будут присутствовать в быту человека. Будут существовать миниатюрные компьютеры, служащие в качестве «мозга» для роботов. Вероятно, в штаб-квартире I.B.M. в 2014 году будет работать робот-уборщица. Медленный, большой робот, который, впрочем, сможет выполнять обычные задачи уборщицы.


General Electric в 2014 году будет демонстрировать 3D фильмы серии «Робот будущего».


8. Рекламные плакаты будут заменены светящейся настенной рекламой.


9. Общество в 2014 году будет являться «обществом принудительного отдыха», и настоящей проблемой людей будушего станет скука. Появится большое количество недугов, связанных с душевными расстройствами, а психиатрия станет весьма важным направлением медицины.


10. Появится много продуктов на основе водорослей и микроорганизмов. В 2014 появятся бары с продуктами из водорослей, например «псевдостейк». Важным шагом будет являться преодоление психологического барьера, мешающего человеку начать относиться к искусственным продуктам так же, как и к натуральным.


Согласитесь, эти предсказания, как говорят, «не в бровь, в глаз». Большая часть сбылась, но есть и то, что еще только предстоит — например, широкое распространение транспортных средств, парящих над дорогой (что-то вроде воздушной подушки).


С полным списком можно ознакомиться вот здесь.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


[Перевод] Zynga играет с Биткойном

image

Как сообщает CoinDesk, гигант социальных игр Zynga начинает тестировать использование Биткойна в своих приложениях. Значение этой новости трудно переоценить — ведь Zynga буквально доминирует в мире игр для социальных сетей, в которые играют десятки миллионов. Если этот тест будет успешен, для цифровой валюты откроется гигантский, и к тому же активно растущий, рынок.

Zynga объявила, что она будет принимать биткойны для покупок внутри некоторых своих игр, в качестве «теста» своей интеграции с биткойн-процессором BitPay. Этот шаг потенциально открывает для цифровой валюты рынок в 800 млн. долларов в год — именно в такую сумму оцениваются внутриигровые покупки в играх только одной этой компании. Команда Zynga только что опубликовала следующее сообщение на своем официальном аккаунте в Reddit:


«Мы тестируем Биткойн! Этот тест пока доступен только для игроков, играющих в наши игры FarmVille 2, CastleVille, ChefVille, CoasterVille, Hidden Chronicles, Hidden Shadows и CityVille. Эти игры доступны игрокам на zynga.com. Zynga всегда работает над улучшением качества обслуживания клиентов за счет обратной связи от игроков в наших играх. Мы с нетерпением ждем от наших игроков впечатлений о тесте Биткойна, чтобы мы могли продолжать наши усилия по обеспечению наилучшего возможного игровой опыта.»


Источники, связанные с BitPay и Zynga пользователей быстро подтвердили, что указанное заявление — не шутка, а чистая правда.


Стоит отметить, что крупные инвесторы компании Zynga Union Square Ventures и Andreessen Horowitz, также заинтересованы в Биткойне, так как они недавно профинансировали онлайн-кошелек и платежный сервис на основе Биткойн компанию Coinbase.


Zynga является явным лидером нового поколения компаний, ориентированных на социальные игры. Эти игры, которые пользуются популярностью и сетевыми эффектами существующих социальных сетей для привлечения новых пользователей, которые приглашаются своими друзьями, с которыми они могут конкурировать и сотрудничать в играх.


Выручка Zynga приходит в двух формах: прямые покупки игроков внутри игр, а также доходы от партнеров. Прямые покупки производятся игроками прямо внутри игры, чтобы покупать разные виртуальные товары, апгрейды, способности и т.п., которые могут помочь игрокам соревноваться с другими.


Пользователь Reddit под ником betafall разместил это видео, показывая простоту совершения покупки за биткойны в игре Zynga:



Фирма также ранее объявила о том, что она движется в сторону игр за реальные деньги, выпустив ZyngaPlusPoker и ZyngaPlusCasino в Великобритании в 2013 году. В США, было объявлено, что компания тоже попытается получить лицензию как оператор азартных игр, но это оказалось сложно и в июле компания прекратила свои усилия по лицензированию в Америке.


Zynga имеет бурную историю, когда дело доходит до использования альтернативных валют для покупок в приложениях. В 2010 году, компания угрожала прекратить отношения с Facebook после того, гигант соцсетей пытался заставить ее принимать собственную виртуальную валюту, Facebook Credits (ныне прекращенную), для покупок внутри своих игр. Если бы эта сделка состоялась, Facebook клал бы себе в карман 30% всех внутриигровых платежей в играх Zynga, размещенных на Facebook.


Компании преодолел свой ​​спор и продлили контракт на пять лет, но Zynga также начала создавать свою собственную сеть Zynga With Friends, которая соединяет игроков в играх компании на различных платформах. Также, был выпущен API Zynga, позволяющая и другим разработчикам создавать социальные игры на основе этой сети.

image


Zynga является производителем целого ряда популярнейших социальных игр. Основанная в 2008 году компания стала публичной в декабре 2011 года. В прошлом году, бизнес шел тяжело для Zynga — в июле, компания заявила, что она потеряла почти половину своей пользовательской базы в течение года, в результате прямой конкуренции самих социальных сетей и других игровых компаний.


Легкий, мобильный дружественный подход к играм Zynga сильно отличается от традиционного рынка консольных и PC-игр, в которых доминируют монументальные, сложные игры, часто конкурирующие с голливудскими фильмами по бюджетам и срокам производства. В секторе игровых консолей, компании отошли от виртуальной валюты. Microsoft, например, отказалась от своей системы Points в начале этого года, вернувшись к простой покупке внутри игр с помощью кредитных карт.


Прием биткойнов в качестве валюты внутри игр несет ряд преимуществ, сказал Джеффри Грин, старший аналитик pymnts.com, который специализируется в платежном бизнесе. «Преимущества в том, чтобы дать пользователю еще один вариант оплаты. Дайте пользователю выбор, пусть он использует то, что ему удобнее», считет Грин, который написал анализ виртуальных валют, используемых крупными интернет- компанями. Он объяснил:


«Проблемой может стать волатильность Биткойна и то, что их можно легко обменять на доллары. Объем вначале будет не очень высокой, но, вероятно, будут геймеры, которые открыты к новым идеям и готовы попробовать что-то новое.»


Вопрос еще и в том, что в мире платежей высоки комиссии. PayPal и кредитные компании взимают комиссию по платежам, и хотя большая компания, такая как Zynga, может получить скидки с комиссии, практически отсутствующие комиссии биткойн-платежей делают эту опцию весьма привлекательной для компании-производителя.


Есть, однако, и негативные аспекты в использовании биткойнов для внутриигровых платежей. Ведь цифровая валюта пока не позволяет формат периодических платежей, как периодическое списание с кредитки, которые могут быть полезны в социальных играх.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Куски кода в заголовках писем на Яндекс.Почте

20140103-test-5.eml:

20140103-test-6.eml: 13sql_exception

20140103-test-7.eml: HЙ√и†Тш€LЙзиИОш€HЙяиЩш€HЙ√ллРРРAWMЙ«AVIЙюAUIЙЌATUHЙ’SHЙуHЙќHБмШ

20140103-test-8.eml: r.cc

20140103-test-9.eml: NS_21thread_resource_errorEEEEE

20140103-test-10.eml: чЕЎо€€йяо€€

20140103-test-11.eml: –}%HШЊ

20140103-test-12.eml: r.cc

20140103-test-13.eml: r.cc

20140103-test-14.eml: 13sql_exception

20140103-test-15.eml: чЕЎо€€йяо€€

20140103-test-16.eml: NS_21thread_resource_errorEEEEE

20140103-test-17.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-18.eml: r.cc

20140103-test-19.eml: чЕЎо€€йяо€€

20140103-test-20.eml: –}%HШЊ

20140103-test-21.eml:

20140103-test-22.eml: r.cc

20140103-test-23.eml: r.cc

20140103-test-24.eml: 13sql_exception

20140103-test-25.eml: r.cc

20140103-test-26.eml: –}%HШЊ

20140103-test-27.eml: r.cc

20140103-test-28.eml: r.cc

20140103-test-29.eml:

20140103-test-30.eml: –}%HШЊ

20140103-test-31.eml: 13sql_exception

20140103-test-32.eml: r.cc

20140103-test-33.eml: r.cc

20140103-test-34.eml: r.cc

20140103-test-35.eml:

20140103-test-36.eml: –}%HШЊ

20140103-test-37.eml: 13sql_exception

20140103-test-38.eml: r.cc

20140103-test-39.eml: r.cc

20140103-test-40.eml:

20140103-test-41.eml: –}%HШЊ

20140103-test-42.eml: r.cc

20140103-test-43.eml: 13sql_exception

20140103-test-44.eml: r.cc

20140103-test-45.eml:

20140103-test-46.eml: –}%HШЊ

20140103-test-47.eml: r.cc

20140103-test-48.eml: 13sql_exception

20140103-test-49.eml: r.cc

20140103-test-50.eml:

20140103-test-51.eml: r.cc

20140103-test-52.eml: r.cc

20140103-test-53.eml: 13sql_exception

20140103-test-54.eml: r.cc

20140103-test-55.eml: –}%HШЊ

20140103-test-56.eml:

20140103-test-57.eml: r.cc

20140103-test-58.eml: r.cc

20140103-test-59.eml: r.cc

20140103-test-60.eml: 13sql_exception

20140103-test-61.eml: –}%HШЊ

20140103-test-62.eml:

20140103-test-63.eml: r.cc

20140103-test-64.eml: 13sql_exception

20140103-test-65.eml: r.cc

20140103-test-66.eml: –}%HШЊ

20140103-test-67.eml: 13sql_exception

20140103-test-68.eml: r.cc

20140103-test-69.eml:

20140103-test-70.eml: r.cc

20140103-test-71.eml: 13sql_exception

20140103-test-72.eml: r.cc

20140103-test-73.eml: –}%HШЊ

20140103-test-74.eml: 13sql_exception

20140103-test-75.eml: 13sql_exception

20140103-test-76.eml:

20140103-test-77.eml: чЕЎо€€йяо€€

20140103-test-78.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-79.eml: NS_21thread_resource_errorEEEEE

20140103-test-80.eml: –}%HШЊ

20140103-test-81.eml: r.cc

20140103-test-82.eml: 13sql_exception

20140103-test-83.eml: r.cc

20140103-test-84.eml:

20140103-test-85.eml: –}%HШЊ

20140103-test-86.eml: –}%HШЊ

20140103-test-87.eml: чЕЎо€€йяо€€

20140103-test-88.eml: 13sql_exception

20140103-test-89.eml: r.cc

20140103-test-90.eml: 13sql_exception

20140103-test-91.eml: essage, stid=%s

20140103-test-92.eml: 13sql_exception

20140103-test-93.eml: NS_21thread_resource_errorEEEEE

20140103-test-94.eml: r.cc

20140103-test-95.eml: чЕЎо€€йяо€€

20140103-test-96.eml:

20140103-test-97.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-98.eml: NS_21thread_resource_errorEEEEE

20140103-test-99.eml: r.cc

20140103-test-100.eml: 13sql_exception

20140103-test-101.eml: essage, stid=%s

20140103-test-102.eml: 13sql_exception

20140103-test-103.eml: NS_21thread_resource_errorEEEEE

20140103-test-104.eml: чЕЎо€€йяо€€

20140103-test-105.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-106.eml:

20140103-test-107.eml: NS_21thread_resource_errorEEEEE

20140103-test-108.eml: r.cc

20140103-test-109.eml: r.cc

20140103-test-110.eml: 13sql_exception

20140103-test-111.eml: чЕЎо€€йяо€€

20140103-test-112.eml: –}%HШЊ

20140103-test-113.eml: 13sql_exception

20140103-test-114.eml: r.cc

20140103-test-115.eml:

20140103-test-116.eml: чЕЎо€€йяо€€

20140103-test-117.eml: –}%HШЊ

20140103-test-118.eml: –}%HШЊ

20140103-test-119.eml: 13sql_exception

20140103-test-120.eml: r.cc

20140103-test-121.eml: 13sql_exception

20140103-test-122.eml: r.cc

20140103-test-123.eml: чЕЎо€€йяо€€

20140103-test-124.eml:

20140103-test-125.eml: –}%HШЊ

20140103-test-126.eml: –}%HШЊ

20140103-test-127.eml: 13sql_exception

20140103-test-128.eml: essage, stid=%s

20140103-test-129.eml: 13sql_exception

20140103-test-130.eml: r.cc

20140103-test-131.eml: NS_21thread_resource_errorEEEEE

20140103-test-132.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-133.eml: чЕЎо€€йяо€€

20140103-test-134.eml: 13sql_exception

20140103-test-135.eml:

20140103-test-136.eml: r.cc

20140103-test-137.eml: NS_21thread_resource_errorEEEEE

20140103-test-138.eml: чЕЎо€€йяо€€

20140103-test-139.eml:

20140103-test-140.eml: –}%HШЊ

20140103-test-141.eml: –}%HШЊ

20140103-test-142.eml: r.cc

20140103-test-143.eml: 13sql_exception

20140103-test-144.eml: essage, stid=%s

20140103-test-145.eml: r.cc

20140103-test-146.eml: 13sql_exception

20140103-test-147.eml: 13sql_exception

20140103-test-148.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-149.eml: NS_21thread_resource_errorEEEEE

20140103-test-150.eml: 13sql_exception

20140103-test-151.eml: r.cc

20140103-test-152.eml: чЕЎо€€йяо€€

20140103-test-153.eml:

20140103-test-154.eml: NS_21thread_resource_errorEEEEE

20140103-test-155.eml: r.cc

20140103-test-156.eml: –}%HШЊ

20140103-test-157.eml: r.cc

20140103-test-158.eml: чЕЎо€€йяо€€

20140103-test-159.eml:

20140103-test-160.eml: –}%HШЊ

20140103-test-161.eml: 13sql_exception

20140103-test-162.eml: essage, stid=%s

20140103-test-163.eml: 13sql_exception

20140103-test-164.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-165.eml: 13sql_exception

20140103-test-166.eml: 13sql_exception

20140103-test-167.eml: NS_21thread_resource_errorEEEEE

20140103-test-168.eml: r.cc

20140103-test-169.eml: чЕЎо€€йяо€€

20140103-test-170.eml: r.cc

20140103-test-171.eml:

20140103-test-172.eml: –}%HШЊ

20140103-test-173.eml: NS_21thread_resource_errorEEEEE

20140103-test-174.eml: r.cc

20140103-test-175.eml: 13sql_exception

20140103-test-176.eml:

20140103-test-177.eml: –}%HШЊ

20140103-test-178.eml: essage, stid=%s

20140103-test-179.eml: чЕЎо€€йяо€€

20140103-test-180.eml: чЕЎо€€йяо€€

20140103-test-181.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-182.eml: r.cc

20140103-test-183.eml: 13sql_exception

20140103-test-184.eml: 13sql_exception

20140103-test-185.eml: 13sql_exception

20140103-test-186.eml: NS_21thread_resource_errorEEEEE

20140103-test-187.eml: чЕЎо€€йяо€€

20140103-test-188.eml: r.cc

20140103-test-189.eml: –}%HШЊ

20140103-test-190.eml:

20140103-test-191.eml: r.cc

20140103-test-192.eml: 13sql_exception

20140103-test-193.eml: NS_21thread_resource_errorEEEEE

20140103-test-194.eml:

20140103-test-195.eml: –}%HШЊ

20140103-test-196.eml: essage, stid=%s

20140103-test-197.eml: чЕЎо€€йяо€€

20140103-test-198.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-199.eml: 13sql_exception

20140103-test-200.eml: 13sql_exception

20140103-test-201.eml: 13sql_exception

20140103-test-202.eml: чЕЎо€€йяо€€

20140103-test-203.eml: NS_21thread_resource_errorEEEEE

20140103-test-204.eml: r.cc

20140103-test-205.eml: чЕЎо€€йяо€€

20140103-test-206.eml: –}%HШЊ

20140103-test-207.eml: 13sql_exception

20140103-test-208.eml: r.cc

20140103-test-209.eml:

20140103-test-210.eml: NS_21thread_resource_errorEEEEE

20140103-test-211.eml: r.cc

20140103-test-212.eml:

20140103-test-213.eml: –}%HШЊ

20140103-test-214.eml: essage, stid=%s

20140103-test-215.eml: чЕЎо€€йяо€€

20140103-test-216.eml: 13sql_exception

20140103-test-217.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-218.eml: чЕЎо€€йяо€€

20140103-test-219.eml: 13sql_exception

20140103-test-220.eml: r.cc

20140103-test-221.eml: –}%HШЊ

20140103-test-222.eml: r.cc

20140103-test-223.eml: чЕЎо€€йяо€€

20140103-test-224.eml: 13sql_exception

20140103-test-225.eml: чЕЎо€€йяо€€

20140103-test-226.eml: 13sql_exception

20140103-test-227.eml: essage, stid=%s

20140103-test-228.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-229.eml: чЕЎо€€йяо€€

20140103-test-230.eml: 13sql_exception

20140103-test-231.eml: чЕЎо€€йяо€€

20140103-test-232.eml: 13sql_exception

20140103-test-233.eml: r.cc

20140103-test-234.eml: –}%HШЊ

20140103-test-235.eml: essage, stid=%s

20140103-test-236.eml: r.cc

20140103-test-237.eml: чЕЎо€€йяо€€

20140103-test-238.eml: 13sql_exception

20140103-test-239.eml: чЕЎо€€йяо€€

20140103-test-240.eml: –}%HШЊ

20140103-test-241.eml: 13sql_exception

20140103-test-242.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-243.eml: r.cc

20140103-test-244.eml: –}%HШЊ

20140103-test-245.eml: чЕЎо€€йяо€€

20140103-test-246.eml: 13sql_exception

20140103-test-247.eml: чЕЎо€€йяо€€

20140103-test-248.eml: –}%HШЊ

20140103-test-249.eml: 13sql_exception

20140103-test-250.eml: essage, stid=%s

20140103-test-251.eml: r.cc

20140103-test-252.eml: чЕЎо€€йяо€€

20140103-test-253.eml: –}%HШЊ

20140103-test-254.eml: 13sql_exception

20140103-test-255.eml: r.cc

20140103-test-256.eml: –}%HШЊ

20140103-test-257.eml: x-Spam

20140103-test-258.eml: –}%HШЊ

20140103-test-259.eml: r.cc

20140103-test-260.eml: –}%HШЊ

20140103-test-261.eml: HЙп膥ш€Ї)

20140103-test-262.eml: 13sql_exception

20140103-test-263.eml: x-Spam

20140103-test-264.eml: –}%HШЊ

20140103-test-265.eml: loc = std::allocator<char>]

20140103-test-266.eml: r.cc

20140103-test-267.eml: /libfeed/nosuchuser.tpl

20140103-test-268.eml: essage, stid=%s

20140103-test-269.eml: –}%HШЊ

20140103-test-270.eml: x-Spam

20140103-test-271.eml: NS_21thread_resource_errorEEEEE

20140103-test-272.eml: –}%HШЊ

20140103-test-273.eml: r.cc

20140103-test-274.eml: HЙп膥ш€Ї)

20140103-test-275.eml: /libfeed/nosuchuser.tpl

20140103-test-276.eml: HЙ«иР…ш€LЙоHЙ«иЕ…ш€LЙцHЙ«иz…ш€HЛt$ HЙ«иm…ш€HЛt$hHЙ«и`…ш€HЛі$А

20140103-test-277.eml: essage, stid=%s

20140103-test-278.eml: –}%HШЊ

20140103-test-279.eml: r.cc

20140103-test-280.eml: x-Spam

20140103-test-281.eml: –}%HШЊ

20140103-test-282.eml: essage, stid=%s

20140103-test-283.eml: HЙп膥ш€Ї)

20140103-test-284.eml: –}%HШЊ

20140103-test-285.eml: 13sql_exception

20140103-test-286.eml: r.cc

20140103-test-287.eml: x-Spam

20140103-test-288.eml: –}%HШЊ

20140103-test-289.eml: /libfeed/nosuchuser.tpl

20140103-test-290.eml: essage, stid=%s

20140103-test-291.eml: loc = std::allocator<char>]

20140103-test-292.eml: r.cc

20140103-test-293.eml: –}%HШЊ

20140103-test-294.eml: x-Spam

20140103-test-295.eml: –}%HШЊ

20140103-test-296.eml: essage, stid=%s

20140103-test-297.eml: HЙп膥ш€Ї)

20140103-test-298.eml: r.cc

20140103-test-299.eml: чЕЎо€€йяо€€

20140103-test-300.eml: 13sql_exception

20140103-test-301.eml: 13sql_exception

20140103-test-302.eml: –}%HШЊ

20140103-test-303.eml: x-Spam

20140103-test-304.eml: –}%HШЊ

20140103-test-305.eml: r.cc

20140103-test-306.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-307.eml: /libfeed/nosuchuser.tpl

20140103-test-308.eml: essage, stid=%s

20140103-test-309.eml: чЕЎо€€йяо€€

20140103-test-310.eml: r.cc

20140103-test-311.eml: –}%HШЊ

20140103-test-312.eml: x-Spam

20140103-test-313.eml: –}%HШЊ

20140103-test-314.eml: r.cc

20140103-test-315.eml: 13sql_exception

20140103-test-316.eml: essage, stid=%s

20140103-test-317.eml: essage, stid=%s

20140103-test-318.eml: 13sql_exception

20140103-test-319.eml: чЕЎо€€йяо€€

20140103-test-320.eml: –}%HШЊ

20140103-test-321.eml:

20140103-test-322.eml: –}%HШЊ

20140103-test-323.eml: 13sql_exception

20140103-test-324.eml: essage, stid=%s

20140103-test-325.eml: 13sql_exception

20140103-test-326.eml: –}%HШЊ

20140103-test-327.eml: чЕЎо€€йяо€€

20140103-test-328.eml: 13sql_exception

20140103-test-330.eml: –}%HШЊ

20140103-test-331.eml: essage, stid=%s

20140103-test-332.eml:

20140103-test-333.eml: 13sql_exception

20140103-test-334.eml: –}%HШЊ

20140103-test-335.eml: 13sql_exception

20140103-test-336.eml: чЕЎо€€йяо€€

20140103-test-337.eml: –}%HШЊ

20140103-test-338.eml: essage, stid=%s

20140103-test-339.eml:

20140103-test-340.eml: 13sql_exception

20140103-test-341.eml: –}%HШЊ

20140103-test-342.eml: чЕЎо€€йяо€€

20140103-test-343.eml: –}%HШЊ

20140103-test-344.eml: essage, stid=%s

20140103-test-345.eml: 13sql_exception

20140103-test-346.eml: 13sql_exception

20140103-test-347.eml:

20140103-test-348.eml: –}%HШЊ

20140103-test-349.eml:

20140103-test-350.eml: чЕЎо€€йяо€€

20140103-test-351.eml: essage, stid=%s

20140103-test-352.eml: –}%HШЊ

20140103-test-353.eml: 13sql_exception

20140103-test-354.eml: 13sql_exception

20140103-test-355.eml:

20140103-test-356.eml:

20140103-test-357.eml: –}%HШЊ

20140103-test-358.eml: 13sql_exception

20140103-test-359.eml: c_string<char, std::char_traits<char>, std::allocator<char> > >, Allocator = std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

20140103-test-360.eml: чЕЎо€€йяо€€

20140103-test-361.eml:

20140103-test-362.eml: –}%HШЊ

20140103-test-363.eml: –}%HШЊ

20140103-test-364.eml: r.cc

20140103-test-365.eml: 13sql_exception

20140103-test-366.eml: –}%HШЊ

20140103-test-367.eml: –}%HШЊ

20140103-test-368.eml: x-Spam

20140103-test-369.eml: r.cc

20140103-test-370.eml:

20140103-test-371.eml: essage, stid=%s

20140103-test-372.eml: essage, stid=%s

20140103-test-373.eml: essage, stid=%s

20140103-test-374.eml:

20140103-test-375.eml: чЕЎо€€йяо€€

20140103-test-376.eml: –}%HШЊ

20140103-test-377.eml: 13sql_exception

20140103-test-378.eml: HЙп膥ш€Ї)

20140103-test-379.eml: /libfeed/nosuchuser.tpl

20140103-test-380.eml: –}%HШЊ

20140103-test-381.eml: 13sql_exception

20140103-test-382.eml: –}%HШЊ

20140103-test-383.eml: loc = std::allocator<char>]

20140103-test-384.eml: –}%HШЊ

20140103-test-385.eml:

20140103-test-386.eml: x-Spam

20140103-test-387.eml: чЕЎо€€йяо€€

20140103-test-388.eml: 13sql_exception

20140103-test-389.eml: /libfeed/nosuchuser.tpl

20140103-test-390.eml: –}%HШЊ

20140103-test-391.eml:

20140103-test-392.eml:

20140103-test-393.eml: чЕЎо€€йяо€€

20140103-test-394.eml: –}%HШЊ

20140103-test-395.eml: 13sql_exception

20140103-test-396.eml: –}%HШЊ

20140103-test-397.eml: /libfeed/nosuchuser.tpl

20140103-test-398.eml:

20140103-test-399.eml: –}%HШЊ

20140103-test-400.eml: чЕЎо€€йяо€€

20140103-test-401.eml: –}%HШЊ

20140103-test-402.eml: 13sql_exception

20140103-test-403.eml: x-Spam

20140103-test-404.eml: /libfeed/nosuchuser.tpl

20140103-test-405.eml:

20140103-test-406.eml: –}%HШЊ


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Взаимодействие Android-устройств в локальной сети


Предположим, мы пишем игру для Android, которая подразумевает некое сетевое взаимодействие между устройствами. Причем наши устройства находятся в одной сети и мы хотим, чтобы взаимодействие между ними осуществлялось быстро, а значит вариант с обменом данными через интернет нам не подходит. Ах да, еще одна маленькая ложка дегтя — мы хотим охватить максимально возможную аудиторию, для чего нам необходимо поддерживать Android 2.3.

Что же нам делать? Давайте поговорим об этом, а заодно рассмотрим относительно новые возможности Android SDK для соединения двух и более устройств.



О чем это и для кого это?




Как-то раз, уйдя с предыдущего места работы и погрузившись в заслуженный отдых, я принялся писать сетевую игру, в которую могут играть люди, находящиеся в одной локальной сети. И сразу же столкнулся с тем, что для нормального функционирования подобной игры нам мало соорудить сетевое взаимодействие — нам нужно сделать нормальное и быстрое обнаружение устройств в сети. Собственно, в данной статье я поделюсь своим опытом в реализации решения для данной задачи.

Сразу оговорюсь, что статья предназначена в большей мере для тех, кто имеет опыт Android-разработки, написал несколько приложений и хочет расширить свой кругозор, а также улучшить профессиональные навыки.

Какие возможные способы решения существуют?





  1. Android Network Service Discovery. Простой и эффективный способ обнаружения устройств. На Android Developer есть пошаговое руководство по подключению NSD, есть пример NsdChat, который можно скачать там же. Но есть один существенный минус — данный метод поддерживается только начиная с API Level 16, то есть с Android 4.1 Jelly Bean;

  2. Второе решение, предлагаемое нам на сайте Android Developer — Wi-Fi Peer-to-Peer. Проблема этого метода та же самая — поддерживается он только начиная с API Level 16;

  3. Есть странное решение, которое предлагается некоторыми программистами на Stack Overflow — самостоятельно сканировать локальную сеть на предмет наличия сервера. То есть проходить по всем адресам сети. Это уже сейчас звучит как странный велосипед, а теперь представьте, что порт нашего сервера назначается автоматически. Таким образом, сканирование даже самую небольшой сети становится достаточно долгой и трудоемкой задачей;

  4. Наконец, мы можем обратить внимание на Java-библиотеки и написать что-нибудь с их использованием. Например, JmDNS.




Последний способ выглядит вполне адекватным и, кажется, может обеспечить нас требуемой скоростью и удобством обнаружения устройств в сети для конечного пользователя.

Итак...




Я вооружился JmDNS и решил попробовать соорудить несколько классов, которые по максимуму упростят написание описанных выше приложений. Но для начала пришлось немного повырезать дубликаты .class-файлов из jar-пакета JmDNS (проблема описана здесь):

mkdir unjar
cd unjar
jar xf ../jmdns.jar
jar cfm ../jmdns.jar META-INF/MANIFEST.MF javax/


Далее я взял исходный код NsdChat с Android Developer и изменил его служебный класс, который отвечает за инициализацию сокетов и организацию сетевого взаимодействия. Также я написал wrapper для JmDNS



import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.Log;

import java.io.IOException;
import java.net.InetAddress;

import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceInfo;
import javax.jmdns.ServiceListener;

/**
* @author alwx
* @version 1.0
*/
public class NetworkDiscovery {
private final String DEBUG_TAG = NetworkDiscovery.class.getName();
private final String TYPE = "_alwx._tcp.local.";
private final String SERVICE_NAME = "LocalCommunication";

private Context mContext;
private JmDNS mJmDNS;
private ServiceInfo mServiceInfo;
private ServiceListener mServiceListener;
private WifiManager.MulticastLock mMulticastLock;

public NetworkDiscovery(Context context) {
mContext = context;
try {
WifiManager wifi = (WifiManager) mContext.getSystemService(android.content.Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifi.getConnectionInfo();
int intaddr = wifiInfo.getIpAddress();

byte[] byteaddr = new byte[]{
(byte) (intaddr & 0xff),
(byte) (intaddr >> 8 & 0xff),
(byte) (intaddr >> 16 & 0xff),
(byte) (intaddr >> 24 & 0xff)
};
InetAddress addr = InetAddress.getByAddress(byteaddr);
mJmDNS = JmDNS.create(addr);
} catch (IOException e) {
Log.d(DEBUG_TAG, "Error in JmDNS creation: " + e);
}
}

/**
* starts server with defined names on given port
*
* @param port server port
*/
public void startServer(int port) {
try {
wifiLock();
mServiceInfo = ServiceInfo.create(TYPE, SERVICE_NAME, port, SERVICE_NAME);
mJmDNS.registerService(mServiceInfo);
} catch (IOException e) {
Log.d(DEBUG_TAG, "Error in JmDNS initialization: " + e);
}
}

/**
* performs servers discovery
*
* @param listener listener, that will be called after successful discovery
* (see {@link me.alwx.localcommunication.connection.NetworkDiscovery.OnFoundListener}
*/
public void findServers(final OnFoundListener listener) {
mJmDNS.addServiceListener(TYPE, mServiceListener = new ServiceListener() {
@Override
public void serviceAdded(ServiceEvent serviceEvent) {
ServiceInfo info = mJmDNS.getServiceInfo(serviceEvent.getType(), serviceEvent.getName());
listener.onFound(info);
}

@Override
public void serviceRemoved(ServiceEvent serviceEvent) {
}

@Override
public void serviceResolved(ServiceEvent serviceEvent) {
mJmDNS.requestServiceInfo(serviceEvent.getType(), serviceEvent.getName(), 1);
}
});
}

/**
* closes connection & unregisters all services
*/
public void reset() {
if (mJmDNS != null) {
if (mServiceListener != null) {
mJmDNS.removeServiceListener(TYPE, mServiceListener);
mServiceListener = null;
}
mJmDNS.unregisterAllServices();
}
if (mMulticastLock != null && mMulticastLock.isHeld()) {
mMulticastLock.release();
}
}

/**
* accuires Wi-Fi lock
*/
private void wifiLock() {
WifiManager wifiManager = (WifiManager) mContext.getSystemService(android.content.Context.WIFI_SERVICE);
mMulticastLock = wifiManager.createMulticastLock(SERVICE_NAME);
mMulticastLock.setReferenceCounted(true);
mMulticastLock.acquire();
}

public interface OnFoundListener {
void onFound(ServiceInfo info);
}
}


Здесь размещены 4 основные функции для работы Network Discovery:



  1. startServer для создания сервера и регистрации соответствующего сервиса в локальной сети;

  2. findServers для поиска серверов;

  3. reset для окончания работы с Network Discovery и последующего освобождения ресурсов;

  4. wifiLock для запроса блокировки Wi-Fi.


В завершении я написал универсальный класс ConnectionWrapper для полноценной организации обнаружения, а также обмена сообщениями в локальной сети. Таким образом, создание сервера в конечном приложении выглядит следующим образом:



getConnectionWrapper().startServer();
getConnectionWrapper().setHandler(mServerHandler);




А вот и mServerHandler, использующийся для приема и обработки сообщений:

private Handler mServerHandler = new MessageHandler(MainActivity.this) {
@Override
public void onMessage(String type, JSONObject message) {
try {
if (type.equals(Communication.Connect.TYPE)) {
final String deviceFrom = message.getString(Communication.Connect.DEVICE);
Toast.makeText(getApplicationContext(), "Device: " + deviceFrom, Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
Log.d(DEBUG_TAG, "JSON parsing exception: " + e);
}
}
};




Отправка сообщений еще проще:

getConnectionWrapper().send(
new HashMap<String, String>() {{
put(Communication.MESSAGE_TYPE, Communication.ConnectSuccess.TYPE);
}}
);




И, наконец, метод для обнаружения и подключения к серверу:

private void connect() {
getConnectionWrapper().findServers(new NetworkDiscovery.OnFoundListener() {
@Override
public void onFound(javax.jmdns.ServiceInfo info) {
if (info != null && info.getInet4Addresses().length > 0) {
getConnectionWrapper().stopNetworkDiscovery();
getConnectionWrapper().connectToServer(
info.getInet4Addresses()[0],
info.getPort(),
mConnectionListener
);
getConnectionWrapper().setHandler(mClientHandler);
}
}
});
}




Как видите, все очень просто. А главное, все это работает в любой версии Android для максимум двух устройств. Но сделать так, чтобы это работало для условно неограниченного числа устройств очень легко, и очевидное решение придет к вам почти сразу после детального изучения класса Connection. Пусть это будет в качестве домашнего задания.

Ах, да, весь код доступен для изучения и использования всеми желающими в моем репозитории на GitHub.. И, конечно, не исключаю то, что некоторые вещи можно сделать лучше и проще, поэтому не стесняйтесь форкать и делать pull request'ы.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Обзор развития индустрии вспомогательных компьютерных технологий для пользователей с нарушениями зрения за 2013 год


сегодня в 17:31


Традиционный ежегодный обзор вспомогательных компьютерных технологий для пользователей с нарушениями зрения, посвящённый разбору основных тенденций и событий из этой области за 2013 год. Материал носит название «Тифлотехнологии-2013: точки бифуркации» и в полной версии размещён на ресурсе Тифлокомп. Здесь же в комментариях можно задать любые интересующие вопросы по данной теме.

Ниже приводится содержание данного обзора со ссылками на основные тематические блоки, чтобы предоставить возможность всем желающим выборочно ознакомиться лишь с интересующими их разделами.



Надеемся, что тема accessibility заинтересует не только людей, имеющих к ней прямое касательство, но и получит большее признание в среде обычных разработчиков, IT-журналистов и просто тех, кто неравнодушен к различным проявлениям мира информационных технологий.


Содержание






Свежий взгляд

на бег


протестируй кроссовки

нового поколения




Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»




Возьми Lumia 925 на тест-драйв сейчас.




Впечатляющие возможности

в стильном тонком корпусе из металла




Boomburum

исследует LTE


Эволюция средств связи

в путешествии по России




Проблемы коммуникации внутри бизнеса?



Смотри бесплатные курсы

и выиграй Xbox




Нет времени

на счета?


MasterCard

Mobile



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


[Из песочницы] Управление компьютером при помощи глаз — практическая реализация


1. Необходимость и постановка задачи




Статья написана, прежде всего, для людей, которым трудно или невозможно работать на компьютере общепринятым способом: нажимая кнопки на клавиатуре и двигая мышь. Постараюсь рассказать, как была сделана система, которая позволяет управлять компьютером при помощи одного только взгляда. Сразу оговорюсь, что приведённое решение плохо работает (пока), если человек носит очки.

Итак, есть только глаза и компьютер. Ничего другого использовать нельзя, — ни педалей, ни поворота головы, ни преобразования речи в текст.



2. Выбор из существующих решений




Поиск в интернете по ключевым словам «Eye Gaze Tracking» и «Assisitive Technology» даёт множество ссылок, после копания в которых прихожу к выводам:


  • Готовые устройства существуют, но стоят удивительных денег; на территории России их никто не продаёт, не обслуживает; программное обеспечение не предусматривает работу с русским языком (в частности, нет клавиатуры с кириллицей).

  • Есть программное обеспечение с открытым исходным кодом, нацеленное на создание самодельных систем. Испытания со своей камерой не дают приемлемого качества работы.

  • Есть возможность купить устройства для разработчиков (developer edition) по сходной цене в компаниях Tobii и TheEyeTribe. Но по схеме «утром — деньги, вечером — стулья», то есть предзаказ можно оформить осенью 2013 года, а получить устройство — в начале 2014 года.


Для справки, в разделе «5. Другие способы, которые я не попробовал» привожу описание разных устройств, о которых я набрал информацию.

Неожиданно в середине декабря компания Tobii меняет концепцию, переходит на разработку нового устройства EyeX, а своё старое устройство REXX рассылает разработчикам по цене, в три раза ниже первоначальной и прямо сейчас, уверяя, что написанный для REXX код будет работать и с EyeX.

Долго думать не стал, заказал REXX, на основе которого и сделана система.


3. Детали реализации




3.1. Аппаратная часть




Итак, заказываем устройство Tobii REXX на сайте Tobii. Не перепутайте, на этой странице заказывается и EyeX, и REXX, но EyeX придёт только в конце марта 2014г.

Доставляют UPS'ом из Швеции. Как растаможить посылки UPS — отдельная большая тема, в интернете есть много советов на эту тему. Замечу только две вещи: при заказе указывайте только свой домашний адрес (адрес прописки), чтобы не доказывать, что это посылка для частного лица, а не для организации. И второе — если вы в Москве, то гораздо проще и дешевле растаможить самому, приехав в офис UPS на грузовом терминале аэропорта Внуково, чем целый день дозваниваться до UPS, пересылать им всякие бумажки и ждать до 10 дней.

В коробке находится следующее: само устройство, удлинитель кабеля USB, флешка с программным обеспечением, пара магнитных держателей с липким слоем для крепления к монитору, пара бесполезных бумажек.



После установки драйверов не забудьте войти в контрольную панель Windows и запустить программу настройки устройства и калибровки под конкретного пользователя. Без этого ничего не заработает!

Мне пришла версия устройства для ноутбуков, довольно маленькая. Но она заработала и с довольно большим монитором, больше 20 дюймов.


В комплекте идут только демонстрационные программы, призванные показать, на что способно устройство, и средства для написания своих собственных программ (SDK). Документация, которая идёт с SDK, можно сказать, никакая. Но есть примеры на С++ и С#, изучив которые, можно понять, как надо делать.

При попытке использовать программное обеспечение от других, более дорогих моделей Tobii, именуемое Tobii Gaze Interaction, ничего не получилось. Но понравилась идея, там реализованная.

Итак, программное обеспечение пришлось писать самому.


3.2 Программное обеспечение




Была написана программа, которая позволяет имитировать глазами действия мышью: левый, правый, двойной щелчок, drag-and-drop, колесо прокрутки, а также набирать текст глазами на виртуальной клавиатуре.

Лучше, впрочем, один раз увидеть. Демонстрацию работы программы приглашаю посмотреть здесь.


Программа доступна в исходных кодах на github. Там же есть её скомпилированная версия (32-разрядный исполняемый файл). Если будете компилировать сами, то не забудьте добавить в проект каталоги include и lib из SDK, а также файлы TobiiGazeConfig32.lib и TobiiGazeCore32.lib.

Исполняемый файл: перейти по ссылке, затем нажать на кнопку «RAW» для скачивания.

Исходники: перейти по ссылке, затем нажать на кнопку «RAW» для скачивания.


Важное замечание: для работы программы необходимы файлы, которые идут в комплекте с SDK:

TobiiGazeConfig32.dll

TobiiGazeCore32.dll

Скопируйте эти файлы в каталог, где находится программа.


4. Проблема работы в очках




Используемое устройство, так же как и большинство других аналогичных, использует для определения направления взгляда блики на зрачках, которые получаются от инфракрасной подсветки. К сожалению, очки добавляют паразитные блики.



Несмотря на то, что при настройке устройства под конкретного пользователя есть возможность указать, что человек носит очки, это не слишком помогает, устройство постоянно теряет положение зрачков.

Буду благодарен за проверенные рекомендации по устранению бликов на линзах очков в инфракрасном диапазоне.

5. Другие способы, которые я не попробовал




Сразу оговорюсь, что устройства используются не только для облегчения работы на компьютере для людей с ограниченными возможностями, но и, например, для исследования того, каким частям веб-страниц пользователи уделяют наибольшее внимание. Поэтому иногда за такие системы заламывают чудовищные деньги. Впрочем, и за устройства для инвалидов часто заламывают удивительные деньги.

5.1. Продукты коммерческих компаний.<.h3>


TheEyeTribe




На первое место поставлю TheEyeTribe за то, что они были первыми, кто провозгласил, что устройство должно быть доступным, и стали принимать предварительные заказы на устройство ценой в $99. И это при ценах в несколько тысяч долларов у других компаний! Спасибо, ребята, ваше устройство пока до меня не доехало, но другие компании цены серьёзно снизили, думаю, благодаря вам.

А уж будет ли ваша коробочка работать — узнаем в ближайшее время.

SMI — senso-motoric instruments




Их устройства можно посмотреть вот здесь.

Устройства можно купить в России (не буду давать ссылку), но когда я поинтересовался ценой самого дешёвого, мне озвучили цену в один миллион двести тысяч рублей. До свидания, SMI.

Tobii




Фирма давно выпускает продукты для людей с ограниченными возможностями. Даже Intel инвестировала в них несколько миллионов долларов. У них был альянс с фирмой Dell, когда планшет поставлялся с железкой для отслеживания глаз, причём техническую поддержку оказывала Dell.

На русском можно прочитать здесь.

На английском — на их сайте.

Много всего про эти устройства можно посмотреть на youtube.

Совсем недавно цены начинались с $4000. В настоящее время (январь 2014) цена на PCEye упала до $2000, но софт не русифицирован (Tobii Gaze Interaction).

EyeTech




Тоже давно работают в этой сфере, кажется с конца 90-х. Их устройства более ляповатые, но очень понравился софт, демонстрацию которого можно посмотреть вот здесь.

В то же время есть клип, на котором человек моргает глазами для нажатия на кнопку мыши — это не понравилось, обморгаешься. У Tobii такого не видел.

Есть три устройства, различающихся только размером, для разных мониторов, от ноутбука до 30 дюймов. Цена, которую мне удалось найти — $8700. Господа не скромничают.

Но то, как работает их софт, приметим.


DynaVox




Специализированное устройство, нельзя пользоваться стандартными компьютерными программами.

EyeGaze Edge (от LC Technologies)




Монстроподобное устройство, включающее в себя камеру и компьютер, который обрабатывает её данные. Можно подсоединить весь этот агрегат к своему компьютеру (в том числе беспроводно), тогда он заменит мышь и клавиатуру, что позволит работать с обычными программами. Опять 8-10 тысяч долларов.

Вроде бы есть набор «EyeGaze Edge Pack», где компьютер вы используете свой, просто добиваете в него их камеру и софт, но цены на него не нашёл нигде.

Это основные игроки на рынке. Одна из маленьких новых амбициозных контор, которая сама не смогла довести до ума свой продукт, тем не менее не поленилась раскритиковать лидеров и привела вот такую табличку, из которой понятно, что сами они самые крутые (хотя продукта ещё нет, а демо-ролик показывает, что позиция зрачка всё время скачет). Но сравнение остальных весьма показательно. Хотя оборудование там приведено часто уже устаревшее, но можно оценить порядок цен и кто продвинулся дальше.


5.2. Проекты с открытым исходным кодом




К сожалению, ни одна из упомянутых ниже программ не дала достаточно точного определения направления взгляда на имеющемся оборудовании (видеокамера PC104E с режимом ночной съёмки и отдельно расположенная инфракрасная светодиодная подсветка). Тем не менее, возможно у кого-то заработает лучше.

GazeTracker




Рекомендую начать с того, что посмотреть клип на этой странице.

Проект развивался в университете ИТ Копенгагена. Развивался где-то до конца 2010 года, после чего впал в апатию. Тем не менее многими уважаем за свою открытость, некоммерциализованность и определённые достижения. Изначально был нацелен на возможность работы с оборудованием типа «сделай сам» (DIY — do it yourself). Многие самодельщики использовали этот софт со своими железками, часто обходившимися им в 20-30 долларов. См., например, вот это.

Текущая версия 2.0 beta, до этого был ряд стабильных версий, например 1.6, 1.8.

В инструкции по использованию упоминается, что сами разработчики использовали камеру Sony HDR-HC5 с одной или двумя лампами подсветки от той же Sony, модель HVL-IRM.

На сайте [относительно] живой форум, можно пообщаться если не с разработчиками, то с апологетами.


Haytham




Университет ИТ в городе Копенгагене не забросил работы после того, как команда GazeTracker свалила. Теперь у них есть куда более красивая система:



Это не одна программа, а сервер, раздающий положение зрачка клиентам по сети. Один из клиентов — это программа Haytham_Monitor, которая управляет курсором мыши. Если бы хорошо заработала на моём железе, не было бы нужды ничего делать. Удачи ребятам.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


[Из песочницы] Опыт создания робота. Часть 1

Доброго времени суток! Хочу поделиться со всеми опытом по созданию робота, на базе Arduino. В первой части не будет чего-то оригинального, возможно даже местами похоже на другие статьи, но постараюсь описывать именно проблемы, с которыми я столкнулся при сборке робота.

Преамбула




У меня уже давно появилась идея создания робота, но не хватало времени и знаний.

И вот со временем я прочитал различные статьи, вдохновился и понеслось. Тогда я поверхностно представлял, что такое микроэлектроника, немного умел программировать, и решил, что этих знаний будет достаточно.

Идея была собрать более или менее компактного робота, но достаточно проходимого и функционального. Я не хотел привязываться к каким-то определённым платформам или собирать китовые наборы, поэтому решил отдельно заказывать детали и стараться по максимуму делать из подручных средств.



Подбор запчастей




Вначале я стал выбирать «мозг» робота. Очень привлекательным мне казался LEGO Mindstorms, привлекало именно то, что можно было собрать из деталей любую шасси, какую захочется. Но мне хотелось не готовый конструктор, подключил проводки и готово, а самому паять, программировать, изучать микроконтроллеры, да и набор LEGO дороговато стоит. Поэтому выбор пал на семейство Arduino. И не такое дорогое, и программировать можно. Мне советовали взять Arduino Uno, но так как я решил делать компактно, решено было взять Arduino Nano.

Когда я начал выбирать шасси, я вдруг вспомнил, что где-то в шкафу пылится LEGO SpyBotics, это что-то вроде прародителя Mindstorms.


image


Незамедлительно было принято решение отдать его под нож, в моём случае под паяльник.


Небольшие размеры, два моторчика, гусеничное шасси – всё это идеально подходило под мои нужды. Тем более эта модель давно уже не на ходу, дата кабель бесследно затерялся, программировать эту модель было адское занятие, да и это шло вразрез с моим желанием освоить микроэлектронику.


Я решил, что выпаяю с платы моторчики, их оставлю, а саму плату верну обратно в шкаф, хотя вероятно можно будет с неё выпаять различные датчики для дальнейших опытов.


Итак, с основными деталями разобрались, теперь остальное. И вот я стал искать, где вообще можно выбрать и купить запчасти. Я нашёл девочку, которая заказывает из Китая вещи, она пообещала помочь с покупкой и дала ссылку на Taobao, посоветовав покупать детали у одного продавца, чтобы меньше платить за доставку. Через пару дней анализа я определился с поставщиком и сделал заказ.


И вот после месяца ожидания, наконец, пришла посылка.


image


Содержимое:


1) Arduino Nano V3.0 ATMEGA328P


image


2) Motors driver L298


Когда я выбирал модуль управления моторами, мне на глаза попался интересный вариант, специально для Nano — Feedback Control add-on


Но в Китае я эту модель так и не нашёл, поэтому заказал обычную модель.


image


3) Bluetooth HC-05


image


Через этот модуль мы будем связываться с ПК. В дальнейшем я планирую написать управление под Android.


4) LM2577 DC-DC Adjustable Step Up Power


image


Данный преобразователь напряжения я решил заказать на всякий случай, ведь у шасси SpyBotics дека всего под 3 батарейки AA, и я не знал, достаточно ли мне будет питания.


Ну и плюс мелочи: Монтажная плата и различные проводки.


Диоды, сопротивления и прочую мелочь я не стал заказывать, решил, что их можно будет выпаять из старых плат.


Сборка робота




Сборку решил делать поэтапно, экспериментируя с различными вариантами.

Примерный план был такой:

1) Подключить к Arduino драйвер моторов, ну, и собственно, сами моторы.

2) Прикрутить мозги к шасси и установить элементы питания.

3) Прикрутить к роботу дистанционное управление.


А дальше уже будет модернизация робота и попытки сделать его максимально автономным.


За пару дней до прихода основных деталей я решил отпаять моторчики от старых мозгов и придумать, как вся система будет крепиться.


image


Оказалось, это не так просто, ибо плата достаточно крепко сидела на корпусе.


И тут первая неожиданность, моторчики держались за счёт крепления к плате. Поэтому я их приклеил и припаял к контактам проводки, для дальнейшего удобства.


image


С самой шасси я решил пока особо не экспериментировать и собрать её по стандартной схеме.


image


Я старался сделать схему гибкой, чтобы можно было легко отсоединять детали от робота. Мне нужно было придумать, как приделать мои детали к LEGO. Это оказалось легче, чем казалось. Вначале я взялся за драйвер двигателей, лёгким движением руки, прикрепив его к деталям LEGO. Правда пришлось немного модернизировать старый корпус, получилась такая интересная композиция.


image


Которая без проблем прикрепилась к шасси робота.


image


Затем я взялся за bluetooth модуль и arduino. Bluetooth модуль я приклеил к одной из деталей, чтобы легко можно было прикрепить его к любому месту. А для arduino решил использовать разъём, приклеил его к одной из деталей LEGO, и припаял необходимые провода к нему.


image


Теперь чтобы прикрепить arduino, достаточно воткнуть её в разъём, и подключить к ней разъём питания.


Программирование робота




Наконец, пришло время подключить собранную схему и заставить моторчики крутиться.

На самом роботе тестировать оказалось неудобно, поэтому пришлось всю схему пересобрать на макетку и тестировать на ней. На будущее отметил для себя всегда начинать именно с макетки.


image


Для тестов был использован смартфон, так как у него есть bluetooth. Покопавшись в интернете я нашёл пару интересных программ. Blue Arduino показалась мне очень удобной. Ничего лишнего, обычный терминал для связи с arduino. Так же заинтересовала программа Arduino Bluetooth Controller, удобно в ней то, что интерфейс управления представлен в виде джойстика и можно очень быстро назначить на любой элемент управления любую команду. Для тестирования моего робота уже в собранном виде она подошла очень кстати.


Для программирования arduino я использовал стандартный пакет с официального сайта. Была написана самая простейшая программа, взятая из тестовых примеров, чтобы только тестировать.



char incomingByte; // Входящие данные

void setup()
{
Serial.begin(9600); // инициализация порта
Serial.println("Robot online...");
}

void loop()
{
if (Serial.available() > 0) //если пришли данные
{
incomingByte = Serial.read(); // считываем байт

if(incomingByte == 'w') // если w, то едем вперед
{
digitalWrite(DR, HIGH);
digitalWrite(DL, HIGH);
digitalWrite(MR, LOW);
digitalWrite(ML, LOW);

Serial.println("Forward");
}
if(incomingByte == 's') // если s, то едем назад
{
digitalWrite(DR, LOW);
digitalWrite(DL, LOW);
digitalWrite(MR, HIGH);
digitalWrite(ML, HIGH);

Serial.println("Backward");
}
if(incomingByte == 'a') // если a, то поворачиваемся налево
{
digitalWrite(DR, HIGH);
digitalWrite(DL, LOW);
digitalWrite(MR, LOW);
digitalWrite(ML, HIGH);

Serial.println("Left");
}
if(incomingByte == 'd') // если d, то поворачиваемся направо
{
digitalWrite(DR, LOW);
digitalWrite(DL, HIGH);
digitalWrite(MR, HIGH);
digitalWrite(ML, LOW);

Serial.println("Right");
}
if(incomingByte == 'f') // если f, то стоп
{
digitalWrite(DR, LOW);
digitalWrite(DL, LOW);
digitalWrite(MR, LOW);
digitalWrite(ML, LOW);

Serial.println("Stop");
}
}
}




А вот и проблемы

Вначале я наткнулся на то, что при подключенном bluetooth модуле не заливается прошивка. Но это решилось тем, что провод питания от bluetooth легко отключался от arduino.

Самая большая проблема оказалась в том, что надо правильно подобрать источники питания.


Вначале я долго не мог определиться со схемой питания. На просторах интернета нашёл схему с двумя отдельными источниками, на «мозги» и на драйвер двигателей. От неё я сразу отказался и начал тестировать различные способы.


image


Оказалось, что можно всю схему питать как через Arduino, так и через драйвер двигателя.


image


В первой схеме я подавал напряжение на Arduino на вход Vin, а на драйвер двигателя пускаем через 5V, но таким образом двигателям не хватало напряжения.


image


Вторая моя схема питала напрямую драйвер двигателей, а уже он питал arduino, при такой схеме двигатели крутили хорошо, но мозги начали подтупливать. Перестали нормально отрабатываться циклы программы.


image


В итоге я просто параллельно подал питание, и всё стало нормально работать.


На этапе тестирования всё было отлично, потому что я питался от usb-провода. Зря я изначально упёрся в деку для трёх батареек АА.


image


Трёх батареек оказалось не достаточно, чтобы привести робота в движение, даже с использованием преобразователя. В итоге преобразователь был убран из схемы. Походя по магазинам, нашёл замечательные литий-ионные(li-ion) аккумуляторы, формата AA.


image


Они подошли идеально (напряжение 3.7V). При первом тесте этих аккумуляторов, мой робот на огромной скорости устремился в стену, остановить его я не успел. Трёх аккумуляторов оказалось слишком много. В итоге я оставил только два аккумулятора.


Для зарядки этих аккумуляторов был докуплен такой модуль:


image


Заключение




Получилась такая вот модель робота.

image


Потом шасси всё-таки пришлось пересобрать, потому что он очень коряво дёргался, точнее, вставал на дыбы, так и ехал.


image


Получилась модель достаточно компактная, как я и хотел. Проходимость пока не проверял, главное модель получилась гибкой — при необходимости, легко можно снять саму плату arduino и использовать в других проектах. Так же доступ к usb в свободном доступе, для отладки.


Правда, моя модель поворачивает очень грубо, гусеницы проворачиваются, надо будет попробовать ещё раз шасси пересобрать.


В итоге получилось, что на программирование вообще не делал уклон, больше времени потратил на саму сборку, но думаю, я это в дальнейшем наверстаю. Вначале всё-таки по максимуму протестирую различные модули, как они работают и что умеют, а потом уже буду делать систему автономной.


Всем спасибо за внимание! В следующей статье попробую описать подключение дополнительных блоков к роботу, таких как ультразвуковой дальномер и солнечную батарею.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


[Из песочницы] Пляски с бубном в новогоднюю ночь или вторая жизнь старых машин

Доброго времени суток, уважаемые. Расскажу сегодня в рамках темы статьи, как я провёл новогоднюю ночь. Не только расскажу, но и покажу картинки. Очень увлекательное было действо. Ну а началось всё так. После установки и настройки домашнего мини-сервера мама захотела себе компьютер. Мол, чем я хуже. Хочу в интернете информацию читать, набирать тексты и тому подобное. Думал я думал и надумал.

Как-то давным давно читал я одну статью о тонких клиентах. Что можно настроить старую машину — Intel i486, pentium I, II и подобную для нормальной работы: просмотр видео, интернет сёрфинг и прочее. Звучит фантастически. Но это правда. Можно сделать такое шаманство. Для этого нужен мощный сервер и клиент (в моем случае им оказался Intel Pentium MMX 200 RAM 64Mb 2MB Video и без HDD).



Вообщем дело было перед новым годом. Эта конструкция была бы неплохим новогодним подарком маме. Решил я надолго это не откладывать. Для компьютера нужно было прикупить кое какое барахлишко: новую клавиатуру и мышь. Не смейтесь, но к АТ-корпусу клавиатуры уже не выпускают. На раритетных платах это разъем DIN-5. Очень смахивает на штекер от старого магнитофона. Мышку можно туда ps/2 подключить, на материнской плате есть для этого специальные Pin'ы


А клавиатуру я купил тоже ps/2. И умудрился её подружить с АТ-корпусом. Для этого пришлось сварганить переходник. Взял шнур от старой неработающей клавиатуры АТ, разъем ps/2 отпилил с неработающей материнской платы. Через полчаса получилось следующее.



Всё! Теперь можно использовать оптическую мышь и новую клаву со стареньким компьютером. Запчасти все были на месте. Оставалось совершить таинство по настройке сервера для этого чуда. Чтобы это старьё заработало нужно было всего лишь установить так называемый LTSP-сервер. Желающие могут ознакомится об этом проекте на странице википедии ru.wikipedia.org/wiki/LTSP


Операционная система у меня на сервере конечно же GNU/Denian Linux. Седьмая версия (стабильный выпуск). Поехали, как говорил Юрий Гагарин. Сначала нужно было довести до ума серверную часть. Используя удаленный доступ к машине через ssh я установил пакеты, необходимые для работы LTSP-чуда.



apt-get install ltsp-server-standalone




Подтянулись все необходимые пакеты, включая DHCP сервер и TFTP. Да, придётся еще и их за одно настроить. Из коробки ничего не работает. Нужно это допилить напильником до кондиции. А вот теперь пошли обещанные танцы с бубнами. Это обычное дело у «красноглазиков». Эти пляски продолжались всю новогоднюю ночь. Так что мне не было скучно. Я даже телевизор за весь вечер не посмотрел.

Меня ждала радостная новость. TFTP настраивать не нужно, он завелся самостоятельно. Основные настройки нужно делать для DHCP. Он будет раздавать сетевые адреса машинам и благодаря ему будет происходить последующая загрузка по сети через TFTP. Обнаружился фай конфигурации по адресу /etc/ltsp/dhcpd.conf. У меня файл имеет такой вид:



authoritative;

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.1 192.168.0.250; # диапазон адресов для сетевой загрузки
option domain-name "paulo737.pp.ua"; # доменное имя моего сервера
option log-servers 192.168.0.1; # ip сервера для логирования
option domain-name-servers 192.168.0.1; # сервер ДНС
option broadcast-address 192.168.0.255; # широковещательный адрес
option routers 192.168.0.1; # настройка маршрутизации
next-server 192.168.0.1;
# get-lease-hostnames true;
option subnet-mask 255.255.255.0; # маска подсети
option root-path "/home/ltsp/i386"; # путь к корню LTSP-сервера
filename "/ltsp/i386/pxelinux.0"; # файл для загрузки по сети
}




Ещё пару изменений нужно было сделать в файле /etc/default/isc-dhcp-server

DHCP_CONF=/etc/ltsp/dhcpd.conf
INTERFACES="eth1"




Здесь должно быть всё понятно. Указываем место нахождения конфигурационного файла для сервера DHCP, слушаем запросы из локальной сети на интерфейсе eht1. После этих не хитрых действий нужно перезапустить сервер dhcp

/etc/init.d/isc-dhcp-server restart




Осталось настроить импорт файловой системы ltsp-сервера. В файл /etc/exports нужно добавить строчку

/home/ltsp/i386 *(ro,no_root_squash,async)




Можно создавать рабочую среду для клиентов.

ltsp-build-client --base /home/ltsp




Это система-заготовка в которую будут загружаться тонкие клиенты по сети. Для настройки этой системы нужно войти в chroot-окружение:

ltsp-chroot




А потом пошло и поехало… apt-get install и нужные пакеты.

Перезапускаем сервер nfs и готово.

Теперь дело осталось за малым. Нужно подготовить компьютер-клиент для загрузки по сети. В этом поможет следующий сайт rom-o-matic.net/gpxe/gpxe-1.0.1/contrib/rom-o-matic/. Подготавливаем образ для загрузки. Я выбрал iso-образ. Записал его на болванку и теперь загружаю при помощи привода CD/DVD.


И… о чудо! На стареньком компе можно увидеть следующее. Напомню для тех, кто забыл. На нём нет жесткого диска и оперативная память всего 64 (шестьдесят четыре) мегабайта. Не путать с гигабайтами.



Вот такие приключения в новогоднюю ночь) Компьютер готов и ожидает новенький монитор. Не плохое сочетание раритетной техники с новыми технологиями. Это, конечно, не планшет Google Nexsus… но все же. Успехов в новом году и в настройке GNU/Linux. До новых встреч на страницах моего блога. Оставляйте свои мысли, комментарии и советы.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Курсы от Яндекса для тех, кто хочет провести каникулы с пользой. Дискретный анализ и теория вероятностей

Для тех, кому одного курса на праздники мало и кто хочет больше, продолжаем нашу серию курсов от Школы анализа данных Яндекса. Сегодня подошла очередь курса «Дискретный анализ и теория вероятностей» – даже более фундаментального, чем предыдущий. Но без него нельзя представить ещё большую часть современной обработки данных.

В рамках курса рассматриваются основные понятия и методы комбинаторного, дискретного и асимптотического анализа, теории вероятностей, статистики и на примере решения классических задач демонстрируется их применение.



Читает курс Андрей Райгородский. Доктор физико-математических наук. Профессор кафедры математической статистики и случайных процессов механико-математического факультета МГУ им. М. В. Ломоносова. Заведующий кафедрой Дискретной математики ФИВТ МФТИ. Профессор и научный руководитель бакалавриата кафедры «Анализ данных» факультета инноваций и высоких технологий МФТИ. Руководитель отдела теоретических и прикладных исследований компании «Яндекс». (Ещё больше можно узнать в статье о нём на Википедии).


Лекция 1. Основы перечислительной комбинаторики




Числа сочетания (с повторениями и без повторений), числа размещения (с повторениями и без повторений), перестановки. Бином Ньютона и биномиальные коэффициенты. Полиномиальная формула и полиномиальные коэффициенты. Формула включений и исключений.

Лекция 2. Обобщенная функция Мёбиуса и асимптотики




Простейшие комбинаторные тождества. Знакопеременные тождества. Использование формулы включений и исключений для доказательства тождеств. Функция Мёбиуса и формула обращения Мёбиуса. Подсчет числа циклических последовательностей. Элементарные оценки факториалов, биномиальных коэффициентов и пр. Понятие об энтропии. Неравенство Чернова. Формула Стирлинга (б/д). Асимптотики для биномиальных коэффициентов и пр.

Лекция 3. Деревья и унициклические графы




Основные понятия теории графов. Перечисление деревьев на n вершинах (формула Кэли): подход с производящими функциями; подход с использованием биекции между множеством деревьев и множеством размещений с повторениями (коды Прюфера). Изоморфизмы и автоморфизмы графов. Сводка результатов по перечислению графов.

Лекция 4. Разбиение чисел на слагаемые




Задачи о разбиениях чисел на слагаемые. Упорядоченные и неупорядоченные разбиения. Рекуррентные соотношения для функций разбиения. Харди-Рамануджана (б/д).

Лекция 5. Производящие функции и линейные рекуррентные соотношения




Линейные рекуррентные соотношения с постоянными коэффициентами. Степенные ряды и производящие функции. Применение степенных рядов и производящих функций для доказательства комбинаторных тождеств. Применение степенных рядов и производящих функций для решения рекуррентных соотношений. Числа Каталана, Стирлинга, Бернулли и др. Их применения.

Лекция 6. Хроматические числа графов и Кнезеровский граф




Хроматические числа графов. Гипотеза Кнезера. Теорема Ловаса.

Лекция 7. Классическое определение вероятности, схема Бернулли и их применение к числам Рамсея




Классическое определение вероятности. Геометрические вероятности. Парадокс Бертрана. Условные вероятности. Независимость событий. Формулы полной вероятности и Байеса. Схема Бернулли. Полиномиальная схема. Схема серий. Случайные блуждания. Понятие о случайном графе. Перколяция. Метод Монте-Карло.

Лекции 8-9. Локальная лемма Ловаса. Теория вероятностей (часть 1, часть 2)




Числа Рамсея. Раскраски гиперграфов. Покрытие графов линейными лесами.

Лекция 10. Распределения случайных величин




Дискретные и абсолютно непрерывные распределения. Основные виды распределений: биномиальное, геометрическое, пуассоновское, гипергеометрическое, равномерное, нормальное, показательное, гамма-распределение, хи-квадрат, Стьюдента, Фишера и пр. Числовые характеристики распределений: математическое ожидание, дисперсия, моменты, факториальные моменты. Совместные распределения. Ковариация и корреляция. Независимость и некоррелированность случайных величин. Понятие о вариационном ряде. Распределения, математические ожидания, дисперсии и ковариации порядковых статистик.

Лекции 11-12. Предельные теоремы (часть 1, часть 2)




Неравенства Маркова и Чебышёва. Закон больших чисел для схемы Бернулли. Закон больших чисел в форме Чебышёва. Закон больших чисел в форме Хинчина. Неравенство Колмогорова. Усиленный закон больших чисел. Предельные теоремы Муавра-Лапласа для схемы Бернулли (локальная и интегральная). Предельная теорема Пуассона для схемы серий. Производящие и характеристические функции. Центральная предельная теорема (различные формулировки; доказательство только для случая независимых одинаково распределенных случайных величин).

Лекция 13. Размерность Вапника-Червоненкиса




Понятие о выборке и выборочном пространстве. Точечное оценивание параметров. Несмещенность, состоятельность и пр. Методы моментов и максимального правдоподобия. Доверительное оценивание. Методы построения доверительных интервалов.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


[Из песочницы] Знакомство с Cisco TelePresence

Как показал томный взгляд, построение сети для видеосвязи задача нетривиальная: тут и решения разные, и уровни взаимодействия, и интернет везде разный, и опасных мест выше крыши. Самое странное – нет русскоязычных гайдов по планированию, дизайну и более тонкой настройке. Есть серединка, т.н. «базовая настройка», которой искушенный сетевой администратор доволен не будет. В зависимости от ситуации и требований могут появиться абсолютно неожиданные решения. Даже для одной организации с набором требований найти подходящее решение сходу будет проблематично, а чтобы быть универсальным и охватить полный спектр услуг, предоставляемых оборудованием Cisco TelePresence, нужен будет не один агрегат. Если купить все цисковские железки и все друг в друга воткнуть – может это и получится «Универсально».

Под катом много текста.

image



Введение




Идея организации в одной сети всех доступных средств передачи информации, таких как телефон, телеграф и сети связи, не новая, и появилась еще во второй половине XX века. Эта концепция дошла до наших дней под названием ISDN, однако, развитие IP-сетей и появление новых сервисов не дали жизни предложенной концепции. Ей на смену пришли решения, которые носили название New Generation Network (NGN) – сети нового поколения. Используя концепцию сетей нового поколения для передачи мультимедиа данных, Cisco TelePresence реализует свои управляющие компоненты раздельно. Т.е. сигнальная информация, необходимая для установки/разрывов соединения и определения маршрута мультимедиа потока, передается по одним устройствам. А непосредственно мультимедиа данные, т.е. голос и видео, коммутируются другими устройствами.

Видеоконференцсвзязь базируется на следующих 5 «слонах» (использую сиско-терминологию):

1. VideoNetworkServices, управляющие controlplane компоненты, занимаются роутингом вызовов в т.ч. в «иные» сети. Управляют сигнальной информацией;

2. Videoservices, так называемые userplane компоненты, отвечающие непосредственно за передачу мультимедиа. Чаще используется аббревиатура MCU (Multipoint Control Unit), опираясь на терминологию h.323;

3. endpoints, по-руccки, конечные устройства: может быть телевизор или мобильник, ну и все что между (iPod пока не поддерживается).;

4. Менеджеры: без них никуда. Если в Бугульме не работает камера, ехать туда придется последнему, кто её трогал;

5. конечно же сеть.
VideoNetworkServices



Бывает их два вида: кол-контрол и гейтвеи.

CallControl – т.н. Video Communication Server (VCS), регистрирует конечные точки (SIP и Н.323), роутит вызовы, мониторит, к мультимедиа никакого отношения не имеет. Можно собирать в кластер несколько штук, если одной тяжело. Бывают VCS Control, для подключения клиентов из своей сети, а бывают VCS Expressway с поддержкой NAT, трансфер файрволл etc, для внешних подключений. Expressway размещается в DMZ.

Gateway — доступ в «иные» сети, например ISDN, PSTN. Бизнес-ту-Бизнес там же.

image

VCS Tandberg
Videoservices



Видеосервисы не обязательны, но являются важной частью планирования инфраструктуры ВКС. Начать стоит с ответов на вопросы: будут ли конференции с более чем 2-мя участниками, нужен ли стриминг видео и нужна ли запись? Соответственно, выделяют два типа устройств:

Conferencing – оборудование для объединения 3 и более участников. Обеспечивает свитчинг и транскодинг. Свитчинг заключается в пересылке видео/аудио потока от одного конечного устройства к множеству других. Транскодинг – это кодирование и декодирование медиа потока между конечными точками. В терминологии Н.323 зовется MCU (MultipointControlUnit). Сиско предоставляет свой список существующих решений: Cisco Telepresence Multipoint Switch, MCU 4000, Cisco Integrated Service Router (ISR), а так же кластерные решения на базе MSE 8000 с несколькими блейд серверами на борту.

image

MCU 4500

Streaming&Recording – многие MCU, помимо конференсинга, держат у себя на борту сервер видеовещания. А если их нет – есть два вида железок. Одна, правда, только записывает, Cisco TelePresence Recording Server. А вот вторая и пишет и вещает одновременно, Cisco TelePresence Content Server. Работает в связкес Cisco Media Services Engine (MSE)


Endpoints



Конечные устройства можно использовать вот какие:

• Софтовые клиенты: ЛайфСайз Клир Си (есть для андроид устройств), Cisco Jabber (есть для айпадов, мак виндус и андроид). В таком случае устройством-кодеком будет сам компьютер/планшет/телефон;

• Персональные станции: EX60, DX650, E20 – самые популярные. Настраиваются просто, веб-мордой либо прямо на экране. Все что нужно терминалу, это выбрать кодек и дать адрес сервера. Кстати, у DX650 есть VPN-клиент на борту, т.е. можно цепляться не к Экспрессвею, а сначала в рабочую сеть, и по туннелю к Контролу;

• Митинг-румы и конференс-румы. Решения правильно называются Collaboration Room Endpoints (серии MX и Profile) и Immersive TelePresence (TX серии). В них кодек – это коробочка, в которую заводятся экраны, микрофоны и камеры.

imageimage
Management



Soft-based штуковина с огромным количеством функций, пока, правда, в основном используется для мониторинга. Дело в том, что почти у каждой железки есть удобная веб-морда. Консоль, кстати, тоже доступна. Однако если вы умеете настраивать роутеры и свитчи фирмы Сиско – это вам не поможет, синтаксис там совсем другой. И все же, манагеры:

Cisco TMS – TelePresence Management Suite. Сервер-бейзед системка, т.е. под него нужна железка. Удобный и понятный мониторинг, основнаяфича – видеоконференции по расписанию. Т.е. в определенный момент совершается вызов на всех участников. Интегрируется в AD, в частности, календарь MicrosoftExchange;

Cisco TelePresence Manager и Cisco Prime Collaboration Manager – В чем реальное отличие от первого, честно, не знаю. Трогал только первый. Но в прайм колаборейшене есть риал-тайм мониторинг, за что, несомненно, респект.
Network



В основном все требования к сети для передачи потока зависят от самого потока. Например, для передачи видео h.264 рекомендуется не менее 2 Мбит/сек. для одного клиента. Задержки, джиттер, потери – все как у всех. Наиболее интересен вопрос подключения удаленных клиентов. Нужен ли VPN, не нужен ли, одна сеть для всех клиентов, или /30 и PPTP, или NAT. Шифрование, реализованное в Cisco TelePresence, обсудим далее.

Теперь, когда мы немного ознакомились с функциональными назначениями различных продуктов (это вообще не все) можно начать планировать подключение клиентов, выход в сети, зрить в корень реализации и т.д.

Есть несколько вариантов установления звонка соединения(skinny не рассматривал):

• h.323 — набор протоколов, пользователи связи цепляются к гейткиперу (он же контроллер зоны, он же привратник, реализован в VCS) — обработчик вызовов. Гейткипер цепляется к h.323 MCU;

• sip – протокол инициализации сессий. Нужен сип-сервер (который есть в VCS). Будет регистрировать пользователей, он же SIP-proxy. Цепляется к MCU (для случая звонков от 3-х участников).


Можно процитировать книжку Cisco Video and TelePresence Architecture Design Guide:


In many regards, SIP is better categorized as a communications session signaling protocol than a telecommunications signaling protocol because SIP enables more than just the establishment of voice and video communications. SIP can enable instant messaging, presence, and so forth, whereas SCCP and H.323 are purely telecommunications protocols. Part of the strength of the SIP protocol specification to support a myriad of services comes from the fact that UAS and UAC elements must ignore what they do not understand or support. On occasion, however, this strength becomes one of SIP’s disadvantages because it complicates interoperation between vendors. Furthermore, SIP is less detailed in its specification than SCCP or H.323, making vendor interoperation somewhat challenging at times. For example, in SIP there is more than one way to implement some features. If different vendors implement the same feature in different ways, they would be incompatible.





Что сип, что h.323 — одинаково полезны. Стоит оговориться, что h.323 — это не протокол, а рекомендации к используемым протоколам. А протоколы эти имеют характер стандарта. По функциям одно и то же. Хотя сип выигрывает по следующим критериям:

• удобнее масшабировать;

• соединение устанавливается в 1 хендшейк, когда в h.323 их будет 100500;

• многие заметят сходство SIPс небезызвестным протоколом HTTP. Правда, похож, понятен.

Начнем с того, что для нас важно будет определение топологии, или топологий, которые мы хотим раскидать. Предположим простейшую схему, нам точно нужно телеприсутствие, видеосвязь h.264 и конференции SIP+h.323. С этим справится набор из VCS для регистрации участников и sip-сервером на борту, MCU для конференсинга, эндпоинты с HD камерами и интернет-канал.


Лирическое отступление: Работая с Cisco TelePresence придется столкнуться с большим количеством НЕ циско-устройств: в их число входят Tandberg и Codian. Дела такие: когда-то в недалеком прошлом все они были независимы друг от друга. Тандберт считался гигантом видеосвязи, а Кодиан специализировался на производстве MCU-шек. В 2007 Британский Кордиан стал (за 270 миллионов бакинских) частью гиганта Тандберга, а в 2010 Тандберг стал частью гиганта Циско (за 3.3 миллиарда). Тандберг теперь производит своё оборудование под брендом TANDBERG Cisco, а Кодиан поддерживает и производит своё оборудование с подачи Циски под старым брендом Codian. Т.е. говоря о Кодианах и пр. мы подразумеваем Cisco«Om-nom-nom»corp.


Схема включения будет иметь вид:

image


Лицензирование




Заденем вопрос лицензирования. Поскольку пользователи живут и регистрируются на VCS, а объединение трех и более клиентов происходит на MCU, логично предположить, что Циско вряд ли дадут своим клиентам безграничные возможности по подключению участников конференций. Ограничение номер раз, это максимально доступное кол-во регистраций пользователей. Изначально машинка (VCS) имеет возможности на 2500 регистраций (зависит от комплектации покупки). Можно собрать кластер (максимум 6 устройств). Кластером можно расширить число регистраций МАКСИМУМ до 10 000. Меньше, чем должно быть – это из-за резервирования, т.е. если одна железяка выходит из строя юзеров возможно портировать на вторую. Ограничения номер 2 и 3 это traversal и non-traversal звонки. Traversal звонки, это:

• Звонки с H.323 на sip (и наоборот);

• Firewall traversal вызов Assent;

• Firewall traversal вызов h.460;

• Ipv4-ipv6;

• Expressway получивший вызов, но не имеющий продленную лицензию на локальные вызовы, может использовать одну traversal лицензию на один звонок.

Non-traversal – это звонок внутри ipv4 сети, с сипа на сип, вызовы между VCS-ками, т.е. простейшие вызовы не требующие хитрых манипуляций.Траверсал лицензии можно докупать по 10, 20, 50, 100, 200 и 300 штук. Кстати, если собрать кластер (так же 6 штук), можно получить 2000 нон-траверсал и 400 траверсал лицензий. Так же, лицензированию на VCS подвержены множество дополнительных функций, такие как FindMe, Advanced Account Security, Device Provisioning и многое другое. К сожалению, ни слова не нашел по расширению количества создаваемых sip-доменов (по умолчанию их 200, но куда уж больше!).

Лицензирование MCU заключается в возможном количестве участников в конференции. Рассмотрим на примере MCU серии 4200 Codian MCU-4210: он имеет возможность включать до 20 участников в видеоконференцию, имеет дополнительно 20 лицензий на аудио участников. Для сравнения, Codian MCU-4220 может всего по 40 (видео и доп. аудио). Тут 20 участников означает наличие на устройстве 20 виртуальных портов, которые устройство между собой коммутирует. Т.е. больше 20 – никак. Кластер можно собирать, только если у вас есть что-то из сверхзлых железок, ако Supervisor MCU MSE 8050 напичканного блейдами MCU MSE 8510 blade. Кстати, на этой же MCU-шке (4210) есть сервер видеовещания.

Шифрование




Разберемся, что шифруется: во-первых сигнализация. Шифруется она AES-ом (DES-ом, 3DES-ом), ключ выбирается по Диффи-Хеллману. Включается нажатием кнопки в красявой веб-мордочке. Во-вторых, шифруется передаваемый трафик (медиа данные), тем же AES-ом, ключик по тому же Диффи-Хеллману. И включается точно так же.

Если секурность кажется недостаточной, то до клиентов можно поднимать VPN-туннели, писать ACL, настраивать Firewall-ы и т.д. Включим паранойю:

• если SIP, то SIPS (тот же сип, но с TLS.Адрес пишется не sip:@…, а sips:@...)

• если TCP/UDP, то TLS

• если RTP, то SRTP

• если клиент далеко, то GRE/IPsec

• ну и все, что придумаем

Понятно, что это увеличит время пакетизации и общий оверхед.

VCS Software Overview




Сама по себе прошивка очень удобная (X7.2.2), обладает мануалом к себе самой на борту, открывается он кнопочкой Help в верхнем правом углу. Открывающийся в окне хелп даёт справочную информацию о той подсистеме, в которой вы сейчас находитесь (как теоритическую, так и практическую). Поля ввода так же подсвечиваются миниатюрным хелпом.

image

Не стоит переживать, если что-то не понятно, или не помнишь что в каком поле писать. Help выполнит своё предназначение. К плюшкам софтварины можно отнести мощный набор регулярок (относительно мощный в пределах своей задачи).

Настройка




Базовую настройку опустим, вот уж чего-чего, а «как настроить VCSe+VCSc+MCU на скорую руку» в интернетах полным-полно, а вот самого интересного можно отрыть только в километрах гайдов (у меня ушло чуть меньше месяца с «ниже абсолютного нуля»). Предположим, что базовые настройки мы выполнили, установили соседство c MCU, Traversal зоны, настроили время и т.д. Сейчас разберемся с управлением вызовами «like a boss», кто такие эти соседки, и зачем нужен Traversal.

Зоны




Мутные замуты начинаются здесь. Зона – это абстрактный набор чего угодно (доменов, ip-адресов, устройств, сервисов), к которым применим определенный набор правил. Зоны нужны для управления пропускной способностью, аутентификацией и маршрутизацией звонков, и это применяется сразу ко всему, что есть в зоне. Создавая Диал-планы Вам необходимо указать из какой зоны в какую передать звонок (а не в какой домен). Так проще контролировать все, что происходит, однако, настройка этого безобразия может показаться муторной.

Все конечные устройства, VCS-ки и MCU-шки, вообще все ваши устройства, входят в Локальную зону (LocalZone). Локал зона может быть разделена на подзоны (Subzones). Поэтому для гибкости управления можно создавать отдельную сабзону для нового sip-домена. Создавать их можно до 1000. Домен, который будет относится к той или иной сабзоне нужно определять с помощью «правила членства в подзоне» (Subzone membership rules).

Зоны же бывают соседские (Neighbor), перенаправляющие (Traversal(клиент-серверного представления)), ENUM и DNS. Последние два для ENUM и DNS запросов, им нужно показать, у каких серверов спрашивать имена и E.164. Traversal zone нужны для маршрутизации вызовов между разделенными фаером VCS Control и Expressway. Скажем половина клиентов внутри будет делать вызов через VCS Control, а половина, которая находится удаленно, воспользуется средствами Expressway. VCS Control– клиент, Expressway– сервер. Neighbor зона нужна, например, для связи с MCU, или другим VCS. Те, кто не попал ни в одну зону, попадают в DefaultZone, и работают согласно правилам дефолтной зоны, которую, вообще говоря, можно не заполнять правилами, и все будут просто реджектиться.

image

Скриншоты буду выкладывать поменьше, дабы не забивать текст полупустыми окнами браузера. Проще рассказать словами.

Создать Subzone (для управления пропускной способностью, шифрованием и аутентификацией) можно в меню VCS Configuration ->Localzone ->Subzones. Жмем New, в области Policy разрешаем регистрацию Registration policy – Allow, и обязательно авторизуем: Authentication policy – Check Credentials. В области SIP Media encryption mode можно определить необходимость шифрования. Ограничения по пропускной способности – опционально. Этот инструмент позволяет управлять звонками между зонами.

Создать SIP-domain (VCS Configurations -> Protocols –> SIP ->Domains). Нажать New, ввести имя домена. Создать можно до 200 штук.

Создание правил membership rules для установления членства домена в сабзоне (VCS Configuration ->Local zone ->Subzones membership rules). Правило должно содержать Название, приоритет, регулярное выражение, под которое будет попадать доменное имя и сабзона, правила которой будут использоваться в данном домене.

image


После того, как определилась сабзона получателя и отправителя, на VCS (или VCS-ах) начинается обработка вызова, согласно правилам вызова Call policy (VCS Configuration->Call policy->Rules). Во-первых, включаем их, во-вторых пишем правила. Кто знаком с ACL-ями увидит большое сходство. Откуда-куда-политика – простая схема, всего 3 пункта правила. То правило, которое стоит выше – срабатывает раньше, менять положение можно стрелками ввхерх-вниз.

image


Таким правилом мы разрешаем/запрещаем вызовы на номер 123456 из домена newdomain.ru, например. Есть в конце неявный Deny или нет, я, к сожалению, не проверял, но на всякий случай в конце поставил правило «.* -> .* Reject» т.е. блочить отовсюду и куда угодно. Естественно раньше написаны разрешающие правила. Вообще говоря, можно не включать Call Policy, и рулить звонками на уровне диал-планов. Но со включенными правилами у вас даже до диал-планов не дойдет, и если у вас их много, не нужно бегать по списку правил и судорожно искать диал-план, под который попадает ваш звонок.

Вот уже мы вплотную подошли к Dial-plan-ам, вещам важным и нужным, без которых ничего работать не будет. Обработка вызова на этапе Dial-plan-ов происходит поэтапно. Сначала срабатывают правила типа «Transform». Они позволяют делать с адресами вообще что угодно: отрезать доменную часть, добавить доменную часть, сменить имя получателя, отправителя. Скажем, вам хочется звонить с Сиско-фона на блатной номер, «666666» например, и попадать в конференцию, комнат у вас немерено, и создавать еще одну нет нужды. Значит, пишем трансформ уже в существующую комнату и дело с концом. Вот пример как из 666666 сделать 639801.

image


После того, как трансформ выполнен и правила трансформа, применимые к вызову, кончились, начинается обработка согласно правилам Search rules. Создаем Search Rule для диал-планов, для роутинга search requests в определенные зоны (VCSConfiguration ->Dial-Plan ->SearchRules). Пример правила для домена-сабзоны ниже.

image

Обращаем внимание на то, что правило создаётся для исходящей зоны, указанной в Source name ищет в запросе Pattern string, указанный как суффикс получателя (Suffix) URI «nik». Другими словами, если из зоны nik звонок имеет адрес назначения nik, то искать этот адрес нужно в локальной зоне (Local Zone).Включается правило в drop-down поле State в положение Enable.


Сейчас пара слово Pattern matching variables. Да-да, а самое приятное – эти штуки работают вообще везде, если в поиске регулярка, суффикс или префикс. Это переменные вида %pattern%, которые применяются в регулярках, Search Rules-ах и вообще везде, где вы работаете с ip-адресами или sip-доменами.

Краткий, но полезный лист переменных:

%localdomains% — все локальные sip-домены

%ip% — все ipv4 и ipv6 адреса

%ipv4%, %ipv6% то же самое, но по-отдельности

%localdomain1% — sip-домен с индексом 1(изменяется от 1 до 200)

%systemname% — systemname


Вопрос – кто же будет звонить? Создать sip-юзера можно несколькими способами. Первый очевидный – создать локального пользователя прямо в VCS (VCS Configuration –>Authentication ->Devices ->Local Database). Второй вариант – создать пользователя в TMS (у нас же еще менеджер есть). Для создания пользователей конечных устройств (регистрируемых с устройств) пройти в меню Системы -> Регламентирование -> Пользователи. Слева в меню Создать группу и пользователей (Add Group,Add users). В том же меню слева, снизу выбрать конфигурацию шаблонов (Configuration Template) и создать шаблон для группы. Тут стоит оговориться, что для разных терминальных устройств шаблоны будут разные, но, по сути, с одинаковым набором опций. Например, домен, адрес SIP-сервера, адрес телефонной книги и т.д… На TMS скачивается набор схем, все схемы заполняются администратором. Заполнение шаблона понятно интуитивно, но схемы этого шаблона для конечных устройств (будь это джаббер клиент, или терминал E20) нужно предварительно скачать с сайта

image

Есть возможность проводить аутентификацию после интеграции в AD или LDAP, но у нас не было необходимости.


Теперь Expressway. Создать SIP-домен таким же способом, как на Control-е. Поскольку TMS и Expressway находятся в разных сетях и разделены ACL-ем, юзера так же надо заводить в Local Database (Аналогично создать сабзону и membership Rule для членства в сабзоне). Для работы аутентификации включить Search Rule по протоколу SIP, с источником DefaultZone, искать нужно по следующей регулярке ^(.+)domain\.ru$, и отправлять в Traversal Zone на VCS Control. Для чего и почему – выяснилось только эмпирическим путем: до регистрации, поскольку это НЕ контрол, под «его» сеть не попадает никто, юзер не числится в домене, он не в сабзоне, т.е. все НЕ зарегистрированные лица попадают в DefaultZone.

Можно создать 2 универсальных правила, Call's to Traversal zone и Call's from Traversal zone для звонков между VCS-ками (мы же теперь можем такими понятиями оперировать?). Нетрудно догадаться, какого вида они будут, но если нужно разрешать сквозные звонки не всем, то лучше такое общее правило не писать, а делать для каждого домена отдельно.


Кратенько об MCU. Собственно, сам Конференсинг, как мы помним, организуется на MCU. Управление конференциями простое, устанавливаем h.323 соединение VCS с MCU-шкой (вагон и тележка гайдов в интернетах по этой теме) и создаем саму конференцию. Особенности хелпа MCU такие же как на VCS, но все же: создается конференция во вкладке Конференции кнопкой «Добавить новую конференцию». При создании конференции большинство полей будет заполнено из шаблона (заранее сконфигуренного), заполнить нужно будет только следующие поля:

• Имя – знаковый индентификатор

• Цифровой идентификатор – цифры, добавляемые к префиксу для регистрации

• PIN-код, если необходимо

• Айдишник гостя

• PIN гостя.

Шаблоны обеспечивают автоматическое заполнение некоторых полей, их можно изменять в меню Главная страница -> Конференции -> Шаблоны. Помимо основных настроек, будет доступна для конфигурирования пользовательская раскладка (Главная страница: ->Конференции -> Конференция «name» -> Пользовательская раскладка).Она определяет расположение участников видеоконференций на экране.

Вот так с нуля можно сконфигурить звонилку-конференсилку из кучи дорогих железок. Спасибо, что дожили до конца и с новым годом вас!


Источники

habrahabr.ru/

www.cisco.com/

www.anticisco.ru/

linkmeup.ru/

mcu.dc.codian.com/


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.