krymneya

krymneya

Пикабушница
поставилa 0 плюсов и 0 минусов
отредактировалa 0 постов
проголосовалa за 1 редактирование
Награды:
самый сохраняемый пост недели
19К рейтинг 69 подписчиков 2 подписки 82 поста 4 в горячем

Код Хэмминга (7; 4)

Всем привет! Сегодня я хочу рассказать вам немного о коде Хэмминга (7; 4). Этот простейший код может быть с лёгкостью применён любым человеком для передачи самокорректирующихся сообщений , и сегодня я хочу вам показать как именно этот код можно легко и просто использовать.


Структурно слова кода Хэмминга состоят из двух частей. Сначала идут информационные 4 бита, затем три бита проверочных. Будем обозначать информационные биты буквами ABCD, проверочные буквами xyz.


Таким образом слово кода Хэмминга имеет следующую структуру:


ABCDxyz


Для передачи 4 бит информации нам требуется передавать кодовое слово из целых 7 бит! Последние три бита в случае, когда ошибки отсутствуют, не несут никакой новой информации, ибо они зависят от первых 4. Однако если в кодовом слове из 7 бит произошла 1 ошибка, то исходные информационные 4 бита всё равно можно будет восстановить точно! В этом и состоит главная особенность самокорректирующихся кодов.


Естественно, использование кода Хэмминга при передаче данных требует увеличенных ресурсов. Здесь есть такое важное понятие как скорость кода -- отношение числа информационных бит к общему числу бит. В случае кода Хэмминга скорость равна 4/7. Т.е., к примеру, чтобы передавать информацию со скоростью 1 Мбит/сек и коррекцией ошибок с помощью кода Хэмминга вам потребуется канал с пропускной способностью минимум в 7/4=1.75 Мбит/сек.


Для подсчёта проверочных бит можно использовать следующие формулы:


x = A + B + C mod 2,

y = A + B + D mod 2,

z = A + C + D mod 2,


где n mod 2 означает остаток от деления числа n на 2.


К примеру, если информационный вектор есть ABCD = 1001, то кодовый вектор будет ABCDxyz = 1001 100


Вместо непонятных формул можно использовать следующую картинку:

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

Здесь всё очень просто. Подставляете вместо букв значения соответствующих битов и затем считаете значения x, y и z как сумму по модулю 2 тех информационных бит, которые есть в соответствующем круге.


В приведённом выше примере будет:

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

Куда более интересным является вопрос об исправлении ошибок. Очевидно, вывод об отсутствии ошибок приёмник может сделать просто взяв информационные биты ABCD, посчитав на их основе проверочные биты xyz и сравнить посчитанные проверочные биты с принятыми. Если есть ошибка, то часть проверочных битов не совпадёт.


Предположим что произошла ошибка в проверочном бите y и было принято слово 1001 110

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

В таком случае два проверочных бита сойдутся, а один нет. Этого вполне достаточно чтобы сделать вывод что нужно исправить бит y (для которого проверка не сошлась).


Предположим, что произошла ошибка в одном из информационных битов BCD -- к примеру в бите B.

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

В таком случае не сойдутся аж два проверочных бита -- x (он равен 1, а "должен" равняться 0) и y. Посмотрев на круги легко увидим что они пересекаются по битам B и A. Т.к. не сошлось две проверки, то берём бит B (расположенный на пересечении двух проверок).


Наконец, отдельно рассмотрим бит A. Если в нём ошибка, то у нас не сойдутся все три проверки:

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

Увидев такое безобразие сразу же делаем вывод о том, что ошибка в бите A.


Таким образом, можно легко и просто вычислять локацию ошибки и исправлять её. Замечу что если ошибок больше одной, то описанный выше алгоритм сработает неверно. К примеру, допустим что произошли ошибки в битах C и z:

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост
Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

Проверочные биты y и z сойдутся, а бит x нет. Алгоритм исправит бит x и всё. Это вполне естественное поведение, т.к. если вероятность ошибки p < 1, то вероятность двух ошибок меньше чем вероятность одной ошибки (p^2 < p <= p < 1 при p <> 0).


Естественно, работать с цветными кругами удобно человеку, но неудобно компьютеру. У кодов Хэмминга есть одна особенность, которая позволяет их лёгкое декодирование на компьютере. Итак, рассмотрим следующий алгоритм:


Определим числа g, b, r как сумму всех четырёх бит в кругах соответствующего цвета. Т.е.:


g = A + B + C + x mod 2,

b = A + B + D + y mod 2,

r = A + C + D + z mod 2.


Фактически каждый из этих бит можно определить как сумму соответствующего проверочного бита, вычисленного на основании принятых информационных бит, с принятым проверочным битом. Т.е. к примеру g есть сумма (A + B + C mod 2) (по этой формуле считался x на стороне передатчика) и принятого x. Аналогично b соответствует y, r соответствует z.


Если ошибок нет, то gbr = 000 (принятые проверочные биты сошлись с вычисленными на основе информационного вектора).


Если же есть 1 ошибка, то число gbr есть номер (в двоичной записи) ошибочного бита в векторе ABCxDyz.

В качестве примера рассмотрим уже знакомый нам вектор ABCDxyz = 1001 100, в котором произошла ошибка в бите x (четвёртый бит в векторе ABCxDyz). Посчитаем gbr:

Код Хэмминга (7; 4) Код, Хэмминга, Длиннопост

gbr = 100 [2] = 4 [10]. Ошибка в 4 бите, которым и является x. Таким образом, для декодирования и исправления ошибки в кодовом слове длины 7 требуется лишь вычислить три суммы и из полученного числа несложной функцией получить местонахождение ошибки.


На этом всё, спасибо за внимание!

Показать полностью 8

Штурмовики-рискофилы из первого XCOM

Всем привет. Сегодня я хочу рассказать немного о штурмовиках из игры XCOM: Enemy Within. Как вы наверняка знаете, в одной из веток раскачки у штурмовика присутствует активируемая способность "Беглый огонь". Согласно XCOM вики использование этой способности позволяет совершить два выстрела с потерей точности в 15%.


На первый взгляд способность весьма неплохая. Если штурмовик стоит близко к противнику и тот открыт, то использование данной способности позволяет попросту нанести двойной урон, ибо даже с -15% солдат всё равно попадёт два раза. Однако давайте рассмотрим более общий случай.


Пусть штурмовик использует оружие, наносящее при попадании урон D. Это может быть как средний урон данного оружия (т.к. попадание/непопадание и урон выкидываются рандомизатором отдельно, т.е. являются независимыми событиями), так и детерминированный (хотя в оригинальном XCOM такого оружия нет). Мы также будем считать что меткость на наносимый урон не влияет, т.е. если шанс попадания 5% и солдат попал, то наносится все D единиц урона.


Пусть вероятность успеха при попадании есть p. На данном этапе забудем про 15% штраф к меткости и посчитаем сколько в среднем наносится урона при использовании одиночного выстрела:


D единиц урона наносится с вероятностью p

0 единиц урона наносится с вероятностью 1-p


Легко видеть что средний урон будет pD. Дисперсия урона есть D^2 (p - p^2), а среднеквадратичное отклонение D sqrt(p(1-p)), где sqrt(x) есть корень из x.


При использовании "Беглого огня":


2D единиц урона наносится с вероятностью p^2

D единиц урона наносится с вероятностью 2 p (1-p)

0 единиц урона наносится с вероятностью (1-p)^2


Средний урон будет 2pD. Дисперсия урона есть D^2 2 (p - p^2), а среднеквадратичное отклонение D sqrt(2p(1-p)).


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


Напоследок рассмотрим штрафы к меткости. Пусть штраф составляет x%. Средний урон от одиночного выстрела составляет по прежнему Dp. Средний же урон от двойного выстрела составит 2D(p-x). Чтобы понять что эффективнее можно просто сравнить эти величины. К примеру, одиночный выстрел эффективнее двойного когда

Dp > 2D(p-x) => Dp > 2Dp - 2Dx => Dp < 2Dx => p < 2x.


Т.е. в приведённом выше примере если меткость составляет 29% и ниже, то лучше воспользоваться одиночным выстрелом нежели двойным.


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


За сим всё, спасибо за внимание!

Показать полностью

Энергоэффективный Wi-Fi для сенсорных сетей

Всем привет! Сегодня я хочу рассказать вам немного о технологии Passive Wi-Fi, придуманной исследователями из Вашингтонского университета. Придумала её команда во главе с Bryce Kellogg (мужик на фотке ниже).

Энергоэффективный Wi-Fi для сенсорных сетей Wi-Fi, Passive, Длиннопост

В чём прикол такого энергосберегающего Wi-Fi ? Вообще технологии энергосбережения направлены в основном на то, чтобы увеличить время работы от батареек. Предполагается что в будущем в наших домах и городах будет функционировать множество автономных беспроводных датчиков -- беспроводных просто для удобства, чтоб не надо было тянуть провода. Работать эти датчики будут, естественно, от батареек. А часто менять батарейки неудобно (по крайней мере так считают учёные). И вот одной из целей является как раз разработка сетей, которые позволят растянуть ресурс батареек и одновременно позволят девайсам (типа беспроводных датчиков охраны, дыма или компактных измерительных приборов) передавать их чрезвычайно полезные данные.


В частности, большое внимание проблеме энергосбережения уделено в стандарте IEEE 802.11ah, которого уже вышла пятая черновая редакция. ah вообще разрабатывается в основном под нужды Интернета вещей, потому они увеличили радиус действия до 1 км -- ценой переноса полосы частот в под1Гц диапазон и уменьшением скорости; а также увеличили число одновременно подключённых к точке доступа станций до 8000 (только представьте, все устройства в одном доме подключены к одному роутеру!). Правда уже сейчас есть сомнения по поводу необходимости ah...


Passive Wi-Fi, о котором я хочу рассказать, основан на несколько других принципах. Статью (если не ошибаюсь, уже опубликованную) они выложили на своём сайте: http://passivewifi.cs.washington.edu/files/passive_wifi.pdf

Энергоэффективный Wi-Fi для сенсорных сетей Wi-Fi, Passive, Длиннопост

Помимо беспроводных автономных девайсов, сберегающих батарейку, они предлагают дополнительно поставить RF устройство -- подключённое к сети и излучающее постоянный синусоидальный сигнал на частоте близкой к полосе частот Wi-Fi, но не совпадающий с ней. Смогут ли другие Wi-Fi устройства работать в таких условиях -- когда в соседнем диапазоне кто-то постоянно что-то излучает? Они говорят что смогут -- мол у нас большинство беспроводных девайсов (планшеты, смартфон) и так включают в себя Wi-Fi + Bluetooth, так что всё норм.


Как же происходит передача данных? Для начала RF устройство должно зарезервировать канал для своего сенсора. Оно делает это самостоятельно, просто заранее зная что тот или иной сенсор генерирует данные с постоянной скоростью. Сделать это можно просто послав RTS кадр точке доступа. В ответном CTS точка доступа установит всем подключённым устройствам (которые обязаны её слышать, ибо все девайсы в одной сети) TXOP и все ненужные девайсы будут молчать. Затем для передачи данных беспроводной сенсор начинает переключать импеданс своей антенны между двумя состояниями.

Энергоэффективный Wi-Fi для сенсорных сетей Wi-Fi, Passive, Длиннопост

Когда импеданс антенны меняется, меняется её ЭПР. В результате амплитуда отражённой волны скачет -- как будто исходный синусоидальный тон был домножен на последовательность прямоугольных импульсов. На нулевую гармонику вроде можно забить -- она и так всегда есть. Первая гармоника приводит к разделению исходного тона на два смещённых, причём один из них должен оказаться как раз в полосе частот Wi-Fi.

Энергоэффективный Wi-Fi для сенсорных сетей Wi-Fi, Passive, Длиннопост

А на второй тон опять забиваем -- ну типа раньше всё работало, сейчас тем более.


У прямоугольной волны есть и третья, и пятая и остальные гармоники, которые приводят к образованию дополнительных лепестков в спектре. Ну и авторы Passive Wi-Fi тоже предлагают на них забить -- мол они аж на 10 децибел ниже, так что всё хорошо.


Как же такой отражённой волной передавать данные? А всё просто. Энергосберегающий сенсор просто двигает туда-сюда прямоугольные импульсы. Результирующий сигнал тоже сдвигается и в результате можно передавать данные используя модуляции BPSK и QPSK. В статье утверждается что эти ребята смогли сделать девайсину на FPGA со всеми четырьмя скоростями из .11b -- 1, 2, 5.5. и 11 Мбит/сек.


Естественно, большая ответственность ложится на RF устройство. Фактически, кадр подтверждения принимает тоже оно, и оно же сигнализирует устройству о том что данные были приняты успешно (или нет). Практически все функции -- ассоциация, алгоритмы контроля скорости -- так или иначе связаны с RF девайсом.


Причём, как было сказано в начале, такой Wi-Fi не является энергосберегающим. Он является энергоэффективным. Энергоэффективным для автономных беспроводных сенсоров, работающих от батареек. RF устройство тратит дохрена энергии постоянно излучая в канал синусоиду, однако оно подключено к электросети и не беспокоится о батарейках. Сенсоры же работают от батареек и вполне успешно их экономят. В частности, беспроводной микрофон может проработать в 1000 раз дольше, камера с VGA разрешением и 1 FPS в 50 раз дольше, а датчики (типа датчика приближения) аж больше 10 лет!


На этом всё. Больше можете узнать на этом сайте: http://passivewifi.cs.washington.edu/

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

Показать полностью 4

Немного о философии Платона и современных либералах

Начались у нас лекции по философии. Ну как философии -- истории философии, конечно. В этот раз рассказывали про Платона.


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

И далее Платон рассматривал различные отклонения от этого лучшего общественного строя.


Самое слабое отклонение -- тимократия, власть доблестных воинов. Типа как эти воины сначала охраняют мудрецов, но потом начинают думать "какого фига я их охраняю?" и берут власть в свои руки.


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


После свержения олигархии наступает демократия -- власть людей, умеющих убеждать народ. Основным благом считается человеческая свобода. Любое принуждение вызывает у людей возмущение. При этом люди теряют свой внутренний стержень, начинают потакать страстям, эмоциям и желаниям. Платон употребляет термин "смена вывесок" -- человек подменяет свои взгляды на мир. Он называет стыдливость глупостью, наглость свободой, а бесстыдство мужеством. Та же самая золотая молодёжь при деньгах потакает первичным человеческим желаниям и инстинктам, призывая свергнуть власть при любых устанавливаемых ею ограничениях.


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


А теперь главный вопрос, дорогие друзья. Только ли у меня платоновская "золотая молодёжь" вызывает ассоциации с блогерами с Эха Москвы?

Показать полностью

Серьёзно?

Серьёзно? Люди, Facebook

Оно конечно понятно, что такая форма вполне возможна, но чем не нравится слово «людям»?

API ВКонтакте для Python

Всем привет! Сегодня я расскажу вам немного о Пайтоновском API для соц. сети ВКонтакте.


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


Поскольку я сама не особо сильна в Пайтоне, о различных аспектах этого прекраснейшего языка (ООП, функциональное программирование и т.д.) я умолчу.


Давайте начнём.


Получение Python


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


Не советую качать версию 3.5, ибо под ней некоторые модули (ещё не обновившиеся) могут не работать.


И если вы только начинаете знакомиться с этим языком, не советую также качать версии ниже третьей.


Если вы юзаете UNIX то должны сами знать где гуглить. Под Убунтой просто обновитесь (типа sudo apt-get update).


Также рекомендую поставить pip под вашу версию языка.


Получение модуля


В командной строке или терминале введите pip install vk (pip3 install vk)


Или можете воспользоваться этой ссылкой.


Также присутствует документация с примерами.


Что надо сделать ВКонтакте?


Авторизуемся ВКонтакте и заходим на страничку разработчиков.


Тыкаем там на кнопку "Создать приложение"

API ВКонтакте для Python ВКонтакте, Python, Длиннопост

Вводим имя и нажимаем "Подключить приложение". Тип оставляем Standalone.

API ВКонтакте для Python ВКонтакте, Python, Длиннопост

Подтверждаем действие

API ВКонтакте для Python ВКонтакте, Python, Длиннопост

После создания приложения заходим в его настройки и копируем (запоминаем) его идентификатор, он нам позже пригодится. На скриншоте ID закрашен другим цветом.

API ВКонтакте для Python ВКонтакте, Python, Длиннопост

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


Авторизация


Теперь самое интересное. Нужно получить токен авторизации.

В принципе, модуль vk вполне работает и без него. Некоторые методы могут быть вызваны вообще без авторизации на сайте. Кроме того, вы можете в самом приложении авторизоваться через свой логин и пароль (как показано в этом примере).


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


Прикол в том, что токен авторизации выдаётся конкретному приложению с конкретными правами доступа и конкретным ID. Т.е. в принципе, разрабу модуля он бесполезен.


А вот ваши данные авторизации могут быть вполне полезны. Потому я считаю что лучше юзать токен. По крайней мере, если у вас возникнут какие-то подозрения, не придётся менять пароль и засвеченную почту (номер телефона).


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


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


Вот пример ссылки:


https://oauth.vk.com/authorize?client_id={ID приложения}&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,photos ,audio,video,docs,notes,pages,status,wall,groups,messages,notifications,offline&response_type=token


Это запрос к сайту на выдачу токена авторизации для нашего Standalone-приложения. Разберём подробнее.


client_id={ID приложения} -- вместо {ID приложения} подставьте ID вашего приложения.

redirect_uri=https://oauth.vk.com/blank.html -- в случае Standalone-приложений ВКонтакте обязывает использовать именно такой адрес перенаправления.

scope=friends,photos ,audio,video,docs,notes,pages,status,wall,groups,messages,notifications,offline -- самое интересное. Это список запрашиваемых разрешений. Полный список возможных разрешений можно найти здесь.

Будьте крайне внимательны при составлении этого списка. Фактически, он определяет все возможности, доступные обладателю токена. Особо обратите внимание на последний параметр offline -- при его использовании будет выдан бессрочный токен авторизации.


После того, как юзер даст приложению доступ со страницы ВК, его перебросит на пустую страницу с URL вида


https://oauth.vk.com/blank.html#access_token={токен авторизации}


С некоторыми дополнительными параметрами. Для авторизации приложению необходим токен, стоящий в параметре access_token. Вам необходимо его вытащить.


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


import vk

session = vk.Session(access_token='{токен авторизации}')

api = vk.API(session)


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


К примеру, написание первого поста:


api.wall.post(message = 'Hello, World!')


Приведёт к появлению на вашей стене текстового поста.


Лирическое отступление относительно токенов и добросовестности


Как видите, процедура получения токена довольно проста, а его наличие даёт практически неограниченный контроль над страницей пользователя (практически такой же, как и с веб-интерфейса).


Естественно, это накладывает определённые требования к добросовестности пользователей. Любой из вас может обмануть доверчивого друга или соседа, прислав ему ссылку и попросив скопировать ответ (хотя на странице-редиректе и стоит напоминание о том, что ссылку с токеном нельзя никому присылать) либо получив на короткое время доступ к незапароленному компьютеру.


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


Я искренне надеюсь что вы не станете так делать.


Продолжим.


Написание простейшей программы с использованием API


Давайте напишем какую-нибудь полезную программу, использующую API ВКонтакте.


Вот пример такой программы, предназначенной для своевременного получения обновлений сообщений (к сожалению, после сохранения поста всё форматирование пропадает, потому вместо символов табуляции я буду использовать escape-последовательность \t):


import vk

import time

import SendEmail


def searchForUser(user_list, ID):

\tfor user in user_list:

\t\tif type(user) is int:

\t\t\tcontinue

\t\tif user['uid'] == ID:

\t\t\treturn user['first_name'] + ' ' + user['last_name'] + '\n'


def checkMessages(message_list):

\tIDS = []

\tfor message in message_list:

\t\tif type(message) is int:

\t\t\tcontinue

\t\tif message['read_state'] == 0:

\t\t\tif 'chat_id' not in message:

\t\t\t\tIDS.append(str(message['uid']))

\tuser_list = api.users.get(user_ids = ','.join(IDS))

\ttext = ''

\tfor message in message_list:

\t\tif type(message) is int:

\t\t\tcontinue

\t\tif message['read_state'] == 0:

\t\t\tif 'chat_id' not in message:

\t\t\t\ttext = text + searchForUser(user_list, message['uid']) + message['body'] + '\n'

\t\t\telse:

\t\t\t\ttext = text + 'Сообщение из чата\n' + message['body'] + '\n'

\tprint(text)

\treturn text


session = vk.Session(access_token = '{токен авторизации}')

api = vk.API(session)


while True:

\tmessage = api.messages.get(time_offset = 0)

\tif len(message) != 1 and message[1]['read_state'] == 0:

\t\tSendEmail.sendEMail(checkMessages(message))

\telse:

\t\tprint('No new messages!')

\t\tSendEmail.sendEMail('No new messages!')

\t\ttime.sleep(600)


Разберём построчно что делает этот код.


В первых трёх строчках мы импортируем необходимые нам модули. Модуль time используется для того, чтобы отправлять процесс в сон. Модуль SendEmail -- это пользовательский модуль, предназначенный для отправки сообщений на определённый ящик.


Функция searchForUser(user_list, ID) ищет пользователя по его ID в списке user_list объектов user. Когда она его находит, то возвращает строку с именем и фамилией юзера. Проверка на тип сделана т.к. API ВКонтакте частенько возвращает первым элементом списка объектов длину этого списка.


Фунция checkMessages(message_list) просматривает список сообщений (опять же, пропуская элемент списка, содержащий число сообщений в списке) и формирует список из ID тех юзеров, сообщения которых ещё не прочитаны. Далее по этому списку ID у API запрашивается список юзеров. И наконец потом формируется единая строка, в которой через строчку указан отправитель (полученный функцией searchForUser(user_list, ID)) и текст его сообщения.

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


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

1) Проверяем, есть ли сообщения и прочтено ли последнее сообщение

2) Если есть, то вытаскиваем функцией checkMessages(message_list) строку вида


Юзер Юзеров

Сообщение от юзера 1

Юзер Юзеров

Сообщение от юзера 2

Другой Юзер Юзеров

Сообщение от юзера 1


И отправляем её себе на Email функцией SendEmail.sendEMail(text). Вместо отправки на почту можно выводить сообщение в консоль или записывать в файл.


2а) Если сообщений не было, то отправляем уведомление об этом (его цель, в основном, дать вам понять что программа не вылетела из-за какого-нибудь эксепшена).

3) Вызовом time.sleep(600) ждём ещё 10 минут.


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


Если вы планируете писать своё приложение, обращайте также внимание на ограничения по частоте запросов к API (в конце страницы).


Всем спасибо за внимание, до новых встреч!

Показать полностью 4

Немного о нормах

Всем привет. В самый разгар новогодних каникул хотелось бы рассказать немного о нормах.


Различные нормы широко используются в самых разных разделах математики. Всем со школы знакома Евклидова норма:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

Довольно часто используется первая и бесконечная нормы:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

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


В общем виде норма счётномерного вектора определяется следующим образом:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

При m = 1 получаем первую норму (сумму модулей компонент). При m = 2 получаем вторую норму (Евклидову).


При необходимости можно рассмотреть случай с 0 < m < 1.


Рассмотрим предельные случаи.


Первый случай: бесконечная норма. m -> inf.

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

Здесь все члены суммы меньше или равны единице. Так как:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

То:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

Что и приводит нас к бесконечной норме.


Второй случай называют также часто нормой Хэмминга. Он реализуется при m = 0. Формально запишем определение нормы:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

Нам создаёт проблемы корень нулевой степени (означающий, фактически, возведение в пределе в бесконечную степень). Для сведения нулевой нормы к норме Хэмминга выкинем этот корень:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

Учитывая, что 0^0=0, получаем норму Хэмминга.


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

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

можно построить графики соответствующих окружностей:

Немного о нормах Математика, Нормы, Длиннопост, LaTeX ПО

В случае первой нормы окружность является ромбом. В случае второй (Евклидовой) нормы окружность имеет привычный нам вид. При увеличении m она всё больше и больше переходит в квадрат (окружность бесконечной нормы). При уменьшении m окружность стремится к кресту, характерному для нулевой нормы.


Благодарности:


Формулы были написаны при помощи онлайн редактора LaTeX.


График был построен с использованием библиотеки модулей matplotlib для языка Python.


Решение уравнения было выполнено с использованием языка C в среде Code::Blocks, работавшей в операционной системе Windows 7.


Длиннопост был выполнен с использованием встроенного редактора на сайте pikabu.ru.

Показать полностью 8

Может ли Wi-Fi больше?

Всем привет! Сегодня я хочу в очередной раз поговорить с вами о сетях Wi-Fi. Я хочу рассказать вам немного о тех трудностях, которые возникают при изучении работы беспроводных сетей. Давайте начнём.

Может ли Wi-Fi больше? Wi-Fi, Модели, Длиннопост

Пакетные радиосети появились довольно давно. Их прообразом стала сеть ALOHA, которой американские военные пытались соединить разрозненные Гавайские острова. Сеть была устроена донельзя просто: станции передавали данные фиксированной длины центральной точке доступа, она или подтверждала приём, или отвечала что данные попали в коллизию и не дошли.


Сеть Wi-Fi базируется на тех же принципах. Если две станции передают в эфир одновременно, летящий по радиоволнам пакет данных портится и никому не достаётся. Если некой станции повезло и она втиснула пакет в пустой канал, приёмник отвечает кадром подтверждения ACK (acknowledgment) и передача считается успешной. Для того, чтобы успешных кадров было больше, а побитых из-за коллизий и радиопомех поменьше, устройства Wi-Fi используют различные фишечки: прослушивают среду, чтобы не начать передавать данные когда кто-то уже занял канал; выбирают момент передачи случайным образом, чтобы две станции не заглушили друг друга и т.д.


Механизм DCF, составляющий основу Wi-Fi, был придуман в 1996 году, однако тогда было малопонятно, насколько вообще он хорош или плох. Как оценить качество связи в беспроводной сети? По скорости передачи данных, по пингу, по потребляемой устройствами мощности? Как понять какой протокол передачи данных лучше?


Можно провести натурный эксперимент: взять 20-30 беспроводных раций, прошить их, включить в сеть и оставить на долгое время. Обычно так поступают физики и биологи: наблюдают за системой долгое время, попутно замеряя некоторую статистику. Однако при изучении беспроводных систем такой подход слишком долгий и дорогостоящий. Для обсчёта параметров и качества радиосетей необходимо было иметь некую математическую модель, которая позволила бы быстро и точно оценивать эффективность работы сети. 3 года люди думали над этой моделью, соревновались в том, кто быстрее сможет её придумать. Наконец, вперёд (с отрывом буквально в пару месяцев) вырвался один итальянец...

Может ли Wi-Fi больше? Wi-Fi, Модели, Длиннопост

Джузеппе Бьянки. В 1999 году он опубликовал статью Performance Analysis of the IEEE 802.11 Distributed Coordination Function, в которой представил первую работающую аналитическую модель современного Wi-Fi. Бьянки сильно облегчил себе задачу рассмотрением т.н. режима насыщения -- когда все сетевые устройства только и делают, что передают пакеты без продыху. При этом подходе можно найти результирующую пропускную способность сети -- максимум того, что можно выжать из Wi-Fi. Конечно, если вы внимательно прочтёте оригинальную статью, вы увидите что сеть в режиме насыщения работает несколько хуже, чем в случае нормальной нагрузки. Однако Бьянки также не учёл снижение скорости из-за помех, засвеченных станций и скрытых терминалов. Потому можно считать что модель Бьянки даёт неплохую оценку сверху для пропускной способности сети Wi-Fi.

Может ли Wi-Fi больше? Wi-Fi, Модели, Длиннопост

При желании любой может скачать оригинальную статью и написать простенькую программу для подсчёта скорости сети. Я же предлагаю вам рассмотреть на следующем графике синюю кривую.

Может ли Wi-Fi больше? Wi-Fi, Модели, Длиннопост

На ней изображены результаты подсчёта скорости передачи данных в сети Wi-Fi согласно модели Бьянки. Номинальная скорость на физическом уровне составляет примерно 8 Mbps. Однако на графике скорость даже не достигает 4.5 Mbps. Почему?

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

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

В итоге на IP уровне пропускная способность сети оказывается в два раза ниже, чем на физическом. Конечно, так бывает не всегда. Тем не менее, когда вы видите на коробке сетевого роутера манящие цифры 54Mbps, можете смело делить их на 2.


Напомню вам график ещё раз:

Может ли Wi-Fi больше? Wi-Fi, Модели, Длиннопост

Как вы видите, при увеличении числа станций скорость сети падает, что вполне логично. Модель Бьянки объясняет глобальный максимум при числе станций равном двум, однако не будем на нём останавливаться. Рассмотрим лучше красную кривую.

Она показывает задержку между двумя успешно переданными подряд пакетами -- т.е. прошедшее между двумя последовательными успешными передачами время. Когда в сети 1000 станций, задержка меньше 10 секунд -- вроде бы, можно потерпеть пока долетит пакет, верно? Однако при увеличении числа станций задержка резко возрастает. При числе станций порядка 50000 задержка становится сравнимой с возрастом Вселенной. Вы хотели бы получить электронное письмо, написанное до Большого взрыва?


По сравнению с реальностью результат модели Бьянки ещё очень оптимистичен. К счастью, пока мало кто задумывается о том, как сеть Wi-Fi будет функционировать, если в ней будет большое число устройств. Не слишком скоро ожидается выпуск стандарта .11ah, который должен поддерживать до 6000 подключённых устройств. Конечно же, там вводятся дополнительные фишечки, которые должны помочь сохранить и повысить скорость сети. Будет ли Wi-Fi жить? Сможет ли он больше? Время покажет!

Всем спасибо за внимание, до новых встреч!

Показать полностью 5
Отличная работа, все прочитано!