...

суббота, 20 июня 2020 г.

[Перевод] Конференция QCon. Овладение хаосом: руководство Netflix для микросервисов. Часть 1

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

Около 15 лет назад моя мачеха, назовем ее Фрэнсис, стала чувствовать боль и слабость во всем теле, ей стало трудно стоять, и когда врачи в больнице немного привели ее в себя, у нее обнаружился паралич рук и ног. Это было ужасное испытание для нее и для нас, как оказалось, диагнозом стал синдром Гийона-Барре. Мне просто любопытно, кто-нибудь из вас слышал о такой болезни? О, довольно много людей! Надеюсь, вы получили эту информацию не из первых рук. Это аутоиммунное заболевание, острый полирадикулоневрит, при котором иммунная система человека поражает собственные периферические нервы.

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

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

Вы можете спросить: «Какое отношение этот рассказ имеет к теме микросервисов»? Так вот, трафик в архитектуре микросервисов являет собой такой же подвиг, как и человеческое дыхание. У вас могут возникать всплески трафика, иметь место враждебная DDoS атака, хакер может внести изменения в вашу рабочую среду, отрезав клиентам доступ. Вот почему сегодня мы собираемся поговорить об архитектуре микросервисов, об их огромных преимуществах, проблема и решениях, которые Netflix обнаружил в течение последних 7 лет борьбы с большим количеством сбоев разного рода.

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

Я Джош Эванс, который начал работу в Netflix в 1999 году, перед этим сделав карьеру в схожей области. Я пришел в проект за месяц до запуска DVD-сервиса, работал инженером, менеджером и был участником интеграции коммерческого продукта и стриминга в существующий DVD-бизнес. В 2009 я попал прямо в «сердце» потокового мультимедиа, возглавив команду Playback Service – службу, которая занимается доставкой DRM, манифестов и записью телеметрии, возвращающейся из устройств пользователей. Я также управлял этой командой во время международного внедрения Netflix, когда наш сервис заработал практически на всех устройствах, воспроизводящих потоковое видео, и участвовал в переносе проекта с дата-центров в облачный сервис. Можно сказать, что последние 3 года были самыми захватывающими. Я возглавлял команду инженеров Operations Engineering, которая фокусируется на высокопрофессиональных операциях контроля скорости, мониторинге и предупреждении сбоев, доставке потокового мультимедиа и широком спектре функций, поиогающих инженерам Netflix успешно эксплуатировать свои собственные облачные сервисы.

Примерно месяц назад я ушел из Netflix и сегодня наверстываю упущенное с книгой Арианны Хаффингтон «The Sleep Revolution: Transforming Your Life, One Night at a Time». Впервые за довольно долгое время я взял отпуск и провожу его с семьей, пытаясь выяснить, как создать баланс между работой и личной жизнью.

Как известно, Netflix является лидером в области абонентского интернет-телевидения, предоставляющим пользователям голливудскую кинопродукцию, инди, локальные передачи, растущий пласт оригинального контента. У нас 86 млн. пользователей в 190 странах, стриминг на 10 языках и поддержка более 1000 типов устройств. Все это работает на основе микросервисов AWS.

Давайте поговорим о микросервисах с абстрактной точки зрения. Начнем с того, какими они не должны быть. Дата-центр Netflix DVD образца 2000 года имел достаточно простую инфраструктуру: аппаратный балансировщик нагрузки, кстати, достаточно дорогой, хост Linux стандартной конфигурации с Apache Reverse Proxy и Tomcat, и всего одно приложение, названное нами Javaweb.

Хост напрямую соединялся через JDBC с базой данных Oracle, которая, в свою очередь, соединялась с другой, биллинговой базой данных Oracle через DB link. Первой проблемой данной архитектуры была монолитность кодовой базы Javaweb, то есть все вкладывалось в одну единственную программную базу, обновляемую еженедельно или раз в 2 недели. Любое внеочередное изменение становилось проблемой, которую было достаточно трудно диагностировать. Например, мы потратили почти неделю, разбираясь с «медленной» памятью. Мы вытягивали куски кода, запускали его, смотрели, что при этом происходит и так далее, поэтому внесение любых изменений занимало много времени. База данных представляла собой еще более строгий монолит – это был один сегмент оборудования, работающй с одной большой базой данных Oracle, которую мы называли «Базой данных магазина». Если она выходила из строя, то из строя выходило абсолютно все. Каждый год с началом периода отпусков мы наращивали аппаратные мощности, чтобы вертикально масштабировать наше приложение.

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

Так что же такое микросервис? Кто-нибудь хочет дать ему определение? Мне нравится, что вы сказали: «привязка к контексту и владение данными». Я приведу вам определение Мартина Фаулера: «Архитектурный стиль микросервисов представляет собой подход к разработке одного приложения как совокупности мелких сервисов, каждый из которых имеет собственный рабочий процесс и осуществляет коммуникацию с помощью легких механизмов, преимущественно в виде API на основе HTTP-ресурсов».

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

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

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

Давайте рассмотрим архитектуру Netflix и то, как она мапируется.

Слева вы видите клиентский сервис – конечный уровень ELB-прокси под названием Zuul, который осуществляет динамическую маршрутизацию. Здесь же расположен NCCP (Netflix Content Control Plane), который поддерживает предыдущие поколения наших устройств и обеспечивает воспроизводящую способность контента. API-шлюз, являющийся ядром нашей современной архитектуры, обращается ко всем другим сервисам для выполнения запросов клиентов.

Справа расположена подсистема среднего уровня Middle Tier и платформа сервиса. Это среда, состоящая из множества компонентов, таких как A/B тестирование, сообщающее результаты пользовательских проверок. Абонентский сервис Subscriber предоставляет развернутую информацию о клиентах, система рекомендаций Recommendations обеспечивает информацию, необходимую для создания списка фильмов, которые будут представлены каждому клиенту.

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

Эти виды объектов формируют экосистему Netflix. Хочу подчеркнуть, что так как микросервисы являются абстракцией, мы склонны думать о них очень упрощенно. На этом слайде показан мой любимый горизонтально масштабируемый микросервис. Прекрасно, что микросервисы кажутся простыми, однако в реальности почти никогда таковыми не являются. В какой-то момент вам потребуются данные, которые нужно вытянуть из базы данных. Это может быть абонентская информация Subscriber или рекомендации Recommendations. Обычно эти данные находятся на уровне хранения Persistence. На схеме показан обычный подход к получению пользовательских данных, который использует не только сервис Netflix.

Service Client начинает предоставлять клиентские библиотеки на основе Java, которые обеспечивают доступ к базовым данным. Наступает момент, когда вам потребуется масштабировать сервис, привлекая к этому EVCashe Client, потому что сервис с разросшейся базой данных недостаточно хорошо справляется с клиентской нагрузкой. EVCache — это распределенное решение для кэширования в памяти, основанное на memcached & spymemcached, интегрированное с инфраструктурой Netflix OSS и AWS EC2. После подключения клиента EVCashe вы должны будете заняться оркестровкой, чтобы, если это хранилище выйдет из строя, вы смогли бы обратиться к Service Client, который вызовет базу данных и вернет ответ обратно. При этом вы должны убедиться в том, что произошло наполнение EVCashe так, что при следующем обращении к нему спустя несколько миллисекунд все будет в порядке.

Эта клиентская библиотека встраивается в клиентское приложение, которое использует микросервис, представляющий собой цельный набор технологий и комплекс конфигураций. Это не простая stateless-структура, которой легко управлять, а сложная комплексная структура.
Итак, рассмотрев основы архитектуры микросервисов, перейдем к проблемам, с которыми мы сталкивались на протяжении последних 7 лет, и их решениям. Я люблю «нездоровую» пищу и мне нравится эта картинка, потому что я думаю, что во многих случаях проблемы и их решения должны быть связаны с нашими привычками, в нашем случае с тем, как мы подходим к микросервисам. Поэтому во многих случаях нашей целью является «организовать здоровое питание и потреблять как можно больше овощей».

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

Первый случай – это внутренние запросы на обслуживание Intra-service requests, например, запросы микросервиса А микросервису В. По аналогии с нервными клетками и нервной проводимостью все идет прекрасно, пока нам не приходится перепрыгивать через бездну — в случае, когда один сервис вызывает другой, существует огромный риск сбоя.

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

Продолжение будет совсем скоро…


Немного рекламы


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас:Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)

Минкомсвязи обновило список бесплатных социально-значимых интернет-ресурсов

В середине июня 2020 года на портале Министерства цифрового развития, связи и массовых коммуникаций Российской Федерации (Минкомсвязи РФ) был опубликован приказ № 280 «О внесении изменений в перечень социально значимых информационных ресурсов в информационно-телекоммуникационной сети «Интернет», утвержденный приказом Минкомсвязи России от 31.03.2020 № 148».

Обновленный список социально значимых сайтов, к которым должен быть предоставлен бесплатный доступ операторами связи РФ даже при нулевом балансе на счету абонента включает в себя 371 интернет-ресурс, ранее список состоял из 391 строки. Минкомсвязи убрало некоторые мало востребованные у широкого круга пользователей ресурсы, а также добавило несколько новых порталов. Вдобавок в новом списке обновлены адреса некоторых телеканалов и радиостанций на «облегченные» версии их сайтов (без потокового видео). Основные позиции, типа двух десятков сервисов «Яндекса» и десятка сервисов Mail.ru Group, остались на своих местах. Минкомсвязи пока не трогало и первые строки списка — там все те же ресурсы, включая соцсети, ЖЖ и «Хабр».
Инициатива Минкомсвязи и операторов связи РФ по безвозмездной услуге доступа пользователям к сайтам из списка проводиться в качестве эксперимента уже почти третий месяц. Срок проведения данной «акции» для абонентов фиксированного домашнего интернета — с 1 апреля 2020 года по 1 июля 2020 года. Вероятно, что далее он будет продлен, так как в Минкомсязи планировали распространить его действие и на абонентов мобильного интернета.

Со стороны провайдеров связи в эксперименте на добровольной основе в настоящее время принимают участие: «Ростелеком», «МТС», «Мегафон», «Билайн» и «Эр-Телеком холдинг» (бренд «Дом.ру»). Эти операторы связи обязуются предоставлять своим абонентам бесплатный доступ к сайтам из списка Минкомсвязи со скоростью не более 10 Мбит/с. Причем, если в договоре с абонентом предусмотрено предоставление услуг по организации связи на скорости более 10 Мбит/с, то эти операторы имеют право ограничить скорость доступа к бесплатных интернет-ресурсам из списка до 10 Мбит/с.

Вдобавок у пользователя должен быть действующий договор с оператором-участником эксперимента, чтобы он мог бесплатно заходить на ресурсы из списка Минкомсвязи. Также пользователь сможет бесплатно посещать не только веб-версии ресурсов из списка, но и заходить на них через мобильные приложения. «Если абонент использует дома Wi-Fi, можно подключить к нему мобильное устройство и зайти в приложение», — пояснили в Минкомсвязи. Пользователям разрешается использовать бесплатные интернет-ресурсы только в личных целях, а не для осуществления предпринимательской деятельности.

Ресурсы, которые убрали из нового списка, по сравнению с его первой редакцией:

  • единая информационная система в сфере закупок zakupki.gov.ru;
  • сервис проведения вебинаров «Вебинар.ру»;
  • система рекомендации контента Lentainform;
  • информационный портал «Wi-fi»;
  • РИА «Sm-news»;
  • ряд сервисов в области здоровья («ДокДок», «Здоровье.ру», Zdorovieinfo и другие) и ряд других интернет-ресурсов.

Ресурсы, которые добавили в список, по сравнению с его первой редакцией:
  • официальный сайт «Победа! 75 лет»;
  • официальный сайт Национальных проектов России;
  • Единая справочная система центров государственных и муниципальных услуг «Мои документы»;
  • официальный сайт Большой российской энциклопедии Минкультуры РФ;
  • сайт президентской библиотеки имени Б. Н. Ельцина.

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

Ресурсы типа телеканалов и радиостанций, адреса которых были обновлены в списке по сравнению с его первой редакцией, получили в начале своего адреса цифру «0» или слово «free», например, сайт «Радио России» 0.radiorus.ru, сайт телерадиокомпании «Россия Культура» — 0.tvkultura.ru, сайт телеканала «Пятница» — free.friday.ru.

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


Если начать на этом сайте просматривать видеоролик, то мы покинем его «бесплатную» часть.

Ранее 31 марта 2020 года Минкомсвязи утвердило первый вариант списка социально значимых сайтов, к которым должен быть предоставлен бесплатный доступ операторами связи РФ даже при нулевом балансе на счету абонента. В нем сразу были «Хабр», «ВКонтакте», ЖЖ, «N+1», но также были и нюансы.

Интересно, когда-нибудь Минкомсвязи будет выкладывать такие списки в GitHub или его российский аналог, когда тот появится, чтобы делать git diff для полного понимания изменений? Или, в ведомстве ждут, когда это будут делать энтузиасты из IT-отрасли.

См. также:

Let's block ads! (Why?)

[Перевод] Высокопроизводительная сборка мусора для C++

Мыуже писали о сборке мусора для JavaScript, о DOM, и о том, как всё это реализовано и оптимизировано в JS-движке V8. Правда, Chromium — это не только JavaScript. Большая часть браузера и движок рендеринга Blink, куда встроен V8, написаны на C++. JavaScript можно использовать для работы с DOM, а на экран изменения выводятся с использованием конвейера рендеринга.

Так как граф C++-объектов, имеющих отношение к DOM, тесно связан с JavaScript-объектами, команда разработчиков Chromium пару лет назад начала использовать для управления памятью, в которой хранятся эти объекты, сборщик мусора, названный Oilpan. Oilpan — это сборщик мусора, написанный на C++ и предназначенный для управления C++-памятью, которая может быть подключена к V8. Управление памятью осуществляется с использованием технологии кросс-компонентной сборки мусора. В рамках этой технологии граф связанных C++/JavaScript-объектов рассматривается как единая куча.

Этот материал является первой публикацией, посвящённой Oilpan. Здесь будет сделан обзор основных принципов, лежащих в основе данного сборщика мусора, а также — C++-API Oilpan. Мы рассмотрим некоторые возможности, поддерживаемые Oilpan, расскажем о том, как устроена работа различных подсистемам сборщика мусора. Тут же мы разберём процесс конкурентного освобождения памяти, занятой объектами.

Самое интересное здесь то, что система Oilpan является частью Blink, но сейчас осуществляется её перевод в V8, где она будет представлена в форме библиотеки для сборки мусора. Цель этого всего заключается в том, чтобы облегчить доступ к C++-механизмам сборки мусора всем тем, кто встраивает в свои платформы движок V8. Кроме того, то, что Oilpan станет библиотекой, позволит пользоваться этой системой абсолютно всем заинтересованным в ней C++-программистам.

Общие сведения


В Oilpan применяется система сборки мусора, в которой используется алгоритм пометок (Mark and Sweep). Этот алгоритм предусматривает разделение процесса сборки мусора на две фазы. Первая фаза заключается в исследовании кучи, и в пометке (mark) «живых» объектов, которые нельзя удалять из памяти. Вторая фаза — это очистка (sweep) памяти кучи, которую занимают ненужные («мёртвые») объекты.

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

В этом плане C++ от JavaScript не отличается. Правда, в отличие от JavaScript-объектов, C++-объекты статически типизированы. Они, в результате, не могут менять собственное представление во время выполнения программы. При работе с C++-объектами с применением Oilpan этот факт учитывается и предоставляется описание указателей на другие объекты (рёбра графа) с использованием паттерна «Посетитель» (Visitor). Базовый паттерн используемый для описания Oilpan-объектов, выглядит так:

class LinkedNode final : public GarbageCollected<LinkedNode> {
 public:
  LinkedNode(LinkedNode* next, int value) : next_(next), value_(value) {}
  void Trace(Visitor* visitor) const {
    visitor->Trace(next_);
  }
 private:
  Member<LinkedNode> next_;
  int value_;
};

LinkedNode* CreateNodes() {
  LinkedNode* first_node = MakeGarbageCollected<LinkedNode>(nullptr, 1);
  LinkedNode* second_node = MakeGarbageCollected<LinkedNode>(first_node, 2);
  return second_node;
}

В этом примере Oilpan управляет LinkedNode, на что указывает то, что класс LinkedNode является наследником GarbageCollected<LinkedNode>. Когда сборщик мусора обрабатывает объект, он находит указатели на другие объекты, вызывая метод объекта Trace. Тип Member — это интеллектуальный указатель, который, с синтаксической точки зрения, похож, например, на std::shared_ptr, который предоставляется Oilpan и используется для поддержания единообразного состояния при обходе графа объектов во время выполнения маркировки объектов. Всё это позволяет Oilpan точно знать о том, где именно находятся указатели, с которыми работает эта система.

Тот, кто внимательно прочитал вышеприведённый код, возможно, заметил (и, может быть, его это испугало) то, что first_node и second_node хранятся в стеке в виде обычных C++-указателей. Oilpan не задействует дополнительные абстракции для работы со стеком. Сборщик мусора, обрабатывая корневые объекты в куче, которой управляет, полагается исключительно на консервативное сканирование стека при поиске указателей. Всё это работает путём пословного перебора стека и благодаря интерпретации слов в виде указателей на сущности, находящиеся в управляемой куче. Это означает, что использование Oilpan не приводит к ухудшению производительности при доступе к объектам, размещаемым в стеке. Вместо этого нагрузка переносится на этап сборки мусора, когда осуществляется консервативное сканирование стека. Oilpan интегрирован в подсистему рендеринга и пытается откладывать запуск процедуры сборки мусора до тех пор, пока система не достигнет состояния, когда в стеке, точно, не будет ничего интересного. Так как работа веб основана на событиях, а выполнение кода производится путём обработки задач в циклах событий, в распоряжении Oilpan оказывается достаточно удобных моментов для запуска сборки мусора.

Oilpan используется в Blink, а это — большая кодовая база, написанная на C++, в которой содержатся значительные объёмы зрелого кода. Благодаря этому Oilpan, кроме прочего, отличается следующими возможностями:

  • Множественное наследование с помощью миксинов и ссылок на подобные миксины (внутренние указатели).
  • Поддержка вызова сборки мусора при выполнении конструкторов.
  • Поддержание объектов из неуправляемой памяти в «живом» состоянии с помощью интеллектуальных указателей Persistent, которые рассматриваются как корневые сущности.
  • Коллекции, представляющие собой последовательные (например — vector) и ассоциативные (например — set и map) контейнеры. Возможность уплотнения данных, лежащих в основе коллекций.
  • Слабые ссылки, слабые функции и эфемерные структур данных.
  • Финализаторы — методы, выполняемые перед удалением из памяти отдельных объектов.

Очистка памяти для C++


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

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

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

Здесь, с точки зрения программиста, нет заранее заданного порядка, в котором вызываются деструкторы, так как механизм перебора, используемый системой очистки памяти, не принимает во внимание порядок создания уничтожаемых объектов. Это накладывает на финализаторы ограничения, в соответствии с которым они не могут обращаться к другим объектам, находящимся в куче. Перед нами встаёт задача, встречающаяся достаточно часто. Она заключается в следующем: есть платформа, которая не поддерживает указание порядка финализации объектов (вроде Java), но при этом для данной платформы нужно писать код, требующий определённого порядка вызова финализаторов. Oilpan использует плагин Clang, который, в статическом режиме, обеспечивает запрет доступа к объектам кучи в процессе уничтожения объектов (это — лишь одна из многих возможностей Clang):

class GCed : public GarbageCollected<GCed> {
 public:
  void DoSomething();
  void Trace(Visitor* visitor) {
    visitor->Trace(other_);
  }
  ~GCed() {
    other_->DoSomething();  // error: Finalizer '~GCed' accesses
                            // potentially finalized field 'other_'.
  }
 private:
  Member<GCed> other_;
};

В этом коде происходит ошибка при попытке обращения к объекту из кучи в ходе уничтожения другого объекта.

Если вас интересует вопрос уничтожения объектов, то знайте, что Oilpan даёт в распоряжение программиста коллбэки, вызываемые перед финализатором. Это позволяет реализовывать сложные схемы уничтожения объектов, когда объекту, перед уничтожением, нужен доступ к другим объектам. Подобные коллбэки создают немалую дополнительную нагрузку на систему в ходе сборки мусора. Эта нагрузка больше той, которую способны создать деструкторы. Поэтому такие коллбэки используются в Blink относительно редко.

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


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

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

В самом начале в Oilpan использовался механизм очистки памяти, реализованный по схеме «stop-the-world». Это означало, что выполнение приложения в главном потоке приостанавливалось во время проведения процедуры очистки памяти.


Приостановка выполнения кода в ходе очистки памяти

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


Инкрементальная очистка памяти

При использовании инкрементального подхода фазы пометки и уничтожения объектов отделены друг от друга. При этом процедура очистки памяти разбита на несколько частей, представленных отдельными задачами, выполняющимися в главном потоке. В лучшем случае подобные задачи выполняются только во время простоя системы, что позволяет избежать их конфликта с задачами, представляющими обычные механизмы приложения. Внутренние механизмы сборщика мусора разделяют одну большую задачу по очистке памяти на небольшие задачи, это разделение основано на понятии «страница». Страницы могут пребывать в двух состояниях. Одни страницы находятся в состоянии ожидания очистки (to-be-swept), а другие уже являются очищенными (already-swept). Механизмы выделения памяти учитывают только страницы, которые уже очищены, и пополняют локальные буферы выделения памяти (Local Allocation Buffer, LAB) из списка свободной памяти, в котором хранится список доступных фрагментов памяти. Для того чтобы получить память, сведения о которой есть в списке свободной памяти, приложение сначала попытается найти память, которая относится к уже очищенным страницам. Затем приложение попытается помочь системе в обработке страниц, которые ожидают очистки, воспользовавшись там, где оно пытается выделить память, системой очистки памяти. Новая память у операционной системы будет запрошена лишь в том случае, если вышеприведённые действия не привели к тому, что приложение получило нужную ему память.

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

  • Система очистки памяти обрабатывает только память «мёртвых» объектов, которые, по определению, недостижимы из приложения.
  • Приложение выделяет память, используя только ту память, которая принадлежит очищенным страницам. Такие страницы уже не интересуют систему очистки памяти.

Оба правила позволяют обеспечить то, что несколько сущностей не станут бороться друг с другом за один и тот же объект и его память. К сожалению, C++ сильно полагается на деструкторы, которые реализованы как финализаторы. Oilpan запускает финализаторы в главном потоке для того чтобы помочь разработчикам и исключить гонку данных в самом коде приложения. Для решения этой проблемы Oilpan планирует отложенное выполнение финализатора объекта в главном потоке. А если точнее, то всякий раз, когда конкурентная система очистки памяти сталкивается с объектом, у которого есть финализатор (деструктор), она помещает его в очередь финализации, которая будет обработана на особом этапе финализации. Код на этом этапе всегда выполняется в главном потоке, в котором, кроме того, выполняется и код приложения. Вот как, в общих чертах, выглядит схема конкурентной очистки памяти.

Конкурентная очистка памяти с использованием фоновых задач

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

Результаты


Механизм фоновой очистки памяти был выпущен в сборке Chrome M78. Наш фреймворк для тестирования Chrome в условиях, приближенных к реальным, показал уменьшение времени, уходящего в главном потоке на операции, связанные с очисткой памяти, на 25-50% (в среднем — на 42%). Ниже показаны результаты испытаний некоторых популярных веб-проектов.

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

То время, которое всё ещё уходит в главном потоке на очистку памяти, требуется для выполнения финализаторов. В настоящее время идёт работа по оптимизации финализаторов для типов объектов, которые часто используются в Blink. Примечательно здесь то, что все такие оптимизации проводятся за пределами кода системы очистки памяти, так как эта система, в её текущем виде, автоматически подстраивается под ситуацию при отсутствии финализаторов.

Сталкивались ли вы с проблемами производительности веб-проектов, которые вызваны системой сборки мусора Chrome?

Let's block ads! (Why?)

[Из песочницы] Простой state manager для простой работы

image



В фронтэенде многие предпочитают (или хотели бы) использовать лёгкие и простые пакеты. Кроме того, на текущий момент использовать средства управления состоянием — это стандарт. Я постарался объединить эти принципы и сделать новый state mangerstatirjs. Идеологической основой послужили: rematch, redux.

Дать краткий обзор основному функционалу statirjs. Без сравнений и лишней теории.

Основной областью применения statirjs являются малые/личные проекты, которым не требуются: многочисленные внешние зависимости, повышенный теоретический порог для использования средства управления состоянием.


  1. желание иметь простой redux как rematch;
  2. перенасыщенность выделенными сущностями в reduxстатья;
  3. стремление к отсутствию внешних зависимостей;
  4. необходимость независимости платформы для её развития;
  5. стремление к малому размеру;

1. он мало весит


  • ядро ~2.2 KB
  • коннектор к react ~0.7 KB

2. использует компонентный подход


  • весь store разбит на небольшие фрагменты — forme (читай "форма")
  • в каждой forme описывается и состояние и функции изменения этого состояния

3. удобно и легко расширяется


  • middlewares почти как у redux, только проще
  • upgrades почти как middlewares, только изменяют сам store

4. почти не требует писать бойлерплейтов


5. redux-devtool из коробки


6. работает с react через хуки


Примечание: к относительным плюсам можно отнести переиспользование популярного словоря терминов из redux. также statirjs написан на typescript и неплохо выводит типы как для forme так и для store.

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

import { createForme, initStore } from "@statirjs/core";

const counter = createForme(
  {
    count: 0,
  },
  () => ({
    actions: {
      increment: (state) => ({ count: state.count + 1 }),
    },
  })
);

const store = initStore({
  formes: {
    counter,
  },
});

Что здесь происходит?


  1. в фабрику createForme передаётся начальное состояние и функция;
  2. второй аргумент createForme (функция) возвращает объект с actions;
  3. в actions определена функция increment;
  4. increment получает состояние forme counter до вызова и после выполнения возвращает новое, следующее состояние;
  5. созданный counter передаётся в initStore для создания стора;

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

const initState = {
  count: 0,
};

const actions = {
  increment: (state) => ({ count: state.count + 1 }),
};

const builder = () => ({ actions });

const counter = createForme(initState, builder);

const store = initStore({
  formes: {
    counter,
  },
});


Запоминаем №1: statirjs описывает действия как простые, чистые функции



Представим что нужно декрементировать значение. С statirjs это будет быстро и просто:

const counter = createForme(
  {
    count: 0,
  },
  () => ({
    actions: {
      increment: (state) => ({ count: state.count + 1 }),
+     decrement: (state) => ({ count: state.count - 1 }),
    },
  })
);

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

Payload в action следует передавать как параметр:

const summer = createForme(
  {
    sum: 0,
  },
  () => ({
    actions: {
      add: (state, payload) => ({ count: state.sum + payload }),
    },
  })
);

const store = initStore({
  formes: {
    counter,
    summer,
  },
});

Однозначно да. В forme есть поле actions и в нём синхронные действия. Чтобы вызвать их нужно лишь указать через dispatch имя forme и action'а:

store.dispatch.counter.increment();

store.dispatch.summer.add(100);

Теперь состояние стора обновилось и будет следующим:

store.state = {
  counter: {
    count: 1,
  },
  summer: {
    sum: 100,
  },
};

Mожно также присвоить increment переменной и вызывать как обычную функцию. Внутри statirjs работает на замыканиях, а не на контексте:

const increment = store.dispatch.counter.increment;

increment();

При использовании react доступ к dispatch'у осуществляется через хук:

import { useDispatch } from "@statirjs/react";

const increment = useDispatch((dispatch) => dispatch.counter.increment);


Запоминаем №2: экшены разбиты на компоненты, но есть возможность получить всё состояние как у redux

Запоминаем №3: statirjs активно использует замыкания и позволяет манипулировать экшенами как если бы они были простыми функциями

Запоминаем №4: statirjs поддерживает хуки



За эффекты отвечает поле pipes, которое как actions, но чуточку сложнее:

const asyncCounter = createForme(
  {
    count: 0,
  },
  () => ({
    pipes: {
      asyncIncrement: {
        push: async (state) => ({ count: state.count + 1 }),
      },
    },
  })
);

const store = initStore({
  formes: {
    asyncCounter,
  },
});

store.dispatch.asyncCounter.asyncIncrement();

Что здесь происходит?


  1. в фабрику createForme передаётся начальное состояние и функция;
  2. второй аргумент createForme (функция) возвращает объект с pipes;
  3. в pipes определен объект asyncIncrement;
  4. asyncIncrement содержит функцию push с небольшой задержкой;
  5. созданный asyncCounter передаётся в initStore для создания стора;
  6. asyncIncrement вызывается через dispatch для асинхронного обновления кода;


Запоминаем №5: эффекты можно писать с использованием стандартного async/await



Любая pipe как и action работает через замыкание и на практике является простой асинхронной функцией с соответствующей типизацией:

const increment = store.dispatch.asyncCounter.asyncIncrement;

await increment();

Во-первых actions нужны только для синхронных действий, pipes наоборот. во-вторых, на самом деле, каждая pipe разделена на шаги push, core, done, fail для сторогсти контролирования этапов асинхронного действия:

const asyncCounter = createForme(
  {
    count: 0,
    isLoading: false,
  },
  () => ({
    pipes: {
      asyncIncrement: {
        push(state) {
          return { ...state, isLoading: true };
        },
        async core(state) {
          await someDelay();
          return state.count + 1;
        },
        done(state, payload, data) {
          return {
            count: data,
            isLoading: false,
          };
        },
        fail(state) {
          return { ...state, isLoading: false },
        },
      },
    },
  })
);

Разделение следующее: push вызывается первым (здесь могут располагаться подготовительные действия), core для выполнения основной работы pipe'ы, done выполняется при успехе, fail при ошибке. Разделение осуществляется за счёт использования try catch внутри pipe.



Запоминаем №6: pipe разделена на шаги

Запоминаем №7: pipe из коробки ловит ошибки




Взаимодействие formes

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

const asyncCounter = createForme(
  {},
+  (dispatch) => ({
    pipes: {
      asyncIncrement: {
        push() {
          dispatch.counter.increment();
        }
      },
    },
  })
);

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


Запоминаем №8: все formes связанны через dispatch объект




Как отслеживать изменения?

Если используете react, то через @statirjs/react hooks:

import { useSelect } from "@statirjs/react";

const count = useSelect((rootState) => rootState.counter.count);

Если используете только @statirjs/core, то подписку. Подписка вызывается на action, pipe:push, pipe:done и pipe:fail:

store.subscribe(console.log);

Получаем cледующие удобности и плюсы от использования statirjs:


  1. малый вес;
  2. actions — это чистые функции;
  3. используется компонентный подход;
  4. можно получать общее состояние как у redux;
  5. части frome можно переиспользовать;
  6. statirjs активно использует замыкания и позволяет манипулировать экшенами как если бы они были простыми функциями;
  7. redux-devtool из коробки;
  8. statirjs поддерживает хуки;
  9. эффекты можно писать с использованием стандартного async/await;
  10. pipe разделена на шаги;
  11. pipe из коробки ловит ошибки;
  12. все formes связанны через dispatch;

При разработке statirjs я видел его как простой инстумент для простой работы. очевидно нет никаких "killer feature", но развивается идея простоты rematch. Уже готовы пакеты core, react, persist и в будущем планируется поддерживать vue и angular. Statirjs это удобный инструмент (думается мне), но также хорошее место чтобы начать контрибьютить в open source.

Имеется страница с документацией

Let's block ads! (Why?)

[Из песочницы] ДНК тесты — чувствуете ли вы горечь от фенилтиокарбамида?

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

Давайте рассмотрим что-нибудь не страшное вроде болезни Альцгеймера а безобидное вроде «возможность чувствовать горький вкус от некоторых веществ».

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

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

image
Схема работы мембранного рецептора

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

Как мы чувствуем вкус?


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

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

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

В ходе исследований вкуса, было предложено довольно много различных белков — кандидатов во вкусовые рецепторы. Таблицу с такими кандидатами можно посмотреть, например, в статье 2007 года (таблицы 1 и 2 приложения). Тем не менее, этот список, скорее всего, не окончательный и новые кандидаты в рецепторы будут регулярно пересматриваться.

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

Рецепторы и ДНК


Какая связь между большими белками рецепторами и ДНК? Скорее всего, для большинства людей, изучавших биологию в школе это элементарно, но я все же повторю. Связь эта выражена в "Центральной догме молекулярной биологии". Клетки «читают» код ДНК, чтобы синтезировать белки — которые представляют большие молекулы, состоящие из аминокислот. Вообще весь процесс идет через промежуточную молекулу РНК, но опустим детали в этой статье. Итак код ДНК состоит из четырех букв — A, T, G и C. Чтобы синтезировать белки клетки читают эти буквы по три за раз. Комбинации из трех букв подряд называются триплетами. Читая каждый триплет клетка добавляет к белку какую-то из 20 аминокислот. Какой триплет кодирует какую аминокислоту показано в таблице.

image
Таблица как кодируются аминокислоты

За эту таблицу ее авторы получили Нобелевскую премию в 1968 году и потратили несколько лет на ее создание. Здесь правда триплеты указаны в коде РНК, а не ДНК, в которой буква T заменена на букву U, но сути это не меняет. Таким образом рецепторы это белки, которые тело построило на основе какого-то участка ДНК, называемого геном, и последовательность аминокислот, а также что за аминокислоты находятся в этом белке определено последовательностью нуклеотидов (букв A, T, G или C) в ДНК на основе правил из таблицы выше.

Представим, что у нас есть последовательность РНК: AUG-СCA-CGU-… Прочитав ее клетка синтезирует белок Метионин-Пролин-Аргинин-… Количество аминокислот в белках обычно исчисляется сотнями или тысячами единиц. Например, белок TAS2R38, являющийся как раз рецептором для горького вкуса имеет 333 аминокислоты в своем составе.

Теперь давайте представим, что в ДНК произошла мутация и во втором триплете первая C поменялась на G и итоговая комбинация стала AUG-GCA-CGU-… или в аминокислотах: Метионин-Аланин-Аргинин… Теперь, читая нашу последовательность клетка начнет синтезировать уже немного другой белок, у которого будут другие свойства.

Именно такая мутация может возникнуть в гене TAS2R38, кодирующем белок — рецептор горького вкуса как ни странно тоже называющийся TAS2R38. Аббревиатура P49A значит, что в аминокислоте номер 49 белка TAS2R38 произошла замена пролина(P) на аланин(A) — у каждой аминокислоты есть краткие обозначения из трех и одной буквы.

Теперь немного информации про белок TAS2R38. В 1931 году сотрудник компании DuPont Артур Фокс случайно просыпал пыль состоящую из вещества фенилтиокарбамид (также PTC или PTU). Его коллега начал жаловаться на горький вкус от облака пыли PTC, хотя сам Фокс ничего не чувствовал. По какой-то причине Фокс начал тестировать других людей на восприятие вкуса PTC и обнаружил что это свойство передается по наследству. Как пишет википедия, восприятие вкуса PTC раньше использовалось для тестов на отцовство. Позже было также выяснено, что ген, ответственный за восприятие вкуса PTC находится на 7й хромосоме и в 2003 было установлено, что этим геном является TAS2R38. В 2005 году были найдены отдельные мутации в гене, которые приводили к отсутствию чувствительности. Подробнее об истории TAS2R38 можно почитать в статье 2011 года.

Что же за замены аминокислот могут возникнуть в TAS2R38 и привести к неспособности чувствовать горький вкус? Ответ P49A, A262V и V296I — вы ведь уже знаете как их интерпретировать, правда? Детальнее доступно в той же статье 2011 года.

Как это применимо к ДНК тестам?


Итак, вы сдали ДНК тест, и хотели бы узнать, чувствуете вы горечь от фенилтиокарбамида или нет. Это можно сделать несколькими путями. Во-первых, многие тесты по умолчанию дадут вам информацию. Например, при покупке варианта с опцией здоровья, 23andme предоставит отчет на основе замены P49A, ancestryDNA за дополнительные деньги также даст отчет по TAS2R38 — правда не знаю на основе какой именно замены. Отечественные генотек и атлас, скорее всего, также дадут вам эту информацию из коробки — я правда не нашел именно восприятие горького вкуса в примерах отчетов на их сайтах, может это как-то по-другому называется.

Предположим, вы хотите сами посмотреть есть ли у вас упомянутые в статье замены. Для этого откроем статью 2011 года и внимательно посмотрим на график 4:

image
Изображения под номером 4 из статьи 2011 года A — манхэттенский график, C — зависимость между порогом чувствительности вещества PROP и генотипом в rs10246939

Тут на рисунке А изображен манхэттенский график, на котором по горизонтальной оси отложены различные маркеры, сгруппированные по хромосомам. Помните, в статье я писал, что замена C на G изменяет аминокислоту в белке? Так вот маркер относится к обозначению места где C может поменяться на G и в рассмотренном выше случае маркер обозначается rs713598. По вертикальной оси рисунка А отложен логарифм от p-значения и все это умножено на -1. Генетики ищут такие маркеры, для которых p-значение (может быть от 0 до 1) очень мало. Поэтому если взять логарифм от очень маленького числа, близкого к 0 и умножить его на -1 получится большое число, которое сразу видно на графике. И тут видно, что самые маленькие p-значения были найдены для маркеров обозначенных rs713598 и rs10246939. В статье также приведено, что эти маркеры отвечают за замены P49A и V296I соответственно.

Маленькое p-значение для маркера говорит, что между тем, что находится в данном маркере и восприятием горького вкуса действительно есть взаимосвязь. Теперь нам известно как минимум два маркера, которые ассоциируются, согласно исследованиям с восприятием горечи от пропилтиоурацила — также PROP (обладает теми же свойствами в плане горечи что и фенилтиокарбамид, но безопаснее). Остается вопрос какая буква в маркере ассоциируется с восприятием горечи, а какая нет. Это также можно прочесть в статье 2011 года. Кроме этого, есть еще рисунок C под манхэттенским графиком. Здесь по горизонтальной оси отложены возможные буквы в маркере rs10246939, а по вертикальной оси порог чувствительности PROP. То есть по вертикальной оси отложена минимальная концентрация при которой люди могли чувствовать горечь от PROP. Опять же от концентрации взят логарифм чтобы график был «красивее».

И тут оказывается, что люди с CC (я думаю там опечатка, должно быть CC а не CG, но специально оставил как в оригинале), чувствуют горечь от PROP, когда вещество имеет меньшую концентрацию, чем люди с TT в rs10246939. Аналогично можно выяснить, что для rs713598 хотя бы одна G даст возможность чувствовать горечь.

Вооружившись этими знаниями, вы можете скачать raw data с сайта компании, где вы заказали тест. Далее, распаковав zip архив (обычно файл заархивирован) и открыв файл любой удобной программой, вы можете поискать rs10246939 и rs713598. В моем случае rs713598 — CG и rs10246939 — СС, что значит, что я скорее почувствую вкус горечи от PROP. Пока я это не проверял.

Вы также можете загрузить свои данные на https://promethease.com/, https://genomelink.io/, https://www.xcode.life/ и эти сервисы сформируют вам отчет по вашим свойствам и не придется искать маркеры в своем файле самостоятельно. Сервисов по расшифровке ДНК сейчас довольно много, https://genotek.ru/ сейчас предлагает такие услуги, довольно новой платформой в плане расшифровки является https://ru.bezoder.com. Там вы сами можете создавать шаблоны для анализа своего ДНК и пользоваться шаблонами других.

Как видите, в целом поиск маркеров и свойств это поиск и интерпретация научной литературы.

Мы рассмотрели любопытную связь генетики и реального свойства организма. Однако, возможно, восприятие вкуса горечи это не самое увлекательное свойство, которое может раскрыть генетический тест. Количество маркеров в индивидуальных ДНК тестах превышает 600 тысяч и каждый из них может указать на менее безобидные особенности вашего организма как склонность к онкологическим заболеваниям, болезни Альцгеймера и многому другому. Более того, некоторые маркеры отвечают сразу за несколько свойств организма, т.к. одинаковые белки могут выполнять разные функции в различных клетках организма. Например, недавно стало известно, что версии белков APOE, ассоциирующиеся с возникновением болезни Альцгеймера также влияют на тяжесть протекание Covid 19. Возможно, белок APOE синтезируется клетками не только в голове но и где-то в дыхательной системе.

Let's block ads! (Why?)

Как дочка Ростех-а, продавшая десятки тысяч камер в школы, делает «российские» камеры c дырявой китайской прошивкой

Всем привет!

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

О том, как мы начинали я писал в статье.

С тех пор многое изменилось — мы стали поддерживать еще больше чипсетов, например, таких как mstar и fullhan, познакомились и подружились с большим количеством как иностранных, так и отечественных производителей IP камер.

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


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

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

Но, однако, сегодня, читая новости в фейсбуке, и попивая утренний кофе — чуть не разлил его, прочитав новость о том, что дочка Ростеха, компания ЭЛВИС-НеоТек поставит десятки тысяч камер в школы.

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

Итак, давайте по фактам: К нам принесли камеру «VisorJet Smart Bullet», из отечественного — в ней была коробка и листик приемки ОТК (:-D), внутри оказалась типовая китайская модульная камера на базе чипсета Hisilicon 3516.

После того, как сделали дамп прошивки, очень быстро стало понятно, что реальный производитель камеры и прошивки — некая контора «Brovotech», которая специализируется на поставке IP камер с кастомизацией. Отдельно, возмутило второе название этой конторы «ezvis.net» — топорная подделка названия компания Ezviz — b2c дочки одного из мировых лидеров Hikvision. Мда, все в лучших традициях Abibas и Nokla.

В прошивке все оказалось ± стандартно, незатейливо по китайски:

Файлы в прошивке

├── alarm.pcm
├── bvipcam
├── cmdserv
├── daemonserv
├── detectsns
├── font
├── lib

│   └── libsony_imx326.so
├── reset
├── start_ipcam.sh
├── sysconf
│   ├── 600106000-BV-H0600.conf
│   ├── 600106001-BV-H0601.conf

│   └── 600108014-BV-H0814.conf
├── system.conf -> /mnt/nand/system.conf
├── version.conf
└── www

├── logo
│   ├── elvis.jpg
│   └── qrcode.png


От отечественного производителя видим файлик elvis.jpg — неплохо, но с ошибкой в названии фирмы — судя по сайту они называются «elvees».

За работу камеры отвечает bvipcam — основное приложение, которое работает с A/V потоками и является сетевым сервером.

Теперь про дыры и бэкдоры:

1. В bvipcam очень просто находится бэкдор: strcmp (password,«20140808») && strcmp (username,«bvtech»). Он не отключаемый, и работает на не отключаемом порту 6000

2. В /etc/shadow статический пароль root и открытый порт telnet. Не самый мощный макбук брутфорснул этот пароль меньше чем за час.

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

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

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

По итогам обследования, мы написали в elvees neotek заключение, со всеми обнаруженными фактами. В ответ получили от ЭЛВИС-НеоТек шикарный ответ: «Прошивка для наших камер базируется на Linux SDK от производителя контроллеров HiSilicon. Т.к. эти контроллеры используются в наших камерах. При этом поверх данного SDK разработано наше собственное ПО, отвечающее за взаимодействие камеры по протоколам обмена данными. Специалистам, проводившим тестирование, было затруднительно выяснить это, так как мы не предоставляли root-прав к камерам.

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

Естественно, исходников никто не показал.

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

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

Но, увы, простейшее сопоставление инструкции по эксплуатации «российской» камеры инструкциям в интернете дало результат.

Итак, встречайте оригинал: камеры не известного вендора milesight.

Чем этот milesight лучше brovotech? С точки зрения безопасности скорее всего — ничем: дешевое в закупке решение.

Достаточно взглянуть на скриншот Web интерфейса камер milesight и ЭЛВИС-НеоТек — не останется никаких сомнений: «российские» камеры VisorJet — клон камер milesight. Совпадают не только картинки web интерфейсов, а и дефолтный IP 192.168.5.190, и чертежи камер. Даже дефолтный пароль похож: ms1234 vs en123456 у клона.

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

Let's block ads! (Why?)

Новый эксперимент Google — Keen, клон Pinterest на машинном обучении

18 июня 2020 года Google без особого афиширования запустила новый сервис — социальную сеть под названием Keen. Фактически, это аналог социального сервиса Pinterest, только с ИИ.

Разработкой и дизайном сервиса Keen занималась команда специалистов под названием Area 120, это внутренний инкубатор Google, который создает экспериментальные приложения и сервисы. Механизм машинного обучения для Keen был разработан и интегрирован в сервис с помощью команды специалистов PAIR (People + AI Research). В PAIR разработчики реализуют инициативы Google по организации совместной работы пользователей с ИИ в максимальном числе отраслей и сфер применения через совместную работу.
Таким образом, в социальной сети Keen именно искусственный интеллект ищет для пользователя интересный контент на основе заранее выбранной человеком определенной тематики и пожеланий. Разработчики нового экспериментального сервиса пояснили, что так Google стремится создать альтернативу «бездумному» просмотру онлайн-каналов и предоставлять пользователю только нужную ему информацию.

Для регистрации в сервисе Keen пользователю необходима учетная запись Google. Вдобавок команда Area 120 опубликовала в магазине Google Play мобильное приложение Keen для Android. Правда разработчики указали в описании, что это экспериментальное приложение, упрощающее использование онлайн-портала Kenn (staykeen.com) на смартфоне, а не полноценное приложение для этого сервиса.


Ранее в феврале 2020 года Facebook (а точнее ее команда экспериментаторов NPE Team) создала приложение Hobbi, которое тоже сделано по типу Pinterest. В Hobbi можно сохранять фотографии и видео и создавать коллекции по интересам — например, делить их на разделы, посвященные кулинарии, рукоделию, фитнесу и другим занятиям. Так же в Hobbi пользователь сможет отслеживать собственный прогресс.
См. также:

Let's block ads! (Why?)

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

image

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


Сам файл Excel содержит макросы, которые при включении устанавливают троян GraceWire, который ворует конфиденциальную информацию, например, пароли. Атаки инициировала группа Chimborazo, которую исследователи Microsoft отслеживают с января.

Ранее эта группа распространяла файл Excel во вложениях, включенных в фишинговые сообщения, а затем — через встроенные веб-ссылки. Однако в последние недели группа изменила стратегию и начала рассылать фишинговые письма, которые содержит ссылки на сайты перенаправителей (обычно это сайты, которые ранее были взломаны). В других случаях к электронным письмам прикрепляется HTML-код, содержащий вредоносный тег iframe.

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


В Microsoft окрестили новую кампанию Chimborazo Dudear.

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

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


Не исключено, что CAPTCHA, обнаруженная Microsoft, может быть поддельной reCAPTCHA.
См. также:

Let's block ads! (Why?)

Как устроена индустрия лицензирования кино? Почему Okko так лагает на PS4?

9 июня в нашем инстаграм-аккаунте прошел прямой эфир с CTO Okko Алексеем Голубевым и вышла настоящая прожарка — 99% вопросов составила критика сервиса.
Из-за этого получился скорее более продуктовый рассказ, чем технический, но по сложившейся традиции, мы выкладываем все расшифровки и записи эфиров.
***


Меня зовут Алексей, я – технический директор компании Okko. Вопросов накопилось много, я постараюсь ответить на все.

Когда в онлайн-кинотеатрах будут идти премьеры параллельно с обычными кинотеатрами? Индустрия до сих пор не готова?


Давайте расскажу, как в принципе работает индустрия лицензирование кино.

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

Раньше следующим этапом было открытие прав на продажу DVD/Blu-ray, и только после этого открывались права на цифровой показ. Несколько лет назад картина начала меняться под давлением сервисов, предоставляющих услуги цифрового показа – Netflix, в первую очередь. Мы, конечно, тоже вносим свой вклад. Каждая большая студия проводит аудит онлайн-сервисов на предмет соответствия стандартам безопасности, и я стараюсь добавлять в переговоры тему сдвига релизного «окна». Сейчас ситуация уже сильно изменилась: например, фильмы русских студий часто поступают в онлайн-кинотеатры еще до конца проката в физических кинотеатрах.

Кстати, на наш рынок повлияла пандемия: те же «Тролли» поступили в физический прокат за неделю до закрытия всех кинотеатров, а после закрытия – сразу же появились на онлайн-площадках. Индустрия двигается вперед, но крупные компании – Sony, Fox и прочие Paramount – довольно консервативны сами по себе, и их точка зрения меняется медленно.

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

Когда у пользователя будет возможность вернуть деньги за неинтересный фильм? Например, с привязкой размера возвращаемых средств к процентам просмотра фильма.
Это интересная фича, и многие онлайн-кинотеатры о ней думают. Правда, надо понимать: за подобный прерванный просмотр фильма (обычно – начиная с 20%) правообладатель все равно должен получить средства целиком, и в таком случае их должен будет заплатить кинотеатр. Может быть, такие затраты можно будет причислить к маркетингу. Общая цена фильма состоит из минимальной витринной цены (её тоже может устанавливать правообладатель), отчислений за подписку/продажу и отчислений вендорам платформ (например, Samsung SmartTV) – то есть, за каждый просматриваемый фильм кинотеатр обязан заплатить как кинокомпании, так и вендору платформы.

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


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

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

Можно ли в Okko получить копию фильма без DRM, без дубляжа, с оригинальной дорожкой и качеством?


Исходник может занимать терабайт, например – поэтому истинного исходного качества точно не может быть. Мы готовим контент для доставки по Интернету, режем на несколько разных битрейтов, кодируем 264/265 кодеком и выкладываем на разные платформы в разных типах стримов с поддержкой адаптивного битрейта. То есть, пока вы смотрите на мобильном приложении через WiFi, битрейт подстраивается под скорость подключения около 6 Мбит/с, а если вы выносите телефон за его пределы, качество падает до SD. Без DRM – нельзя, это запрещено договорами с правообладателями. Хотя некоторые фильмы защищать не надо – в основном, те, которые считаются частью мирового наследия. Фильмы с оригинальной дорожкой у нас есть, но я не могу сказать точно, сколько их.

Работаете архитектором и CTO одновременно?


Да. Я рос в Okko от разработчика на Android до full stack, back end, архитектора, системного архитектора и CTO. Мне нравится заниматься архитектурными вещами. Я стал CTO 3 года назад, и это развязало мне руки: теперь я могу комфортно и быстро продвигать новые технологии, которые я сам вместе с нашей командой архитекторов считаю нужными, необходимыми, перспективными.

Сейчас я продолжаю решать архитектурные вопросы по новым кускам системы и по расширению старых кусков. Техническая команда Okko еще год назад составляла не больше 40 человек, и на каждую платформу приходилось немного (мы работаем с мобильными Apple и Android, смарт-ТВ, Web и так далее); при том, что для работы с клиентами и тестирования нужно 10-15 человек, а также люди нужны на DevOps, поддержку облачной инфраструктуры, разработку серверного ПО и различных внутренних (backoffice) инструментов, не видных пользователю. На малое количество людей приходится большая плотность знаний – и для того, чтобы правильно развивать систему дальше, нужно правильно привлекать эти знания. Я стараюсь максимально делиться своими собственными знаниями.

Разделяются ли эти роли?


Формально да. Отдельные документы пишу как архитектор, другие – как CTO. В разных компаниях в понятие роли CTO вкладываются различные смыслы; где-то он больше «технический», где-то – «директор». Я думаю, в более крупных компаниях обычно главенствует вторая составляющая – там больше организационно-бумажно-процессной нагрузки. Наша культура развития больше напоминает культуру стартапа: я до начала этого года явно был главным образом «техническим». Сейчас у нас появились крупные акционеры, типа Сбербанка, и с ними пришло много организационной работы, но пока удается справляться с ней минимальными усилиями.

Будет ли сравнение Okko с аналогичными сервисами?


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

Зачем мне платить за вашу якобы премиум-подписку? У ivi есть годовые подписки, они гораздо дешевле


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

Решил посмотреть фильм – оказалось, что в подписку не входит, нужно платить дополнительную сумму; сколько – непонятно, без регистрации не узнать


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

Я вот вначале подумал что въедливая, умная и капризная аудитория Хабра не входит в целевую группу Okko, потом сообразил, что как раз таки входит, а нецелевая группа смотрит обычное ТВ, а не шарится по стриминговым сервисам.
Если бы Okko пошло по пути тех же трекеров в плане предоставления контента – то есть, с возможностью выбора нюансов, озвучки, качества – то результат мог бы быть хорошим, за удобство доступа вполне можно было бы платить. Почему вы так не делаете?


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

Почему в разделе «аниме» 50 фильмов, и только один от Миядзаки?


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

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


Киноклуб – это совместный просмотр? У нас есть такие идеи, сейчас идет исследование — студенческий рисерч-проект, чтобы попробовать. А театральные и режиссерские версии уже есть, если их поискать.

Почему в России нет своего Netflix, который бы продюсировал кино?


На самом деле и ivi, и Okko уже работают над собственным продакшеном. У нас в сервисе есть сериалы, которые были спродюсированы и сняты полностью в Okko Studios. Это будет раскручиваться дальше – в эту игру начинают играть многие, и собственный продакшен в будущем должен стать главным отличием цифровых кинотеатров друг от друга.

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

Реально ли иметь сервис, где будут ВСЕ любимые фильмы? Не хочу 10 подписок


Пока придется иметь много подписок. На Западе сейчас обычное дело – подписываться на 2-3 сервиса, или более. Издателям ведь мало ваших денег за билет — они хотят отчислений от подписок каждого цифрового кинотеатра, для этого используются эксклюзивы и ротации. Такова реальность — я называю это звериный оскал капитализма.

Почему нельзя сделать подписку как у Netflix, в которую входит все?


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

Некоторые кинотеатры требуют несколько подписок одновременно: для основного контента и для сериалов от HBO, например. Почему?
Это история, которая диктуется правообладателями — в противном случае они вообще не дадут контент. Тут мы сами в ловушке.

Почему даже в премиум-подписку не входят все фильмы?


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

Откуда берутся цены на фильмы?


Оттуда же, из контрактов. Плюс затраты на маркетинг и другие наценки.

Подписка и так платная, почему посреди сериала реклама какой-то мыльной оперы? Это решение правообладателя?


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

Кстати, насчет «Хоббита». Он не новинка, но он входит в бэк-каталог. Каталог ротируется большими студиями; должны быть «окна», чтобы зрителями постоянно предлагались разные фильмы, чтобы всякому старью давать больше ценности.

Почему такая высокая цена? Оптимум с ширпотребом – 399, премиум в два раза дороже – 799, и то отдельные фильмы приходится докупать


Это больно, но я не знаю что на это сказать — такое ценообразование.

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

В США люди боятся качать торренты, потому что считают, что их могут поймать – то есть, у них такого выбора нет. Это вопрос менталитета. Меня знакомые американцы иногда просят скачать что-то с трекеров и привезти на диске.

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


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

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

Почему некоторые сезоны сериалов платные при наличии подписки в Okko? У меня часто бесплатен по подписке только первый сезон


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

Фильмы в 4К только платные. Почему так?


На самом деле нет, есть подписка 4К. Она входит в Премиум.

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


Потеря денег.

У Netflix нет платных фильмов, можно по подписке смотреть все, что доступно


Да, но зато у них нет The Other Lamb.

Почему у нас нигде нет так, как на Netflix?


Ну, пока нет. Боремся с пиратством. Каждая копеечка важна с точки зрения выживания сервиса.

Наше население неплатежеспособно, сравните уровни жизни за рубежом и здесь — вот и ответ на пиратство?


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

Кинопоиск охватывает сторонние студии озвучки, разрешает матюки, ценник ниже, делает свои проекты, нет путаницы с подписками, что предпринимает Okko?


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

Правда ли, что, чем больше сервисов, тем больше шансов, что на них кто-то подпишется?


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

Как будет развиваться Okko? Вы продолжите размазывать контент по сервисам, заманивая эксклюзивами?


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

Почему приставка Okko Smart Box продается с обрезанным функционалом? Чтобы получить AndroidTV, приходится шаманить


Да потому что она стоит 2 рубля. Поэтому там порезан функционал и оставлены Youtube, Okko и еще что-то. Можно заплатить за Xiaomi, если нужен полноценный Andoid TV. Это всегда так работает с андроидом: покупаешь его, рутуешь, ставишь торренты и у тебя все хорошо, но это требует усилий

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

Стоковая прошивка запускает Youtube в FullHD. Зачем там начинка, которая годится для 4K, но не показывает 4K?


Я думаю, в этом году будет обновление приложения Okko для Smart Box, в котором будет 4K. Это, опять же, вопрос лицензирования. Чтобы получить разрешение на показ фильмов от Disney или Warner в 4К, нужен технический аудит устройства командой по защите контента на предмет наличия лицензированного DRM – например, Microsoft PlayReady, Google WideVine, Apple FairPlay и еще нескольких. Они должны быть реализованы с хранением ключей не в памяти приложений, а в hardware trusted zone – то есть, чтобы защищенность обеспечивалась на уровне железа, а декодированное видео тоже защищалось на уровне железа вплоть до выхода HDMI, где будет работать HDCP, который покажет черный экран при подключении китайского сплиттера. Smart Box еще не прошел лицензирование, но процесс идет – вот это вот 4К лицензирование в том числе находится и в моих руках и я этим обязательно займусь, завтра утром ;).

Что планируется по спорту? Новый ЧМ по футболу, Лига чемпионов, другие виды?


Сейчас я как раз стараюсь больше сосредотачиваться на спорте. Там более интересные технологии, на мой взгляд; кроме того, в этой области можно развиваться наравне со всем миром. Понятно, что Okko и остальные отечественные игроки сильно отстают от Netflix в области фильмов, но, если говорить о спортивных over-the-top трансляциях, то Okko не насколько отстает от ESPN+, например, как от Netflix. У нас есть шансы догнать и определять этот рынок. 17 июня рестартует Премьер-лига, там будут варианты просмотра в оригинале (с пустым стадионом), либо с наложением звуков стадиона. Приостановленный MLS – американская лига обычного футбола – тоже будет возрождаться. Других футбольных лиг пока не предполагается, потому что это требует серьезного расширения штата комментаторов; они у нас круты, но для одновременной трансляции итальянского и испанского чемпионата потребовалось бы больше людей – и за эти кадры пришлось бы бороться с Матч-ТВ. Другие виды спорта будут, возможно – до конца года.

Иногда приложение Okko запускается на телевизоре LG минут 10, а ivi – стабильно быстро, почему?


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

Почему Okko не может сделать нормальное приложение для телефона?


Есть долг по мобильному Android, но мы над ним работаем. Приложение для Apple, как мне кажется, нормальное.

Почему в некоторых сезонах сериалов на PlayStation не работает звуковая дорожка? Почему версия для Android не запоминает тайминг и номер серии?


Должна запоминать. Напишите нам об этом, мы исправим. Возможно, что это Android 4.4 и у него специфика сложная — поищем.

Общее качество приложения отвратительно, почему не смогли повторить, имея перед глазами Amazon Prime и Netflix?


Сейчас техническая команда Okko – порядка ста человек. У Netflix года два назад было 600 человек, плюс отдельная команда – человек 200, которые занимаются рекомендациями (у нас – пять человек). Будем развиваться.

Какие выводы были сделаны после нестабильной работы трансляции матчей Премьер-лиги?


Я довольно подробно коснулся этого и рассказал, с техническими деталями, на конференции HighLoad++ в конце прошлого года. Доклад доступен на Youtube и в виде PDF. Выводы были сделаны, платформа была улучшена.

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

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

Как дела с приложением Okko Спорт на Xbox?


Работаем над этим. Некоторые моменты пришлось отложить из-за карантина, но скоро мы поедем в командировку в Москву и решим вопросы, которые требуют личного присутствия. Я сам очень волнуюсь за это и надеюсь, что к новому сезону ПЛ все будет готово.

Что за фигня с региональными дорожками и сабами? То есть, то нет, в разных приложениях по-разному


Это из-за разницы в форматах. Существует три основных.

Стрим MPEG Dash – стандарт, в нем вроде бы должны все работать, в нем используется Common Encryption DRM. Работают все-таки не все: его поддерживают основные браузеры, но не Safari, также новые платформы смарт-ТВ: Samsung, LG (после 14-го года).

Еще есть Microsoft SmoothStreaming с DRM PlayReady, его поддерживают более старые платформы смарт-ТВ. Для Safari есть HLS с Apple FairPlay. Для Android – MPEG Dash с DRM WideVine. Есть некоторые устройства, где MPEG Dash используется с PlayReady от Microsoft; более старый вариант – PlayReady + Smooth Streaming, еще более старый – WideVine Classic (например, для старых LG).

Такая фрагментация стримов. Live еще более чувствителен к деталям в манифестах. На HighLoad я рассказывал о том, как базовые Live-энкодеры и пакеджеры тестируются у больших вендоров вроде Amazon: при этом используются только новые платформы, типа LG и Samsung после 14-го года, а на старые им плевать. Мы исследовали этот вопрос и понимаем, как поправлять манифесты, чтобы все работало; мы написали модуль для Nginx, который меняет их на лету для старых платформ.

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


Мы работаем над этим.

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


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

Когда к Sony пришла компания Okko и сказала, что хочет разместить приложение на PS3 и PS4, нам сказали: вот WebMAF, пусть там крутится ваше HTML-приложение. Мы много усилий потратили на попытки уговорить Sony предоставить нам доступ к тому же API, которым пользуются геймдевы, но нам его не дали.

Дальше мы настраивали работу нашего Javascript/HTML через этот устаревший Web-движок. Я уже говорил, что Netflix может диктовать всем условия — так вот, им этот доступ Sony дали, у них приложение работает на их движке, который они контролируют.

На PS5, которая должна была выйти этой осенью, этот вопрос вроде бы улучшен и существует доступ к различным SDK для HTML-приложений. Еще там больше памяти — JS-приложение на PS4 вылетает именно из-за ее недостатка. Но, пока PS5 не вышла, мы ничего не можем сделать. Netflix работает на PS на том же уровне, что и игры, поэтому работает идеально.

Я сам пользуюсь Okko на PlayStation и страдаю каждый раз, когда вижу медленную загрузку. Это беда.

Почему сервис на PS4 только в 1080p?


4K просто не помещается в выделенную память на PS4.

Добавьте UFC на Okko. И пусть попробуют заняться организацией боев или спонсорством боев на манер РенТв, лично мня это интересует больше футбольчика


Не буду раскрывать все карты спойлерить.

Планируется ли закупать контент у стриминговые сервисов, недоступных на территории РФ?
Amazon Prime и Netflix не продают так свой контент.


Если бы они продавали, мы бы закупили.

Почему выбор качества в зависимости от платформы, на которой смотришь? Один сервис заявляет, что есть 4К, но его можно смотреть только на телевизорах от LG
Это связано со стримами. 4К – это HEVC/265, нужен MPEG Dash + Common Encryption. Это как раз поддерживают новые телевизоры от LG/Samsung и Android TV. Старые смарт-ТВ не поддерживают HEVC.

Есть проблемы на устройствах, на которых нормально смотрю другой 4K-контент. Почему так?
Да, есть сложности из-за того, что DRM – шифрование-дешифрование – добавляет необходимости в ресурсах. Из-за этого может не работать стриминг, которому требуется HEVC и DRM – даже в тех случаях, когда работает другой 4К-контент (mp4).

На какие технологии в IT следует обратить внимание тем, кто заканчивает ВУЗы в ближайший год? Что будет актуально в ближайшие 5 лет?


Сейчас актуально дробление.

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

Можно найти хорошие переведенные книги, есть отличный сайт microservices.io.

Не могу сказать точно насчет языков – в какой-то момент становится все равно, на каком языке писать. Есть Go, есть Kotlin. Важно уметь систематизировать свои знания и правильно задавать вопросы – хоть гуглу, хоть StackOverflow, а если в этих источниках нет ответа – то своим коллегам.

В ближайшие годы явно будут актуальны облачные сервисы. У нас не так много людей владеет построением решений на Amazon Web Services, например – в этом стоит прокачиваться. Хотя есть облака Mail.RU, Yandex или Sbercloud, они отстают от AWS и даже от Google Cloud или Azure.

Почему для Казахстана недоступен весь контент?


Мы уже работаем над лицензированием контента для Казахстана.

Что будет с моей истекшей из-за covid-19 подпиской на Премьер-лигу?


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

Честно платить за контент у меня получается только за игры, ПО и музыку, остальные медиа у нас еще в каменном веке по уровню сервиса. Почему?


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

Как принять участие к киноклубе?


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

Как вы поддерживаете высокую доступность сервиса? У вас, как у Youtube, есть какие-то коробочки для провайдеров?


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

Сколько сил вкладывается в web?


Постепенно все больше. Там много маркетинговых историй, и дальше эта платформа будет развиваться. Хотя раньше я в неё даже и не верил – по мне, web = rutracker.

Почему нет возможности выбрать аудио дорожки и включить субтитры?


На некоторых фильмах они есть, хотя и не на всех. Мы работаем над этим.

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


Исходный файл добывается не так просто. Кроме того, это – довольно ограниченная ниша спроса, хотя мы, конечно, расширяем каталог фильмов с такой озвучкой и субтитрами. У нас сейчас есть бэк-каталог, который мы долго кодировали в тех форматах стримов, о которых я раньше упоминал – Dash, PlayReady/Smooth Streaming и так далее. Некоторое время назад мы начали использовать новый подход к подготовке контента: теперь мы кодируем один раз и используем just-in-time-преобразования для разных типов стримов. У нас эта технология уникальна, как я думаю, но Netflix тоже так делает; собственно, здесь каждый изобретает свой велосипед. Свой бэк-каталог мы перекодировали, но не всегда можно найти хороший исходник с оригинальной дорожкой. Надо понимать, что тайминг может не совпадать: даже видеоряд у оригинала и локализации немного отличается из-за разной длины реплик, например, и такая синхронизация требует дополнительной работы отдела контента – а этот отдел и так постоянно загружен добавлением фильмов.

Тяжело ли общаться с российскими правообладателями?


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

Чего пользователям ждать от Okko в плане новых технических фич?
Технические фичи обычно не видны пользователю. Сервис постепенно становится стабильнее и быстрее, конечно, но пользователь обращает внимание, в основном, на продуктовые фичи. Технологическая команда поддерживает эти наработки – например, новый плеер для iPhone.

Назовите пару наиболее сложных технологических проблем


В рамках выпуска прямых трансляций WTT была куча проблем. Это стык с телевидением, и там люди бывают очень консервативны. У них до сих пор SDI-кабели торчат – если вы забыли, этот тот самый простой антенный кабель – и у них это основная поставка сигнала.

И это нужно было превратить в наши мегабиты в секунду; потребовалось серьезно напрячься, чтобы успеть в срок. Можно еще вспомнить вопросы нагрузки, кодирования just-in-time в разные стримы, «sale architecture» — чтобы клиенты ходили на разные back-end сервера, чтобы размазывать нагрузку и потенциальные сбои.

Какие языки стоит учить? Хочу Python и Java


Хорошие языки. Хотя нужные вещи на Python можно переписать на Go, а на Java – на Kotlin. В Kotlin больше синтаксического сахара, можно вместить 10 строк на Java в одну на Kotlin – конечно, на первый взгляд она будет совершенно непонятна.

На Go я пока серьезно не работал.

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

Как развиваться разработчику, чтобы стать архитектором?


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

Не надо бояться – это то же самое программирование, тестирование, инженерия.

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

У архитекторов разные пути – я сам пришел в Yota в 2009 году как разработчик приложений для Android, там было много новых идей. В какой-то момент все начало разделяться, что-то уехало в Мегафон, а я остался разрабатывать видеосервисы.

Дальше мы стали писать приложения под Apple, часть переквалифицировалась под Objective-C; дальше – Windows Phone. Потом я стал изучать вещи под backend – хотелось, чтобы API было лучше. Мне стало понятнее, как взаимодействуют большие компоненты между собой, какая боль у клиентов, как ее решать через backend. От этого выросло мое архитектурное мышление – но это только один из вариантов пути. Можно приходить через test-driven development, например.

Зачем брать подписки, если то и дело из них пропадают фильмы и сериалы?


Пропадает обычно старое. Ну, какая разница – смотреть прямо сейчас первого Рокки, или второго? Они оба классные.

А что дальше?


Следующий прямой эфир пройдет во вторник, 23 июля, в 20:00.
Маркетолог RUVDS Сания Галимова будет отвечать на ваши вопросы в прямом эфире. Эфир пройдет в нашем инстаграм-аккаунте.

Задать ей вопрос можно в комментариях к этому посту.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook — как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса — как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend — как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина — Vue.js core team member, GoogleDevExpret — как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, технический директор и основатель DeviceLock — кто ворует и зарабатывает на ваших персональных данных.

Let's block ads! (Why?)