Русский
Русский
English
Статистика
Реклама

Open source

Перевод Разработчик популярного веб-фреймворка FastAPI об истории его создания и перспективах аннотаций типов Python

16.06.2021 12:16:05 | Автор: admin


Python-девелопер и писатель Рики Уайт взял интервью у Себастьяна Рамиреса, разработчика из Explosion AI. Но Себастьян не просто разработчик, это заметная фигура в open source сообществе, создатель популярных фреймворков FastAPI и Typer. В основном речь шла про широкие возможности применения аннотаций типов Python, историю создания фреймворка FastAPI и его дальнейшее развитие. Кроме того, Себастьян рассказал о своих планах по работе над другими open source проектами. Без лишних слов, давайте перейдем к интервью.

Рики: Спасибо, что пришёл, Себастьян. Сначала я бы хотел задать тебе те же вопросы, что и другим своим гостям. Как ты начал программировать? Когда познакомился с Python?

Себастьян: Спасибо, что пригласил [улыбается].

Я начал программировать, когда мне было пятнадцать. Я пытался создать веб-сайт для бизнеса своих родителей. Первым моим настоящим кодом был JavaScript внутри HTML модальное диалоговое окно (alert) с фразой Hello World. Я до сих пор помню, как обрадовался, увидев это маленькое окно с сообщением, и испытал чувство всемогущества от мысли, что это запрограммировал я.

Я много лет боялся изучать какой-либо другой язык, думая, что сначала должен хотя бы освоить JavaScript. Но потом на одном из многих онлайн-курсов, которые я проходил, возникла необходимость использовать Python для управления искусственным интеллектом в Pac-Man и для некоторых других задач. Курс состоял из одного длинного туториала по основам Python, и этого было достаточно. Мне очень хотелось попробовать.

Я быстро влюбился в Python и пожалел, что не начал раньше!

Рики: На сегодняшний день мне известно [поправь меня, если ошибаюсь], что ты трудишься в Explosion AI, компании, создавшей популярную платформу обработки естественного языка (NLP-библиотеку spaCy). Расскажи немного о трудовых буднях. Какие задачи в сфере искусственного интеллекта и машинного обучения интересуют команду и какие инструменты создала компания, чтобы помочь разработчикам быстрее продвигаться в обеих областях?

Себастьян: Да, Explosion в основном известен благодаря spaCy. Это NLP-библиотека с открытым исходным кодом. Они также создали Prodigy, коммерческий инструмент с поддержкой скриптования для эффективного аннотирования наборов данных в машинном обучении. Я работал в основном в Prodigy Teams. Это облачная версия Prodigy для совместного использования. Поскольку продукт ориентирован на конфиденциальность, создание облачной версии было связано с множеством особых проблем.

Тем не менее недавно я решил покинуть компанию. Теперь я планирую найти способ посвятить большую часть своего рабочего времени FastAPI, Typer и другим моим open source проектам. А ещё я, скорее всего, буду консультировать другие команды и компании.

Рики: Ты более известен как разработчик FastAPI, высокопроизводительной веб-платформы для создания API-интерфейсов, которая быстро стала одной из самых популярных в Python-сообществе. Что вдохновило тебя на его создание и как планируешь развивать его дальше? И вопрос от тех, кто ещё не пробовал FastAPI: почему можно смело использовать его в своём следующем проекте вместо других популярных фреймворков?

Себастьян: На самом деле я годами откладывал создание нового фреймворка.

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

У меня также была возможность поработать с другими технологиями с JavaScript и TypeScript на фронте, несколькими фреймворками для гибридных приложений, с Electron для десктопа и так далее. Тем не менее, большинство моих проектов (или даже все) были связаны с данными (data science, ML и так далее).

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

  1. Автозаполнение в редакторе кода.
  2. Автоматическое обнаружение ошибок в редакторе (проверка типов).
  3. Возможность писать простой код.
  4. Автоматическая валидация данных.
  5. Автоматическое преобразование данных (сериализация).
  6. Автоматическая генерация документации для API.
  7. Поддержка стандартов OpenAPI для Web API, OAuth 2.0 для аутентификации и авторизации и JSON Schema для документирования.
  8. Внедрение зависимостей для упрощения кода и повторного использования кода в качестве утилит.
  9. Хорошая производительность / параллелизм.

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

В какой-то момент мой очередной эксперимент по скрещиванию опять провалился. Я как будто перепробовал всё, что можно, и задумался о том, что делать дальше. И тогда я понял: Час Х настал. Я стал изучать стандарты OpenAPI, JSON Schema, OAuth 2.0 и многие другие. Затем я начал реализовывать свои идеи именно так, как это работало у меня в голове. Сначала тестировал на нескольких редакторах, оптимизируя взаимодействие с разработчиками, и только потом закреплял это во внутренней логике моего проекта.

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

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

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

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

А вообще, мигрировать на FastAPI относительно просто, там нет сложных интеграций. Вы можете использовать обычные Python-пакеты непосредственно в сочетании с FastAPI. Мигрировать можно постепенно или создавать с FastAPI только новые компоненты.

Рики: Ещё ты создал Typer, фреймворк, работающий в режиме командной строки (CLI). Он, так же как и FastAPI, во многом опирается на аннотации типов Python. Кажется, я замечаю закономерность [улыбается]. Что такого особенного в этой типизации, которая тебе так нравится? Считаешь ли ты, что всё больше библиотек должны использовать аннотации типов Python?

Себастьян: Да, конечно! Аннотации типов позволяют реализовать автозаполнение и проверку типов в редакторе кода. Аннотации типов, собственно, и были придуманы для этих задач.

Это особенно актуально, если вы создаёте инструмент, который, как ожидается, будут использовать другие разработчики. Я бы хотел, чтобы многие Python-пакеты, например, для инфраструктуры API или SaaS-клиентов, поддерживали аннотации типов. Это значительно улучшило бы жизнь их разработчиков и упростило бы внедрение инструментов.

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

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

Ещё аннотации типов можно использовать для сериализации данных. Например, в URL-адресе всё является строкой, и то же самое справедливо для CLI. Но если в аннотациях типов мы укажем, что нам нужно целое число, инфраструктура (FastAPI или Typer) может попытаться преобразовать, например, строку 42 из URL-адреса или командной строки в целое число.

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

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

Всё это из коробки могут делать FastAPI и Typer.

Рики: Каковы твои планы на будущее? Над какими ещё проектами будешь работать?

Себастьян: О да, у меня много планов. Может быть, даже слишком много [улыбается].

Есть несколько фич, которые я хочу добавить в FastAPI и Typer. Я также планирую поработать над автоматизацией UI администратора FastAPI, который не будет зависеть от базы данных (буду делать на основе OpenAPI). Ещё хочу интегрировать pydantic с SQLAlchemy для тех случаев, когда нужно общаться с базами данных (опять же, хочу воспользоваться преимуществами аннотаций типов и уменьшить дублирование кода).

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

Кроме того, хочу сделать больше контента об изучении всех этих штук, снять несколько видеороликов, возможно, сделать курс

Рики: Теперь, задам тебе, пожалуй, два последних вопроса. Чем ещё занимаешься в свободное время? Чем интересуешься, помимо Python и программирования?

Себастьян: В последнее время у меня не было возможности отвлекаться на другие занятия, но я надеюсь, в дальнейшем это немного изменится. Когда у меня есть время, я люблю играть в видеоигры с женой (а иногда и один), смотреть фильмы, завтракать или пить кофе с друзьями где-нибудь в Берлине (когда нет карантина).

Мне очень нравится работать над своими open source проектами, поэтому я легко могу сидеть за этим делом часами даже в выходные дни и не замечать, как проходит время [улыбается].

Рики: Спасибо, что пришёл, Себастьян. Классно пообщались!

Себастьян: Всегда рад.Большое спасибо за приглашение!



VPS серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Свой криптографический протокол опасная идея

01.06.2021 12:20:22 | Автор: admin

Разработка своей криптографии в чём-то сравнима с созданием собственного авиадвигателя, говорит эксперт по безопасности Руна Сандвик. Фото: Виталий Кузьмин

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

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

Это распространённые причины, из-за которых разрабатывают проприетарные протоколы.

Безопасность


Поговорим о безопасности.

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

На Хабре частенько упоминают реверс-инжиниринг протоколов в различных устройствах: автомобили, тракторы, даже машины для производства мороженого. Производители этой техники стараются скрыть технические данные ради безопасности. Чтобы глупые пользователи не совали шаловливые ручки внутрь.

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

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

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

Но жизнь иногда показывает обратное. А именно:

  1. Принцип безопасность через неясность не работает. Любой протокол можно отреверсить.
  2. Проприетарная реализация шифрования это очень рискованно.
  3. Никто не поможет закрыть критические дыры в закрытом софте.

Принцип безопасность через неясность не работает в криптографии


Принцип безопасность через неясность (security through obscurity) заключается в том, чтобы скрыть внутреннее устройство системы или реализацию для обеспечения безопасности.

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

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

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


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

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

Собственная криптография


Вопрос Почему не разработать собственную криптографию? чем-то похож на вопрос Почему не спроектировать авиадвигатель?, говорит Руна Сандвик, исследователь по безопасности. Конечно, теоретически мы можем это сделать. Но это чрезвычайно сложно. Гораздо более простой и надёжный вариант выбрать готовое решение, проверенные и надёжные протоколы и алгоритмы.

Поэтому в сообществе информационной безопасности вызывает большое подозрение, если какая-то компания реализует собственный проприетарный протокол. Например, проприетарный протокол MTProto в Telegram поначалу вызвал массу критических отзывов. Взлом MTProto1.0 стал одной из самых популярных статей на Хабре в 2013 году: Безопасен ли Telegram? Или как я искал закладку в MTProto (спойлер: глупые ошибки в проприетарной криптографии).

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

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

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

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

Конечно, в опенсорсе есть свои специфические риски. Например, проблемы с сотнями зависимостей, которые вы не контролируете. Например, 20% багов в проектах на GitHub явно внесены в проекты специально, со злым умыслом. То есть вредоносными контрибуторами, которые действовали умышленно. Ещё не забыта история c мейнтейнером ESLint, который 12 июля 2018 года опубликовал вредоносные версии пакетов eslint-scope и eslint-config-eslint в репозитории npm.

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


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

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

Кстати, в 2013 году проприетарный софт впервые обогнал опенсорсные проекты по среднему количеству багов на 1000 строк кода.


Источник: Coverity Scan Open Source Report

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

Возвращаясь к примеру Telegram. 5 декабря 2020 года двое итальянских математиков Марино Микулан и Никола Витоколонна опубликовали на сайте препринтов arXiv.org исследование Автоматическая символическая проверка протокола MTProto 2.0 в Telegram (вторая версия опубликована 30 апреля 2021 года, arXiv:2012.03141v1). Оно подтверждает безопасность обновлённой версии фирменного протокола MTProto 2.0.


Набор протоколов MTProto 2.0 (в голубой рамке) и область покрытия данной научной работы (светло-зелёным цветом). Схема из научной статьи Марино Микулана и Никола Витоколонны, arXiv:2012.03141v1

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


Протокол аутентификации MTProto 2.0. Здесь $\{m\}_{pk}$ означает асимметричное шифрование $m$ открытым ключом $pk$. В свою очередь, $\{m\}_{(k,iv)}$ означает симметричное шифрование общим ключом $k$ с вектором инициализации $iv$. Схема из научной статьи


Слегка упрощённая версия протокола MTProto 2.0 для секретных чатов. Все сообщения перенаправляются через сервер $S$: каждое сообщение между $X \in \{A, B \}$ и $S$ шифруется с использованием ключа авторизации $X$ (здесь не показан). Обратите внимание, что $g_{ab}$, $k$ и $iv$ не известны серверу $S$. Схема из научной статьи



Эта математическая работа чуть ослабила озабоченность экспертов по поводу проприетарного протокола MTProto2.0. Редкий случай, когда собственная нестандартная криптографическая система (пока) работает надёжно. В ней ещё не нашли таких фатальных уязвимостей, как в MTProto 1.0.

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



На правах рекламы


Наша компания предлагает серверы с Linux или Windows. Не экономим на железе только современное оборудование и одни из лучших дата-центров в России и ЕС. Поспешите проверить!

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

I2pd-tools дополнительные утилиты I2P

03.06.2021 18:21:18 | Автор: admin

Подробное изучение i2pd достойно уважения. Эта статья близка по духу навыкам администрирования роутера, но посвящена несколько другой, но важной теме: набору инструментов, который включает в себя ряд полезных утилит. i2pd-tools, дамы и господа!

  1. keygen генерация ключей

  2. vain генерация ключей по шаблону (майнер красивых адресов)

  3. keyinfo информация о ключах

  4. b33address получение адреса для зашифрованного лизсета

  5. regaddr регистрация короткого домена в зоне .i2p

  6. regaddr_3ld регистрация домена третьего уровня в зоне .i2p

  7. regaddralias привязка короткого домена к новым ключам

  8. offlinekeys использование временных ключей в целях безопасности

  9. routerinfo информация о роутере

  10. x25519 генерация ключей шифрования

  11. i2pbase64 кодирование информации в base64 и ее декодирование

Компиляция утилит

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

Начнем со сборки бинарных файлов: для начала скачайте репозиторий к себе на устройство. Команда клонирования на всех операционных системах выглядит одинаково: git clone --recursive https://github.com/purplei2p/i2pd-tools. Чтобы установить зависимости, необходимо запустить скрипт dependencies.sh. Предполагается, что компилятор C++ и программа сборки make уже имеются, поэтому под зависимостями понимаются исключительно библиотеки boost и openssl.

Если вы только начинаете путь на поприще со сборкой программ из исходных кодов, поставьте git, компилятор g++ и систему сборки make командой вроде этой: sudo apt install git g++ make. Для пользователей Windows все немного сложнее требуется установить оболочку MSYS2, а затем из нее выполнить команду: pacman -S git make mingw-w64-x86_64-gcc. Скрипт для установки зависимостей также запускается в MSYS2 (если скрипт не хочет запускаться, нужно сделать его исполняемым простой командой chmod +x dependencies.sh). Когда все готово, запускаем сборку командой make.

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

keygen

При указании несуществующих ключей в конфигурационном файле туннелей, автоматически создаются новые. В большинстве случаев это удобно. Однако, если требуется заранее знать адрес, либо произвести какие-то дополнительные манипуляции с ключом, следует воспользоваться утилитой keygen. Использование крайне простое: запускаем keygen с указанием желаемого имени для новых ключей. По умолчанию используется актуальный тип подписи EDDSA-SHA512-ED25519 (кодовое обозначение 7), который также является типом по умолчанию при создании ключей самим I2P-роутером. Если требуется получить ключ с другим типом подписи, его следует указать при запуске после имени файла. Можно указать как имя типа, так и его номер. Обозначения приведены в файле README.

сначала создан ключ с типом подписи по умолчанию, затем с типом 10сначала создан ключ с типом подписи по умолчанию, затем с типом 10

vain

Крайне редко можно увидеть хоть сколько-то читаемый адрес в выдаче keygen (потому что это просто хеш). Для адресов с человекочитаемым началом существует отдельная утилита vain (vanitygen). Говорящее название (vanity тщеславие) намекает на основное применение майнера адресов. Конечно помимо тщеславия адрес с запоминающимся началом имеет и практический профит: его проще распознать на глаз.

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

Шаблоны до 6 символов находятся почти моментально, но с увеличением строки поиска время растет экспоненциально. Небольшая табличка с примерным временем нахождения приведена в файле README. На момент выхода статьи vain поддерживает только ключи с типом подписи EDDSA-SHA512-ED25519 (7), используемый в сети по умолчанию.

keyinfo

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

Возможные параметры: -v от verbose, подробный вывод; -d от destination, вывод только полного адреса в кодировке base64, -b от b33 (bb32), вывод адреса для зашифрованного лизсета (подробно о зашифрованных лизсетах читайте в статье).

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

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

b33address

keyinfo с флагом -b высчитывает адрес для конечной точки с зашифрованным лизсетом. b33address делает то же самое, но принимает не файл с ключами, а полный адрес в кодировке base64. Для использования зашифрованных лизсетов (которые называются b33 или bb32, что одно и то же), рекомендуется использовать тип подписи 11. Утилита b33address работает только с ним.

На скриншоте генерируется ключ, затем его адрес bb32 запрашивается через keyinfo. Чтобы получить полный адрес, снова используется keyinfo. Вывод keyinfo был скопирован, а затем передан в b33address. Утилита сообщила адрес, который будет использован при зашифрованном лизсете, а также вывела сегодняшний хеш хранения. Как видно, значения совпадают с теми, которые предоставила утилита keyinfo, т.е. функционал b33address аналогичен keyinfo -b, но отличается форматом принимаемого значения.

regaddr

Для регистрации коротких человекочитаемых доменов вроде site.i2p необходимо посетить регистраторы reg.i2p и stats.i2p (первый от русскоязычного сообщества PurpleI2P, второй от англоязычной команды Java-роутера).

Оба регистратора работают по схожему принципу: вы предоставляете свой полный адрес, к которому будет привязан желаемый домен, а также криптографическую подпись заявленного желания. Подпись проверяется ключом из полного адреса. Такая заявка имеет стандартный вид и генерируется утилитой regaddr (с версии 2.37.0 i2pd поддерживает генерацию регистрационной строки через веб-консоль). Синтаксис утилиты простой: сначала файл с ключами, затем желаемый домен.

Работа утилиты regaddr проста, как и синтаксис регистрационной строки: сначала идет желаемый домен, затем полный адрес, к которому он будет привязан, а в конце строки подпись желаемого домена. Синим цветом на скриншоте выделен полный адрес. Для наглядности полный адрес также получен утилитой keyinfo с флагом -d. Красным цветом выделена подпись.

Получая подобную строку, регистратор проверяет валидность подписи и, если заявленный домен свободен, регистрирует его. Для примера можно воспользоваться утилитой verifyhost, которую использует reg.i2p. При использовании в bash необходимо экранировать восклицательный знак, чтобы он был интерпретирован как часть строки, и передан в утилиту (либо заключить всё выражение в ковычки).

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

regaddr_3ld

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

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

./regaddr_3ld step1 sub_domain.dat sub.domain.i2p > step1.txt

Затем ключом основного домена подписывается строка субдомена:

./regaddr_3ld step2 step1.txt domain.dat domain.i2p > step2.txt

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

./regaddr_3ld step3 step2.txt sub_domain.dat > step3.txt

В приведенном примере регистрационная строка находится в файле step3.txt.

regaddralias

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

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

offlinekeys

I2P имеет концепцию оффлайн-ключей (offline keys), которая позволяет хранить постоянные ключи в надежном месте. Другими словами, основной ключ хранится в безопасном месте, а на сервере используется временный, срок действия которого истекает через заданное количество дней. В случае его компрометации, спустя заданный срок действия, вы с полной уверенностью можете утверждать, что ваш сетевой адрес снова принадлежит только вам. Оффлайн-ключи подробно разобраны в отдельной статье.

На скриншоте красным цветом выделен основной ключ и его адрес, а синим временный ключ, который имеет пометку Offline signature и тот же адрес.

routerinfo

I2P-роутер складывает информацию об известных роутерах в директорию netDb. Затем эти роутеры используются при построении транзитных туннелей. Файл, являющийся идентификатором роутера, называется RouterInfo (RI). В него включается информация о криптографических ключах и IP-адрес (если он публикуется и является доступным извне).

Флаг -p отображает порт (по умолчанию выводится только IP-адрес). Флаг -f выводит правило для файервола iptables для разрешения исходящего подключения к конкретному I2P-роутеру (для параноидальных случаев, когда все исходящие соединения запрещены). Параметр -6 добавляет в выдачу IPv6 адрес, если он присутствует.

x25519

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

i2pbase64

Почти в каждом пункте этой статьи упоминалась какая-либо информация, которая по умолчанию является бинарной (двоичным, нечитаемым машинным кодом). Например, криптографические ключи и хеши. Чтобы двоичную информацию было проще воспринимать человеку, а также легко передавать в текстовом виде, в I2P почти повсеместно используется кодировка base64. Алфавит base64 в I2P отличается от общего стандарта на два символа: + заменяется на -, а / на ~. Это связано с использованием base64-строк в веб-браузере, где + и / являются специальными символами: человекочитаемые короткие домены записываются в локальную базу роутера через браузер посредством открытия специальных ссылок (addresshelper).

На скриншоте приведен пример кодирования текстовой информации, а затем ее раскодирование обратно в текст. Утилита аналогичным образом работает с любыми бинарными файлами вроде изображений или видео. Прямое практическое назначение у i2pbase64 в i2pd-tools отсутствует. Это сугубо специфичная утилита для экзотических задач, например, ручного кодирования сторонних ключей.


Утилита famtool не была освещена в статье по простой причине: family дополнительный опознавательный признак роутера. В концепции, в которую поверили лишь единицы, в том числе zzz (ведущий разработчик Java-роутера), family указывается добропорядочными пользователями для того, чтобы роутеры одного админа не появились вместе в одном туннеле. Как не трудно понять, эта опция никем и никогда не используется, а злонамеренными людьми, которые хотят захватывать как можно больше туннелей для попытки мониторинга сети, family не используется тем более. При практической бессмысленности, инструмент famtool не тривиален в использовании, поэтому в рамках этого материала упущен.

Оригинальная статья опубликована в блоге дата-центра ITSOFT.

Подробнее..

Транспортный агент MS Exchange для защиты от вирусов и нежелательной почты

18.06.2021 12:04:53 | Автор: admin

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

Пример зловреда, с которым встроенные механизмы Exchange не справилисьПример зловреда, с которым встроенные механизмы Exchange не справились

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

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

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

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

История разработки

Сначала мы дописывали StripLinks, который в качестве примера транспортного агента представлен Microsoft, а затем прикрутили к нему функциональность опенсорсного ExchangeAttachmentFilter для фильтрации по имени файлов. Этого нам показалось мало и мы добавили туда анализ контента файлов алгоритмом Ахо-Корасик и регулярками, анализ текста, заголовков и темы письма, а еще обезвреживание автозапуска в pdf.

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

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

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

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

Как это работает

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

  • Совпадение отправителя и получателя письма

  • Опасные шаблоны в теме письма

  • Ссылки в тексте письма

  • Опасные шаблоны в тексте письма

  • Подделку MessageID

  • Потенциально опасные заголовки письма

  • SMTP сессию

  • Проверку вложения по имени

  • Проверку вложения YARA на наличие вредоносных сигнатур

  • Проверку содержимого архивов остальными файловыми модулями

Правила для проверки задаются в формате YARA-правил для файлового анализа и в XML для других модулей. В отличие от встроенных механизмов эксченджа, эти правила дают возможность полного контентного анализа, а не только поверхностного принятия решения на основе расширения файла.

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

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

  • Пропустить

  • Отклонить

  • Добавить в тему письма надпись "опасно"

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

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

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

Что мы хотим от публикации в опенсурс?

  • Идеи, как можно было бы улучшить/поправить инструмент

  • Помощь энтузиастов в развитии агента

  • Дать коллегам по цеху инструменты и идеи, как можно оградить своих пользователей от почтовых угроз

Подробнее..

Как мы построили Computer Vision из подручных материалов, чтобы сделать гифки

17.06.2021 14:15:17 | Автор: admin

Меня зовут Денис Власов, я Data Scientist в Учи.ру. С помощью моделей машинного обучения из записей онлайн-уроков мы сделали гифки последовательность из нескольких кадров с наиболее яркими эмоциями учеников. Эти гифки получили их родители в e-mail-рассылке. Вместе с Data Scientist @DariaV Дашей Васюковой расскажем, как без экспертизы в Computer Vision, а только с помощью открытых библиотек и готовых моделей сделать MVP, в основе которого лежат low-res видео. В конце бонус виджет для быстрой разметки кадров.

Откуда у нас вообще возникла мысль распознавать эмоции? Дело в том, что мы в Учи.ру развиваем онлайн-школу Учи.Дома сервис персональных видео-уроков для школьников. Но поскольку такой урок это чисто человеческое взаимодействие, возникла идея прикрутить к нему немного аналитики. Такие данные могут помочь повысить конверсию, отследить эффективность уроков, замерить вовлеченность учеников и многое другое.

Если у вас, как и у нас, не стоит задача RealTime определения эмоций, можно пойти простым способом: анализировать записи уроков.

Маркеры начала и конца урока

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

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

Разбили видео на кадры

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

Научились детектировать детские улыбки (и не только)

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

Проблема 1. Распознавать лица на картинках низкого качества сложнее

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

Стандартный детектор DNN Face Detector из библиотеки OpenCV, который мы сначала взяли за основу, на наших данных давал неточные результаты. Оказалось, что алгоритм недостаточно хорошо справляется с реальными кадрами из видеочатов: иногда пропускает лица, которые явно есть в кадре, из двух лиц находил только одно или определял лица там, где их нет.

Стандартный детектор DNN Face Detector мог определить как лицо узор на занавеске, игрушечного медведя или даже композицию из картин на стене и стулаСтандартный детектор DNN Face Detector мог определить как лицо узор на занавеске, игрушечного медведя или даже композицию из картин на стене и стула

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

Размечали итеративно: после добавления новой порции размеченных кадров мы заново обучали модель. А после проверки ее работы сохраняли разметку для новых кадров, наращивая обучающую выборку. Всего мы разметили 2624 кадра из 388 видеозаписей, на которых в сумме было 3325 лиц.

Таким образом удалось обучить более чувствительный в наших условиях детектор. В валидационной выборке из 140 кадров старый детектор нашел 150 лиц, а пропустил 38. Новый же пропустил только 5, а 183 обнаружил верно.

Проблема 2. В кадре присутствует не только ребенок

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

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

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

  • возраст людей на кадре с низким разрешением становится неочевидным;

  • дети присутствуют в кадре практически весь урок, а взрослые минуты.

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

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

Вторая модель должна была находить именно такие родительские плечи. Очевидно, что в этой задаче детектор лиц не применим, поэтому надо обучаться на кадрах целиком. Конечно, таких датасетов мы не нашли в публичном доступе и разметили около 250 000 кадров, на которых есть часть родителя, и кадры без них. Разметки на порядок больше, чем в других задачах, потому что размечать гораздо легче: можно смотреть не отдельные кадры, а отрезки видео и в несколько кликов отмечать, например, что вот эти 15 минут (900 кадров!) родитель присутствовал.

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

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

Проблема 3. Дети улыбаются по-разному

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

За основу классификатора настроения мы взяли предобученную модель ResNet34 из библиотеки fast.ai. Эту же библиотеку использовали для дообучения модели в два этапа: сначала на публичных датасетах facial_expressions и SMILEsmileD с веселыми и нейтральными лицами, потом на нашем размеченном вручную датасете с кадрами с камер учеников. Публичные датасеты решили включить, чтобы расширить размер выборки и помочь модели более качественными изображениями, чем кадры видео с планшетов и веб-камер наших учеников.

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

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

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

  3. Аугментация. Позволяет в разы увеличить эффективный размер выборки и учесть особенности данных.

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

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

1. Аугментации

При дообучении мы использовали достаточно жесткие аугментации:

  • Отражали изображение по горизонтали.

  • Поворачивали на случайную величину.

  • Применяли три разных искажения для изменения контраста и яркости.

  • Брали не всю картинку, а квадрат, составляющий не менее 60% от площади исходного изображения.

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

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

Пример аугментаций на одном изображении. Для наглядности аугментации сделаны до масштабирования к разрешению 64х64Пример аугментаций на одном изображении. Для наглядности аугментации сделаны до масштабирования к разрешению 64х64Код для аугментаций
# ! pip freeze | grep fastai# fastai==1.0.44import fastaiimport matplotlib.pyplot as pltfrom matplotlib import cmfrom matplotlib import colorsimport seaborn as sns%matplotlib inlinefrom pylab import rcParamsplt.style.use('seaborn-talk')rcParams['figure.figsize'] = 12, 6path = 'facial_expressions/images/'def _side_cutoff(    x,    cutoff_prob=0.25,    cutoff_intensity=(0.1, 0.25)):    if np.random.uniform() > cutoff_prob:        return x    # height and width    h, w = x.shape[1:]    h_cutoff = np.random.randint(        int(cutoff_intensity[0]*h), int(cutoff_intensity[1]*h)    )    w_cutoff = np.random.randint(        int(cutoff_intensity[0]*w), int(cutoff_intensity[1]*w)    )        cutoff_side = np.random.choice(        range(4),        p=[.34, .34, .16, .16]    ) # top, bottom, left, right.    if cutoff_side == 0:        x[:, :h_cutoff, :] = 0    elif cutoff_side == 1:        x[:, h-h_cutoff:, :] = 0    elif cutoff_side == 2:        x[:, :, :w_cutoff] = 0    elif cutoff_side == 3:        x[:, :, w-w_cutoff:] = 0    return x# side cutoff goes frist.side_cutoff = fastai.vision.TfmPixel(_side_cutoff, order=99)augmentations = fastai.vision.get_transforms(    do_flip=True,    flip_vert=False,    max_rotate=25.0,    max_zoom=1.25,    max_lighting=0.5,    max_warp=0.0,    p_affine=0.5,    p_lighting=0.5,        xtra_tfms = [side_cutoff()])def get_example():    return fastai.vision.open_image(        path+'George_W_Bush_0016.jpg',    )def plots_f(rows, cols, width, height, **kwargs):    [        get_example()        .apply_tfms(            augmentations[0], **kwargs        ).show(ax=ax)        for i,ax in enumerate(            plt.subplots(                rows,                cols,                figsize=(width,height)            )[1].flatten())    ]plots_f(3, 5, 15, 9, size=size)

2. Нормализация цвета

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

Пример нормализации цвета на изображениях из публичного датасетаПример нормализации цвета на изображениях из публичного датасетаКод для нормализации цвета
# pip freeze | grep opencv# > opencv-python==4.5.2.52import cv2import matplotlib.pyplot as pltfrom matplotlib import cmfrom matplotlib import colorsimport seaborn as sns%matplotlib inlinefrom pylab import rcParamsplt.style.use('seaborn-talk')rcParams['figure.figsize'] = 12, 6path = 'facial_expressions/images/'imgs = [    'Guillermo_Coria_0021.jpg',    'Roger_Federer_0012.jpg',]imgs = list(    map(        lambda x: path+x, imgs    ))clahe = cv2.createCLAHE(    clipLimit=2.0,    tileGridSize=(4, 4))rows_cnt = len(imgs)cols_cnt = 4imsize = 3fig, ax = plt.subplots(    rows_cnt, cols_cnt,    figsize=(cols_cnt*imsize, rows_cnt*imsize))for row_num, f in enumerate(imgs):    img = cv2.imread(f)    col_num = 0        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    ax[row_num, col_num].imshow(img, cmap='gray')    ax[row_num, col_num].set_title('bw', fontsize=14)    col_num += 1    img_normed = cv2.normalize(        img,        None,        alpha=0,        beta=1,        norm_type=cv2.NORM_MINMAX,        dtype=cv2.CV_32F    )    ax[row_num, col_num].imshow(img_normed, cmap='gray')    ax[row_num, col_num].set_title('bw normalize', fontsize=14)    col_num += 1        img_hist_normed = cv2.equalizeHist(img)    ax[row_num, col_num].imshow(img_hist_normed, cmap='gray')    ax[row_num, col_num].set_title('bw equalizeHist', fontsize=14)    col_num += 1        img_clahe = clahe.apply(img)    ax[row_num, col_num].imshow(img_clahe, cmap='gray')    ax[row_num, col_num].set_title('bw clahe_norm', fontsize=14)    col_num += 1        for col in ax[row_num]:        col.set_xticks([])        col.set_yticks([])plt.show()

В итоге мы получили модель, способную отличить улыбку от нейтрального выражения лица в с качеством 0.93 по метрике ROC AUC. Иными словами, если взять из выборки по случайному кадру с улыбкой и без, то с вероятностью 93% модель присвоит большую вероятность улыбки кадру с улыбающимся лицом. Этот показатель мы использовали для сравнения разных вариантов дообучения и пайплайнов. Но интуитивно кажется, что это достаточно высокий уровень точности: даже человек не всегда может определить эмоцию на лице другого человека. К тому же в реальности существует гораздо больше выражений лиц кроме однозначной радости и однозначной печали.

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

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

3. Увеличение объема выборки

На этом этапе у нас было около 5400 размеченных кадров, нам хотелось понять: достаточно ли такого объема для обучения. Мы разделили кадры на две подвыборки: половина для оценки качества (валидация), другая для обучения (трейн). Каждая группа состояла из кадров с разными учениками: если бы одни и те же лица попали в разные выборки, результаты оценки качества были бы завышены.

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

Такое упражнение называется построением learning curve, и оно в очередной раз подтверждает тезис: объем данных самое важное в модели машинного обучения.

Качество на отложенной выборке растет по мере увеличения выборки для дообученияКачество на отложенной выборке растет по мере увеличения выборки для дообучения

4. Картинки Google для обогащения выборки

Мы пробовали спарсить первые 1000 результатов картинок по запросам в духе happy, unhappy, smiling, neutral и т. д. Не ожидали получить данные высокого качества, поэтому планировали потом просмотреть их глазами и удалить совсем неподходящие. В итоге мы быстро поняли, что никакая фильтрация эти картинки не спасет, поэтому отказались от этой идеи совсем.

Примеры изображений по запросам happy и unhappyПримеры изображений по запросам happy и unhappy

В итоге мы получили четыре модели, которые с высокой точностью могли показать:

  • есть ли в кадре лицо;

  • с какой вероятностью этот человек улыбается;

  • ребенок это или взрослый;

  • есть ли в кадре взрослый, даже если мы не нашли лица.

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

Собрали гифку

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

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

Примеры итоговых GIF с улыбками нашей коллеги и ее детейПримеры итоговых GIF с улыбками нашей коллеги и ее детей

Что мы в итоге получили?

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

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

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

Статистика дисконнектов. В этом уроке был единственный дисконнект на стороне ученикаСтатистика дисконнектов. В этом уроке был единственный дисконнект на стороне ученика

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

Виджеты

Все данные мы размечали сами и делали это довольно быстро (примерно 100 кадров в минуту). В этом нам помогали самописные виджеты:

  1. Виджет для разметки кадров с улыбками.

  2. Виджет для разметки кадров с детьми и взрослыми.

  3. Виджет для разметки кадров с плечом или локтем родителя.

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

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

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

Видео работы виджета

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

Код виджета
import pandas as pdimport numpy as npimport datetimeimport randomimport osimport ipywidgets as widgetsfrom IPython.display import displayfrom pathlib import Pathclass BulkLabeler():    def __init__(self, frames_path, annotations_path,                 labels = ['0', '1'],                 predict_fn = None,                 frame_width=120,                 num_frames = 27,                 face_width = 120,                 num_faces = 27,                 myname = '?',                 ):        self.predict_fn = predict_fn        self.labels = labels        self.frames_path = frames_path        self.frame_width = frame_width        self.num_frames = num_frames        self.face_width = face_width        self.num_faces = num_faces        self.myname = myname        self.faces_batch = []                # get annotations        self.annotations_path = annotations_path        processed_videos = []        if annotations_path.exists():            annotations = pd.read_csv(annotations_path)            processed_videos = annotations.file.str.split('/').str[-3].unique()        else:            with open(self.annotations_path, 'w') as f:                f.write('file,label,by,created_at\n')                # get list of videos        self.video_ids = [x for x in os.listdir(frames_path)                           if x not in processed_videos]        random.shuffle(self.video_ids)        self.video_ind = -1                self._make_video_widgets_row()        self._make_frames_row()        self._make_range_slider()        self._make_buttons_row()        self._make_faces_row()        self._make_video_stats_row()                display(widgets.VBox([self.w_video_row,                              self.w_frames_row,                              self.w_slider_row,                              self.w_buttons_row,                              self.w_faces_row,                              self.w_faces_label,                              self.w_video_stats]))        self._on_next_video_click(0)            ### Video name and next video button        def _make_video_widgets_row(self):        # widgets for current video name and "Next video" button        self.w_current_video = widgets.Text(            value='',            description='Current video:',            disabled=False,            layout = widgets.Layout(width='500px')            )                self.w_next_video_button = widgets.Button(            description='Next video',            button_style='info', # 'success', 'info', 'warning', 'danger' or ''            tooltip='Go to the next video',            icon='right-arrow'        )                self.w_video_row = widgets.HBox([self.w_current_video, self.w_next_video_button])                self.w_current_video.observe(self._on_video_change, names='value')        self.w_next_video_button.on_click(self._on_next_video_click)                        def _on_next_video_click(self, _):        while True:            self.video_ind += 1            current_video = self.video_ids[self.video_ind]            if next(os.scandir(self.frames_path/current_video/'student_faces'), None) is not None:                break        self.w_current_video.value = current_video                    def _on_video_change(self, change):        self.video_id = change['new']        self.frame_nums_all = sorted(int(f.replace('.jpg',''))                                      for f in os.listdir(self.frames_path/self.video_id/'student_src'))        start, stop = min(self.frame_nums_all), max(self.frame_nums_all)        self.w_range_slider.min = start        self.w_range_slider.max = stop        step = self.frame_nums_all[1] - self.frame_nums_all[0] if len(self.frame_nums_all)>1 else 1        self.w_range_start.step = step        self.w_range_stop.step = step        # change to slider value will cause frames to be redrawn        self.w_range_slider.value = [start, stop]               # reset faces        self.faces_df = None        self._reset_faces_row()        self.w_video_stats.value = f'Video {self.video_id}  no annotations yet.'                def _close_video_widgets_row(self):        self.w_current_video.close()        self.w_next_video_button.close()        self.w_video_row.close()        ### Video frames box        def _make_frames_row(self):        frame_boxes = []        self.w_back_buttons = {}        self.w_forward_buttons = {}        for i in range(self.num_frames):            back_button = widgets.Button(description='<',layout=widgets.Layout(width='20px',height='20px'))            self.w_back_buttons[back_button] = i            back_button.on_click(self._on_frames_back_click)            label = widgets.Label(str(i+1), layout = widgets.Layout(width=f'{self.frame_width-50}px'))            forward_button = widgets.Button(description='>',layout=widgets.Layout(width='20px',height='20px'))            self.w_forward_buttons[forward_button] = i            forward_button.on_click(self._on_frames_forward_click)            image = widgets.Image(width=f'{self.frame_width}px')            frame_boxes.append(widgets.VBox([widgets.HBox([back_button, label, forward_button]),                                              image]))                    self.w_frames_row = widgets.GridBox(frame_boxes,                                             layout = widgets.Layout(width='100%',                                                                     display='flex',                                                                     flex_flow='row wrap'))            def _on_frames_back_click(self, button):        frame_ind = self.w_back_buttons[button]        frame = int(self.w_frames_row.children[frame_ind].children[0].children[1].value)        start, stop = self.w_range_slider.value        self.w_range_slider.value = [frame, stop]            def _on_frames_forward_click(self, button):        frame_ind = self.w_forward_buttons[button]        frame = int(self.w_frames_row.children[frame_ind].children[0].children[1].value)        start, stop = self.w_range_slider.value        self.w_range_slider.value = [start, frame]            def _close_frames_row(self):        for box in self.w_frames_row.children:            label_row, image = box.children            back, label, forward = label_row.children            image.close()            back.close()            label.close()            forward.close()            box.close()        self.w_frames_row.close()                    ### Frames range slider                        def _make_range_slider(self):        self.w_range_start = widgets.BoundedIntText(                                        value=0,                                        min=0,                                        max=30000,                                        step=1,                                        description='Frames from:',                                        disabled=False,                                        layout = widgets.Layout(width='240px')                                    )        self.w_range_stop = widgets.BoundedIntText(                                        value=30000,                                        min=0,                                        max=30000,                                        step=1,                                        description='to:',                                        disabled=False,                                        layout = widgets.Layout(width='240px')                                    )        self.w_range_slider = widgets.IntRangeSlider(            value=[0, 30000],            min=0,            max=30000,            step=1,            description='',            disabled=False,            continuous_update=False,            orientation='horizontal',            readout=True,            readout_format='d',            layout=widgets.Layout(width='500px')        )        self.w_range_flip = widgets.Button(description='Flip range',            button_style='', # 'success', 'info', 'warning', 'danger' or ''            tooltip='Invert frames selection',            layout = widgets.Layout(width=f'{self.frame_width}px'),            icon='retweet'                                          )                self.w_range_slider.observe(self._on_slider_change, names='value')        self.w_range_start.observe(self._on_range_start_change, names='value')        self.w_range_stop.observe(self._on_range_stop_change, names='value')        self.w_range_flip.on_click(self._on_range_flip)        self.w_slider_row = widgets.HBox([self.w_range_start,                                          self.w_range_slider,                                          self.w_range_stop,                                          self.w_range_flip])        def _close_range_slider(self):        self.w_range_start.close()        self.w_range_stop.close()        self.w_range_slider.close()        self.w_range_flip.close()        self.w_slider_row.close()            def _on_range_flip(self, _):        start, stop = self.w_range_slider.value        left, right = self.w_range_slider.min, self.w_range_slider.max        if start==left and right==stop:            pass        elif start - left > right - stop:            self.w_range_slider.value=[left, start]        else:            self.w_range_slider.value=[stop, right]                                                   def _on_range_start_change(self, change):        new_start = change['new']        start, stop = self.w_range_slider.value        self.w_range_slider.value = [new_start, stop]                    def _on_range_stop_change(self, change):        new_stop = change['new']        start, stop = self.w_range_slider.value        self.w_range_slider.value = [start, new_stop]                    def _on_slider_change(self, change):        start, stop = change['new']        # update text controls        self.w_range_start.max = stop        self.w_range_start.value = start        self.w_range_stop.min = start        self.w_range_stop.max = self.w_range_slider.max        self.w_range_stop.value = stop        # show frames that fit current selection        frame_nums = [i for i in self.frame_nums_all if i>=start and i<=stop]        N = len(frame_nums)        n = self.num_frames        inds = [int(((N-1)/(n-1))*i) for i in range(n)]        # load new images into image widgets        for ind, box in zip(inds, self.w_frames_row.children):            frame_num = frame_nums[ind]            filename = self.frames_path/self.video_id/'student_src'/f'{frame_num}.jpg'            with open(filename, "rb") as image:                f = image.read()            label, image = box.children            label.children[1].value = str(frame_num)            image.value = f            ### Buttons row        def _make_buttons_row(self):        labels = list(self.labels)        if self.predict_fn is not None:            labels.append('model')        self.w_default_label = widgets.ToggleButtons(options=labels,                                                      value=self.labels[0],                                                      description='Default label:')                self.w_next_batch_button = widgets.Button(description='New batch',            button_style='info', # 'success', 'info', 'warning', 'danger' or ''            tooltip='Show next batch of faces from current frame range',            icon='arrow-right'        )        self.w_save_button = widgets.Button(description='Save labels',            button_style='success', # 'success', 'info', 'warning', 'danger' or ''            tooltip='Save current labels',            icon='check'        )        self.w_buttons_row = widgets.HBox([self.w_default_label, self.w_next_batch_button, self.w_save_button])        self.w_next_batch_button.on_click(self._on_next_batch_click)        self.w_save_button.on_click(self._on_save_labels_click)                def _close_buttons_row(self):        self.w_default_label.close()        self.w_next_batch_button.close()        self.w_save_button.close()        self.w_buttons_row.close()                def _on_next_batch_click(self, _):        if self.faces_df is None:             self._create_faces_df()        # select a sample from faces_df        start, stop = self.w_range_slider.value        subdf = self.faces_df.loc[lambda df: df.frame_num.ge(start)&                                             df.frame_num.le(stop)&                                             df.label.eq('')]        num_faces = min(len(subdf), self.num_faces)                if num_faces == 0:            self.faces_batch = []            self.w_faces_label.value = 'No more unlabeled images in this frames range'            self.w_faces_label.layout.visibility = 'visible'            for box in self.w_faces_row.children:                box.layout.visibility = 'hidden'        else:            self.w_faces_label.layout.visibility = 'hidden'            self.faces_batch = subdf.sample(num_faces).index            # if we have a model then we use it to sort images            if self.predict_fn is not None:                probs, labels = self._predict()                # sort faces according to probability                ind = sorted(range(len(probs)), key=probs.__getitem__)                self.faces_batch = [self.faces_batch[i] for i in ind]                labels = [labels[i] for i in ind]            # create labels for each face            if self.w_default_label.value != 'model':                labels = [self.w_default_label.value]*len(self.faces_batch)            # update faces UI            for facefile, label, box in zip(self.faces_batch, labels, self.w_faces_row.children):                image, buttons = box.children                with open(self.frames_path/facefile, "rb") as im:                    image.value = im.read()                buttons.value = label                box.layout.visibility = 'visible'            if len(self.faces_batch) < len(self.w_faces_row.children):                for box in self.w_faces_row.children[len(self.faces_batch):]:                    box.layout.visibility = 'hidden'        def _predict(self):        probs = []        labels = []        for facefile in self.faces_batch:            prob, label = self.predict_fn(self.frames_path/facefile)            probs.append(prob)            labels.append(label)        self.faces_df.loc[self.faces_batch, 'prob'] = probs        return probs, labels                    def _on_save_labels_click(self, _):        self.w_save_button.description='Saving...'                        with open(self.annotations_path, 'a') as f:            for file, box in zip(self.faces_batch, self.w_faces_row.children):                label = box.children[1].value                self.faces_df.at[file,'label'] = label                print(file, label, self.myname, str(datetime.datetime.now()),sep=',', file=f)                # update current video statistics        stats = self.faces_df.loc[self.faces_df.label.ne(''),'label'].value_counts().sort_index()        stats_str = ', '.join(f'{label}: {count}' for label, count in stats.items())        self.w_video_stats.value = f'Video {self.video_id}  {stats_str}.'                self.w_save_button.description = 'Save labels'        # ask for next batch        self._on_next_batch_click(0)            ### Faces row        def _make_faces_row(self):        face_boxes = []        for i in range(self.num_faces):            image = widgets.Image(width=f'{self.face_width}px')            n = len(self.labels)            toggle_buttons_width = int(((self.face_width-5*(n-1))/n))            toggle_buttons = widgets.ToggleButtons(options=self.labels,                                                    value=self.w_default_label.value,                                                    style=widgets.ToggleButtonsStyle(button_width=f'{toggle_buttons_width}px'))            face_boxes.append(widgets.VBox([image, toggle_buttons]))                    self.w_faces_row = widgets.GridBox(face_boxes,                                            layout = widgets.Layout(width='100%',                                                                    display='flex',                                                                    flex_flow='row wrap'))        self.w_faces_label = widgets.Label()        self._reset_faces_row()            def _close_faces_row(self):        for box in self.w_faces_row.children:            image, buttons = box.children            for w in [image, buttons, box]:                w.close()        self.w_faces_row.close()        self.w_faces_label.close()            def _reset_faces_row(self):        for box in self.w_faces_row.children:            box.layout.visibility = 'hidden'        self.w_faces_label.layout.visibility = 'visible'        self.w_faces_label.value = 'Press "New batch" button to see a new batch of faces'        self.faces_batch = []            ### Video statistics row        def _make_video_stats_row(self):        self.w_video_stats = widgets.Label('No video currently selected')        def _close_video_stats_row(self):        self.w_video_stats.close()                def _create_faces_df(self):        folder = Path(self.video_id,'student_faces')        df = pd.DataFrame({'file':[folder/f for f in os.listdir(self.frames_path/folder)]})        df['frame_num'] = df.file.apply(lambda x: int(x.stem.split('_')[0]))        df['label'] = '' #TODO maybe existing annotations?        df['prob'] = np.nan        df = df.sort_values(by='frame_num').set_index('file')        self.faces_df = df                    def close(self):        self._close_video_widgets_row()        self._close_frames_row()        self._close_range_slider()        self._close_buttons_row()        self._close_faces_row()        self._close_video_stats_row()
Подробнее..

О ходе создания игры Колобок в мае

31.05.2021 10:13:24 | Автор: admin

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


Итак, краткая история создания "Колобка" на текущий момент выглядит следующим образом:


  • 13.02
    • начало разработки на GDevelop
  • 21.02
    • есть печка, стол, окно, кот, банка молока
    • прыжок по банке молока опрокидывает её на пол и разливает
    • на разлитую лужу молока телепортируется кот, до этого сидевший на подоконнике
  • 19.03
    • есть заставка
    • появились лук, стрела, крышка подпола
    • банку молока теперь можно разлить на печке
    • подпол пуст, но в него можно провалиться
    • окно можно разбить одной стрелой
    • через разбитое окно пройти во двор
    • во дворе есть пугало, лестница, бурёнка с анимированным хвостом
    • лук нужно использовать для того, чтобы добраться до лестницы на крыше
    • при прыжке по лестнице она падает на пугало
  • 26.04
    • переезд с GDevelop на Phaser
    • появление врагов в виде мышей и пауков
    • столкновение с врагом приводит к падению с печки и прочих платформ, а также уменьшает прыгучесть на несколько секунд
  • 30.05
    • восстановление стрел и повреждения окна
    • теперь стрелу вместо появления из ниоткуда нужно доставать из кучи стрел на столе
    • самовар тоже теперь можно двигать
    • крышку в подпол снова можно открыть
    • в подпол нужно скинуть самовар, чтобы забраться там на высокую полку

В прошлой статье я описал проблемы, побудившие меня отказаться от GDevelop.
После двух месяцев работы с Phaser пора описать проблемы и этого инструмента:


  • отсутствие редактора сцены, как следствие очень долгая расстановка элементов сцены
  • куцая аркадная физика, как следствие необходимость допиливать, например, возможность таскать предметы
  • слишком сложно для обучения ребят ввиду того, что это лишь API без редактора

Т.к. ни GDevelop, ни Phaser меня не устроили, последующую разработку "Колобка" я решил вести на собственном инструменте, который предстоит сделать в сжатые сроки. Пока лишь ясно, что инструмент будет на основе физической библиотеки Matter.js и стандартных HTML/CSS.


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


P.S.: Список публикаций на текущий момент:


Подробнее..

Мониторим парк ИБП. Ч.3, заключительная

16.06.2021 12:16:05 | Автор: admin

Или что пригодится знать и уметь, если замена ИБП после поломки урон профессиональной гордости.

Часть 1
Часть 2
TL;DR

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

Disclaimer
  1. Речь идёт в основном о ИБП мощностью 400-800VA, "линейно-интерактивных", со свинцовыми батареями 12В;

  2. Бесперебойное обеспечение в основном офисных "печатных машинок": ЦП мощностью до 100 Вт и SSD в качестве системных дисков, без дискретных видеокарт;

  3. Централизованный ИБП отсутствует.

Решаемые задачи:

  1. Минимум: иметь хотя бы общее представление о состоянии парка устройств;

  2. Хорошо: менять устройства ДО возникновения сбоя, обеспечивая тем самых их фактический и экономический смысл. Да-да, просто поставить ИБП совершенно недостаточно;

  3. Отлично: иметь наглядные данные что было сделано IT-службой и почему это было необходимо сделать (потратив на это деньги и человекочасы).

Об офисных UPS

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

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

чуть подробнее

вообще, обмен данным с ИБП идёт постоянно, но всё же не раз в миллисекунду. Драйвер usbhid-ups получает данные раз в 2 секунды (видно в дебаг-режиме, если запускать руками с параметром -D+), что-то похожее, наверняка, и в стандартном драйвере Windows и WMI. Но это только "частичное" обновление, "полное" обновление происходит раз в 30 секунд

есть вероятность, что "полный" запрос сильно нагружает электронику ИПБ, и при частых запросах она начинает подглючивать. Это напрямую касается реализации сервера, о котором идёт речь в статьях. Чем это чревато и что с этим делать см. далее

2. Работа внутренних систем, сенсоров и логики UPS
Во-первых, ИБП от разных производителей обращаются с батареей по-разному. В моей практике хуже всех обращаются с батареями ИБП Powercom, лучше всех IPPON (далее по батарее см. п.3). Отличие не принципиальное, Powercom тоже через пол-года не дохнут, но оно есть и весьма заметно, если анализировать накопленные данные за достаточно длительный период. Здесь переходим к во-вторых: наиболее интересные параметры, которые ИБП сам считает и выдаёт:
а) нагрузка (load)
б) предсказание времени работы от батареи (runtime), вычисляемое на основе нагрузки
в) текущий заряд батареи (charge)

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

К сожалению, есть куда больше параметров, которые анализировать, считать и даже просто получать стоило бы, но это не реализовано.
Простейший пример: просадка напряжения на батарее, когда пропадает питание. Это показательнейший параметр, на основании которого можно куда точнее сделать вывод об убитой батарее. Постоянная память EEPROM есть сейчас где угодно, и ИБП запросто может записывать такие данные самостоятельно. Но ни одного ИБП с таким функционалом мне не попалось.
Другой пример: Powercom'ы после потери питания и разряда батареи до 30 процентов могут "зарядить" 12-вольтовую батарею за 10 минут и утверждать, что всё прекрасно, а Self-test passed.

если вас ничего не смущает

время полного заряда 12 В свинцовой батареи даже в "агрессивном" режиме составит не меньше часа, и батарея после такого долго не живёт

Это прямо натуральный epic fail.
Те же Powercom не умеют в вольтаж батареи вообще, только в проценты. На основании чего там эти проценты внутри считаются покрыто китайской мракой.

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

3. Батарея и её состояние
Из того зоопарка, с которым я имел дело, "посредственно" справляется с задачей анализа состояния батареи серверный ИБП IPPON. Потуги остальных иначе как "бессмысленно" назвать не могу. Очень важный параметр батареи кривая разряда просто игнорируется.

немного о кривой разряда

Свинцовые батареи ИБП разряжаются нелинейно. Проще говоря, чем меньше заряда осталось в батарее, тем быстрее она разряжается. Ещё проще: время разряда со 100% до 90% будет в разы больше, чем с 20% до 0%. Но и это ещё не всё. Кривая разряда становится круче в более старой батарее и/или в зависимости от внешних условий (та же температура). В итоге это выглядит так:

Чувствуете подвох? Угадайте, проводит ли ИБП запись скорости последнего разряда, анализ, учитывает ли дату установки батареи?

спойлер

ИБП ваще пофигу, не анализирует, не учитывает. Лучшее, что я видел через три года начинает орать "чота батарея старая".

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

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

  • просадку заряда батареи непосредственно после потери питания. Если этот показатель низкий, сервер выдаст предупреждение;

  • скорость разряда батареи. Этот параметр требует для расчёта не менее 2 мин наблюдаемого разряда ИБП.

Для корректного учёта этих параметров требуется довольно частый опрос ИБП. Соответствующие изменения внесены в код сервера (см. раздел "NUT и сервер мониторинга"). К сожалению, здесь мы упираемся в ранее озвученный п. "б" ч. 1 текущего раздела при частых обращениях за данными возможны глюки. Более того, в первые секунды после потери питания ИБП данные не отдаёт вообще, а вместо этого передаёт "WAIT". По-хорошему, после потери питания ИБП для целей мониторинга нужно бы опрашивать как можно чаще. На данный момент частота опроса от 10 до 30 секунд, в целом для более-менее приличного анализа этого хватает. Более интенсивные опросы не тестировались достаточно долго, чтобы делать какие-то однозначные выводы.

Краткие итоги раздела:

  • обязательно нужен мониторинг самого факта подключения ИБП к машине;

  • нужно собирать и хранить данные о датах установки батарей;

  • в идеале нужно очень детально мониторить процесс разряда и заряда батарей.

NUT и сервер мониторинга

Изначально NUT был выбран как кроссплатформенное универсальное решение. В целом функции свои выполняет. Без нюансов, впрочем, не обошлось:
а) Не слишком дружелюбная и неочевидная установка на клиентских машинах, под Windows особенно. В частности:

  • иногда отказывается видеть библиотеки;

  • встроенный драйвер не обновлялся давно и половину ИБП не знает. Драйвер надо ставить вручную, и это отдельная песня;

  • на клиентах под Windows служба стартует "невовремя", раньше, чем фактически нужно (похожая история есть при поиске домена на Windows с некоторыми сетевыми адаптерами). Из-за этого приходится городить костыли.

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

В качестве альтернативы я попробовал (и даже написал "адаптер") получать данные из WMI по предложению @firedragon. Суть, в общем, та же. Плюсы: не нужно альтернативных дайверов и библиотек, не нужно костылить некоторые вещи. Минусы: информации сильно меньше, а по сравнению с настроенным клиентом NUT стабильность ровно та же, при этом отсутствует, хотя бы потенциальная, возможность "триггера".

По результатам изысканий решено было оставить NUT в качестве основного решения для сервера. При этом "сильно больше данных" в какой-то момент обернулось базами, раздутыми по 100 Мб на бесперебойник, что повлияло на производительность. В итоге, сервер был перенесён из среды Windows в Linux, и:

  • написан соответствующий скрипт-демон на bash для непрерывного опроса;

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

В саму веб-морду сервера, как уже говорилось, добавлено:

  • отображение заряда батареи сразу после последней потери питания и соответствующий алерт;

  • расчёт времени работы от батареи на основе реальных данных. Некоторым образом это тоже синтетика, т.к. реальная кривая разряда не строится. Однако, отлично себя показала следующая формула: рассчитанное на основе последних реальных данных время / 1+ лет с десятыми.

Итоги, советы, планы

Для тех, кто хочет "сделать всё правильно", исходя из полученного опыта, дам следующие советы:

  1. Тщательно выберите марку и модель ИБП и по возможности используйте только выбранный ИБП во всем офисе;

  2. Запишите серийные номера и/или присвойте каждому ИБП уникальный номер. Запишите дату установки батареи в каждый ИБП. Меняйте батареи раз в два года, и сразу, заранее, закладывайте эти расходы в бюджеты для бизнеса запланированные расходы гораздо удобнее внезапных;

  3. Любым способом следите за тем, чтобы машины, обеспеченные ИБП, имели с ним постоянную связь;

  4. Раз в пол-года обновляйте параметры battery low и battery warning в используемом вами драйвере/решении, прибавляя к ним от 5% до 20% в зависимости от опыта использования вашей модели ИБП, вручную или скриптами;

  5. По возможности проводите ручное тестирование ИБП (отключить от розетки и подождать) раз в квартал-полгода.

Это то, что нужно делать обязательно.

Использование постоянного и подробного мониторинга, в целом, скорее чрезмерно, хотя и может оказаться полезным и наглядным. Заводить для этого отдельный сервер или нет, решать вам. Некоторые параметры можно мониторить в том же Zabbix (и даже посредством WMI), однако лично у меня в целом не очень удачный опыт с Zabbix active parameters; к тому же, сложность реализации некоторых описанных решений внутри Zabbix по сложности приближается, на мой вкус, к сложности реализации представленного сервера мониторинга.

Я удивлён и рад, что довольно много читателей задумалось о мониторинге ИБП после первой статьи, и многие посоветовали довести решение "до энтерпрайза" после второй статьи. Благодарю за отклики и ответы!

Учитывая накопленный опыт, реализация "до энтерпрайза" может быть довольно длительной. Есть проблемы и на клиентской стороне, и в самом NUT; в веб-интерфейсе многое надо выносить в бэкэнд, нет даже банальной авторизации. Можно было бы даже в таком виде запихнуть всё это в контейнер Docker в качестве версии 0.1 alpha, но мой энтузиазм к теме несколько поугас. Если у кого-то энтузиазм найдётся пишите, буду рад поработать вместе!

Рад, если мой опыт вам пригодится. Спасибо всем, кто прочитал!

Подробнее..

Проект электронного мультитула QUARK. Часть 2

11.06.2021 16:11:37 | Автор: admin

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

QUARKQUARK


Для начала напомню, что собой представляет устройство. QUARK это электронный мультиинструмент, в первую очередь, ориентированный под разработку микроконтроллерных устройств, Arduino, ESP32, STM32, IoT, домашняя автоматизация и тому подобные девайсы.

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

Вольтметр

Амперметр

Измерение сопротивления

Измерение емкости

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

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

ВольтметерВольтметер

Точно так же мгновенное потребление тока, при разработке IoT, параметр в себе. Гораздо удобнее проследить изменение в динамике при различных режимах работы устройства:

АмперметерАмперметер

Калькулятор цветовой и СМД маркировки компонентов вещь полезная и нужная, но, согласитесь, так удобнее:

СопротивлениеСопротивление

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

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

ОсциллографОсциллограф

UART данные, конечно, удобнее смотреть на телефоне чем на дисплее устройства. Не скажу, что я прям мучаюсь при подключении UART-TTL моста к компу, но в поле не всегда имеется такая возможность:

Теперь пару слов о схемотехнике. Вся система построена на ESP32 со всеми вытекающими из нее ништяками (bluetooth, Wi_fi). Для измерения напряжения и тока я использовал готовый чип INA219. Подключается по I2C шине, имеет малый размер и вполне достойные, для моих задач, параметры. Сопротивление измеряю стандартным делителем напряжения, но в качестве известного сопротивления использую цифровой потенциометр AD5245, что освобождает пины контроллера, а учитывая тот факт, что AD5245 управляется по I2C, так и вообще нет нужды в дополнительных пинах. Тем же способом измеряю емкость конденсаторов по известному методу заряда до 63.2%. На больших емкостях AD5245, подключенное к питанию имеет низкое сопротивление, а при низких, заряд идет через 1 мегаомный резистор. Таким образом, минимальная измеряемая емкость определяется пикофарадами.
Индуктивность меряю резонансным методом при известной ёмкости по срабатыванию компаратора.
Тракт осциллографа реализован на Rail-to-Rail ОУ AD8541, усиление сигнала регулируется вторым AD5245. Соответственно, сигналы как с высоким, так и с низким размахом амплитуды, поступают на вход АЦП в максимальном разрешении. Для оцифровки использую аппаратный I2S, складываю весь буфер в DMA и вывожу на LCD и, при необходимости, отсылаю по bluetooth.

UART вход реализован аппаратно. Предварительно определяется Baud rate, после чего происходит инициализация драйвера UART с определенными параметрами.
На плате присутствует датчик ускорения LSM6DS3TR. Вообще я его планировал использовать для автовыключения, но ничто не мешает вывести с него данные на экран.


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

Во-первых, универсальный прикручиваемый щуп:

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

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

Подробнее..

От Планеты GitHub с любовью

08.06.2021 20:05:53 | Автор: admin

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

В ноябре прошлого года более 500 российских технологов присоединились к нашему первому GitHub Meetup на русском языке и сейчас наше коммюнити насчитывает уже больше 1000 человек. Недавно мы открыли Telegram канал. Для нас это большая честь - привлекать такое внимание, и мы всегда будем рады слушать, учить и вдохновлять русскоязычное сообщество на вашем родном языке.

Вот краткое изложение того, о чем мы рассказали на данный момент:

GitHub:

Открытый исходный код правит миром:

Безопасность - наша ответственность:

Программа GitHub Stars и ваша собственная Русская Звезда

Начало работы с InnerSource

  • Дмитрий Сугробов (разработчик и евангелист в Leroy Merlin, член InnerSource Commons Foundation) дал нам Введение в InnerSource.

Бонус-трек: развитие soft skills

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

Если вы хотите выступить в качестве приглашенного докладчика, отправьте нам предложение на http://github.co/cfp - не важно если это ваше первое или уже тысячное выступление. Мы приглашаем Вас присоединиться к нам и воспользоваться имеющимися возможностями.

Мы надеемся, что вы присоединитесь к нам 15 июня 2021 года в 19:00 по Москве для дальнейшего общения и новых сессий.

Далее: наши эксперты на июньском мероприятии:

  • Грачев Михаил: Взращивание культуры Open Source в компании

  • Антон Таяновский: Инфраструктурные шаблоны Pulumi на примере AWS Lambda и Sagemaker

RSVP:http://github.co/habr

Подробнее..

Appwrite, open-source бэкэнд-платформа

10.06.2021 10:07:14 | Автор: admin


В последние пару лет намечается тенденция на упрощение работы с бэкэндом, появляется всё больше low- и no-code обёрток для тех, кто хочет сэкономить на стоимости разработки. Экосистемы AWS и GCP задают стандарты в этой области, и все новые проекты стараются копировать их фичи. Проблема в том, что многие молодые проекты предлагают свою панельку с доступом к базе, cloud functions и базовой аналитикой, а потом продают её на сервисной основе. Идея так себе, потому что имея функционал, такой же как у гигантов, они, не имея такого же кредита доверия, пытаются сразу заработать на клиентах. Гораздо больше шансов на успех у тех, кто ведёт полную разработку в open-source, поощряет self-hosting и не пытается сходу монетизировать свой проект, взимая деньги только за использование в облаке. Пример такого подхода Appwrite, и благодаря ему они всего за два года обзавелись большим комьюнити и поддержкой, не успев полностью выпустить продукт и не начав зарабатывать на нём.

Функционал




Appwrite интегрируется с мобильными и веб-клиентами (всякий JS, Flutter, Swift, Objective-C, Kotlin) и предоставляет нужную среду для бэкэнд-задач (Node, .NET, Python, PHP, Ruby, Deno, ограниченно на Go и Java). Разбираем основной функционал:

Авторизация


Авторизация работает по паролю, OAuth и JWT. Вместе с последним в релизе 0.8 появились анонимные сессии в современном вебе это мастхэв фича, которой не хватает во многих аналогах. Список OAuth провайдеров захардкожен, новых нельзя добавить из интерфейса, но можно форкнуть репозиторий и дописать вручную. Сейчас доступны:

  • Amazon
  • Apple
  • BitBucket
  • Bitly
  • Box.com
  • Discord
  • Dropbox
  • Facebook
  • GitHub
  • GitLab
  • Google
  • LinkedIn
  • Microsoft
  • PayPal
  • Salesforce
  • Slack
  • Spotify
  • Tradeshift
  • Twitch
  • VK
  • Yahoo
  • Yandex
  • WordPress


Аккаунт


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

База данных


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

Хранилище


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

  var appwrite = new window.Appwrite();  appwrite    .setEndpoint('https://localhost/v1')    .setProject('[PROJECT-ID]')  ;  var file = document.getElementById('file-input').files[0];  let read = ['*']; // wildcard read access  let write = ['user:self']; // write access only to me  appwrite.storage.createFile(file, read, write)    .then(function (response) {      console.log('file uploaded successfully');    }, function (error) {      console.log(error);    });


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

Вебхуки


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



Список событий очень большой, покрываются разделы account, database, functions, storage, users и teams.

Задачи и функции


Серверные функции, запускающиеся по расписанию или по определённым хукам. Задачи поддерживают кастомные заголовки HTTP и авторизацию для разных сценариев. Функции исполняют кастомный код в разных окружениях (Node, .NET, Python, PHP, Ruby, Deno), с нужными ограничениями по правам и доступом к указанным переменным окружения. Очень гибкая штука.

Установка


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

Если нет докера, ставим его:

  sudo apt-get update  sudo apt-get install \    apt-transport-https \    ca-certificates \    curl \    gnupg \    lsb-release  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  echo \    "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  sudo apt-get update  sudo apt-get install docker-ce docker-ce-cli containerd.io


Затем качаем и запускаем установку:

  docker run -it --rm \    --volume /var/run/docker.sock:/var/run/docker.sock \    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \    --entrypoint="install" \    appwrite/appwrite:0.8.0


Проходим установочный скрипт (если хочется просто пощупать, достаточно указать везде дефолтные значения) и переходим в панельку (она будет жить на тех портах, которые мы укажем при установке, по дефолту localhost:80 / :443).

Заключение


Appwrite не похожа на другие Backend-as-a-Service проекты, стремящиеся к быстрой монетизации. Здесь разработчики сначала фокусируются на задачах, реализации и тестировании фич, и ещё даже не подошли к сервисной модели (которая, тем не менее, планируется). Проект опенсорсный и поддержка self-hosting заявлена вечная, так что сейчас Appwrite выглядит отличным решением, которое можно как минимум потестить на пет-проекте.

Ссылки:




На правах рекламы


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

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Перевод Как использовать Python для проверки протокола Signal

08.06.2021 18:13:14 | Автор: admin

Galois работает над повышением удобства SAW, инструмента для верификации программ наCиJava, исходный код кторого открыт. Основным способом взаимодействия пользователей сSAW является его спецификация иязык программирования сценариев. Чтобы сделать SAW как можно более доступным, вкачестве языка программирования SAW теперь можно использовать Python! Для демонстрации этой новой возможности в Galoisсоздали пример, выполнив проверку части реализации протокола Signal наязыкеС.В частности, как спецификация SAW определяются условия, при которых сообщение протокола Signal будет успешно аутентифицировано. К старту курса о Fullstack-разработке на Python мы перевели материал об этом примере.


SAW-клиент Python

Управление SAW может осуществляться средствами Python через библиотеку saw-client вPyPI. Реализация спомощью Python непредставляет сложности управление SAW осуществляется через JSON-RPC API, как показано впредыдущей статье. Библиотека saw-client постоянно развивалась, итеперь вней реализован высокоуровневый интерфейс, отвечающий зареализацию функций RPC.

Помимо Python, вSAW также используется альтернативный язык программирования сценариев, называемый SAWScript. Хотя наSAWScript возможно писать теже проверки, что иPython, этотязыкнелишён недостатков. SAWScript специализированный язык, поэтому ондовольно сложен для понимания теми, кто впервые берётся заизучениеSAW. Кроме того, вSAWScript практически отсутствует возможность подключения внешних библиотек. Если вызахотите написать наSAWScript то, чего нет встандартной библиотеке, вам придётся реализовать нужную функцию самостоятельно.

Сдругой стороны, Python широко используемый язык, изначально хорошо знакомый гораздо большему числу людей. УPython также имеется богатый набор библиотек ивспомогательных программ, доступных вкаталоге PyPI. Даже если Python невходит вчисло ваших любимых языков программирования, мывсё равно советуем попробовать saw-client. Если под рукой неокажется ничего другого, код, написанный вsaw-client, может послужить источником вдохновения для реализации аналогичного клиента надругом языке.

Базовая спецификация вsaw-client

Давайте рассмотрим, как saw-client можно использовать для создания спецификаций реального кода наязыкеC. Для примера возьмём libsignal-protocol-c. Эта библиотека представляет собой реализованный наязыке Cпротокол Signal, криптографический протокол, используемый для шифрования мгновенных сообщений, голосовых ивидеозвонков. Этот протокол применяется вприложении Signal Messenger, получившем название попротоколу, нотакже поддерживается вдругих приложениях, таких как WhatsApp, Facebook Messenger иSkype.

Общее описание возможностей SAW сиспользованием библиотеки libsignal-protocol-c приведено вразделе "Планы".

Для начала рассмотрим базовую структуру данных, используемую библиотекой libsignal-protocol-c, аименно signal_buffer:

struct signal_buffer {    size_t len;    uint8_t data[];};

signal_buffer представляет собой байтовый массив (массив данных) сдлинойlen. При отправке сообщения спомощью libsignal-protocol-c основным компонентом сообщения является signal_buffer.

Чтобы быть уверенным, что libsignal-protocol-c работает так, как заявлено, нужно убедиться, что содержимое signal_buffer сообщения соответствует ожидаемому. Библиотека проверяет соответствие двух буферов signal_buffer спомощью функции signal_constant_memcmp:

int signal_constant_memcmp(const void *s1, const void *s2, size_t n){    size_t i;    const unsigned char *c1 = (const unsigned char *) s1;    const unsigned char *c2 = (const unsigned char *) s2;    unsigned char result = 0;    for (i = 0; i < n; i++) {        result |= c1[i] ^ c2[i];    }    return result;}

Интуитивно понятно, что утилита signal_constant_memcmp должна проверить, одинаковоли содержимое двух байтовых массивов signal_buffer. Если они одинаковы, функция вернёт значение0. Если содержимое несовпадает, возвращается значение, указывающее набайты, вкоторых массивы отличаются.

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

from saw_client.llvm import *class ConstantMemcmpEqualSpec(Contract):    def specification(self) -> None:        _1        self.execute_func(_2)        _3

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

  • Предварительные условия (_1), определяющие допущения, которые необходимо сделать перед вызовом верифицируемой функции.

  • Аргументы для передачи впроверяемую функцию (_2).

  • Постусловия (_3), определяющие характер проверки после вызова верифицируемой функции.

Учитывая требования кспецификации, проверим, как утилита signal_constant_memcmp работает в пределах спецификации SAW:

class ConstantMemcmpEqualSpec(Contract):    n: int    def __init__(self, n: int):        super().__init__()        self.n = n    def specification(self) -> None:        s1  = self.fresh_var(array_ty(self.n, i8), "s1")        s1p = self.alloc(array_ty(self.n, i8), points_to = s1)        s2  = self.fresh_var(array_ty(self.n, i8), "s2")        s2p = self.alloc(array_ty(self.n, i8), points_to = s2)        self.precondition(cryptol(f"{s1.name()} == {s2.name()}"))        self.execute_func(s1p, s2p, cryptol(f"{self.n} : [64]"))        self.returns(cryptol("0 : [32]"))

Предварительными условиями являются наличие двух байтовых массивов (s1p иs2p), содержимое которых s1 иs2одинаково. Вчастности, одинаковость содержимого гарантирует вызов self.precondition(...). Аргумент self.precondition(...) записывается наCryptol, предметно-ориентированном языке программирования (DSL), используемом вкриптографии. Приведённое выражение наCryptol довольно простое, так как выполняет только проверку равенства, нониже мыувидим более сложные примеры наCryptol.

Аргументами функции являются два байтовых массива суказанием ихдлин (self.n), преобразуемых вначале ввыражение Cryptol, чтобы SAW мог получить оних представление. Порстусловие, снова ввиде выражения наCryptol, заключается втом, что функция возвращает значение 0.

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

mod = llvm_load_module("libsignal-protocol-c.bc") # An LLVM bitcode filearray_len = 42 # Pick whichever length you want to checkllvm_verify(mod, "signal_constant_memcmp", ConstantMemcmpEqualSpec(array_len))

Если проверка пройдёт нормально, можно запустить этот код наPython иувидеть следующий результат:

Verified: lemma_ConstantMemcmpEqualSpec (defined at signal_protocol.py:122)

Ура! Инструмент SAW проверил правильность работы утилиты signal_constant_memcmp. Важно отметить, что нам ненужно было даже упоминать обитовых манипуляциях внутри функции SAW выполнил ихавтоматически. Отметим, однако, что команда ConstantMemcmpEqualSpec определяет происходящее только втом случае, если байтовые массивы равны друг другу. Еслибы мыхотели охарактеризовать происходящее вслучае неравенства байтовых массивов, потребоваласьбы несколько более сложная спецификация.

Также следует отметить, что вприведённом выше коде встречаются повторения, так как мыдважды вызываем функцию self.fresh_var(), азатем self.alloc(). Ксчастью, Python избавляет оттаких проблем:

def ptr_to_fresh(spec: Contract, ty: LLVMType,                 name: str) -> Tuple[FreshVar, SetupVal]:    var = spec.fresh_var(ty, name)    ptr = spec.alloc(ty, points_to = var)    return (var, ptr)class ConstantMemcmpEqualSpec(Contract):    ...    def specification(self) -> None:        (s1, s1p) = ptr_to_fresh(self, array_ty(self.n, i8), "s1")        (s2, s2p) = ptr_to_fresh(self, array_ty(self.n, i8), "s2")        ...

Верификация кода сиспользованием HMAC

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

Одним изосновных этапов шифрования сообщения является присоединение кода аутентификации сообщения (MAC), который можно использовать для проверки того, что после отправки сообщения его содержимое неменялось. Вчастности, libsignal-protocol-c использует HMAC, тип MAC, вычисляемый спомощью криптографической хеш-функции.

Подробное описание работы HMAC тема для отдельной статьи. Но, ксчастью, для создания спецификации SAW, связанной сHMAC, ненужно вдаваться вдетали. Вместо этого можно использовать неинтерпретируемые функции. Для начала создадим ряд функций Cryptol, определяющих характер работы HMAC:

hmac_init : {n} [n][8] -> HMACContexthmac_init = undefinedhmac_update : {n} [n][8] -> HMACContext -> HMACContexthmac_update = undefinedhmac_final : HMACContext -> [SIGNAL_MESSAGE_MAC_LENGTH][8]hmac_final = undefined

Это будут неинтерпретируемые функции, используемые для создания кода, связанного сHMAC, вбиблиотеке libsignal-protocol-c. Основная идея заключается втом, что, получив навходе криптографический ключ, hmac_init создаст HMACContext. HMACContext будет многократно обновляться через hmac_update, используя данные первого аргумента. Затем hmac_final преобразует HMACContext вsignal_buffer достаточной длины для хранения MAC.

Определение HMACContext зависит оттого, какая криптографическая хэш-функция используется всочетании сHMAC. Параметры библиотеки libsignal-protocol-c настроены для используемых еюхеш-функций, поэтому можно свободно подключать библиотеки OpenSSL, Common Crypto или другую подходящую библиотеку.

Поскольку эти функции считаются неинтерпретируемыми, SAW небудет ихоценивать вовремя верификации. Другими словами, то, как реализованы эти функции, неимеет значения; undefined выбрано для удобства, ноподойдёт илюбая другая реализация.

После определения этих функций можно связать ихссоответствующими функциями Cвсамой библиотеке. Например, вот сокращённая спецификация для функции signal_hmac_sha256_initC:

class SignalHmacSha256InitSpec(Contract):    key_len: int    def specification(self) -> None:        hmac_context_ptr = self.alloc(...)        (key_data, key)  = ptr_to_fresh(self, array_ty(self.key_len, i8),                                        "key_data")            self.execute_func(..., hmac_context_ptr, key,                          cryptol(f"{self.key_len} : [64]"))        init = f"hmac_init`{{ {self.key_len} }} {key_data.name()}"        dummy_hmac_context = self.alloc(..., points_to = cryptol(init))        self.points_to(hmac_context_ptr, dummy_hmac_context)        self.returns(cryptol("0 : [32]"))key_len = 32init_spec = llvm_assume(mod, "signal_hmac_sha256_init",                        SignalHmacSha256InitSpec(key_len))

Нестарайтесь понять каждую строчку кода. Просто знайте, что самой важной его частью является последняя строка, вкоторой вместо llvm_verify используется llvm_assume. Функция llvm_assume позволяет SAW использовать спецификацию, фактически немоделируя её посути SAW трактует еёкак аксиому. Это позволяет привязать поведение signal_hmac_sha256_init кнеинтерпретируемой функции hmac_init впостусловиях спецификации.

Аналогичным образом llvm_assume также можно использовать для создания спецификаций, включающих hmac_update иhmac_final. После этого можно проверить очень важную функцию, связанную сMAC: signal_message_verify_mac. Фактически данная функция принимает сообщение вкачестве аргумента, вычисляет MAC для данных внутри сообщения ипроверяет, совпадаетли онсMAC вконце сообщения. Если значения совпадают, можно суверенностью утверждать, что при отправке получателю сообщение неменялось.

Объяснение всех тонкостей работы signal_message_verify_mac занялобы довольно много времени, поэтому вэтой заметке мыкоснёмся лишь главного вопроса: как должно выглядеть содержимое сообщения? Данные внутри сообщения могут быть произвольными, однако MAC вконце должен иметь вполне определённую форму. Эту форму можно определить спомощью функции Python:

def mk_hmac(serialized_len: int, serialized_data: FreshVar,        receiver_identity_key_data : FreshVar,        sender_identity_key_data: FreshVar,        mac_key_len: int, mac_key_data: FreshVar) -> SetupVal:    sender_identity_buf = f"""        [{DJB_TYPE}] # {sender_identity_key_data.name()}            : [{DJB_KEY_LEN} + 1][8]        """    receiver_identity_buf = f"""        [{DJB_TYPE}] # {receiver_identity_key_data.name()}            : [{DJB_KEY_LEN} + 1][8]        """    hmac = f"""        hmac_final         (hmac_update`{{ {serialized_len} }} {serialized_data.name()}          (hmac_update`{{ {DJB_KEY_LEN}+1 }} ({receiver_identity_buf})           (hmac_update`{{ {DJB_KEY_LEN}+1 }} ({sender_identity_buf})            (hmac_init`{{ {mac_key_len} }} {mac_key_data.name()}))))        """    return cryptol(hmac)

Довольно сложно, неправдали? Ноещё раз нестарайтесь понять каждую строчку кода. Тут важно понять, что сначала вызывается hmac_init, затем выполняются несколько вызовов hmac_update, после чего осуществляется вызов hmac_finalcall. Это весьма близко интуитивным допущениям, сделанным ранее для HMAC, поэтому, если SAW убедится втом, что MAC выглядит как данное выражение Cryptol, можно быть уверенным, что онработает так, как ожидалось.

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

lass SignalMessageVerifyMacSpec(Contract):    serialized_len: int    def specification(self) -> None:        ...        mac_index = 8 + self.serialized_len - SIGNAL_MESSAGE_MAC_LENGTH        ser_len   = f"{self.serialized_len} : [64]"        self.points_to(serialized[0], cryptol(ser_len))        self.points_to(serialized[8], serialized_message_data)        self.points_to(serialized[mac_index], mk_hmac(...))        self.execute_func(...)        self.returns(cryptol("1 : [32]"))

Здесь serialized указывает наsignal_buffer для всего сообщения. Для описания памяти, содержащейся вразличных частях буфера, можно использовать нотацию слайса Python (например, serialized[0]). Первая часть содержит self.serialized_len, общую длину сообщения. Через восемь байтразмещается serialized_message_data данные сообщения. Всамом конце буфера содержится MAC, вычисленный спомощью mk_hmac(...).

Проверяем всё напрактике вызываем llvm_verify согласно этой спецификации. Вэтот раз нужно передать несколько дополнительных аргументов. Нужно явно указать, какие допущения мысделали ранее спомощью llvm_assume посредством аргумента lemmas. Также нужно указать инструменту решения SMT, какие функции должны рассматриваться как неинтерпретируемые. Это делается спомощью аргумента script:

uninterps = ["hmac_init", "hmac_update", "hmac_final"]llvm_verify(mod, "signal_message_verify_mac",  SignalMessageVerifyMacSpec(...),            lemmas=[init_spec, update_spec1, update_spec2, final_spec],            script=ProofScript([z3(uninterps)]))

В результате мы видим долгожданную зелёную галочку:

Планы

Спомощью saw-client мысмогли получить ряд интересных данных окоде вlibsignal-protocol-c. Мысмогли продемонстрировать, что signal_message_verify_mac, функция, проверяющая целостность сообщения, отправленного попротоколу Signal, работает правильно, если последняя часть сообщения содержит верный код аутентификации сообщения (MAC). Кроме того, мыопределили, каким должно быть содержимое MAC относительно абстрактной спецификации криптографических хэш-функций.

Однако спомощью инструмента saw-client можно сделать гораздо больше, чем рассказано вданной заметке. Мыпроверяли ключевое свойство кода, проверяющего целостность сообщений. Нотакая проверка целостности некасалась сообщений, передаваемых попроводам. Мытакже нестали полностью определять поведение HMAC, хотя это можно былобы сделать; смотрите здесь.

Несмотря нато что saw-client может использоваться как самостоятельный инструмент верификации, внекоторых аспектах saw-client недостигает функциональности SAWScript. saw-client внастоящее время неподдерживает ряд функций SAW, например функцию инициализации глобальных переменных вспецификациях. Кроме того, некоторые идиомы SAWScript реализованы вsaw-client нетак "красиво", пример квазикавычки ввыражениях Cryptol. Мысчитаем, что современем нам удастся решить эти проблемы.

Вперспективе мыпопытаемся сделать Python полноправным языком написания кода для SAW, иданная работа первый шаг вэтом направлении. Весь код, представленный вэтой заметке, можно найти здесь. Рекомендуем испытать вработе инструмент saw-client. Любые ваши пожелания икомментарии отправляйте в трекер проблем ивопросов SAW.

А если вам инетересен не только анализ программ с помощью Python, но и активная разработка на этом языке в направлениях как бекенда, так и фронтенда, то вы можете обратить внимание на наш курс "Fullstack-разработчик на Python", где также рассматривается тестирование ПО и многие другие аспекты профессии программиста.

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

Другие профессии и курсы
Подробнее..

Перевод Rust 1.53.0 IntoIterator для массивов, quotquot в шаблонах, Unicode-идентификаторы, поддержка имени HEAD-ветки в Cargo

18.06.2021 18:20:53 | Автор: admin

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


Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.53.0 вам достаточно выполнить следующую команду:


rustup update stable

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


Что было стабилизировано в 1.53.0


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


IntoIterator для массивов


Это первый выпуск Rust, в котором массивы реализуют типаж IntoIterator. Теперь вы можете итерироваться в массиве по значению:


for i in [1, 2, 3] {    ..}

Раньше это было возможно только по ссылке, с помощью &[1, 2, 3] или [1, 2, 3].iter().


Аналогично вы теперь можете передать массив в методы, ожидающие T: IntoIterator:


let set = BTreeSet::from_iter([1, 2, 3]);

for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) {    ..}

Это не было реализовано ранее из-за проблем с совместимостью. IntoIterator всегда реализуется для ссылок на массивы и в предыдущих выпусках array.into_iter() компилировался, преобразовываясь в (&array).into_iter().


Начиная с этого выпуска, массивы реализуют IntoIterator с небольшими оговорками для устранения несовместимости кода. Компилятор, как и прежде, преобразовывает array.into_iter() в (&array).into_iter(), как если бы реализации типажа ещё не было. Это касается только синтаксиса вызова метода .into_iter() и не затрагивает, например, for e in [1, 2, 3], iter.zip([1, 2, 3]) или IntoIterator::into_iter([1, 2, 3]), которые прекрасно компилируются.


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


"Или" в шаблонах


Синтаксис шаблонов был расширен поддержкой |, вложенного в шаблон где угодно. Это позволяет писать Some(1 | 2) вместо Some(1) | Some(2).


match result {     Ok(Some(1 | 2)) => { .. }     Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }     _ => { .. }}

Unicode-идентификаторы


Теперь идентификаторы могут содержать не-ASCII символы. Можно использовать все действительные идентификаторы символов Unicode, определённые в UAX #31. Туда включены символы из многих разных языков и письменностей но не эмодзи.


Например:


const BLHAJ: &str = "";struct  {    : String,}let  = 1;

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


warning: identifier pair considered confusable between `` and `s`

Поддержка имени HEAD-ветки в Cargo


Cargo больше не предполагает, что HEAD-ветка в git-репозитории называется master. А следовательно, вам не надо указывать branch = "main" для зависимостей из git-репозиториев, в которых ветка по умолчанию main.


Инкрементальная компиляция до сих пор отключена по умолчанию


Как ранее говорилось в анонсе 1.52.1, инкрементальная компиляция была отключена для стабильных выпусков Rust. Функциональность остаётся доступной в каналах beta и nightly. Метод включения инкрементальной компиляции в 1.53.0 не изменился с 1.52.1.


Стабилизированные API


Следующие методы и реализации типажей были стабилизированы:



Другие изменения


Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.


Участники 1.53.0


Множество людей собрались вместе, чтобы создать Rust 1.53.0. Мы не смогли бы сделать это без всех вас. Спасибо!




От переводчиков


С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Также можете поддержать нас на OpenCollective.


Данную статью совместными усилиями перевели TelegaOvoshey, blandger, Belanchuk и funkill.

Подробнее..

OrganicMaps релиз форка Maps.me с открытым кодом

19.06.2021 00:09:06 | Автор: admin
На днях состоялся первый релиз OrganicMaps open-source форка Maps.me, который команда добровольцев готовила больше чем полгода. В этой небольшой заметке мне бы хотелось поделиться краткой историей проекта, за которой я следил в Telegram-чатах и на GitHub и обозначить основные отличия форка от текущей версии Maps.me. Если вы являетесь текущим или бывшим пользователем Maps.me или интересуетесь проектами с открытым кодом с фокусом на приватности без рекламы и сбора данных, то добро пожаловать.



Предыстория


В декабре 2020 года как и многие посетители Хабра я был обеспокоен ситуацией с Maps.me моей основной картографической программой на тот момент. Продажа криптовалютчикам, провальная первая новая версия (по которой казалось, что новоиспечённые владельцы вообще не понимают почему пользователи выбирают Maps.me), позже откат на старую версию, но состояние неопределенности и непонимание чего ожидать в дальнейшем. Так что для начала я просто отключил обновления для старой версии Maps.me, но было понятно, что это временное решение. К счастью, нашёлся доброволец, который создал телеграм-чат для желающих поучаствовать в развитии форка, но дальше чата дело не пошло. Действительно, развитие и поддержка такого сложного приложения на нескольких платформах требует значительного опыта и усилий, по сравнению с какими-то несложными веб-проектами или мобильными программами, которые дают только интерфейс к веб-сервису. Тут и накопленная годами кодовая база на C++/Java/ObjectiveC и нетривиальные алгоритмы поиска/роутинга.

OMaps


Через некоторое время я увидел объявление о начале работы над форком под названием OMaps. Мне сразу приглянулся мощный старт проекта десятки коммитов в день (хоть и от одного разработчика), налаженный на GitHub CI/CD с публикацией на всех платформах, возможность пообщаться с авторами напрямую в чате. Через некоторое время команда расширилась и началась подготовка к релизу, оценить масштаб работ можно по списку задач на GitHub.

OrganicMaps


В ходе подготовки к релизу программа была переименована в OrganicMaps и на днях вышел релиз для Android и iOS.



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

  • Работа в offline-режиме для всех основных функций: просмотр карт, поиск, навигация
  • Прокладка маршрутов не только для автомобилей, но и для пешеходов и велосипедистов, в некоторых городах есть ограниченная поддержка общественного транспорта
  • Компактные файлы карт
  • Карты на основе OpenStreetMap со всеми его достоинствами (и недостатками)
  • Простой редактор карт, позволяющий добавлять POI


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

  • Убрана вся реклама
  • Убраны трекеры, рекламные SDK и тому подобное
  • Приложение проверено через Exodus Privacy Report и загружено в F-Droid


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

  • POI отелей от Booking.com
  • Отзывов
  • Путеводителей
  • Пробок

Впрочем, многое из этого пропало и из Maps.me.

Выводы


Для меня этот форк оказался предпочтительнее обновлённого Maps.me прежде всего из-за понимания разработчиками своей аудитории и (по крайней мере на данный момент) ориентирования на удобство пользователей, а не на доход с рекламы. Быстрая связь с командой через чат или issue-tracker тоже удобна. Пока непонятно, насколько долго будет продолжаться интенсивная разработка на энтузиазме нескольких авторов, но даже небольших улучшений в комбинации со свежими картами и поддержкой актуальных версий мобильных ОС будет достаточно для удовлетворения потребностей значительного числа пользователей.
Подробнее..

FOSS News 72 дайджест материалов о свободном и открытом ПО за 2430 мая 2021 года

30.05.2021 20:12:29 | Автор: admin

Всем привет!


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


Главные темы нового выпуска:


  1. Google начал установку ОС Fuchsia на устройства Nest Hub.
  2. Microsoft, GitHub, Accenture и ThoughtWorks при поддержке Linux Foundation основали Фонд экологичного ПО.
  3. Открыт код сервиса проверки паролей HaveIBeenPwned.
  4. Соглашение о долгосрочном сотрудничестве: Карачаево-Черкесская Республика внедряет ОС Альт.
  5. Базальт СПО приглашает на объединенную конференцию СПО: от обучения до разработки.
  6. Второе интервью с разработчиком Reiser4 Эдуардом Шишкиным.
  7. Пользователь получил предупреждение от провайдера за скачивание Ubuntu.
  8. Я нашёл лучший линукс (мнение популярного блоггера).

И многое другое



Оглавление


  1. Главное
    1. Google начал установку ОС Fuchsia на устройства Nest Hub
    2. Microsoft, GitHub, Accenture и ThoughtWorks при поддержке Linux Foundation основали Фонд экологичного ПО
    3. Открыт код сервиса проверки паролей HaveIBeenPwned
    4. Соглашение о долгосрочном сотрудничестве: Карачаево-Черкесская Республика внедряет ОС Альт
    5. Базальт СПО приглашает на объединенную конференцию СПО: от обучения до разработки
    6. Второе интервью с разработчиком Reiser4 Эдуардом Шишкиным
    7. Пользователь получил предупреждение от провайдера за скачивание Ubuntu
    8. Я нашёл лучший линукс
  2. Короткой строкой
    1. Новости
      1. Мероприятия
      2. Внедрения
      3. Открытие кода и данных
      4. Дела организаций
      5. Ядро и дистрибутивы
      6. Обучение
      7. Базы данных
      8. Мобильные
      9. Безопасность
      10. DevOps
      11. Web
      12. Пользовательское
    2. Статьи
      1. Внедрения
      2. Дела организаций
      3. DIY
      4. Ядро и дистрибутивы
      5. Системное
      6. Специальное
      7. Базы данных
      8. Мультимедиа
      9. Безопасность
      10. DevOps
      11. AI & Data Science
      12. Web
      13. Для разработчиков
      14. Пользовательское
      15. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Базы данных
      5. Мультимедиа
      6. DevOps
      7. AI & Data Science
      8. Web
      9. Для разработчиков
      10. Пользовательское
  3. Что ещё посмотреть
  4. Заключение

Главное


Google начал установку ОС Fuchsia на устройства Nest Hub


Категория: Новости/Внедрения

OpenNET пишет: Петр Хосек (Petr Hosek), возглавляющий в Google команду, отвечающую за системы сборки, компиляторы и инструментарий для разработчиков, представил первое устройство, которое будет комплектоваться операционной системой Fuchsia. Прошивка на базе Fuchsia начнёт доставляться в умные рамки для фотографий Nest Hub в рамках экспериментального обновления для участников программы Google Preview Program. Если в ходе пробного внедрения не возникнет непредвиденных проблем, прошивка на базе Fuchsia будет применена и на устройства остальных пользователей Nest Hub, которые не заметят отличий так как интерфейс, построенный на базе фреймворка Flutter, останется прежним, изменятся только низкоуровневые составляющие операционной системы. Ранее в выпускаемых с 2018 года устройствах Google Nest Hub, сочетающих функции рамки для фотографий, мультимедийной системы и интерфейса для управления умным домом, применялась прошивка на базе оболочки Cast и ядра Linux. Напомним, что в рамках проекта Fuchsia компанией Google c 2016 года развивается универсальная операционная система, способная работать на любых типах устройств, от рабочих станций и смартфонов до встраиваемой и потребительской техники. Разработка ведётся с учётом опыта создания платформы Android и учитывает недостатки в области масштабирования и обеспечения безопасности.


Подробности:


  1. Google начал установку ОС Fuchsia на устройства Nest Hub []
  2. Fuchsia OS от Google дебютирует на Nest Hub [(en)]
  3. Google запускает свою третью по величине операционную систему Fuchsia[(en)]
  4. Операционная система Google Fuchsia начинает раннее развертывание на потребительских устройствах [(en)]
  5. Google запускает ОС Fuchsia []
  6. Google официально представил свою третью ОС подробнее о Fuchsia []
  7. Официальный выпуск Fuchsia OS 1.0 []
  8. ОС Fuchsia от Google теперь работает на Nest Hub первого поколения[(en)]

Подробности []


Microsoft, GitHub, Accenture и ThoughtWorks при поддержке Linux Foundation основали Фонд экологичного ПО


Категория: Новости/Дела организаций

Пользователь denis-19 опубликовал в новостях на Хабре: 25 мая Microsoft, GitHub, Accenture и ThoughtWorks при поддержке Linux Foundation объявили об основании некоммерческой организации Фонда экологичного ПО (Green Software Foundation). В планах Фонда добиться сокращения выбросов парниковых газов IT-компаниями на 45% к 2030 году в соответствии с Парижским соглашением по климату путём уменьшения с помощью свободного ПО энергопотребления в центрах обработки данных (ЦОД) по всему миру. Цель Фонда создание надёжной экосистемы, объединяющей лучшие практики, стандарты, инструменты и специалистов, для стимулирования устойчивого развития индустрии разработки свободного программного обеспечения.


Подробности:


  1. Microsoft, GitHub, Accenture и ThoughtWorks при поддержке Linux Foundation основали Фонд экологичного ПО []
  2. Linux Foundation вместе с Accenture, GitHub, Microsoft и ThoughtWorks запускает фонд Green Software Foundation, который ставит экологическую устойчивость в основу разработки программного обеспечения.[(en)]

Открыт код сервиса проверки паролей HaveIBeenPwned


Категория: Новости/Открытие кода и данных

OpenNET пишет: Трой Хант (Troy Hunt) открыл исходные тексты сервиса проверки скомпрометированных паролей Have I Been Pwned? (haveibeenpwned.com), выполняющего проверку по базе в 11,2 миллиардах учётных записей, похищенных в результате взломов 538 сайтов. Изначально о намерении открыть код проекта было объявлено в августе прошлого года, но процесс затянулся и код опубликован только сейчас. Код сервиса написан на C# и опубликован под лицензией BSD. Проект планируется развивать с привлечением сообщества под покровительством некоммерческой организации .NET Foundation.


Подробности:


  1. Открыт код сервиса проверки паролей HaveIBeenPwned []
  2. Have I Been Pwned становится открытым исходным кодом и объединяется с ФБР в борьбе с утечкой паролей [(en)]
  3. Сервис проверки утечек паролей Have I Been Pwned выходит с открытым исходным кодом [(en)]
  4. Have I Been Pwned теперь Open Source [(en)]

Соглашение о долгосрочном сотрудничестве: Карачаево-Черкесская Республика внедряет ОС Альт


Категория: Новости/Внедрения

Базальт СПО пишет: Компания Базальт СПО и Министерство цифрового развития Карачаево-Черкесской Республики заключили соглашение о долгосрочном комплексном сотрудничестве. Цель сформировать технологически независимую цифровую среду экономики и социальной сферы региона. Первые проекты миграции на отечественные программные продукты стартуют в Карачаево-Черкесии в 2021 году. На российские операционные системы Альт и прикладное программное обеспечение переведут свою цифровую инфраструктуру учебные заведения республики. По заявкам школ и организаций дошкольного образования Базальт СПО будет предоставлять им льготные лицензии на ОС Альт.


Подробности []


Базальт СПО приглашает на объединенную конференцию СПО: от обучения до разработки


Категория: Новости/Мероприятия

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


Подробности []


Второе интервью с разработчиком Reiser4 Эдуардом Шишкиным


Категория: Статьи/Системное

На Хабре вышло интервью с разработчиком файловой системы Reiser4 Эдуардом Шишкиным. Были обсуждены:


  1. вопросы организации разработки ядра Linux;
  2. плюсы и минусы разных файловых систем;
  3. принципы построения локальных и сетевых файловых систем;
  4. новости разработки Reiser4.

Подробности []


Пользователь получил предупреждение от провайдера за скачивание Ubuntu


Категория: Новости/Юридические вопросы

denis-19 пишет в новостях на Хабре: 26 мая 2021 года пользователь Reddit под ником NateNate60 рассказал, что получил от своего интернет-провайдера Comcast уведомление о том, что он недавно скачал через торрент ISO-образ ОС Ubuntu (ubuntu-20.04.2.0-desktop-amd64.iso) и тем самым нарушил закон об авторском праве. Провайдер попросил пользователя выполнить поиск этого пиратского контента на всех своих устройствах, подключенных к его сети, и удалить файлы, упомянутые в уведомлении. Контент, предположительно нарушающий авторские права, это 64-битная версия ОС Ubuntu 20.04.2.0 LTS. Примечательно, что в уведомлении указано хеш-значение 4ba4fbf7231a3a660e86892707d25c135533a16a, которое соответствует хешу официального выпуска этой редакции дистрибутива Ubuntu от Canonical. В Canonical заинтересовались этой проблемой и изучают её причину.


Подробности [ 1, 2(en)]


Я нашёл лучший линукс


Категория: Статьи/Пользовательское

Популярный GNU/Linux видеоблогер PLAFON опубликовал новое видео, где поделился своим выбором нового GNU/Linux дистрибутива после того, как долгое время использовал Arch-подобные. Выбор делался с точки зрения новизны поставляемого ПО, качества системы, сообщества и других факторов.


Подробности []


Короткой строкой


Новости


Мероприятия


На конференции IT-Community в Иркутске Базальт СПО познакомил сибиряков с ОС Альт и заключил соглашения о сотрудничестве []


Внедрения


CloudLinux предоставляет услуги поддержки Linux для Министерства обороны США[(en)]


Открытие кода и данных


Golos самый большой русскоязычный речевой датасет, размеченный вручную, теперь в открытом доступе []


Дела организаций


  1. Стартап Airbyte, разрабатывающий конвейер данных с открытым исходным кодом, привлекает 26 миллионов долларов[ 1(en), 2(en), 3(en)]
  2. Инцидент с потерей контроля над каналами в IRC-сети FreeNode [ 1, 2(en)]
  3. Более 80 разработчиков Linux помогалиисправить беспорядок, созданный вредоносными действиями разработчиков Университета Миннесоты [(en)]
  4. Инвесторы Da Vinci Capital подали иск против Telegram []
  5. Прекращение разработки Glimpse, форка графического редактора GIMP []
  6. Orbit получил $15 млн на устранение хаоса данных сообщества[(en)]
  7. Mirantis делает ставку на упрощение работы разработчиков с Kubernetes [(en)]
  8. Puppet назначает Бет Ши на должность директора по работе с клиентами [(en)]
  9. SUSE создаёт новое сообщество для пользователей Rancher и SUSE [(en)]
  10. AWS надеется на расширение партнёрства с Docker по мере роста количества контейнеров [(en)]
  11. Еженедельник OSM 565 []

Ядро и дистрибутивы


  1. Microsoft делает общедоступной поддержку приложений Linux с графическим интерфейсом в Windows 10 [ 1(en), 2(en)]
  2. Универсальный базовый образ Red Hat теперь доступен в Docker Hub [(en)]

Обучение


Книга PowerShell для сисадминов []


Базы данных


Что нового в плане мониторинга в PostgreSQL 14 []


Мобильные


  1. Альтернатива Huawei HarmonyOS для Android должна выйти 2 июня[ 1(en), 2(en)]
  2. Грядут изменения конфиденциальности Android вы готовы? [(en)]

Безопасность


  1. Почтовый клиент Mozilla Thunderbird мог быть использован для компрометации отправителя[(en)]
  2. Accurics стремится снизить затраты на безопасность с помощью политики как кода для устранения уязвимости Kubernetes [(en)]

DevOps


  1. UXP это новый открытый дистрибутив корпоративного уровня для Crossplane CNCF[(en)]
  2. New Relic улучшает наблюдаемость Kubernetes с помощью программного обеспечения Pixie с открытым исходным кодом [(en)]
  3. Docker запускает программу Verified Publisher для повышения безопасности контейнеров для разработчиков [(en)]
  4. Docker представляет новые возможности для разработчиков на DockerCon Live [(en)]
  5. По данным Docker, разработчики всё больше осознают потенциал контейнеризации [(en)]
  6. Результаты тестирования Service Mesh: Linkerd превосходит Istio [(en)]

Web


  1. Google выпустила исправления для Chrome после сбоев на Windows 10 и Linux [ 1, 2(en)]
  2. Mozilla обобщила планы по поддержке в Firefox третьей версии манифеста Chrome [ 1, 2(en)]
  3. Google подробно описывает технологию оптимизации кода, которая лежит в основе последнего повышения скорости Chrome на 23% [ 1(en), 2(en)]
  4. Mozilla подготовила для Firefox дополнение с системой машинного перевода []
  5. Браузер Google Chrome теперь насчитывает более 3 миллиардов пользователей[(en)]
  6. Последние обновления Google Chrome и Chrome OS предлагает несколько отличных новых функций особенно для пользователей Linux[(en)]
  7. Развитие проекта arataga: пара рефакторингов по результатам натурных испытаний []
  8. В обновлении Google Chrome добавлена командная строка [(en)]
  9. Протокол QUIC получил статус предложенного стандарта []

Пользовательское


На этой неделе в KDE: тестирование Plasma 5.22! []


Статьи


Внедрения


Как Linux подготовил школу к пандемии[(en)]


Дела организаций


Партнерство Docker и Snyk нацелено на безопасность[(en)]


DIY


Часть 3: Продолжаем пилить мультигаджет ESPboy2 для ретро игр и экспериментов с IoT в 2021 []


Ядро и дистрибутивы


Внутренности Linux: как /proc/self/mem пишет в недоступную для записи память []


Системное


Что такое демоны в Linux [ 1, 2(en)]


Специальное


  1. Как установить и использовать XRDP в Ubuntu для подключения к удалённому рабочему столу[(en)]
  2. Легенды и мифы геофизики []
  3. Установка Proxmox в Debian 10 []
  4. О контроле теплицы с помощью CircuitPython и инструментов с открытым исходным кодом[(en)]
  5. 6 новых интересных функций ShellHub, на которые стоит обратить внимание в 2021 году [(en)]
  6. Clustergram: визуализация кластерного анализа на Python []
  7. Полное руководство по настройке SSH в Ubuntu[(en)]

Базы данных


pgSCV экспортер метрик для PostgreSQL []


Мультимедиа


  1. Видео: Краткая история Blender. Отчет Blender Foundation []
  2. Одна коллекция плагинов Inkscape, чтобы править ими всеми[(en)]

Безопасность


  1. Тестирование на проникновение с помощью инструментов безопасности Linux[(en)]
  2. SPDX уже используется для Global Software Bill of Materials (SBOM) и безопасности цепочки поставок [(en)]
  3. Насколько безопасны повторно используемые компоненты Kubernetes [(en)]
  4. Найти и не обезвредить: пишем пентесты с Kali Linux []

DevOps


  1. Инструмент с открытым исходным кодом Yor проводит автоматический аудит IaC[ 1(en), 2(en)]
  2. Service Mesh Wars, прощаемся с Istio []
  3. Мониторинг 95+ метрик PostgreSQL с помощью плагина Zabbix Agent 2 []
  4. Kubernetes-in-Kubernetes и ферма серверов с загрузкой по PXE []
  5. Лучшие практики для безопасности Kubernetes[(en)]
  6. Бэкапы для HashiCorp Vault с разными бэкендами []
  7. Сеть контейнеров это не сложно []
  8. Ход конём: как принимать сообщения в Kafka через Nginx []
  9. Kubernetes изучаем паттерн Sidecar []
  10. Как Kubernetes изменит Cloud Foundry[(en)]

AI & Data Science


  1. Руководство для начинающих по логистической регрессии в Python[(en)]
  2. Руководство для начинающих по линейной регрессии в Python [(en)]
  3. Как адаптировать языковые модели Kaldi? (со смешными животными) []
  4. Как TensorFlow Lite вписывается в экосистему TinyML[(en)]
  5. Начало работы с созданием изображений с помощью TensorFlow Keras [(en)]
  6. Начало работы с анализом настроений с использованием TensorFlow Keras [(en)]
  7. Язык определения интентов NlpCraft IDL []
  8. Полное руководство Python по глубокой несбалансированной регрессии[(en)]

Web


Становится ли Telegram новой альтернативой Dark Web?[(en)]


Для разработчиков


  1. 3 причины изучить Java в 2021 году[(en)]
  2. 4 шага для настройки глобальных модалов в React [(en)]
  3. Полное руководство по рекурсии и итерации в Python [(en)]
  4. Обработка модульных и динамических файлов конфигурации в командной оболочке [(en)]
  5. О переносе операционных систем на новые архитектуры микросхем [(en)]
  6. Что нужно знать о Quarkus в 2021 году [(en)]

Пользовательское


  1. Gromit-MPX позволяет рисовать где угодно на экране рабочего стола Linux[(en)]
  2. Следите за характеристиками вашего компьютера Linux с помощью KInfoCenter [(en)]
  3. Запуск Flatpak из терминала [(en)]
  4. Осторожно, snap []
  5. Трюки в консоли. Крутые однострочники []
  6. Как настроить KDE Plasma []

Разное


  1. Что представляет собой офис по работе с открытым исходным кодом?[(en)]
  2. Генеральный директор Percona говорит об открытом исходном коде в эпоху облачных технологий [(en)]
  3. Семейная история использования Linux [(en)]

Релизы


Ядро и дистрибутивы


  1. Вышел Floppinux 0.1.0 дистрибутив Linux, умещающийся на одной 3,5-дюймовой дискете [ 1, 2, 3, 4(en), 5]
  2. Выпуск antiX 19.4, дистрибутива для устаревшего оборудования [ 1, 2]
  3. Новая версия Simply Linux 9.1 [ 1, 2, 3, 4]
  4. Опубликован AV Linux 2021.05.22, дистрибутив для создания аудио- и видеоконтента []
  5. Представлен полностью свободный Linux-дистрибутив PureOS 10 []
  6. Выпуск дистрибутива OSGeo-Live 14.0 с подборкой геоинформационных систем []
  7. Доступен дистрибутив AlmaLinux 8.4, продолжающий развитие CentOS 8 []
  8. Выпуск дистрибутива Oracle Linux 8.4 []
  9. Компания Virtuozzo опубликовала дистрибутив VzLinux, нацеленный на замену CentOS 8 []

Системное


  1. Второй выпуск Libreboot, полностью свободного дистрибутива Coreboot []
  2. Выпуск пакетного фильтра nftables 0.9.9 []
  3. Выпуски пакетного менеджера Pacman 6.0 и инсталлятора Archinstall 2.2.0 []
  4. Microsoft выпустила пакетный менеджер Windows Package Manager 1.0, похожий на apt и dnf []

Специальное


Выпуск Wine версии 6.9 []


Базы данных


  1. Databricks представляет Delta Sharing, инструмент с открытым исходным кодом для обмена данными[ 1(en), 2(en)]
  2. Опубликована СУБД immudb 1.0, обеспечивающая защиту от искажения данных []

Мультимедиа


  1. Выпуск музыкального проигрывателя Qmmp 1.5.0 [ 1, 2, 3]
  2. Выпуск редактора векторной графики Inkscape 1.1 [ 1, 2]
  3. Релиз программы для записи и обработки звука Ardour 6.7 []

DevOps


  1. Polaris 4.0 включает поддержку всех ресурсов Kubernetes[(en)]
  2. Команда Kali Linux выпускает Kaboxer, инструмент для управления приложениями в контейнерах [(en)]
  3. Представляем OpenShift Pipelines []
  4. KubeSphere 3.1.0: предоставление командам DevOps возможности запускать приложения в Kubernetes где угодно и когда угодно[(en)]

AI & Data Science


  1. KotlinDL 0.2: Functional API, зоопарк моделей c ResNet и MobileNet, DSL для обработки изображений []
  2. Microsoft выпускает Power BI для блокнотов Jupyter[(en)]

Web


  1. Выпуски nginx 1.21.0 и nginx 1.20.1 с устранением уязвимости []
  2. Релиз Chrome 91 []

Для разработчиков


  1. Состоялся выпуск FPC 3.2.2! []
  2. QtProtobuf 0.6.0 []

Пользовательское


  1. Альфа-выпуск LibreOffice 7.2 []
  2. Выпуск online-редакторов ONLYOFFICE Docs 6.3 []

Что ещё посмотреть


Open-source проект недели по версии SD Times: Ugly Duckling [(en)]


Заключение


На этом всё, до следующего воскресенья!


Подписывайтесь на наш Telegram канал наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News. Также мы есть во всех основных соцсетях:


  1. Fediverse []
  2. ВКонтакте []
  3. Facebook []
  4. Twitter []

[] Предыдущий выпуск





Если кто интересуется составлением дайджестов и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения. В первую очередь нужны люди, готовые помогать в разборе материалов, собранных роботом по нескольким десяткам англо- и русскоязычных источников, а именно разработчики, которые хотели бы поучаствовать в доработке средств автоматизации под многопользовательский режим (скорее всего это будет в форме Telegram чат-бота на Python), и просто активисты, которые смогли бы тратить несколько часов в неделю на работу с будущим автоматизированным категоризатором (записываться уже можно, уведомим по готовности инструмента). Подробнее о внутренней кухне дайджестов можно прочитать в спецвыпуске FOSS News [].






Думаю, все в курсе сложной ситуации, в которой оказался FSF (Фонд Свободного ПО) из-за конфликта вокруг его основателя Ричарда Столлмана. Подробности можно посмотреть в наших подборках новостей [ 1, 2]. Я считаю, что самое время поддержать Фонд вступлением и финансами []. FSF это одна из немногих организаций, бескомпромиссно стоящих на защите интересов большинства людей, использующих компьютеры в работе, общественной активности и для личных дел. А чтобы организация полностью работала в интересах людей, она должна этими людьми и финансироваться. К слову, 80% финансирования FSF идёт от частных лиц.

Подробнее..

FOSS News 73 дайджест материалов о свободном и открытом ПО за 31 мая 6 июня 2021 года

06.06.2021 22:21:53 | Автор: admin

Всем привет!


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


Главные темы нового выпуска:


  1. Huawei представила первые мобильные устройства на HarmonyOS 2.0 и объявила о замене Android на HarmonyOS на своих смартфонах.
  2. Результаты исследования об условиях труда Open Source мейнтейнеров.
  3. Роснефть передала ноутбуки с ОС Astra Linux многодетным семьям.
  4. NocoDB, open-source аналог Airtable.
  5. Интервью с Дэниелом Скейлсом, главным юрисконсультом по бренду в Linux Foundation.
  6. Google представил сервис для наглядного отслеживания зависимостей.
  7. История графической оболочки GNOME.

И многое другое



Оглавление


  1. Главное
    1. Huawei представила первые мобильные устройства на HarmonyOS 2.0 и объявила о замене Android на HarmonyOS на своих смартфонах
    2. Результаты исследования об условиях труда Open Source мейнтейнеров
    3. Роснефть передала ноутбуки с ОС Astra Linux многодетным семьям
    4. NocoDB, open-source аналог Airtable
    5. Интервью с Дэниелом Скейлсом, главным юрисконсультом по бренду в Linux Foundation
    6. Google представил сервис для наглядного отслеживания зависимостей
    7. История графической оболочки GNOME
  2. Короткой строкой
    1. Новости
      1. Мероприятия
      2. Внедрения
      3. Открытие кода и данных
      4. Дела организаций
      5. Ядро и дистрибутивы
      6. Системное
      7. Обучение
      8. Безопасность
      9. AI & Data Science
      10. Web
      11. Пользовательское
      12. Игры
    2. Статьи
      1. DIY
      2. Ядро и дистрибутивы
      3. Системное
      4. Специальное
      5. Базы данных
      6. Безопасность
      7. DevOps
      8. AI & Data Science
      9. Web
      10. Для разработчиков
      11. Пользовательское
      12. Игры
      13. Железо
      14. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Базы данных
      5. Мультимедиа
      6. Web
      7. Для разработчиков
      8. Пользовательское
      9. Игры
  3. Что ещё посмотреть
  4. Заключение

Главное


Huawei представила первые мобильные устройства на HarmonyOS 2.0 и объявила о замене Android на HarmonyOS на своих смартфонах


Категория: Релизы/Мобильные

Travis_Macrif пишет в новостях на Хабре: Китайская компания Huawei анонсировала линейку мобильных устройств, которые первыми будут работать на операционной системе HarmonyOS 2.0. Среди представленных гаджетов планшеты: 10.8 и 12.6-дюймовые MatePad Pro, MatePad 11; смартфоны: Mate40 Pro, Mate X2, Mate40E и nova 8 Pro; смарт-часы: Watch 3 и Watch 3 Pro. Производитель также заявил, что в скором времени представит перечень устройств Huawei, которые будет возможно перевести с Android на HarmonyOS. Все устройства работают на HarmonyOS 2.0. Операционная система является форком Android, использует ядро Linux и имеет открытый исходный код от AOSP. Huawei отметила, что более 100 моделей гаджетов компании, которые в настоящий момент функционируют на Android, смогут быть обновлены до HarmonyOS. По мнению представителей компании, производительность устройств может увеличиться до 42%.


Подробности:


  1. Huawei представила первые мобильные устройства на HarmonyOS 2.0 []
  2. Huawei официально запускает Android-альтернативу HarmonyOS для смартфонов [(en)]
  3. HarmonyOS 2: что вам нужно знать о новой операционной системе Huawei [(en)]
  4. Huawei официально заменяет Android на HarmonyOS, которая также является Android [(en)]
  5. Компания Huawei объявила о замене Android на HarmonyOS на своих смартфонах []
  6. Huawei запускает HarmonyOS на телефонах, чтобы избавиться от Android[(en)]

Результаты исследования об условиях труда Open Source мейнтейнеров


Категория: Статьи/Дела организаций

Tfir пишет: Новый опрос, проведенный Tidelift, показал, что большинству разработчиков ПО с открытым исходным кодом не платят достаточно, если вообще платят за зачастую стрессовую и неблагодарную работу. Тем не менее, общественная польза от своей работы вот что мотивирует этих сопровождающих продолжать свою работу, несмотря на трудности. Почти половина мейнтейнеров добровольцы, не получающие зарплату. 46% не получают зарплату вообще, и только 26% зарабатывают более 1000 долларов в год за свои работы по техническому обслуживанию проектов. Tidelift оказывает поддержку: 52% мейнтейнеров Tidelift зарабатывают более 1000 долларов в год за свою работу по сравнению с только 17% тех, кто не сотрудничает с Tidelift. Три основных причины, по которым сопровождающим нравится их работа, это менять мир к лучшему (71%), удовлетворять потребность в творческой, сложной и / или приятной работе (63%) и работать над важными для меня проектами(59%).


Подробности:


  1. Тяжелая работа и низкая заработная плата вызывают стресс у мейнтейнеров проектов с открытым исходным кодом [(en)]
  2. Мейнтейнерам проектов с открытым исходным кодом мало платят интервью с Крисом Грамсом, главой маркетинга в Tidelift [(en)]
  3. Почти половина разработчиков открытого ПО добровольцы, не получающие зарплату [(en)]

Роснефть передала ноутбуки с ОС Astra Linux многодетным семьям


Категория: Новости/Внедрения

Сайт AstraLinux пишет: В Красноярском крае семьи, где трое и больше детей-школьников и нет финансовой возможности полноценно обеспечить их образование, получили 7260 ноутбуков ICL с ОС Astra Linux Common Edition. Первые 1930 устройств направили семьям из Красноярска, Дивногорска, Сосновоборска, Железногорска и ряда центральных районов края, а остальные 5330 жителям остальных муниципальных образований региона.


Подробности []


NocoDB, open-source аналог Airtable


Категория: Статьи/Базы данных

host_m пишет в блоге компании VDSina.ru на Хабре: Airtable классный инструмент, заслуживший признание у бизнеса по всему миру. Возможность работать с базами данных в удобном no-code интерфейсе с разными представлениями и типами данных не нова, но если в Spreadsheets (где таблица даже не является базой) данные приходилось конвертировать плагинами и костылями, то в Airtable рабочий процесс такой же плавный и удобный, как в Notion при работе с текстом. Но есть один нюанс: Airtable работает по модели сервиса с ограниченным бесплатным функционалом, а код, конечно, закрыт. К счастью, опенсорс-сообщество рано или поздно создаёт открытые альтернативы всем популярным сервисам, и благодаря совместной работе двух десятков разработчиков появился NocoDB.


Подробности []


Интервью с Дэниелом Скейлсом, главным юрисконсультом по бренду в Linux Foundation


Категория: Статьи/Дела организаций

Джейсон Перлоу, директор отдела аналитики проектов и редакционного контента Linux Foundation, поговорил с Дэниелом Скейлсом о важности защиты товарных знаков в проектах с открытым исходным кодом.


Вот некоторые из обсуждаемых вопросов:


  1. Обычно мы думаем о законах об интеллектуальной собственности и товарных знаках применительно к потребительским товарам и коммерческим организациям. В чем разница между ними и тем, когда проекты и организации с открытым исходным кодом используют бренды?
  2. Какие проблемы с товарными знаками возникали в сообществах разработчиков ПО с открытым исходным кодом?
  3. Почему Linux Foundation хорошее место для проектов с открытым исходным кодом, чтобы защитить свои бренды?
  4. Соответствие товарным знакам также может защитить проект от технических отклонений. Как можно использовать программу соответствия товарным знакам для поощрения соответствия кодовой базе или интерфейсам проекта?
  5. Отказываются ли проекты Linux Foundation от контроля над своей торговой маркой?

Подробности [(en)]


Google представил сервис для наглядного отслеживания зависимостей


Категория: Новости/Для разработчиков

OpenNET пишет: Компания Google ввела в строй новый сервис Open Source Insights (deps.dev), визуализирующий полный граф прямых и косвенных зависимостей для пакетов, распространяемых через репозитории NPM, Go, Maven и Cargo (в ближайшее время дополнительно появится поддержка NuGet и PyPI). Основным назначением сервиса является анализ распространения уязвимостей в модулях и библиотеках, присутствующих в цепочке зависимостей, что может оказаться полезным для выявления уязвимостей в зависимостях высокого уровня вложенности (зависимости зависимостей). Из возможных областей применения также называется изучение лицензионной чистоты проекта (показывается статистика о том, какие лицензии используются в зависимостях), отслеживание выхода новых версий и событий, связанных с зависимостями (например, выявление уязвимостей) и оценка зависимых проектов (можно посмотреть отчёт о том, какие проекты используют указанную библиотеку напрямую или через другие зависимости). В качестве источников данных используются репозитории пакетов и данные с GitHub, в том числе Issues.


Источник[]


История графической оболочки GNOME


Категория: Статьи/История

Популярный GNU/Linux видеоблогер Алексей Самойлов опубликовал новое видео: В прошлый раз мы рассмотрели историю развития и появления самого первого полноценного графического окружения Linux KDE. Однако не всем пришлось по нраву использование для его разработки проприетарного в те годы тулкита Qt. Фактически, сообщество раскололось на два лагеря: 1) тех, кому было в общем-то пофиг, ведь окружение свободно и его можно как угодно улучшать и модернизировать. 2) идейных приверженцев свободного ПО и 4-х свобод Столлмана в частности. Мексиканским программистом Мигелем де Икаса, также являющимся автором файлового менеджера Midnight Commander и библиотеки Mono, вместе со своим другом Федерико Кентеро был начат проект полностью свободного до самых костей графического окружения. Заранее хочу извиниться, если что-то упущу из рассказа. Я постарался выделить наиболее заметные и значительные этапы развития этого графического окружения.


Подробности []


Короткой строкой


Новости


Мероприятия


  1. Бесплатное онлайн-мероприятие Upstream для мейнтейнеров 7-го июня[(en)]
  2. Проект Zephyr отмечает 5-ю годовщину с новыми участниками и первым саммитом разработчиков Zephyr 8-10 июня [(en)]

Внедрения


  1. Facebook переводит все свои модели искусственного интеллекта на платформу PyTorch с открытым исходным кодом[ 1(en), 2(en)]
  2. Super Blueprints интегрируют стек с открытым исходным кодом 5G from Core to Door [(en)]
  3. ОС Astra Linux защищенная платформа в центре компетенций Ростелекома []

Открытие кода и данных


Компания Alibaba открыла код распределённой СУБД PolarDB, основанной на PostgreSQL []


Дела организаций


  1. Проект GCC разрешил приём изменений без передачи Фонду СПО прав на код [ 1(en), 2]
  2. Новые способы узнать об открытых организациях[(en)]
  3. Соперник TikTok, Kuaishou, присоединяется к Open Invention Network [(en)]
  4. GitLab приобретает UnReview, чтобы добавить на свою платформу больше инструментов машинного обучения [(en)]
  5. Фонд электронных рубежей осудил закрытие аккаунта PayPal одного из энтузиастов Tor []
  6. SUSE выбирает Calico от Tigera в качестве опции для RKE 2[(en)]
  7. MongoDB начинает 2022 финансовый год с сильной прибыли благодаря сильным продажам облачных продуктов [(en)]
  8. Фреймворк IBM LoopBack присоединяется к OpenJS Foundation в качестве инкубационного проекта [(en)]
  9. Еженедельник OSM 566 []
  10. Компания PINE64 стала спонсором KDE []

Ядро и дистрибутивы


  1. Обновление Linux предотвратит выход вашего устройства из строя[(en)]
  2. KDE Neon перешёл на Qt 5 Patch Collection []

Системное


В репозитории пакетного менеджера winget много дубликатов, плохо сформированных пакетов и искажённых манифестов []


Обучение


Linux Foundation и CNCF добавляют симулятор экзамена к сертификационным экзаменам Kubernetes[(en)]


Безопасность


  1. Серьёзный недостаток WordPress плагина Fancy Product Designer активно эксплуатируется[(en)]
  2. Уязвимость в Polkit, позволяющая повысить свои привилегии в системе []
  3. ХPaste от Southbridge для пересылки паролей и кода []
  4. Миллионы сайтов WordPress получили серьёзное обновление безопасности[(en)]
  5. Google Chrome теперь предупреждает вас, если вы собираетесь установить сомнительное расширение [(en)]

AI & Data Science


Open Source исследователи тестируют качество кода, сгенерированного искусственным интеллектом[(en)]


Web


  1. Google предлагает пользователям Chrome больший выбор по сравнению с новой спорной системой таргетированной рекламы[(en)]
  2. Google говорит, что Chrome помогает упростить переход к гибридной работе [(en)]

Пользовательское


На этой неделе в KDE: KCommandBar для сумасшедшей продуктивности []


Игры


Nvidia и Steam делают игры под Linux великими снова [(en)]


Статьи


DIY


О ходе создания игры Колобок в мае []


Ядро и дистрибутивы


Что представляет собой новая ОС Google Fuchsia[(en)]


Системное


Лучшие аналоги CPU-Z для Linux []


Специальное


  1. Введение вFreeDOS[(en)]
  2. Установите SSH-соединение между Windows и Linux [(en)]
  3. Как перемещаться по FreeDOS с CD и DIR [(en)]
  4. Свой лунапарк TFTP с блэкджеком и С++17 []
  5. Сеть в bitly: Linux tc для минимизации издержек и забавы ради []
  6. FreeDOS команды для фанов Linux [(en)]
  7. Об использовании переменных окружения в FreeDOS [(en)]

Базы данных


Grafana дашборды для pgSCV []


Безопасность


В коммерческом ПО широко распространён устаревший код с открытым исходным кодом: отчёт[(en)]


DevOps


  1. Уютный VPS-сервер для маленьких проектов за минимум денег: как настроить []
  2. Elastic расширяет поддержку osquery, инструментария с открытым исходным кодом для получения информации о хосте с помощью SQL-подобного языка запросов[(en)]
  3. Начните работу с Kubernetes, используя Chaos Engineering [(en)]
  4. Начните мониторинг своего кластера Kubernetes с помощью Prometheus и Grafana [(en)]
  5. Тестируйте отказы кластера Kubernetes и экспериментируйте прямо в своём терминале [(en)]
  6. Гибридная ИТ это больше, чем просто Kubernetes, работающий повсюду [(en)]
  7. Об экосистеме Kubernetes в 2021 году [(en)]
  8. О тестировании Kubernetes с помощью веб-интерфейса Chaos Mesh с открытым исходным кодом [(en)]
  9. Начало работы с Kustomize для управления конфигурацией Kubernetes [(en)]
  10. Рациональное использование ресурсов в Kubernetes []
  11. Ограниченияcf-push в Kubernetes-центричном мире разговор с Джулианом Фишером, CEO и основателем компании anynines [(en)]
  12. Антипаттерны деплоя в Kubernetes. Часть 2 []

AI & Data Science


  1. Лучшие библиотеки Python для науки о данных в 2021 году[(en)]
  2. Прогнозирование временных рядов с помощью AutoML []
  3. О внутреннем устройстве PyTouch, ML-библиотеки Facebook для обработки касаний[(en)]

Web


  1. Nyxt Browser это ориентированный на использование клавиатуры веб-браузер, вдохновленный Emacs и Vim[(en)]
  2. Как использовать REST и SOAP API в Zimbra OSE []
  3. i2pd-tools: дополнительные утилиты I2P []

Для разработчиков


  1. Мини-версия рантайма для программирования микроконтроллеров на D [ 1, 2]
  2. Буферы и окна: подробности о тайне ssh и цикла чтения while []
  3. О неоправданно хорошей работе [ -z $var ] []
  4. Создатель Python Гвидо Ван Россум обсуждает популярные языки программирования[(en)]
  5. Начало работы с бессерверными функциями и Java [(en)]
  6. Оптимизация бессерверных функций на Java в Kubernetes [(en)]
  7. 15 полезных сочетаний клавиш в Visual Studio Code для повышения производительности [(en)]

Пользовательское


Проверка орфографии в вашей программе из командной строки Linux[(en)]


Игры


Компьютерные игры в Linux: насколько это сложно?[(en)]


Железо


Домашний сервер []


Разное


  1. Как установить Chia на Ubuntu []
  2. Безуспешная попытка монетизации моего проекта в open source []
  3. Преобразование изображений в формат ASCII в терминале Linux с помощью Ascii Image Converter [(en)]

Релизы


Ядро и дистрибутивы


  1. Релиз дистрибутива openSUSE Leap 15.3 [ 1, 2, 3(en)]
  2. Релиз дистрибутива для исследования безопасности Kali Linux 2021.2 [ 1(en), 2]
  3. AlmaLinux OS 8.4: свободная альтернатива CentOS [(en)]
  4. Доступен JingOS 0.9, дистрибутив для планшетных ПК []
  5. Tails 4.19 []
  6. ОС Альт Образование 9.2 готовое рабочее место педагога, студента, школьника []
  7. Выпуск дистрибутива NixOS 21.05, использующего пакетный менеджер Nix []
  8. Выпуск дистрибутива Clonezilla Live 2.7.2 []
  9. Выпуск Chrome OS 91 []
  10. Выпуск CentOS Linux 8.4 (2105) []

Системное


Выпуск Util-linux 2.37 []


Специальное


  1. Выпуск OpenRGB 0.6, инструментария для управления устройствами c RGB-подсветкой []
  2. Выпуск Wine 6.10 []

Базы данных


Выпуск СУБД Firebird 4.0 с поддержкой репликации []


Мультимедиа


Выпуск системы потокового видеовещания OBS Studio 27.0 []


Web


  1. Релиз Firefox 89 с переработанным интерфейсом [ 1, 2, 3, 4(en)]
  2. Выпуск сервера приложений NGINX Unit 1.24.0 []
  3. Выпуск децентрализованной видеовещательной платформы PeerTube 3.2 []
  4. Релиз http-сервера Apache 2.4.48 []
  5. Выпуск Tor Browser 10.0.17 и дистрибутива Tails 4.19 []
  6. Доступен децентрализованный коммуникационный клиент Jami Maloya []
  7. Выпуск NeoChat 1.2 []

Для разработчиков


  1. Выпуск библиотеки с реализацией регулярных выражений PCRE2 10.37 [ 1, 2]
  2. Выпуск Electron 13.0.0, платформы создания приложений на базе движка Chromium [ 1, 2]
  3. Microsoft представила собственный бесплатный дистрибутив OpenJDK, пообещав длительную поддержку [ 1, 2]
  4. Выпуск интегрированной среды разработки Apache NetBeans 12.4 []
  5. Выпуск языка программирования Til 0.2 []
  6. Выпуск r-test v0.1.0 инструмента для исследования эффективности кэширования файлов при нехватке памяти []
  7. Выпуск сборочного инструментария Qbs 1.19 []
  8. Выпуск cache-bench 0.1.0 для исследования эффективности кэширования файлов при нехватке памяти []

Пользовательское


  1. Релиз утилиты для создания скриншотов Ksnip 1.9.0 []
  2. Выпуск десктоп-окружения Cinnamon 5.0 []

Игры


Выпуск игры Free Heroes of Might and Magic II (fheroes2) 0.9.4 [ 1, 2]


Что ещё посмотреть


  1. Новые функции в Python 3.0, шпаргалка по grep, бесплатные онлайн-курсы и вторая часть Red Hat Summit Virtual Experience []
  2. Open-Source проект недели по версии SD Times: Project Reaqtor [(en)]

Заключение


На этом всё, до следующего воскресенья!


Подписывайтесь на наш Telegram канал наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News. Также мы есть во всех основных соцсетях:


  1. Fediverse[]
  2. ВКонтакте[]
  3. Facebook[]
  4. Twitter[]

[] Предыдущий выпуск





Если кто интересуется составлением дайджестов и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения. В первую очередь нужны люди, готовые помогать в разборе материалов, собранных роботом по нескольким десяткам англо- и русскоязычных источников, а именно разработчики, которые хотели бы поучаствовать в доработке средств автоматизации под многопользовательский режим (скорее всего это будет в форме Telegram чат-бота на Python), и просто активисты, которые смогли бы тратить несколько часов в неделю на работу с будущим автоматизированным категоризатором (записываться уже можно, уведомим по готовности инструмента). Подробнее о внутренней кухне дайджестов можно прочитать в спецвыпуске FOSS News [].






Думаю, все в курсе сложной ситуации, в которой оказался FSF (Фонд Свободного ПО) из-за конфликта вокруг его основателя Ричарда Столлмана. Подробности можно посмотреть в наших подборках новостей [ 1, 2]. Я считаю, что самое время поддержать Фонд вступлением и финансами []. FSF это одна из немногих организаций, бескомпромиссно стоящих на защите интересов большинства людей, использующих компьютеры в работе, общественной активности и для личных дел. А чтобы организация полностью работала в интересах людей, она должна этими людьми и финансироваться. К слову, 80% финансирования FSF идёт от частных лиц.

Подробнее..

FOSS News 74 дайджест материалов о свободном и открытом ПО за 713 июня 2021 года

13.06.2021 22:06:30 | Автор: admin

Всем привет!


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


Главные темы нового выпуска:


  1. Facebook открыл доступ к самой большой языковой базе для разработчиков переводчиков.
  2. Самое ценное под защитой ОС Альт: Республика Калмыкия перевела на ОС Альт медучреждения, на очереди школы.
  3. Онлайн-хакатон SSL: Safety & Security Lab.
  4. Open source это сообщество, а не бренд. О построении бизнес-модели на открытых исходниках.
  5. Битва открытых лицензий.
  6. Как Replit пыталась отжать open-source проект.
  7. Невероятное демо и немного о Sun Microsystems.
  8. История Linux Live CD.

И многое другое



Оглавление


  1. Главное
    1. Facebook открыл доступ к самой большой языковой базе для разработчиков переводчиков
    2. Самое ценное под защитой ОС Альт: Республика Калмыкия перевела на ОС Альт медучреждения, на очереди школы
    3. Онлайн-хакатон SSL: Safety & Security Lab
    4. Open source это сообщество, а не бренд. О построении бизнес-модели на открытых исходниках
    5. Битва открытых лицензий
    6. Как Replit пыталась отжать open-source проект
    7. Невероятное демо и немного о Sun Microsystems
    8. История Linux Live CD
  2. Короткой строкой
    1. Новости
      1. Мероприятия
      2. Внедрения
      3. Открытие кода и данных
      4. Дела организаций
      5. Ядро и дистрибутивы
      6. Системное
      7. Специальное
      8. Обучение
      9. Мультимедиа
      10. Мобильные
      11. Безопасность
      12. DevOps
      13. AI & Data Science
      14. Web
      15. Пользовательское
      16. Игры
      17. Железо
    2. Статьи
      1. Мероприятия
      2. Дела организаций
      3. DIY
      4. Ядро и дистрибутивы
      5. Системное
      6. Специальное
      7. Обучение
      8. Базы данных
      9. Мультимедиа
      10. Мобильные
      11. Безопасность
      12. DevOps
      13. AI & Data Science
      14. Web
      15. Для разработчиков
      16. Менеджмент
      17. Пользовательское
      18. Разное
    3. Релизы
      1. Ядро и дистрибутивы
      2. Системное
      3. Специальное
      4. Базы данных
      5. Мультимедиа
      6. DevOps
      7. Web
      8. Для разработчиков
      9. Пользовательское
  3. Что ещё посмотреть
  4. Заключение

Главное


Facebook открыл доступ к самой большой языковой базе для разработчиков переводчиков


Категория: Новости/Открытие кода и данных

Analyticsindiamag пишет: Отдел искусственного интеллекта Facebook недавно объявил, что откроет исходный код для своей базы данных FLORES-101, чтобы исследователи могли использовать её для улучшения моделей многоязычного перевода. FLORES-101 это набор оценочных данных многоязычного перевода для 101 языка. База данных вместе с техническим отчётом и моделями доступна здесь для бесплатного использования исследователями и разработчиками по всему миру. Facebook утверждает, что публичный доступ к такой информации позволит исследователям ускорить развитие многоязычных систем перевода во всём мире.


Подробности:


  1. [(en)]
  2. []

Самое ценное под защитой ОС Альт: Республика Калмыкия перевела на ОС Альт медучреждения, на очереди школы


Категория: Новости/Внедрения

Базальт СПО пишет 7-го июня: Сегодня все врачи Республики Калмыкия работают на компьютерах под управлением российской защищенной операционной системы Альт 8 СП. В 2019-2020 в рамках регионального проекта цифровизации здравоохранения гг. было развернуто более 2 тысяч автоматизированных рабочих мест (АРМ). Этот опыт был признан настолько успешным, что Министерство цифрового развития Республики Калмыкия заключило с Базальт СПО соглашение о долгосрочном комплексном сотрудничестве. Оно уже развивается сразу по нескольким направлениям: внедрение ОС Альт в школах республики, совместные конференции и семинары, обучение ИТ-специалистов и пользователей. Например, первая группа системных администраторов организаций здравоохранения Калмыкии успешно прошла дистанционное обучение по программе администрирования ОС ALTSTART. Интенсив. В ближайших совместных планах Минцифры Калмыкии и Базальт СПО пилотное внедрение ОС Альт в школах Калмыкии и открытие центра компетенций Базальт СПО. Программное обеспечение предоставляется школам на льготных условиях.


Подробности []


Онлайн-хакатон SSL: Safety & Security Lab


Категория: Новости/Мероприятия

Теплица социальных технологий анонсировала онлайн-хакатон SSL: Safety & Security Lab. Организаторы пишут: Команда Теплицы социальных технологий приглашает присоединиться к созданию технологических решений, игр и просветительских проектов на онлайн-хакатоне SSL: Safety & Security Lab. Мы ждём разработчиков, UX-дизайнеров, аналитиков, общественных активистов, независимых журналистов, блогеров, популяризаторов цифровых прав и всех, кому дороги ценности персональной независимости, приватности и гражданских свобод. На этот раз участники хакатона SSL: Safety & Security Lab создадут медиапроекты, сервисы, приложения, онлайн-игры, другие проекты и инструменты, которые помогут повысить уровень комплексной защищенности гражданского общества, опираясь на российскую повестку. Мероприятие пройдет онлайн.


По словам менеджера событий Теплицы Алисы Цветковой Абсолютно все проекты, которые будут созданы на хакатоне будут выставлены с открытым кодом.


Подробности []


Open source это сообщество, а не бренд. О построении бизнес-модели на открытых исходниках


Категория: Статьи/Дела организаций

SD Times пишет: Зачем использовать открытый исходный код уже не вопрос. Ситуация изменилась, и компании задаются вопросом, почему они не используют открытый исходный код? Но остался без ответа ещё более серьёзный вопрос: как они используют открытый исходный код? Остаются ли они верными концепции открытого исходного кода?. В статье поднимаются вопросы точного определения открытого кода, бизнес модели на его основе, отдача сообществу, вызовы перед сообществом Open Source и использование открытого кода в корпорациях.


Подробности [(en)]


Битва открытых лицензий


Категория: Статьи/Юридические вопросы

SD Times развивает предыдущую тему: Ранее в этом году Elastic возобновил дебаты о лицензировании открытого исходного кода, объявив, что изменит свою лицензионную модель, чтобы лучше защитить свой открытый исходный код. За последние пару лет ряд компаний, в том числе Redis Labs, MongoDB, Cockroach Labs и Confluent, изменили свои лицензии на открытый исходный код, чтобы избежать того, что они называют большой кражей кода, когда облачные провайдеры, такие как Amazon, берут их успешный проект с открытым исходным кодом, используют его как облачный сервис и получают прибыль, не отдавая при этом ничего сообществу. Издание приводит мнения нескольких участников сообщества по теме этого конфликта.


Подробности [(en)]


Как Replit пыталась отжать open-source проект


Категория: Статьи/Юридические вопросы

MagisterLudi опубликовал в блоге компании Маклауд перевод статьи о показательном примере противостояния сообщества открытого кода в лице одного интереса и бизнеса в вопросах интеллектуальной собственности. Это история о том, как Replit использует юридические угрозы и свое венчурное финансирование, чтобы заставить меня закрыть проект с открытым исходным кодом, который им не нравится краткое содержание статьи. Конфликт вызвал большое внимание и, в свете не такой уж давней истории о конфликте NGINX и Rambler, говорит о том, что конфликт интересов (реальный или раздутый) может возникнуть в то время и в том случае когда его не ждёшь и что сообщество и отдельные разработчики должны уметь защищаться.


Подробности []


Невероятное демо и немного о Sun Microsystems


Категория: Статьи/Разное

Эпичная история как автору Open Source проекта презентовали его же код. Просто почитайте :)


Подробности []


История Linux Live CD


Категория: Статьи/История

Stormglass опубликовал в блоге компании QIWI перевод статьи об истории одного из знаковых предметов в истории GNU/Linux: Продать новую идею может быть тяжело, особенно в случае, если аудитория может её не принять. Возможно, ей интересно было бы попробовать новый продукт, но только если усилия окажутся минимальными. Люди хотят, чтобы при первом признаке опасности у них под рукой была кнопка Выход. Последние 20 лет это было практически девизом Linux Live CD: вставьте этот диск (или USB-флэшку) в свой компьютер, попробуйте систему, посмотрите, понравится ли она вам. Если она вам понравится, установите её. Возможно, вам трудно представить, как мы пришли к такому вполне привычному сейчас формату, когда частью Linux является физический компонент. Это было огромным конкурентным преимуществом Linux. В сегодняшней статье мы расскажем о необычной истории самых первых live CD Linux.


Подробности []


Короткой строкой


Новости


Мероприятия


  1. Вторые открытые соревнования для детей и подростков по GNU/Linux[ 1, 2]
  2. Программа объединенной конференции СПО: от обучения до разработки []
  3. Онлайн-митап для Android-разработчиков []

Внедрения


В МФЦ Орловской области можно получать государственные и муниципальные услуги с помощью полностью отечественных решений []


Открытие кода и данных


  1. Исходный код RTS Периметр выложен в OpenSource []
  2. Компания LG опубликовала систему проверки соблюдения открытых лицензий []

Дела организаций


  1. Mozilla, Google, Apple и Microsoft объединили усилия в стандартизации платформы для браузерных дополнений [ 1, 2(en)]
  2. Экосистема WordPress принесла более половины триллиона долларов доходов [(en)]
  3. Mozilla создала площадку для обсуждения идей и предложений []
  4. The Zephyr Project Celebrates 5th Anniversary with new members and inaugural Zephyr Developer Summit on June 8-10 [(en)]
  5. Hyperledger объявляет об исследовании брендов блокчейнов 2021 года [(en)]
  6. API-шлюз с открытым исходным кодом KrakenD становится проектом Linux Foundation [(en)]
  7. Платформа продуктовой аналитики с открытым исходным кодом PostHog привлекла 15 миллионов долларов [(en)]
  8. FINOS объявляет об исследовании состояния проектов с открытым исходным кодом в сфере финансовых услуг на 2021 год [(en)]
  9. TODO Group объявляет об исследовании состояния OSPO в 2021 году [(en)]
  10. Fairwinds объявляет о создании группы пользователей ПО с открытым исходным кодом [(en)]
  11. Еженедельник OSM 567 []

Ядро и дистрибутивы


Линус Торвальдс: нагруженный релиз-кандидат Linux 5.13 не вызывает серьёзных опасений[(en)]


Системное


В Wayland-драйвере для Wine появилась поддержка Vulkan и многомониторных конфигураций []


Специальное


IonQ интегрируется с Cirq фреймворком квантовых вычислений с открытым исходным кодом от Google[(en)]


Обучение


TransTech Social и Linux Foundation объявляют о стипендии для обучения и сертификации [ 1(en), 2]


Мультимедиа


Kodi 20 получит название Nexus []


Мобильные


  1. Второй бета-выпуск мобильной платформы Android 12 [ 1, 2(en), 3(en), 4(en)]
  2. Plasma Mobile: Больше приложений и улучшенный домашний экран []

Безопасность


  1. GitHub раскрывает свой план по выявлению вредоносных программ и эксплойтов, размещенных на платформе[(en)]
  2. В Fedora 35 намечен переход на yescrypt для хэширования паролей []
  3. Arch Linux прекращает поддержку MD5 и SHA1 для новых паролей []
  4. Linux-дистрибутивы для анонимной работы в интернете что нового? []
  5. Microsoft заявляет, что Kubernetes является целью атак криптомайнинга [(en)]
  6. Google Chrome вынужден исправить очередную zero-day уязвимость [(en)]
  7. Эксперт обнаружил критическую уязвимость в библиотеке Polkit (PolicyKit) для Linux, баг в коде был с 2014 года []

DevOps


Grafana Labs представляет новые функции мониторинга[ 1(en), 2(en)]


AI & Data Science


Новый проект с открытым исходным кодом ISAC-SIMO использует машинное обучение для контроля качества строительства в развивающихся странах[(en)]


Web


Google признал неудачным эксперимент с показом только домена в адресной строке Chrome [ 1, 2(en), 3(en), 4(en)]


Пользовательское


На этой неделе в KDE: множество улучшений производительности []


Игры


Nvidia и Valve привносят DLSS в игры для Linux в некотором роде[(en)]


Железо


В новом ThinkPad от Lenovo есть одно крупное обновление для Linux[(en)]


Статьи


Мероприятия


Чего ожидать на саммите Cloud Foundry Summit 2021[ 1(en), 2(en)]


Дела организаций


Зачем GitLab купил UnReview?[(en)]


DIY


  1. Научный калькулятор с открытым исходным кодом[(en)]
  2. OpenSource-метод позволят делать двусторонние платы с переходными отверстиями в домашних условиях [(en)]

Ядро и дистрибутивы


  1. Как загружаетсяFreeDOS [(en)]
  2. Видео: antiX 19.4 и AV Linux []

Системное


Запускаем Homebrew на Windows 10 []


Специальное


  1. Несколько материалов о работе в FreeDOS[ 1(en), 2(en), 3(en), 4(en)]
  2. Установка Asterisk в Debian 10 []
  3. Анализ показателей здоровья сообщества с помощью Cauldron и GrimoireLab[(en)]
  4. Почему стоит выбрать открытый исходный код для проекта домашней автоматизации [(en)]
  5. RudderStack представляет платформы обработки клиентских данных с открытым исходным кодом для разработчиков [(en)]
  6. VGA библиотека для Raspberry Pi Pico [(en)]

Обучение


  1. 5 удобных руководств по открытому исходному коду для учителей[(en)]
  2. История человека, преподающего Python на Raspberry Pi 400 в публичной библиотеке [(en)]

Базы данных


  1. Настройте свои запросы MySQL как профессионал[(en)]
  2. Linux Fu: базы данных файловые системы нового уровня [(en)]
  3. Измеряем расходы на память у Postgres процессов []
  4. Введение в MySQL: установка, настройка и поддержка в Ubuntu[(en)]

Мультимедиа


Subtitld: кроссплатформенный редактор субтитров[(en)]


Мобильные


Красивый изменяющий цвет пользовательский интерфейс Android 12 уже оправдывает хайп[(en)]


Безопасность


  1. Проверка настроек безопасности в Linux с помощью checksec[(en)]
  2. Безопасность встраиваемых систем Linux []
  3. Dockle Диагностика безопасности контейнеров []
  4. Как использовать Python для проверки протокола Signal []

DevOps


  1. Kubevious революционная панель управления Kubernetes []
  2. Как увеличить скорость реакции Kubernetes на отказ узлов кластера? []
  3. Тестирование сбоев произвольных подов на Kubernetes с помощью kube-monkey[(en)]
  4. Бенчмаркинг Linkerd и Istio []
  5. Что происходит, когда вы намеренно закрываете контейнеры Kubernetes?[(en)]
  6. Проблемы миграции служб данных из Cloud Foundry в Kubernetes [(en)]
  7. Acme.sh + Ansible + Alias mode: Автоматизируем получение и распространение TLS сертификатов []
  8. Автоматизация настройки рабочего окружения или как доставить Linux тем, у кого его нет []
  9. Антипаттерны деплоя в Kubernetes. Часть 3 []
  10. Как правильно сделать Kubernetes (обзор и видео доклада) []
  11. Tоп 10 PromQL запросов для мониторинга Kubernetes []

AI & Data Science


  1. Как добавить Natural Language Processing в Minecraft []
  2. Руководство по GPT Neo для начинающих (с кодом на Python)[(en)]
  3. Проект Plot от Observable помогает с визуализацией данных [(en)]
  4. Руководство по Precision-Recall Tradeoff на Python [(en)]
  5. Сценарии для виртуальных ассистентов Салют на NodeJS и фреймворке SaluteJS []
  6. Как PyTorch в последнее время бросает вызов TensorFlow[(en)]
  7. 8 альтернатив TensorFlow Serving [(en)]

Web


  1. Может ли новый внешний вид Firefox спасти этот веб-браузер?[(en)]
  2. Приложение, работающее через I2P: проще, чем кажется []
  3. Appwrite, open-source бэкэнд-платформа []

Для разработчиков


  1. Утилиты для обработки JSON []
  2. От Планеты GitHub с любовью []
  3. Создание переносимых функций на бессерверных платформах с помощью Quarkus Funqy[(en)]
  4. Каждый Java Junior делает это: распространенные ошибки Java, совершаемые новичками [(en)]
  5. Как гипертекст позволяет работать с состоянием приложения в REST [(en)]

Менеджмент


Чтобы воспитывать открытых лидеров, менеджеры должны научиться отпускать[(en)]


Пользовательское


  1. Сравнение Linux Mint и Fedora: что лучше?[(en)]
  2. Helix: текстовый редактор в терминале для опытных пользователей Linux [(en)]
  3. RTFM! Как читать (и понимать) фантастические страницы руководства в Linux [(en)]
  4. Установка Dash to Dock в Ubuntu 20.04 []
  5. angelspie управление окнами в X11, глобальные и не только горячии клавиши []
  6. Видеообзор Plasma 5.22 на русском от PLAFON []

Разное


  1. Играйте в Doom на Kubernetes[(en)]
  2. Об открытом исходном коде и открытых стандартах [(en)]
  3. Линус Торвальдс вступил в дискуссию с антипрививочником в списке рассылки ядра Linux []

Релизы


Ядро и дистрибутивы


  1. Выпуск Lakka 3.1, дистрибутива для создания игровых консолей []
  2. Выпуск дистрибутива для резервного копирования Rescuezilla 2.2 []
  3. Кандидат в релизы дистрибутива Rocky Linux 8.4, идущего на смену CentOS []
  4. Выпуск дистрибутива Redcore Linux 2101 []

Системное


  1. Выпуск дисплейного сервера Mir 2.4 []
  2. Релиз загрузочного менеджера GNU GRUB 2.06 []

Специальное


  1. Выпуск редактора двоичных данных GNU Poke 1.3 []
  2. Выпуск Proton 6.10-GE-1, расширенной сборки Proton, пакета для запуска Windows-игр в Linux []

Базы данных


Apache Cassandra 4.0: устранение задержек с помощью Java 16 ZGC[(en)]


Мультимедиа


  1. Выпуск свободной системы 3D-моделирования Blender 2.93 LTS [ 1, 2, 3]
  2. Выпуск мультимедийного проигрывателя QMPlay2 21.06.07 []
  3. Обновление медиапроигрывателя VLC 3.0.15 []
  4. video2midi 0.4.5.2 []

DevOps


  1. Что нового вLinkerd 2.10 взгляд Джейсона Моргана, технического евангелиста Linkerd в Buoyant [(en)]
  2. Знакомьтесь: Argo Rollouts v1.0 []

Web


  1. Выпуск vsftpd 3.0.4 []
  2. Обновление Chrome 91.0.4472.101 с устранением 0-day уязвимости []

Для разработчиков


  1. Zig 0.8 []
  2. Выпуск системы управления исходными текстами Git 2.32 []
  3. Вышел релиз GitLab 13.12 с запуском DAST по требованию и графиком частоты развёртывания []

Пользовательское


  1. Релиз рабочего стола KDE Plasma 5.22 [ 1, 2, 3, 4]
  2. Выпуск рабочего стола Regolith 1.6 []
  3. Релиз оконного менеджера IceWM 2.4 []
  4. Представляем Windows Terminal Preview 1.9 []
  5. kchmviewer вышла версия 8.0 []
  6. Обновление KDE Gear 21.04.2, набора приложений от проекта KDE []

Что ещё посмотреть


  1. Дайджест opensource.com: новый сельскохозяйственный проект с открытым исходным кодом, опрос Stack Overflow и чествование разработчиков открытого исходного кода[(en)]
  2. Open-Source проект недели по версии SD Times: page-fetch [(en)]

Заключение


На этом всё, до следующего воскресенья!


Подписывайтесь на наш Telegram канал наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News. Также мы есть во всех основных соцсетях:


  1. Fediverse[]
  2. ВКонтакте[]
  3. Facebook[]
  4. Twitter[]

[] Предыдущий выпуск





Если кто интересуется составлением дайджестов и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения. В первую очередь нужны люди, готовые помогать в разборе материалов, собранных роботом по нескольким десяткам англо- и русскоязычных источников, а именно разработчики, которые хотели бы поучаствовать в доработке средств автоматизации под многопользовательский режим (скорее всего это будет в форме Telegram чат-бота на Python), и просто активисты, которые смогли бы тратить несколько часов в неделю на работу с будущим автоматизированным категоризатором (записываться уже можно, уведомим по готовности инструмента). Подробнее о внутренней кухне дайджестов можно прочитать в спецвыпуске FOSS News [].






Думаю, все в курсе сложной ситуации, в которой оказался FSF (Фонд Свободного ПО) из-за конфликта вокруг его основателя Ричарда Столлмана. Подробности можно посмотреть в наших подборках новостей [ 1, 2]. Я считаю, что самое время поддержать Фонд вступлением и финансами []. FSF это одна из немногих организаций, бескомпромиссно стоящих на защите интересов большинства людей, использующих компьютеры в работе, общественной активности и для личных дел. А чтобы организация полностью работала в интересах людей, она должна этими людьми и финансироваться. К слову, 80% финансирования FSF идёт от частных лиц.

Подробнее..

Перевод На пути к Матрице как происходит исследования в области построения симуляций и искуственной жизни

15.06.2021 16:19:06 | Автор: admin

О проекте


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

Узнайте о целях проекта и о том, как начать.



Функции

  • Реалистичные физические расчеты кинематических и термодинамических процессов повреждаемых и склеиваемых твердых тел
  • Программируемый материал для моделирования цифровых организмов и эволюции
  • Встроенный графический редактор для проектирования собственных машин
  • Моделирование и рендеринг на GPU
  • Программное обеспечение с открытым исходным кодом и доступно под GNU General Public License, Version 3 (GPLv3).

Под катом два примера (Самопроверяющиеся репликаторы и Репликация на основе информации) применения данного программного комплекса.

Кейс первый: Самопроверяющиеся репликаторы


1. Исходные репликаторы


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

image

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

2. Эволюционные эксперименты


2.1. Настройка

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

  • размер вселенной: 1000 x 1000 единиц
  • 5000 случайно распределенных прямоугольных блоков размером 8 x 4 в качестве питательных веществ
  • 20 репликаторов

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


2.2. Симуляции


2.2.1. Маленькие репликаторы

image

Вначале количество репликаторов растет экспоненциально, пока не будут исчерпаны все ресурсы. После этого устанавливается равновесие, при котором число репликаторов (примерно 6000) остается постоянным. Видео ниже показывает, как репликаторы потребляют последние свободные ресурсы. После этого им нужно потреблять друг друга. Однако из-за мутации произошли незначительные оптимизации, которые привели к появлению более адаптированных особей. Иногда можно наблюдать рост плотных колоний. Это явление показано на рисунке, сделанном на 114 000-м шаге. Каждая светящаяся точка представляет собой отдельного индивида/репликатора.

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

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



После этой начальной фазы мы постепенно увеличиваем размер вселенной до 4000 x 1000 единиц и постепенно увеличиваем свойства функции ячейки параметров моделирования -> оружие -> стоимость энергии до 1,4. Эти изменения, с одной стороны, понижают давление окружающей среды и приводят к рассеянию колоний. С другой стороны, усложняется потребление энергии. Неожиданно возникает необходимость в адаптации. Репликаторы развивают подвижность, чтобы более активно потреблять ресурсы. После нескольких миллионов временных шагов и фиксации вышеуказанного параметра происходит слияние нового равновесия. Они потребляют друг друга и производят потомство. Но количество репликаторов остается постоянным. Такое поведение можно наблюдать на первом видео, сделанном после 22 миллионов временных шагов эволюции.


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


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


image

evolved small replicator

2.2.2. Большие репликаторы


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

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


image

evolved large replicator

2.2.3. Сложные репликаторы

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


Такие условия могут быть более подходящими для эволюции в сторону более высокой сложности. В моделировании после 26 миллионов временных шагов возникла совершенно новая структура. Он привлекает внимание своей массивной внутренней обработкой. Это похоже на растущую кристаллическую структуру без активных движений или потребления энергии. Деторождение происходит путем разрушения конструкции из-за физических воздействий. Части снова могут расти. Увеличенное изображение этого удивительного продукта эволюции показано справа внизу.


crystalline structure

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


image

evolved complex replicator

4. Выводы


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

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

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

Кейс второй: Репликация на основе информации


1. Начальный репликатор


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

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

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

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

image

information-based replicator

2. Эволюционный эксперимент


2.1. Настройка

Для нашего эволюционного эксперимента мы создали симуляцию со следующими настройками:

  • начальный размер вселенной: 1000 x 1000 единиц
  • 5000 случайно распределенных прямоугольных кластеров 8x4 ячеек каждые 100 единиц энергии
  • 20 репликаторов

Полную первоначальную конфигурацию можно скачать здесь.

2.2. Симуляция
Во время симуляции мы постепенно увеличиваем размер вселенной до 6000 x 1000 единиц. Затем Вселенная масштабируется до 60 000 x 1 000 единиц, что приводит к увеличению энергии в 10 раз. Количество репликаторов растет экспоненциально и стабилизируется на уровне от 80 до 90 тысяч экземпляров. На этом этапе номер можно прочитать на активных кластерах на мониторе. Результаты, приведенные ниже, нельзя повторить напрямую, так как все моделирование отличается. Однако могут наблюдаться некоторые общие эффекты.

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

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

image

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

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

image

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

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

image

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

image

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

image

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

4. Выводы


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

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

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

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

Дополнительно: Artworks


Все последующие скринкасты показывают моделирование в реальном времени, записанное на системе GeForce 2080 TI. Рекомендуется смотреть видео в качестве 1080p (HD). Больше видео можно найти на канале YouTube.

Возможности физического движка






Искусственно запрограммированная материя






Конструкции на встроенном графическом редакторе



Подробнее..

Прогнозирование временных рядов с помощью AutoML

30.05.2021 14:10:27 | Автор: admin


Хабр, привет!


В лаборатории моделирования природных систем Национального центра когнитивных разработок Университета ИТМО мы активно исследуем вопросы применения автоматического машинного обучения для различных задач. В этой статье мы хотим рассказать о применении AutoML для эффективного прогнозирования временных рядов, а также о том, как это реализовано в рамках open-source фреймворка FEDOT. Это вторая статья из серии публикаций, посвященной данной разработке (с первой из них можно ознакомиться по ссылке).


Все подробности под катом!


Автоматическое машинное обучение (AutoML)


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


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


  • собрать данные из множества источников, очистить их;
  • осуществить предобработку, нормализацию, закодировать некоторые из признаков;
  • отобрать наиболее полезные из них, либо синтезировать на их основе новые;
  • удалить возможные выбросы в данных.

Такие многоступенчатые последовательности операций, включающие этапы от первичной обработки данных до обучения модели и составления прогнозов, называют пайплайнами. Работать с пайплайнами уже несколько сложнее, чем с одиночными моделями машинного обучения, так как чем больше составных блоков, тем больше гиперпараметров, которые нужно оптимизировать. Также выше вероятность того, что на каком-нибудь этапе возникнет ошибка, да и в целом такую более громоздкую систему труднее настраивать и контролировать ее поведение. Для решения этой проблемы реализованы специальные инструменты MLFlow, Apache AirFlow и т. д что-то вроде workflow management system (WMS) в мире машинного обучения. Они призваны упростить контроль за состоянием пайплайнов обработки данных.
Почему потребность в таких инструментах возникла, ведь раньше обходились без них?


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

Более амбициозной задачей в данной области машинного обучения является автоматическая генерация этих пайплайнов. Существует несколько фреймворков, которые предоставляют подобные функции, среди open-source, например это TPOT, AutoGluon, MLJAR или H2O. Такие AutoML фреймворки решают задачу оптимизации вида построить такой пайплайн, который дает конечный прогноз с наименьшей (среди всех рассмотренных решений) ошибкой. В основном структура пайплайна зафиксирована и подбираются только гиперпараметры, но некоторые фреймворки способны получать в качестве решения модели произвольной структуры. Данная оптимизационная задача (нахождения пайплайна произвольной структуры) решается как правило при помощи эволюционных алгоритмов, примеры: фреймворки TPOT и FEDOT.
Существуют также и проприетарные SaaS-решения, такие как DataRobot, GoogleAutoTables, Amazon SageMaker, которые помогают не только автоматизировать ML эксперименты, но и предоставляют возможности AutoML.
Как правило, AutoML библиотеки и сервисы успешно решают две самые популярные задачи в машинном обучении: классификация и регрессия на табличных данных. Реже поддерживаются задачи, связанные с обработкой изображений, текста и прогнозирования временных рядов. В рамках данной статьи мы не будем рассматривать плюсы и минусы известных решений, а остановимся на возможностях автоматического машинного обучения в задаче прогнозирования временных рядов.


Автоматическое машинное обучение для временных рядов


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


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


Некоторые команды, которые все-таки решаются поддерживать прогнозирование временных рядов, однако ограничиваются только этим типом данных. Хороший open-source пример фреймворк AutoTS. В подобных библиотеках обычно используются классические статистические модели для прогнозирования например AR или ARIMA. Внутри фреймворка производится настройка этих моделей, а затем выбирается наилучшая (по метрике ошибки на валидационной выборке), но новых моделей здесь не генерируются. На такой логике, например, основана библиотека pmdarima.


Другой способ адаптировать функциональность готового AutoML-инструмента для задачи прогнозирования. На эту роль хорошо подходят регрессионные модели. Так, например, было сделано в H2O, где в своей коммерческой версии продукта разработчики предоставили такую возможность. Однако, судя по некоторым примерам использования open-source версии, пользователю придется взять на себя задачу первичной обработки исходных рядов, например, извлечение признаков. Для полноценной работы такого урезанного инструментария может не хватать.


А какие функции хотелось бы иметь в AutoML-арсенале?


Хотя задача прогнозирования поведения одномерного массива выглядит тривиальной, существует множество инструментов, которыми инженер хотел бы обладать при работе с временными рядами. Например:
  • Возможность строить интерпретируемые ансамбли из моделей (например, чтобы одна модель воспроизводила высокочастотную составляющую временного ряда, вторая низкочастотную, а третья объединяла их прогнозы);
  • Иметь возможность осуществлять настройку гиперпараметров в пайплайнах для временных рядов;
  • Использовать экзогенные (вспомогательные) временные ряды;
  • Применять специфические методы предобработки (от сглаживания скользящим средним до преобразования Бокса-Кокса);
  • Иметь возможность применять in-sample и out-of-sample прогнозирование;
  • А если временной ряд с пропусками как их устранить?
    Учесть все перечисленные возможности в одном фреймворке, и, при этом, не ограничиваться только временными рядами достаточно сложная задача.

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


Немного о нас

Наша лаборатория является частью Национального центра когнитивных разработок центре компетенций по машинному обучению и когнитивным технологиям, созданном в 2018 году на базе Университета ИТМО. Благодаря данному центру и стало возможным осуществление проекта создания фреймворка FEDOT мы занимаемся им с начала 2020 года.


Некоторое время назад мы заинтересовались исследованиями в области AutoML, а в команде появились свежие идеи для экспериментов. В итоге, идеи сформировались в полноценный open-source AutoML фреймворк, который мы разрабатываем и поддерживаем в лаборатории FEDOT.


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


В некоторых из этих задач нам удалось получить интересные результаты, и если интересно, научные статьи по ним вы можете посмотреть здесь и здесь. Ниже мы сфокусируемся на задаче прогнозирования временных рядов и разберем, как там можно использовать AutoML и FEDOT, в частности.


Основные сущности в FEDOT

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


Основные абстракции, которыми оперирует FEDOT во время работы, это:


  • Операция действие, которое выполняется над данными: это может быть действие по предобработке данных (нормализация, стандартизация, заполнение пропусков) или модель машинного обучения, которая даёт прогноз;
  • Узел это контейнер, в который помещается операция. В одном узле может быть только одна операция. Primary узел принимает только исходные данные, а Secondary использует в качестве предикторов предсказания узлов предыдущего уровня;
  • Цепочка это ациклический направленный граф, который состоит из узлов. Пайплайны машинного обучения в FEDOT реализуются через цепочки (или класс Chain).

Приведенные абстракции можно увидеть на рисунке ниже:

Операции, узлы и цепочки в фреймворке FEDOT


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


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


Прогнозирование временных рядов в FEDOT


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


Признаки есть! Только для формирования таблицы с признаками нужно пройти по временному ряду скользящим окном и подготовить траекторную матрицу.

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


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

Пример составления таблицы с признаками для прогнозирования временного ряда
Такое преобразование мы будем называть lagged-преобразование временного ряда. В FEDOT мы вынесли его в отдельную операцию lagged. Его важным гиперпараметром является размер скользящего окна от него зависит сколько предыдущих значений мы будем использовать в качестве предикторов.


Ниже приведена анимация с примерам многошагового прогнозирования на 1 элемент вперед. Однако, прогноз за один шаг может осуществляться сразу на несколько элементов вперед. В таком случае решается задача muli-target регрессии. Весь процесс прогнозирования от формирования траекторной матрицы до составления предсказания можно увидеть на анимации ниже:

Анимация. Прогнозирование на 3 элемента вперед при помощи lagged преобразования временного ряда


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


Пример задачи


Пример прогнозирования временного ряда

В сообществе распространены примеры прогнозирования временных рядов на довольно простых примерах. Один из самых популярных временной ряд US airline passengers и выглядит следующим образом:

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


Имеются два временных ряда: первый это среднесуточная выработка электроэнергии ветряной установкой. Другой среднесуточная выработка электроэнергии при помощи дизельного генератора. Оба показателя измеряются в кВтч.

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


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


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


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


Заполнение пропусков


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


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

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



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


Для этого мы строим простую цепочку из lagged-представления, сглаживания Гаусса, и ridge-регрессии (см. рисунок), обучаем ее предсказывать значения ряда вперед.

Структура применяемой цепочки для восстановления пропусков во временном ряде


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


Подробнее о том, как это устроено внутри

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


Получаем следующий результат:



Заполненный пропуск во временном ряде выработки электроэнергии дизельным генератором


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


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



Восстановленные временные ряды (видно, что они идут в противофазе и заполненный пропуск не нарушает этот принцип)


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


Автоматическая идентификация композитной модели


Построим цепочку для временных рядов при помощи AutoML. В FEDOT это можно сделать буквально в несколько строчек кода, используя API.
Коротко о том, что происходит внутри. AutoML работает в два этапа:


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

Настройка гиперпараметров по умолчанию осуществляется одновременно во всех узлах цепочки при помощи байесовских методов оптимизации:

Анимация. Процесс настройки параметров в узлах композитной модели


После завершения всех этапов мы получаем итоговый пайплайн. Теперь посмотрим на получившийся прогноз и рассчитаем метрики: среднюю абсолютную ошибку (MAE) и корень из средней квадратической ошибки (RMSE): MAE 100.52, а RMSE 120.42.

Пример прогноза временного ряда


Если смотреть на график и значения метрик, возникает вопрос: хорошая ли получилась модель?


Ответ: определить трудно. На одном участке лучше модель не валидировать. Там ведь всего лишь 14 значений. Лучше посчитать метрику хотя бы три раза по 14 (то есть 42). Для этого стоит воспользоваться in-sample прогнозированием.

Ниже приведена анимация, которая должна помочь разобраться в out-of-sample и in-sample прогнозировании:

Анимация. Процесс in-sample и out-of-sample прогнозирования


Итак, мы наша модель умеет делать прогноз на 14 значений вперед. Но мы хотим получить прогноз на 28 значений вперед в таком случае мы итеративно можем 2 раза сделать прогноз на 14 элементов. В таком случае в качестве предикторов для второго прогноза выступят значения, предсказанные на первой итерации (out-of-sample).


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


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

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


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

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


Как видно из рисунка, более сложные цепочки не всегда показывают высокую точность. Так, лучший найденный пайплайн получился короткий, но тем не менее, величина ошибки на валидации оказалась маленькой. Исходя из этого делаем вывод, что этого вполне достаточно для данного временного ряда.
Так как финальная модель это алгоритм K-ближайших соседей, то цепочка хорошо умеет повторять паттерны временного ряда из обучающей выборки. Проблемы у такой модели могут возникнуть например для ряда, нестационарного по тренду. В таком случае модель K-ближайших соседей не сможет адекватно экстраполировать зависимости из обучающей выборки. У данного же временного ряда есть другая особенность он нестационарен по дисперсии. Однако, в его структуре присутствуют относительно однородные части, которые немногим отличаются от того участка временного ряда, на котором производилась валидация.

Однородные части временного ряда, похожие на валидационный участок, выделены оранжевым цветом


В этих частях присутствуют повторяющиеся паттерны, и при этом сам временной ряд не имеет тренда величина колеблется вокруг среднего, то поднимаясь до значения выше 1000 кВтч, то опускаясь до 0. Поэтому умение воспроизводить эти паттерны для построенного пайплайна является очень важным. А вот угадывать низкочастотные колебания временного ряда (например, тренд или сезонность) при этом не обязательно. Модель K-nn как раз хорошо подходит для этих задач. Метрики качества прогнозирования, полученные после композирования цепочки, таковы: MAE 88.19 и RMSE 177.31.


Важно отметить, что мы получили готовое решение в автоматическом режиме и не вносили в алгоритм поиска каких-либо дополнительных экспертных знаний. Данная задача была решена всего за 5 минут работы фреймворка на десктопном ПК. Естественно, для больших наборов данных, потребуется больше времени на поиск решения.


Сравнение с альтернативами: AutoTS и pmdarima

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


Попробуем также сравнить FEDOT с другими open-source фреймворками для прогнозирования временных рядов AutoTS и pmdarima. Jupyter notebook с кодом, а также графиками, доступен по ссылке. Так как не во всех библиотеках реализована функциональность валидации на нескольких блоках, то решено было провести это небольшое сравнение на всего одном фрагменте ряда. Каждый алгоритм был запущен по 3 раза, и метрики ошибок были усреднены. Таблица с метриками выглядит следующим образом (в ячейках приведено СКО- среднее квадратическое отклонение):


Библиотека МАЕСКО RMSECKO
pmdarima 1551 1961
AutoTS 19822 23641
FEDOT 11014 17026

На рисунке также отображены прогнозы для одного из экспериментов:


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


Заключение


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


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


Примеры (код и картинки) из данного поста доступны в отдельном репозитории по ссылке.


Используйте AutoML, пробуйте FEDOT!


Над статьей работали: Михаил Сарафанов, Павел Вычужанин и Николай Никитин.

Подробнее..

Microsoft представила собственный бесплатный дистрибутив OpenJDK, пообещав длительную поддержку

01.06.2021 20:15:10 | Автор: admin

Корпорация Microsoft на днях начала распространять свой дистрибутив Java на основе OpenJDK. Проект бесплатный, он распространяется под лицензией GPLv2. В его состав входят исполняемые файлы для Java 11 и Java 16, базирующиеся на OpenJDK 11.0.11 и OpenJDK 16.0.1. Новый релиз Java 16 уже используется миллионами геймеров, играющих в Minecraft, вместе с Minecraft Java Edition Snapshot version 21W19A.

Компания подготовила сборки для всех популярных операционных систем, включая Linux, Windows и macOS для архитектуры x86_64. Есть еще и OpenJDK 16.0.1 для систем ARM, работающий под Linux и Windows. Загрузить и использовать новинку может любой пользователь, на полностью бесплатной основе.

Подробности от Microsoft


Каким-то откровением этот релиз не является о том, что он вскоре появится, стало известно еще в апреле 2021 года, когда Microsoft представила тестовые сборки на базе OpenJDK 11 под архитектуру x64 для серверного и десктопного применения в Windows, macOS и Linux. Тогда Microsoft заявила о поддержке Java 11 минимум до 2011 года.

Разработчики OpenJDK от Microsoft заявили, что их проект вклад компании в экосистему Java. Таким образом, компания пытается наладить и укрепить взаимодействие с сообществом Java. Дистрибутив заявлен как стабильный он уже используется в ряде сервисов корпорации и проблем с ним, насколько известно, нет.

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



Кроме основного анонса, компания заявила также о том, что стала членом рабочей группы Eclipse Adoptium. Эта группа распространяет бинарные сборки OpenJDK, которые совместимы со спецификациями Java и соответствуют критериям качества AQAvit. Группа полностью независима от каких-либо коммерческих проектов.

Представители компании заявили, что в Microsoft работает около полумиллиона виртуальных машин Java, обеспечивающих работу множества сервисов, игровых серверов, систем Big Data. И примерно треть виртуальных машин, около 140 тысяч, используют OpenJDK от Microsoft.

Компания давно применяет в работе самые разные проекты с открытым исходным кодом на языке Java, которые помогают ей обеспечить функционирование систем анализа больших данных и логов. Более того, бэкенды LinkedIn и Yammer также почти на 100% базируются на Java-микросервисах.

Активно участвовать в разработке собственной версии OpenJDK компания стала после покупки jClarity из Великобритании. Самые известные ее продукты Censum и Illuminate. Наработки jClarity корпорация планировала использовать для повышения эффективности работы инфраструктуры своих сервисов, а также создания собственного дистрибутива OpenJDK.

Немного подробностей от OpenJDK и Java


OpenJDK достаточно известный проект, цель которого создание Java Development Kit, состоящего исключительно из свободного и открытого исходного кода. В Kit входит несколько элементов, включая компилятор в байт-код Java (javac), стандартные библиотеки классов Java, примеры, документацию, утилиты и среду выполнения Java (JRE).

Еще в 2006 году создатель Java компания Sun (три года спустя поглощенная Oracle) пообещала сделать Java полностью свободным программным обеспечением. Сначала были опубликованы исходные коды виртуальной машины HotSpot и компилятора Java под лицензией GPL. Затем полные исходные коды библиотеки классов Java под GPL, кроме фрагментов, права на работу с которыми были у третьей стороны. Все это было опубликовано в мае 2007 года. Среди частей, которые не стали открытыми, остались компоненты Java для графического интерфейса.

Ну и потом последовал логичный этап создание проекта OpenJDK, который дал возможность участвовать в развитии платформы и другим компаниям. С 2018 года за право использования платформы Oracle JDK бизнес-пользователям приходится платить.

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

Подробнее..

Перевод Как Replit отжимает мой open-source проект

07.06.2021 22:20:16 | Автор: admin
Я думаю, вам следует закрыть проект и прекратить работать над ним. Я привлеку наших адвокатов в понедельник, если к тому времени вы не выполнитте условия. [...] Мы были крошечной компанией, когда вы стажировались у нас [...] К счастью, сейчас мы намного больше, и, что очень важно, у нас есть много денег, чтобы заплатить за лучших юристов, если мы будем вынуждены пойти по этому пути.
из переписки с CEO Replit


image


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

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

Про Replit


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

Я работал в Replit летом 2019 года, где меня попросили переделать стек управления пакетами Replit и сделать его open-source. Если вам нравится читать о технических вещах, вот мой пост для блога Replit, и вот код на GitHub.

Летом 2020 года я устроился на работу в другом месте, но все еще время от времени общался с ними по электронной почте, когда они обращались ко мне, чтобы рассказать о чем-то крутом, разработанном Replit.

Про мой open-source проект


image
В Replit мне действительно понравилась поддержка множества различных языков программирования. (Я написал еще один пост в блоге Replit о том, как они это делают.) И я задумался: сколько языков программирования можно запихнуть в один веб-сайт?

Чтобы изучить этот вопрос, я собрал свое собственное небольшое веб-приложение, которое могло бы запускать код в Интернете. Примерно через день у меня появилось кое-что, что заработало. (Если вам интересно, почему это было так быстро оказывается, вам нужно всего 30 строк кода, чтобы люди могли запускать Python в веб-приложении! Возможно, именно поэтому существует так много веб-сайтов для запуска Python в Интернете )

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

2020-06-05 df9ba38 Initial commit 0 (количество языков)
2020-06-05 5e3a4a4 Install some packages into a Docker image 0
2020-06-05 e937c8f Simple Express server with Hello world 0
2020-06-06 0961498 Embed terminal on frontend app 0
2020-06-06 c66cf63 Embed Monaco editor on frontend 0
2020-06-06 27ab1f7 Add run button 0
2020-06-06 f417858 You can run Python code now 1
2020-06-07 d543081 You can run many languages now 8
2020-06-07 e2a3e71 All languages 17 working now 17
2020-06-07 473c50c ALL THE LANGUAGES 25
2020-06-08 3718315 even more languages 33
2020-06-08 548c1c1 repl.it superiority!!! 38
2020-06-08 1ae424f More languages, we need all the languages 48
2020-06-09 c34ccf2 A lot more languages 77
2020-06-09 846caf2 At this point the number of languages is absurd 79


В конце концов я добавил 216 языков, включая все 38 языков из Replit, все 100 языков из Quine Relay Юсуке Эндо и многое другое. Вы можете спросить: почему я потратил так много времени на добавление непонятных языков программирования в веб-приложение, которое никто не собирался использовать? Ну, позвольте мне сказать так: это ли самое странное хобби 2020 года, которое вы видели?

Что произошло, когда я рассказал о своем проекте сотрудникам Replit


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

image

Сначала я получил позитивный оклик. Но потом, 30 минут спустя, из ниоткуда, Replit обвинил меня в неэтичном поведении и краже их дизайна:

image

Ни одна из идей, которые я использовал в своем проекте с открытым исходным кодом, не была внутренними дизайнерскими решениями: все они были опубликованы публично в блоге Replit (я знал это, потому что меня попросили написать некоторые из этих постов в блоге во время моей стажировки). И мой проект был больше похож на клон Replit, не больше, чем любой другой веб-сайт на первых нескольких страницах выдачи Google для run python online, большинство из которых выглядят точно так же:

image

Но я подумал, что я что-то пропустил, поэтому запросил подробности:

image

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

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

image

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

image

Я хотел бы отметить две вещи об этом письме:

  • Замечание о commits like this это на самом деле вводит в заблуждение. В моем проекте есть только один коммит, в котором упоминается Replit, и это тот, который я уже показывал вам ранее, начиная с моего третьего дня кодирования, когда я только что добавил все 38 языков, поддерживаемых Replit, прежде чем перейти к 178 другим языкам, которые я хотел добавить.
  • Замечание о том, что я demanding стажер я на самом деле не уверен, что это означает, тем более, что Replit только что пытался завербовать меня ранее в тот же день (см. Скриншот их первого письма). Но я оставлю это в покое, потому что это не имеет отношения к рассматриваемому вопросу.


Что произошло после того, как Replit пригрозил подать на меня в суд


Естественно, я сразу скрыл свой проект, подождал некоторое время, чтобы чувства остыли, и послал Replit извинения. Я подумал, что, возможно, что-то было потеряно по электронной почте, поэтому попросил созвониться:

image

Увы, Replit проигнорировал это письмо, поэтому отправил им еще одно. Этот получил ответ, но не тот, на который я надеялся:

image

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

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

Прав ли Replit


Replit утверждал, что мой проект с открытым исходным кодом был:

  1. клоном Replit
  2. основывался на их коммерческой тайне (внутреннем проектном решении)
  3. неэтичен


Разберем эти утверждения по частям:

  1. Разрабатывая свой проект, делал ли я клон Replit?
  2. Разрабатывая свой проект, я использовал какие-либо коммерческие секреты Replit?
  3. Было ли неэтично с моей стороны разрабатывать проект с открытым исходным кодом, похожий на Replit, после работы на них?


Вопросы 1 и 2 содержат довольно много технических деталей, поэтому я поместил их в отдельный пост. Вот TL;DR по этим вопросам:

  1. Мой проект не более похож на Replit, чем 15 других (коммерческих!) проектов, которые вы можете найти в Google, вбив в поиск run python online или online programming environment.
  2. Любое сходство между моим проектом и Replit можно объяснить, взглянув только на репозитории GitHub и сообщения в блогах, которые были опубликованы в Интернете самим Replit, что очевидно делает не секретными.


Давайте ответим на вопрос 3 здесь:

Вопрос: Было ли неэтично с моей стороны разрабатывать проект с открытым исходным кодом, похожий на Replit, после работы на них?


На мой взгляд, ответ на этот вопрос нет, на то есть ряд причин:

  • Riju полностью некоммерческая организация. В отличие от Replit, я не искал финансирования из какого-либо источника, рекламы, пожертвований, сбора средств, подписки, чего угодно. Я не заинтересован в ведении бизнеса и никогда не хотел, чтобы Riju стал слишком популярным, так как именно я оплачивал счет за сервер.
  • Riju не крал клиентов у Replit. Основываясь на моих аналитических данных, в феврале у Riju было 38 посещений. (Половина из них, вероятно, была моих.) Между тем, у Replit более 7 миллионов пользователей. Очевидно, нет никакого смысла в конкуренции Riju с Replit.
  • Riju также не был построен как конкурент для Replit. Поскольку архитектура была ограничена запуском на одном сервере, любой мог вывести из строя всю систему, просто введя fork bomb и один из моих друзей сделал это, просто чтобы посмотреть, что произойдет. (Система вышла из строя.) Если бы я разрабатывал продукт, чтобы конкурировать с Replit, я, конечно, не выбрал бы архитектуру, которую можно масштабировать до размера игрушечного проекта.
  • Основная ценность Replit не про запуск код онлайн (вы можете сделать это в десятках мест бесплатно). Их конкурентное предложение это функции, которые они предлагают помимо запуска кода. Riju категорически не хватало всех этих функций, включая: наличие учетной записи пользователя, сохранение вашей работы, совместное использование вашей работы, публикацию веб-приложений, постоянные рабочие пространства, дискуссионные форумы, интеграцию с GitHub и так далее.
  • У меня не было злого умысла по отношению к Replit, когда я разрабатывал Riju, и я не пытался ничего скрывать. В качестве доказательства этих утверждений я напоминаю, что я с самого начала опубликовал проект на своем GitHub. Обратите внимание, что Replit узнал о моем проекте, потому что я открыто поделился им с ними по собственной воле, предложив им черпать вдохновение из моей работы.
  • Riju никогда не задумывался как продукт. Он был задуман как личное пространство для игры, или как произведение искусства. В качестве доказательства этого утверждения я предлагаю тот факт, что я потратил десятки часов на добавление таких языков, как Hexagony и SNOBOL, а не на то, чтобы вы могли сохранить свою работу(!).


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

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

Если вы хотите сами решить, кто прав, я с удовольствием выложу все доказательства в открытую (за исключением кода, потому что Replit все еще обещает подать на меня в суд, если я это сделаю). Опять же, у меня есть отдельный пост со всеми техническими деталями. И вы также можете прочитать всю переписку между мной и Replit, в полном и сокращенном виде, на Imgur, зеркало в Internet Archive). (Технические подробности о Replit были отредактированы, а также любое утверждения, которые могут косвенно раскрыть такие детали.)

Зачем Replit это сделал?


Replit заявляет следующие идеалы:



Однако действия Replit в данном случае свидетельствуют о лицемерии:

  • они говорят, что они поощряют open-source разработку, но когда мой проект с открытым исходным обидел их, они закрыли его, впав в предрассудки
  • они утверждают, что помогали open-source сообществу, постили сообщения в блоге, но когда я попытался использовать эти идеи в общественном проекте, они угрожали подать на меня в суд
  • они говорят, что они позволяют легко распространять, перерабатывать, исправлять свои творения, но когда я попытался сделать ремикс Replit под себя, я стал персоной нон-грата


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

image


image


Позже Амджад удалил эти твиты, потому что они оказались противоречивыми:

image


В этих твитах Амджад указывает, что Athens Research было явно вдохновлено другой компанией, и утверждает, что поэтому их следует высмеять и запретить получать финансирование. Кроме того, он говорит: Я придерживаюсь того, что я сказал о copycats в целом, то есть он презирает всех людей, которые, по его мнению, copycat существующие проекты, а не только конкретную компанию в своем твите.

Существует явное сходство между комментариями Амджада по поводу Athens Research и его юридическими угрозами в отношении моего собственного проекта. Он даже использовал в обоих случаях одно и то же слово copycat. В случае с Athens Research Амджад ничего не мог сделать, чтобы выразить свое презрение, кроме как очернить их в Твиттере. Но в моем случае, поскольку я раньше работал в Replit, у Амджада был повод бросить мне обвинения обвинения, которые, если вы не знакомы с фактами, звучат так, как будто они могут быть законными.

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

Категории

Последние комментарии

© 2006-2021, personeltest.ru