Шесть пасхалок GitHub

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

Кстати, вы знали о том, что фразу «Easter egg» («пасхальное яйцо», в просторечии — «пасхалка») придумал в 1979 году Стив Райт — директор по разработке программного обеспечения Atari? Если вы смотрели фильм «Первому игроку приготовиться» — значит вам всё уже должно быть понятно. Вот фрагмент фильма, где игрок находит первую в мире пасхалку, скрытую в классической игре Adventure.

1. Просто число π

Полагаю, не существует такого языка программирования, в стандартной или математической библиотеке которого нет константы, хранящей значение числа π. Но если случилось так, что поисковик Google «упал», а то, чему учили на занятиях по математике, вылетело из головы, вспомнить значение числа π можно, просто перейдя по адресу https://github.com/π.

Откроется страница, на которой, в стиле ASCII-арта, будет показано число π, записанное с точностью до 336 знака после запятой. Это очень удобно.

Число π

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

Вкусное число π

2. Октокоты

Продолжим тему ASCII-арта. Знали ли вы о том, что в API GitHub есть конечная точка, ведущая к ASCII-изображению октокота Моны — логотипа GitHub. Для того чтобы это изображение увидеть, нужно открыть в браузере адрес https://api.github.com/octocat (или воспользоваться curl).

Октокот

Облачко с текстом содержит частицу дзен-мудрости GitHub. Подробности об этом можно почитать здесь.

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

3. Всё есть дзен

Тот, кто весь долгий рабочий день глядит в тёмное окно терминала, пользуясь GitHub CLI, может позволить себе прогулку по дзен-саду своего репозитория, напоминающую старую текстовую игру. Для этого достаточно воспользоваться командой gh repo garden. По этому «саду» можно, в полном смысле этого слова, прогуляться, пользуясь навигационными клавишами, применяемыми в vi.

image

Дзен-сад

Каждый цветок в этом саду представлен первой буквой GitHub-имени пользователя, сделавшего коммит. Цвет цветка — это первые 6 символов SHA-хеша коммита, воспринятых системой как шестнадцатеричный код цвета.

В результате, например, коммит b6b3d26ee50fc6540e1796d8bdc563d22da44ba5 будет представлен весьма приятным оттенком сиреневого цвета #b6b3d2.

4. Приукрашенные профили пользователей

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

image

Особый репозиторий

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

Если вы хотите оснастить свой профиль интересным файлом README и ищете источник вдохновения — взгляните на этот материал, где рассматривается десять достойных внимания примеров подобных файлов.

5. Жуть на панели Contributions

Раз в год панель Contributions выглядит гораздо страшнее, чем обычно. Для её раскрашивания, вместо оттенков зелёного цвета используются варианты цвета хэллоуинского (есть ведь такое слово?).

Хэллоуинская панель Contributions

6. Просмотр панели Contributions в стиле игр 1980-х

GitHub Skyline — это, если кто не знает, инструмент для создания симпатичных трёхмерных визуализаций активности пользователя за указанный год. Вот, например, моя активность в 2020 году. То, что формирует GitHub Skyline, можно скачать в виде .stl-файла и напечатать на 3D-принтере (или заказать печать). Можно исследовать то, что получилось, в виртуальной реальности.

image

GitHub Skyline

А вот для того чтобы найти в GitHub Skyline пасхалку — понадобится ввести «код Konami» (↑ ↑ ↓ ↓ ← → ←→ B A). Тогда включится машина времени, которая унесёт вас далеко в прошлое. Вот твит того, кто нашёл эту интересную штуку.

Знаете какие-нибудь пасхалки в популярных сервисах вроде GitHub?

ссылка на оригинал статьи https://habr.com/ru/company/ruvds/blog/548676/

Теория строения скрытых систем

Введение

Начиная с классической криптографии, с её зарождения и до перерождения в современную, всегда существовала проблема передачи ключа шифрования между субъектами. Задача частично решилась во второй половине XX века, с появлением асимметричного раздела криптографии, когда атака методом подслушивания стала невозможной [1]. Тем не менее первоначальная проблема всё же остаётся и эксплуатируется по сей день, хоть и в завуалированной форме.

Препятствие, которое стало на решении проблемы, заключается в элементе доверия, в его присутствии и в его же отсутствии. Если не предпринимать никаких мер по установке доверенных связей, то любые соединения априори будут подвержены MITM (man in the middle) атакам. С другой стороны, если устанавливать доверенные соединения, то возможность MITM атак не исчезает, а сокращается. И теперь, вместе с первоначальными субъектами появляются промежуточные, интерстициальные субъекты (серверы, узлы хранения и передачи информации), выбираемые нами, и являющиеся законно установленными атакующими. Лишь ограничивая круг нападения, они не перестают потенциально атаковать. Данным узлам известна вся передаваемая нами и нам информация: увлечения, интересы, хобби, развлечения, сообщения. Далее эта информация (объект), как чаще всего происходит, начинает конвертироваться в рекламу, на основе которой увеличивается капитал всё тех же промежуточных субъектов. В итоге вся проблема полностью переворачивается с ног на голову, и теперь, атакующий вместо того, чтобы искать связь для подслушивания, сам создаёт её, сам становится фундаментом прослушивания в обличии сервера, а люди, в свою очередь, лишь выбирают лицо того, кто за ними будет пристально следить.

Уничтожить такую систему доверия не представляется возможным, из-за появления более общих и разрушительных видов атак, а также из-за невозможности полного искоренения доверия как такового [2, с.267]. Таким образом, остаётся лишь улучшать данную систему, делать так, чтобы сам её механизм стремился к уменьшению мощности доверия*, чтобы собственная её структура представляла защиту объектов и анонимат субъектов. К системам подобного рода относятся анонимные сети и тайные каналы связи.

Мощность доверия

*Мощность доверия — количество узлов, участвующих в хранении или передаче информации, представленной в открытом виде для данных узлов. Иными словами, такие узлы способны читать, подменять и видоизменять информацию, так как для них она находится в предельно чистом, прозрачном, транспарентном состоянии. Чем больше мощность доверия, тем выше предполагаемый шанс компрометации отдельных узлов, а следовательно, и хранимой на них информации. Принято считать одним из узлов получателя. Таким образом, нулевая мощность доверия будет возникать лишь в моменты отсутствия каких-либо связей и соединений. Если мощность доверия равна единице, это говорит о том, что связь защищена, иными словами, никто кроме отправителя и получателя информацией не владеют. Во всех других случаях мощность доверия будет больше единицы, что говорит о групповой связи (то-есть, о существовании нескольких получателей), либо о промежуточных узлах, способных читать информацию в открытом виде.

Анонимные сети

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

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

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

В одноранговых системах все пользователи однородны, имеют одинаковые возможности, могут представлять одни и те же услуги маршрутизации. Такие сети легко могут разворачиваться в локальных системах, но с осложнениями работают в глобальном пространстве на основе уже созданных соединений. Сами одноранговые сети могут быть разделены на две категории: децентрализованные и распределённые, хоть их различие и туманно со стороны терминологии. Распределённые сети можно именовать “истинно децентрализованными” (хоть и противоречиво), где нельзя выделить какой-либо центр или узел связи сразу нескольких других узлов. Характерной чертой такой сети является тот факт, что каждый пользователь одновременно соединяется напрямую сразу с несколькими другими. Децентрализованные же сети можно именовать “слабо централизованными” (хоть также и противоречиво), где к одним узлам сети подключаются сразу несколько других узлов. Характерной чертой такой сети является тот факт, что появляются “неофициальные” узлы, часто используемые другими узлами (узлы-серверы) в качестве последующей маршрутизации.

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

Сама анонимность также не является чем-то однородным, точно определённым, её можно рассматривать как некую градацию, набор стадий, поэтапность. Всего же существует шесть стадий и пять видов анонимности (2,3,4,5,6 стадии).

  1. Первая стадия характеризуется отсутствием анонимности |A| = 0*. Примером может являться отсутствие связи как таковой или существование только прямого соединения между двумя субъектами.

  2. Вторая стадия игнорирует анонимность клиент-сервер, обеспечивая только анонимность клиент-клиент. Иными словами, сервер обладает достаточной информацией о клиентах (например, знание IP-адреса, личных данных, интересов). При этом сами клиенты не знают друг друга и потому являются анонимами. Типичным примером могут служить форумы, социальные сети, иначе говоря, большинство сайтов и приложений, построенных на основе клиент-серверной архитектуры. Из этого примера следует, что данная архитектура способна выдавать минимальную мощность анонимности, а именно |A| = 1. Описанную стадию можно вкратце именовать псевдо-анонимностью.

  3. Третья стадия представляет примитивную маршрутизацию, а следовательно и примитивную анонимность, нескольких прокси-серверов несвязанных между собой. Именно на данном этапе сеть становится раздробленной, неопределённой, гибридной за счёт чего и повышается мощность анонимности, lim|A|→C, где C — количество прокси- серверов. Хоть мощность анонимности действительно и повышается, безопасность самих субъектов ещё не обеспечивается. Связано это всё потому, что шифрование на данном этапе есть свойство добавочное (сродни второй стадии) необходимое только для защиты клиент-серверной коммуникации, но не обеспечивающее защиту абстрактной связи клиент- клиент, не приводящая к уменьшению мощности доверия.

  4. Четвёртая стадия заменяет сетевой адрес криптографическим. Под заменой подразумевается частичное, неполное, фрагментированное преобразование, где сам сетевой адрес полностью не скрывается и никак не удаляется, он продолжает существовать в самом базисе, механизме компьютерных сетей. Именно на данном этапе мощность доверия становится минимально возможной величиной, а потому и все приложения построенные на четвёртой стадии анонимности и выше, имеют уровень безопасности зависимый только (или в большей мере) от качества самой клиентской части. Примером такой стадии могут являться мессенджеры, файловые сервисы, электронная почта, блокчейн платформы [3] и т.д., где известны лишь криптографические адреса клиентов (публичные ключи, хеши публичных ключей). Сеть представляет собой также, как и в третьей стадии, разрозненный характер поведения узлов, но при этом целью маршрутизации является не только факт самой передачи информации, но и последующее её сохранение, удерживание на большинстве узлов сети, то-есть маршрутизация является слепой, заливочной [4, с.398]. При этом, в список задач такой маршрутизации не вносится как таковая анонимизация субъектов, она скорее представляет собой добавочное, второстепенное свойство. Поэтому, четвёртую стадию можно характеризовать игнорированием (но не отсутствием) анонимности (экзотеричностью) со стороны субъекта и её сохранением (эзотеричностью) в передаваемом объекте. Мощность анонимности данного этапа динамична, то-есть 0 < |A| ≤ N, где N — количество узлов в сети. Это связано с тем фактом, что предполагаемый получатель может оказаться на совершенно случайном узле, как близком к отправителю, так и дальнем от него.

  5. Пятая стадия изменяет способ маршрутизации, придаёт ему свойство полиморфизма, изменчивости закрытой информации по мере перехода от одного узла к другому. Таким методом скрывается настоящая связь между субъектами под средством их объекта. Мощность анонимности данного этапа чаще всего статична, тем самым lim|A|→C, где C — количество выбранных узлов маршрутизации из всего множества в сети. Примером пятой стадии являются сами скрытые сети, подобия Tor (луковая маршрутизация), I2P (чесночная маршрутизация) и т.д.

  6. Шестая стадия повышает анонимность до абсолюта, теоретического максимума за счёт объединения свойств полиморфной и слепой маршрутизации, образуя тем самым новую, вероятностную (а также виртуальную) маршрутизацию. Данный этап объединяет основные характеристики четвёртой и пятой стадий, иными словами, предполагает распространение объекта по всем узлам с вероятностной возможностью его полиморфизма. Мощность анонимности схожа с четвёртой стадией 0 < |A| ≤ N(C+1), где N — количество узлов в сети, C — количество узлов маршрутизации. Данный этап может быть основой, ядром скрытых сетей, а также тайных каналов связи. В отличие от пятой стадии анонимности, где скрытые сети могут быть как одноранговыми, так и гибридными, сеть на основе шестой стадии может быть только одноранговой.

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

Основным моментом четвёртой стадии является возможность идентификации субъектов в одноранговых и гибридных системах, что ведёт к целостности, а также и к аутентификации самой передаваемой информации, не зависимой от сторонних узлов и серверов [5, с.223]. Помимо прочего, может также и появляться свойство конфиденциальности, где информация представляет собой суть секретного, скрытого, тайного, а не открытого и общего объекта. Но данного свойства может и не быть на четвёртом этапе, если оно является избыточным для самой системы. Как пример, в криптовалютах имеются свойства целостности и аутентификации, но не конфиденциальности. Только начиная с пятой стадии анонимности, конфиденциальность становится базисом системы.

Большинство атак, направленных на скрытые сети, представляют способы деанонимизации субъектов (как наиболее лёгкий способ), нежели попытки раскрытия, взлома, дешифрования объектов (как наиболее сложный). Так, например, достаточно сильной и сложно искоренимой атакой на одноранговые (а следовательно, и на гибридные) сети является атака Сивиллы. Она базируется на том факте, что главным способом анонимности является элемент маршрутизации, который обеспечивается за счёт передачи информации посредством нескольких узлов. С одной стороны, сутью атаки является замена несвязанных между собой узлов, на узлы подчинённые одному лицу, либо группе лиц с общими интересами, тем самым, атака ориентируется на (lim|A|→1) уменьшение мощности анонимности до единицы. С другой стороны, в некоторых видах сетей с увеличенной мощностью доверия, атака может вредить и целостности передаваемой информации, иными словами, подменять и видоизменять её. При повышении количества узлов несвязанных между собой в сети, повышается и сложность реализации атаки Сивиллы, за счёт более равномерного распределения узлов. Из этого также следует, что мощность анонимности будет стремиться к своим теоретически заданным значениям. Всё это связано с тем, что атакующие узлы будут конкурировать с обычными узлами за возможность быть посредниками между субъектами передаваемой информации. Чем больше несвязанных узлов и лучше алгоритм распределения, тем меньше вероятность осуществления данной атаки. Тем не менее, атака Сивиллы особо опасна при этапе зарождения скрытых сетей, когда количество узлов минимально. Решений данной проблемы несколько:

  1. Обеспечить замкнутость и сложность встраивания узлов в сеть. Иными словами, использовать фактор доверия или параметр дружбы. Узлы в таких сетях должны выстраивать связи между собой, основываясь на субъективности к уровню доверия, так как никакого объективно доверенного, а следовательно, и централизованного, узла не существует. Выстраивая связи друг-к-другу (или friend-to-friend), узлы также начинают выстраивать связи друг моего друга — это мой скрытый друг. Таким образом, друзья друзей не подключаются напрямую и не знают друг друга, но при этом вполне могут обмениваться информацией между собой, что является показателем увеличения размеров сети. Чтобы успешно подключиться к такой сети, необходимо самому стать доверенным узлом, то-есть пользователем, которому кто-либо доверяет. Сложность исполнения атаки, на такой род сети, сводится к сложности встраивания в сеть подчиняемых узлов, как того требует атака Сивиллы, а это, как было описано выше, является проблематичным действием. Единственная проблема friend-to-friend (f2f) сетей заключается в их малой эксплозии, расширении, увеличении масштаба, являясь тем самым следствием причины ручной настройки и установки списка доверенных узлов.

  2. Осуществить переход к шестой стадии — крайней форме анонимности. В таком случае, целью является сокрытие, удаление, исключение всех возможных связей между отправляемой информацией (объектом) и самим отправителем/получателем (субъектом). После исчезновения всех связей, сама маршрутизация перестаёт быть чем-то реальным и настоящим перерастая тем самым в этап условного и виртуального, где раскрытие даже одного из субъектов, начинает быть сложной задачей. Деанонимизация в таком случае возможна лишь при условии полного внутреннего контроля сети, по причине сложного обнаружения и последующего восстановления связей с объектом. Основным и главным отрицательным свойством шестой стадии анонимности является линейное увеличение нагрузки на сеть O(N) со стороны всех пользователей в ней участвующих. Так, например, если сеть состоит из N узлов, то каждый узел должен будет обрабатывать N-1 запросов от других узлов. Время жизни пакета (TTL) на шестой стадии не является решением данной проблемы, по причине появления новых связей между отправителем и передаваемой информации, что, следовательно, ведёт к переходу на пятый этап.

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

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

  2. Использовать изменения информации в процессе её маршрутизации. При таком способе информация будет представлена в полиморфной и самоизменяющийся оболочке, то-есть оболочке шифрованной. Такой подход необходим в моменты, когда информация, приходящая из государства A в государство B, будет снова возвращаться на свою родину A**. В качестве примера можно привести луковую маршрутизацию сети Tor, где само шифрование представлено в виде слоёв, которые каждый раз “сдирают”, снимают при передаче от одного узла к другому.

Существует также и альтернативный вариант противодействия подобной атаке. Он в отличие от вышеописанного не требует этапа с федеративностью, но взамен требует огромное количество информации, приводящую к спаму. Плюсом такого подхода является и то, что его можно использовать в тайных каналах связи как единственно возможный элемент анонимизации субъектов. Для осуществления такого метода применяются сети основанные на шестой стадии анонимности, так как они распространяют информацию методом заливки, что априори ведёт к множественному дублированию, пролиферации. Полиморфизм информации осуществляется способом установки промежуточных получателей и созданием транспортировочных пакетов, представленных в форме множественного шифрования. Как только узел сети принимает пакет, он начинает его расшифровывать. Если пакет успешно расшифровывается, но при этом сама расшифрованная версия является шифрованным экземпляром, то это говорит о том, что данный принимающий узел — это промежуточный получатель, целью которого является последующее распространение “расшифрованной” версии пакета по сети. Так будет происходить до тех пор, пока не будет расшифрован последний пакет, предполагающий существование истинного получателя. Стоит также заметить, что промежуточные получатели при расшифровании пакета могут узнавать криптографический адрес отправителя, именно поэтому стоит отправлять транспортировочные пакеты из-под криптографического адреса псевдо-отправителя.

Пример программного кода [6] для создания транспортировочного пакета
import ( 	"bytes" ) func RoutePackage(sender *PrivateKey, receiver *PublicKey, data []byte, route []*PublicKey) *Package {    var (      rpack = Encrypt(sender, receiver, data)      psender = GenerateKey(N)    )    for _, pub := range route {      rpack = Encrypt(        psender,        pub,        bytes.Join(         [][]byte{           ROUTE_MODE,            SerializePackage(rpack),         },         []byte{},       ),     )   }    return rpack  }

Если предположить, что в сети существует всего три узла {A, B, C} (где один из них является отправителем — A) и сама сеть основывается на шестой стадии анонимности без полиморфизма информации, то в таком случае и при таком условии крайне проблематично определить истинного получателя, пока он сам себя не выдаст ответом на запрос (так как ответом будет являться совершенно новый пакет, отличный от всех остальных). Теперь, если предположить, что существует возможность полиморфизма информации, то есть вероятность её маршрутизации, то начинается этап слияния свойств получения и отправления, образуя антиципацию. Так, например, если полиморфизм существует, значит будет существовать три этапа: (A → B ИЛИ A → C) → (B → C ИЛИ C → B) → (B → A ИЛИ C → A), но если полиморфизма не существует, то будет два этапа: (A → B ИЛИ A → C) → (B → A ИЛИ C → A)***. При этом предполагается, что системе известен лишь отправитель информации (инициатор), в то время как получатель не определён. Из этого следует, что если полиморфизм будет являться статичной величиной (то есть, будет всегда существовать или не существовать вовсе), то определение получателя будет являться лёгкой задачей (при условии, что он всегда отвечает инициатору). Но, если полиморфизм будет иметь вероятностную величину, то грань между отправлением и получением будет стираться, сливаться, инвертироваться, что приведёт к разному трактованию анализируемых действий: запрос(1) — ответ(1) — запрос(2) или запрос(1) — маршрутизация(1) — ответ(1). Но в таком случае, возникает свойство гипертелии (сверх окончания), где запрос(2) не получает своего ответа(2), что снова приводит к возможности детерминированного определения субъектов. Теперь, если выровнять количество действий полиморфизма (количество маршрутизации пакета) k и количество действий без него n (что представляет собой всегда константу n = 2), иными словами придерживаться формулы НОД(k, 2) = 2 (где НОД — наибольший общий делитель), то получим максимальную неопределённость, алеаторность при константе k = 2, которую можно свести к следующему минимальному набору действий полиморфизма: (A → B ИЛИ A → C) → (B → C ИЛИ C → B) → (B → C ИЛИ C → B) → (B → A ИЛИ C → A). В итоге, все действия можно трактовать двумя полностью самодостаточными процессами: запрос(1) — ответ(1) — запрос(2) — ответ(2) или запрос(1) — маршрутизация(1) — маршрутизация(~1) — ответ(1), что в свою очередь приводит к неопределённости отправления и получения информации со стороны анализа трафика всей сети. И потому, ответ(1) = маршрутизация(1), ответ(2) = ответ(1), а также запрос(2) = маршрутизация(~1). Проблемой здесь является лишь запрос(1), созданный инициатором связи, который будет трактоваться всегда детерминировано. Но при последующих действиях данная проблема всегда будет угасать из-за увеличивающейся энтропии, приводящей к хаотичности действий. Так например, на следующем шаге появится неопределённость вида запрос(3) = запрос(2), означающая неоднозначность выявления отправителя.

Далее, анализируя вышеописанный подход, можно также заметить, что маршрутизация и ответ являются этапами полностью автоматизированными, в то время как запрос является этапом ручным. Такой момент приводит к явлению, что между ответом и последующим запросом интервал времени ожидания больше, нежели между запросом — ответом, запросом — маршрутизацией, маршрутизацией — маршрутизацией и маршрутизацией — ответом. Это приводит к возможности осуществления атаки методом учёта времени с последующим расщеплением хаотичности, тем самым приводя к однозначности маршрутизации и к возможному выявлению субъектов информации. Предотвратить подобную уязвимость можно двумя противоположными, дифференцированными методами:

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

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

Продолжая анализ, можно выявить некоторые закономерности, приводящие к возможности точного обнаружения состояния пакета, а именно, является ли он запросом или ответом (при этом не разглашая субъектов информации). Исходя из периода T, который вычисляется по формуле НОК(2+k, 2) (где НОК — наименьшее общее кратное), несложно узнать, что период при k = 2 будет равен 4. Это в свою очередь говорит о том, что каждое четвёртое действие, начиная с предыдущего запроса, будет также являться запросом (аналогичная ситуация с ответом). Хоть и уязвимостей при данной детерминированности выявлено не было, тем не менее, с консервативной точки зрения, лучшим решением будет повышение периода, если атаки на этой основе будут обнаружены. Повысить период можно несколькими способами:

  1. Повысить k (не стоит забывать о свойстве гипертелии, если выбор падает на нечётное число).

  2. Сделать k случайной переменной диапазона [1;n], где n < N (количество узлов в сети).

Мощность анонимности

*Мощность анонимности — количество узлов, выстроенных в цепочку и участвующих в маршрутизации информации от отправителя до получателя, при этом, не будучи никак связанными между собой общими целями и интересами. Из этого следует, что многоранговая архитектура по умолчанию имеет мощность анонимности равной единице (вне зависимости от количества серверов). Нулевая мощность анонимности возникает либо при отсутсвии связей, либо при существовании прямого соединения между субъектами (иными словами при отсутствии какой бы то ни было маршрутизации).

Мощность федеративности

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

Обозначение абсолютной анонимности

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

Тайные каналы связи

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

  1. Первым, минимальным видом анонимности в тайных каналах связи принято считать четвёртую стадию, то-есть сохранение экзотеричности субъекта и эзотеричности объекта, благодаря использованию криптографических и/или стеганографических [7] методов преобразования информации. При этом, если в секретных каналах связи используются криптографические методы, то они не ограничиваются только идентификацией субъектов (целостностью, аутентификацией), но также и применяют практику шифрования объектов (конфиденциальность). И так как тайные каналы связи разворачиваются в заведомо замкнутой системе (многорановой), то и мощность анонимности в таком случае равняется единице.

  2. Вторым, максимальным видом анонимности в тайных каналах связи принято считать шестую стадию, при этом пропуская, игнорируя, импутируя пятую. Вся особенность такого подхода заключается в невозможности использовать фактическую, реальную маршрутизацию, которую предполагает пятая стадия анонимности. Тем самым реальная маршрутизация отдаёт откуп виртуальной, существование которой возможно лишь и только на шестой стадии анонимности. Виртуальная маршрутизация имманентна, сводится к передаче объекта внутри единого, сингулярного приложения, связывающего всех субъектов изнутри. Таким приложением является сервер (или группа серверов с |A| = 1), при помощи которого клиенты передают друг другу и принимают друг от друга информацию. Так как приложение располагает полным знанием того, кто является отправителем и кто является получателем, то сам сервер становится создателем сети на основе которой располагается тайный канал связи. При всём этом, такое приложение, в задаче о тайных каналах связи, аналогично и равносильно государству, в задаче о построении анонимных сетей. Всё это ведёт лишь к единственно возможной борьбе за анонимность с приложением-создателем — методом спама (так как способ с федеративностью бессилен и недейственен в виртуальном пространстве).

Тайные каналы связи, использующие стеганографию, всегда имеют некий контейнер, в который помещается истинное сообщение. Под контейнером может пониматься ложное, неявное, сбивающее с пути сообщение, которое чаще всего носит нейтральный характер. Из этого также следует, что в зависимости от размера контейнера, зависит и размер самого исходного сообщения, тем самым, стеганографический подход рассчитан на сообщения малых размеров и мало пригоден для передачи целых файлов. Примером контейнера может служить изображение, аудио-запись, видео-файл, то есть всё, что может хранить дополнительную или избыточную информацию, которая останется незаметной для человеческих глаз и ушей. Одним из примеров сокрытия информации может служить замена каждого старшего бита в изображении, битом исходного сообщения. Таким образом, если размер изображения (то есть, контейнера) будет равен 2MiB, то максимальный размер исходного сообщения не будет превышать 256KiB.

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

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

Существует ещё один, третий способ сокрытия информации, относящийся к криптографическим, но при этом обладающий некоторыми стеганографическими свойствами, качествами, особенностями [8, с.720]. Это не является последовательным объединением, использованием методов, как это было описано выше, а скорее оказывается их слиянием, синтезом, симбиозом. В таком методе истинная информация скрывается в цифровой подписи ложного сообщения на основе общего, согласованного ключа, где главной чертой и исключительностью является стойкость ко взлому, сродни сложности взлома цифровой подписи. При этом, сама подпись — есть контейнер, скрывающий существование сообщения методом аутентификации ложной информации.

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

Протокол безопасной передачи информации

Из всего вышесказанного можно создать легковесный, примитивный, но при этом и безопасный протокол передачи информации, являющийся самодостаточным, цельным и монолитным. Может быть применим в анонимных сетях и тайным каналам связи [2, с.58][8, с.80].

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

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

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

Пример программного кода для шифрования информации
import (    "bytes"    "encoding/hex"  )  func Encrypt(sender *PrivateKey, receiver *PublicKey, data []byte) *Package {    var (      session = GenerateBytes(N)      rand = GenerateBytes(M)      pubsend = PublicKeyToBytes(&sender.PublicKey)      hash = HashSum(bytes.Join(        [][]byte{          rand,          data,pubsend,          PublicKeyToBytes(receiver),        },        []byte{},      ))      sign = Sign(sender, hash)    )    return &Package{      Head: HeadPackage{        Rand: hex.EncodeToString(EncryptS(session, rand)),        Sender: hex.EncodeToString(EncryptS(session, pubsend)),        Session: hex.EncodeToString(EncryptA(receiver, session)),      }, Body: BodyPackage{        Data: hex.EncodeToString(EncryptS(session, data)),        Hash: hex.EncodeToString(hash),        Sign: hex.EncodeToString(EncryptS(session, sign)),        Npow: ProofOfWork(hash, C),      },    }  }

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

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

Пример программного кода для расшифрования информации
import (    "bytes"    "encoding/hex"  )  func Decrypt(receiver *PrivateKey, pack *Package) (*PublicKey, []byte) {    // Check proof.    hash, err := hex.DecodeString(pack.Body.Hash)    if err != nil {      return nil, nil    }    if !ProofIsValid(hash, C, pack.Body.Npow) {      return nil, nil    }    // Decrypt session key.    eskey, err := hex.DecodeString(pack.Head.Session)    if err != nil {      return nil, nil    }    skey := DecryptA(receiver, eskey)    if skey == nil {      return nil, nil    }    // Decrypt public key.   ebpubsend, err := hex.DecodeString(pack.Head.Sender)    if err != nil {      return nil, nil    }    bpubsend := DecryptS(skey, ebpubsend)    if bpubsend == nil {      return nil, nil    }    pubsend := BytesToPublicKey(bpubsend)    if pubsend == nil {      return nil, nil    }    // Decrypt and check sign.    esign, err := hex.DecodeString(pack.Body.Sign)    if err != nil {      return nil, nil    }    sign := DecryptS(skey, esign)    if sign == nil {      return nil, nil    }    if !Verify(pubsend, hash, sign) {      return nil, nil    }    // Decrypt rand.    erand, err := hex.DecodeString(pack.Head.Rand)    if err != nil {      return nil, nil    }   rand := DecryptS(skey, erand)    if rand == nil {      return nil, nil    }    // Decrypt data.    edata, err := hex.DecodeString(pack.Body.Data)    if err != nil {      return nil, nil    }    data := DecryptS(skey, edata)    if data == nil {      return nil, nil    }    // Check hash.    check := HashSum(bytes.Join(      [][]byte{        rand,        data,        PublicKeyToBytes(pubsend),        PublicKeyToBytes(&receiver.PublicKey),      },      []byte{},    ))    if !bytes.Equal(hash, check) {      return nil, nil    }    return pubsend, data  }

Для улучшения эффективности, допустим при передаче файла, программный код можно изменить так, чтобы снизить количество проверок работы в процессе передачи, но с первоначальным доказательством работы на основе случайной строки (полученной от точки назначения), а потом и с накопленным хешем из n-блоков файла, для i-ой проверки. Таким образом, минимальный контроль работы будет осуществляться лишь ⎡M/nN⎤+1 раз, где M — размер файла, N — размер одного блока. Если доказательство не поступило или оно является неверным, то нужно считать, что файл был передан с ошибкой и тем самым запросить повреждённый или непроверенный блок заново.

Исходные коды

Протокол безопасной передачи информации реализован в фреймворке gopeer: https://github.com/Number571/gopeer

На основе протокола также было реализовано приложение электронной почты — HES, представляющее четвёртую стадию анонимности: https://github.com/Number571/HES

Заключение

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

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

  1. Диффи. В., М. Хеллман. Новые направления в криптографии [Электронный ресурс]. — Режим доступа: https://ee.stanford.edu/~hellman/publications/24.pdf (дата обращения: 19.12.2020).

  2. Шнайер, Б., Фергюсон, Н. Т. Практическая криптография / Б. Шнайер, Н. Т. Фергюсон. — М.: Издательский дом «Вильямс, 2005. — 420 с.

  3. Накамото, С. Биткойн: система цифровой пиринговой наличности [Электронный ресурс]. — Режим доступа: https://bitcoin.org/files/bitcoin-paper/bitcoin_ru.pdf (дата обращения: 19.12.2020).

  4. Таненбаум, Э., Уэзеролл, Д. Компьютерные сети / Э. Таненбаум, Д. Уэзеролл. — СПб.: Питер, 2017. — 960 с.

  5. Рябко, Б. Я., Фионов, А. Н. Криптография в информационном мире / Б. Я. Рябко, А. Н. Фионов. — М.: Горячая линия — Телеком, 2019. — 300 с.

  6. Донован, А.А., Керниган, Б.У. Язык программирования Go / А.А. Донован, Б.У. Керниган. — М.: ООО «И.Д. Вильямс», 2018. — 432 с.

  7. Шелухин, О.И., Канаев, С.Д. Стеганография. Алгоритмы и программная реализация / О.И. Шелухин, С.Д. Канаев. — M.: Горячая линия — Телеком, 2018. — 592 с.

  8. Шнайер, Б. Прикладная криптография. Протоколы, алгоритмы и исходные коды на языке C / Б. Шнайер. — СпБ.: ООО «Альфа-книга», 2018. — 1040 с.

ссылка на оригинал статьи https://habr.com/ru/post/550044/

Двумерные тестовые функции для оптимизации

Оптимизация функций — это область исследований, где поставлена задача найти некое входное значение [аргумент функции], результат которого — максимум или минимум данной функции. Алгоритмов оптимизации много, поэтому важно развивать алгоритмическое чутьё и исследовать алгоритмы на простых и легко визуализируемых тестовых функциях.


Двумерные функции принимают два входных значения (x и y) и выводят единожды вычисленное на основе входа значение. Эти функции — одни из самых простых для изучения оптимизации. Их преимущество в том, что они могут визуализироваться в виде контурного графика или графика поверхности, показывающего топографию проблемной области с оптимумом и уникальными элементами, которые отмечены точками. В этом туториале вы ознакомитесь со стандартными двумерными тестовыми функциями, которые можно использовать при изучении оптимизации функций. Давайте начнём.

Обзор туториала

Двумерная функция — это функция, которая принимает две входные переменные и вычисляет целевое значение. Можно представить две входные переменные как две оси на графике, x и y. Каждый вход в функцию является единственной точкой на графике, а результат вычисления функции — некоторая высота на графике.

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

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

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

  1. Унимодальные функции.

  1. Унимодальная функция 1.

  2. Унимодальная функция 2.

  3. Унимодальная функция 3.

  1. Мультимодальные функции.

  1. Мультимодальная функция 1.

  2. Мультимодальная функция 2.

  3. Мультимодальная функция 3.

Реализация каждой целевой функции будет представлена на Python в выведена в виде поверхности.

Все целевые функции являются функциями минимизации, то есть задача — найти аргументы, при которых значение функции минимально. Любая максимизирующая функция может быть заменена функцией минимизации путем добавления минуса ко всем её значениям. Аналогичным образом минимизирующая функция заменяется максимизирующей. Кроме того, все функции взяты из литературы, их придумал не я. Ссылки смотрите в разделе «Дальнейшее чтение».

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

Унимодальные функции

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

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

Унимодальная функция 1

Диапазон ограничен промежутком -5,0 и 5,0 и одним глобальным оптимумом в точке [0,0, 0,0].

# unimodal test function from numpy import arange from numpy import meshgrid from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D  # objective function def objective(x, y): 	return x**2.0 + y**2.0  # define range for input r_min, r_max = -5.0, 5.0 # sample input range uniformly at 0.1 increments xaxis = arange(r_min, r_max, 0.1) yaxis = arange(r_min, r_max, 0.1) # create a mesh from the axis x, y = meshgrid(xaxis, yaxis) # compute targets results = objective(x, y) # create a surface plot with the jet color scheme figure = pyplot.figure() axis = figure.gca(projection='3d') axis.plot_surface(x, y, results, cmap='jet') # show the plot pyplot.show()

Код создаёт поверхность согласно графику функции.

График поверхности на основе унимодальной функции оптимизации 1
График поверхности на основе унимодальной функции оптимизации 1

Унимодальная функция 2

Диапазон ограничен значениями -10,0 и 10,0 и одним глобальным оптимумом в точке [0,0, 0,0].

# unimodal test function from numpy import arange from numpy import meshgrid from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D  # objective function def objective(x, y): 	return 0.26 * (x**2 + y**2) - 0.48 * x * y  # define range for input r_min, r_max = -10.0, 10.0 # sample input range uniformly at 0.1 increments xaxis = arange(r_min, r_max, 0.1) yaxis = arange(r_min, r_max, 0.1) # create a mesh from the axis x, y = meshgrid(xaxis, yaxis) # compute targets results = objective(x, y) # create a surface plot with the jet color scheme figure = pyplot.figure() axis = figure.gca(projection='3d') axis.plot_surface(x, y, results, cmap='jet') # show the plot pyplot.show()

Код создаёт поверхность согласно графику функции.

График унимодальной функции оптимизации 2
График унимодальной функции оптимизации 2

Унимодальная функция 3

Диапазон ограничен -10,0 и 10,0 и одним глобальным оптимумом при [0,0, 0,0], функция известна как функция Изома.

# unimodal test function from numpy import cos from numpy import exp from numpy import pi from numpy import arange from numpy import meshgrid from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D  # objective function def objective(x, y): 	return -cos(x) * cos(y) * exp(-((x - pi)**2 + (y - pi)**2))  # define range for input r_min, r_max = -10, 10 # sample input range uniformly at 0.01 increments xaxis = arange(r_min, r_max, 0.01) yaxis = arange(r_min, r_max, 0.01) # create a mesh from the axis x, y = meshgrid(xaxis, yaxis) # compute targets results = objective(x, y) # create a surface plot with the jet color scheme figure = pyplot.figure() axis = figure.gca(projection='3d') axis.plot_surface(x, y, results, cmap='jet') # show the plot pyplot.show()

Код создаёт поверхность согласно графику функции.

График унимодальной функции оптимизации 3
График унимодальной функции оптимизации 3

Мультимодальные функции

Мультимодальная функция — это функция с более чем одной “модой” или оптимумом (например долиной на графике).

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

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

Мультимодальная функция 1

Диапазон ограничен -5,0 и 5,0 и одним глобальным оптимумом при [0,0, 0,0]. Эта функция известна как функция Экли.

# multimodal test function from numpy import arange from numpy import exp from numpy import sqrt from numpy import cos from numpy import e from numpy import pi from numpy import meshgrid from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D  # objective function def objective(x, y): 	return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20  # define range for input r_min, r_max = -5.0, 5.0 # sample input range uniformly at 0.1 increments xaxis = arange(r_min, r_max, 0.1) yaxis = arange(r_min, r_max, 0.1) # create a mesh from the axis x, y = meshgrid(xaxis, yaxis) # compute targets results = objective(x, y) # create a surface plot with the jet color scheme figure = pyplot.figure() axis = figure.gca(projection='3d') axis.plot_surface(x, y, results, cmap='jet') # show the plot pyplot.show()

Код создаёт поверхность согласно графику функции.

Мультимодальная функция оптимизации 1
Мультимодальная функция оптимизации 1

Мультимодальная функция 2

Диапазон ограничен [-5,0 и 5,0], а функция имеет четыре глобальных оптимума при [3,0, 2,0], [-2,805118, 3,131312], [-3,779310, -3,283186], [3,584428, -1,848126]. Эта функция известна как функция Химмельблау.

# multimodal test function from numpy import arange from numpy import meshgrid from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D  # objective function def objective(x, y): 	return (x**2 + y - 11)**2 + (x + y**2 -7)**2  # define range for input r_min, r_max = -5.0, 5.0 # sample input range uniformly at 0.1 increments xaxis = arange(r_min, r_max, 0.1) yaxis = arange(r_min, r_max, 0.1) # create a mesh from the axis x, y = meshgrid(xaxis, yaxis) # compute targets results = objective(x, y) # create a surface plot with the jet color scheme figure = pyplot.figure() axis = figure.gca(projection='3d') axis.plot_surface(x, y, results, cmap='jet') # show the plot pyplot.show()

Код создаёт поверхность согласно графику функции.

Мультимодальная функция оптимизации 2
Мультимодальная функция оптимизации 2

Мультимодальная функция 3

Диапазон ограничен промежутком [-10,0 и 10,0] и функцией с четырьмя глобальными оптимумами в точках [8,05502, 9,66459], [-8,05502, 9,66459], [8,05502, -9,66459], [-8,05502, -9,66459]. Эта функция известна как табличная функция Хольдера.

# multimodal test function from numpy import arange from numpy import exp from numpy import sqrt from numpy import cos from numpy import sin from numpy import e from numpy import pi from numpy import absolute from numpy import meshgrid from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D  # objective function def objective(x, y): 	return -absolute(sin(x) * cos(y) * exp(absolute(1 - (sqrt(x**2 + y**2)/pi))))  # define range for input r_min, r_max = -10.0, 10.0 # sample input range uniformly at 0.1 increments xaxis = arange(r_min, r_max, 0.1) yaxis = arange(r_min, r_max, 0.1) # create a mesh from the axis x, y = meshgrid(xaxis, yaxis) # compute targets results = objective(x, y) # create a surface plot with the jet color scheme figure = pyplot.figure() axis = figure.gca(projection='3d') axis.plot_surface(x, y, results, cmap='jet') # show the plot pyplot.show()

Код создаёт поверхность согласно графику функции.

График мультимодальной функции оптимизации 3
График мультимодальной функции оптимизации 3

Резюме

Если вы хотите глубже погрузиться в тему — обратите внимание на сопутствующие материалы ниже.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы

ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/549472/

FOSS News №63 – спецвыпуск о «внутренней кухне» дайджестов

Всем привет!

Вот уже больше года я вместе с несколькими товарищами делаю дайджесты FOSS News для Хабра с материалами о свободном и открытом ПО и железе. Недавно меня пригласили на онлайн-конференцию разработчиков программного обеспечения с открытым кодом «Админка», где я рассказал о наших дайджестах для тех, кто их не видел, и об их «внутренней кухне» для тех кто уже читает. Я подумал, что здесь читателям это тоже может быть интересно, поэтому публикую текст доклада, на котором я основывал своё выступление.

Оглавление

  1. Введение
  2. Предыстория
  3. Идея
  4. Формат
  5. Последние главные материалы
  6. Развитие за год+
  7. Схема подготовки
  8. Источники, ключевые слова, фильтрация и прочее
  9. Интерактивный категоризатор
  10. Админка
  11. Команда
  12. Планы
  13. Присоединяйтесь!
  14. Контакты и ссылки

Введение

Сегодня я хочу рассказать о дайджестах новостей и других материалов о свободном и открытом ПО и железе под названием FOSS News. Free and Open Source Software News то есть. Мы с товарищами делаем эти дайджесты с января 2020 г., то есть больше года. В своём выступлении я хочу не только рассказать, что мы делаем, для тех кто не читал, но и показать некоторые детали процесса подготовки, что будет новым для тех кто нас уже и так читает, и остальным может быть интересно. Ещё FOSS News – это не просто дайджесты о FOSS, это сам по себе FOSS проект, потому что в нём много автоматизации и её код выложен под свободной лицензией. В PermLUG я занимаюсь организационными вопросами и проектами, по основной же работе в Miro я инженер по нагрузочному тестированию и имею около 12 лет опыта разработки ПО.

Предыстория

Всё началось на встрече Пермской группы пользователей GNU/Linux 23 января 2020 г., а группа сама появилась аж 24 года назад. Я тогда только в школу ходил и ещё не участвовал. Далее было 5-6 волн активности и затишья. Я подключился где-то на 4-й. И последняя волна была инициирована мной, идея дайджестов тоже была моя, это я на верхнем фото справа со странным лицом, просто другого фото не было. Захотелось что-то полезное делать кроме собраний. Я и стал делать. Объединяться хорошо, а объединяться вокруг проекта – ещё лучше. И в рекордные сроки, через 3 дня после той линуксовки, был готов выпуск №0. А со временем ещё пара людей подключились.

Идея

Идея дайджестов была простая. Я читал несколько источников о свободном и открытом ПО и железе, но мне мало интересны были релизы, которым уделялось достаточно много внимания. Я просто регулярно делаю sudo apt upgrade и радуюсь если что новое появилось в программах, которыми пользуюсь, ну а если что не заметил – надо будет нагуглю. Именно релизы я отслеживаю буквально по нескольким проектам. Мне было интересно, чем ещё живёт сообщество. Что куда внедрили, кто исходники открыл, аналитика разная о достижениях FOSS, привлечение финансирования, отчёты о работе фондов и всё такое. Гипотеза была такая, что не одному мне интересна именно в первую очередь такая приоритизация.

Формат

Формат менялся со временем и чуть меньше года назад или около того стал примерно таким:

  1. Несколько главных материалов. Это могут быть и новости, и статьи, и какие-то особо важные релизы.
  2. Блок «короткой строкой». Здесь по указанным трём категориям собрано всё, что попало в ленту из всех источников и не попало в главное, это реально много материалов, но там просто заголовок и ссылка и всё поделено по категориям. В начале дайджеста оглавление. Можно просто перейти в нужный блок, пропустив неинтересное.
  3. Прочее. Тут например ссылки на другие дайджесты или что-то ещё, что не вписалось в основные категории.

Выход каждую неделю в воскресенье вечером.

Последние главные материалы

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

Развитие за год+

Чуть более чем за год всего было выпущено 62 дайджеста. Выпуск №0 был опубликован ВКонтакте и это было провалом, просмотров было очень мало, всего несколько десятков, я очень расстроился. Сейчас, вспоминая это, я думаю – с чего вдруг я вообще решил релизить ВКонтакте. Может просто потому что у нас была группа только там и других мыслей и в голову не могло прийти.

Выпуск №1 запостили уже на Хабр по совету одного знакомого. Спасибо тимлиду с прошлого места работы за инвайт. И тут труды были вознаграждены – просмотров было много, тысяч 7. И на только что созданный канал в Telegram сразу подписалась пара сотен человек.

Далее такого пика просмотров как у выпуска №1 мы не достигали и вообще число просмотров стабилизировалось, зато сформировалась постоянная аудитория и наверное это тоже неплохо. Аудитория примерно 2.5 тысяч человек – не знаю много это или мало, мне нормально. Ну а Telegram канал растёт потихоньку но стабильно, это приятно.

Схема подготовки

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

Как делаются дайджесты:

  1. FNGS робот, написанный на Python, крутится на сервере и пробегается по куче RSS и HTML источников, собирает материалы и отфильтровывает по ключевым словам.
  2. С помощью интерактивного консольного клиента-категоризатора fncategorizer.py, тоже на Python (у меня почти всё на Python), я обрабатываю то что насобирал сервер, отбрасываю не по теме или явно неинтересные материалы, раскидываю по категориям с помощью подсказок категоризатора, который тоже работает по базе ключевых слов, всё это отправляется обратно на сервер.
  3. Скрипт remotedatatohtml.py вытаскивает с сервера все заголовки и ссылки для текущего выпуска и метаинформацию и генерирует HTML.
  4. HTML загружаю на Google Drive, кидаю ссылки для ревью товарищам.
  5. После ревью гуглодок выкачиваю и скриптом googledoctohtml.py преобразую в формат Хабра, в том числе строя оглавление. Да, в редакторе Хабра не совсем стандартный HTML.
  6. Заливаю на Хабр, ссылки кидаю в Telegram, RSS и по соцсетям.
  7. Собираю статистику, тоже скриптом естественно.

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

Источники, ключевые слова, фильтрация и прочее

Ещё немного статистики на слайде. Русскоязычные источники я насобирал по памяти, а англоязычные – считерил немного, просто некоторое время назад linux.com собирал тематические материалы с других ресурсов и делал ссылки у себя, а я просто посмотрел откуда они собирали и добавил в базу. Ключевые слова набирались в ходе работы с категоризатором, который я написал, и ещё я стащил названия всех проектов, которые ведёт Linux Foundation. Есть на примете ещё источники. Вот тут написано про 500 исходных и 160 итоговых материалов – просто не все ленты прям строго тематические, приходится отбирать по ключевым словам, большую работу тут за меня делает робот, я отсеиваю буквально десяток-другой вручную или около того. Ещё десяток-другой это дубликаты, их потом вручную объединять приходится пока что. По категориям раскидывание идёт в полуавтоматическом режиме, скрипт делает мне предложения исходя из ключевых слов, я принимаю или указываю свои варианты.

Интерактивный категоризатор

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

Админка

Поскольку FNGS сервер работает на Python Web фреймворке Django, бонусом шла админка. Через неё удобнее поиск делать и какие-то отдельные записи править и добавлять. Тут особо моей заслуги нет, просто показываю. Сборная солянка такая из консольных и графических инструментов, но мне норм.

Команда

В команде FOSS News из постоянных участников робот, мы вдвоём с Васей из PermLUG и ещё один человек с Хабра. Робот делает очень много рутинной работы, которой если бы мне пришлось заниматься каждую неделю я бы точно с ума сошёл 🙂 А последнего я в жизни никогда не видел, просто он сначала на Хабре замечания к выпускам скидывал в личку, а потом я его пригласил к предрелизной подготовке, и он большой молодец.

Планы

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

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

И где-то в далёком светлом будущем я хотел бы сделать из FOSS News профессиональное СМИ, даже домены купил уже.

Присоединяйтесь!

Как я уже говорил, планов много, качество хочется повышать, новые направления открывать, но ресурсов не хватает. Поэтому возникла идея сделать распределённой работу над самой продолжительной частью процесса подготовки – категоризацией источников. Для этого можно сделать Telegram бота. Он же может использоваться для добавления материалов, которые оказались вне поля зрения FNGS-робота.

Поэтому приглашаем к участию Python-разработчиков, которые хотели бы помочь в разработке бота, и просто активистов, которые хотели бы поработать с ботом в будущем.

Мы также открыты к другим вариантам сотрудничества.

И с радостью расскажем о ваших FOSS проектах, скидывайте ссылки!

Контакты и ссылки

На последнем слайде были контакты и ссылки, приведу их просто текстом для удобства.

Ресурсы PermLUG:

  1. Сайт (статичная страничка, просто для ссылок на всё остальное)
  2. Telegram — @permlug (канал) и @permlug_chat (чат)
  3. ВКонтакте
  4. Fediverse
  5. Twitter
  6. Facebook

Исходники инструментов:

  1. FOSS News Gathering Server
  2. FOSS News Tools

Мои личные контакты:

  1. gim6626@gmail.com
  2. @gim6626 в Telegram

Спасибо за внимание! Читайте, комментируйте, распространяйте FOSS News и подключайтесь к нашей команде!


Ссылки на материалы по «Админке»:

  1. Полная программа te-st.ru/events/adminka
  2. Видеозапись первого дня www.youtube.com/watch?v=dvsCYfeo_qc
  3. Видеозапись второго дня www.youtube.com/watch?v=gCukiw4DWuU

ссылка на оригинал статьи https://habr.com/ru/post/550060/

Светильники Remez с солнечным спектром

Бренд Remez, известный по первым в мире светодиодным лампам с солнечным спектром, выпускает не только лампы, но и светильники с теми же светодиодами SunLike. Я протестировал три модели.


Светильники оснащены Tuya-совместимыми Wi-Fi/Bluetooth-модулями и могут управляться из приложения на смартфоне (можно использовать как фирменное приложение Remez Smart Light, так и приложения Tuya или Smart Life). Потолочные светильники также управляются пультами, входящими в комплект.

У всех светильников можно регулировать яркость, у потолочных светильников меняется и цветовая температура от тёплого до холодного света.

Светильник Leda необычно выглядит на фотографиях.

К него полуматовое стекло с микропризмами.

Свет каждого светодиода превращается в красивую объёмную светящуюся фигуру.

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

Заявленные параметры: мощность 60 Вт, световой поток 100 — 4000 лм, цветовая температура 3000-6500 К, индекс цветопередачи CRI (Ra) > 95.

В светильнике установлены светодиоды двух цветовых температур: «тёплые» и «холодные», смешиванием их света достигаются промежуточные цветовые температуры.

Я протестировал светильник в трёх режимах: самого тёплого, нейтрального и самого холодного света.

Спектр во всех режимах ровный, соответствующий спектру SunLike, индекс цветопередачи очень высокий — 97-98. Пульсации света практически нет, как при полной яркости, так и при её снижении. Цветовая температура «тёплых» светодиодов 3000К, «холодных» около 5500К.

Мощность в разных режимах цвета изменяется от 57 до 60.6 Вт. Учитывая среднюю эффективность светодиодов Sunlike 67 лм/Вт, световой поток светильника в режиме тёплого света составляет около 3800 лм, в режимах нейтрального и холодного света около 4100 лм.

В режиме минимальной яркости тёплого света световой поток светильника составляет 4% от максимального.

Когда светильник выключен в приложении или с пульта, он потребляет около 0.4 Вт.

Пульт инфракрасный, кнопки светятся в темноте.

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

Светильник запоминает своё состояние после отключения питания. Обычным выключателем (фактически кратковременным отключением питания) можно менять цветовую температуру (тёплый-нейтральный-холодный).

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

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

Второй потолочный светильник Wisper имеет диаметр 60 см.

Заявленные параметры: мощность 50 Вт, световой поток 100 — 3300 лм, цветовая температура 3000-6500 К, индекс цветопередачи CRI (Ra) > 95.

Результаты моих измерений в трёх режимах.

Спектр такой же ровный, индекс цветопередачи очень высокий — 96-98. Пульсации света также нет во всех режимах. Цветовая температура «тёплых» светодиодов 2800К, «холодных» около 5100К.

Мощность в разных режимах цвета изменяется от 44.5 до 47 Вт. Световой поток в режиме тёплого света около 3000 лм, в режимах нейтрального и холодного света около 3200 лм.

В режиме минимальной яркости тёплого света световой поток светильника составляет 4% от максимального.

Когда светильник выключен в приложении или с пульта, он потребляет около 0.45 Вт.

Пульт использует радиоканал.

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

Вид светильника снизу.

Драйвер.

Как и первый светильник, Wisper имеет ограниченный угол освещения и не освещает потолок.

Офисный подвесной светильник Aller оснащён светодиодами с цветовой температурой 4000К.

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

Заявленные параметры: мощность 40 Вт, световой поток 100 — 3150 лм, цветовая температура 4000К, индекс цветопередачи CRI (Ra) > 95.

Результаты моих измерений.

Спектр отличный, индекс цветопередачи почти 99. Пульсации отсутствуют. Цветовая температура около 3900К.

Мощность 38.1 Вт. Световой поток около 2550 лм.

В режиме минимальной яркости тёплого света световой поток светильника составляет 1% от максимального.

Когда светильник выключен в приложении или с пульта, он потребляет около 1.5 Вт.

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

Вид светильника снизу.

Драйвер.

Светильник может использоваться как для общего освещения в помещении с высокими потолками (скорее всего понадобятся несколько таких светильников), так и для местного освещения при размещении над столом.

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

Я снял небольшое видео о светильнике Leda, но и Wisper тоже в него попал.

https://www.youtube.com/watch?v=aj_G1YmlLlU

Светильники Remez, благодаря использованию светодиодов Sunlike корейской фирмы Seoul Semiconductor, дают самый комфортный и безопасный свет с ровным «солнечным» спектром.

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

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

© 2021, Алексей Надёжин

ссылка на оригинал статьи https://habr.com/ru/company/lamptest/blog/550068/