Как извлекать ценность из данных с помощью аналитической платформы от Factory5

F5 Platform — ключевой продукт Factory5 и основа для всех остальных решений компании. Она представляет самостоятельную ценность для интеграторов и делает разработку бизнес-приложений намного легче. Рассказываем подробно о функциональных особенностях Платформы и ее преимуществах для пользователя.

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

  • Ожидания быстрых результатов аналитического проекта. Чаще всего это завышенные требования к CDO по разработке решения под конкретные задачи клиента. Это усложняется еще и тем, что ответственные за цифровую трансформацию подрядчики меняются.
  • Большое количество данных в многообразии информационных систем. Все они могут стать хорошей основой для принятия решений, но возникают сложности с извлечением знаний из них.
  • Недоступность контроля качества данных. Плохие или недостаточные данные негативно сказываются на весь дальнейший процесс, в том числе и на решение, принимаемое на основе них.
  • «Лоскутная» автоматизация и отсутствие единой системы работы с данными. Хотя в организации автоматизированы уже многие процессы, сложность возникает когда необходимо объединить результаты работы этих разрозненных систем.

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

1. Коннекторы к основным источникам

F5 Platform предназначена для сбора и обработки промышленных масштабов данных, поэтому принимает данные со основных известных источников: традиционные БД, нереляционные БД и хранилища, облачные хранилища, подключенные устройства и Historian и файловые источники. Данные поступают в платформу тремя способами:

  1. Автоматически с датчиков в режиме реального времени.
    Если оборудование оснащено датчиками, передающими телеметрию в режиме реального времени, то через коннекторы она поступает на платформу в режиме реального времени. Также данные могут приходить на сервер ОPC, который является стандартом для обмена данными между промышленным оборудованием и информационными системами.
  2. Вручную из файлов.
    Данные копятся на оборудовании, а когда оборудование готово для передачи этих данных, файлы вручную с помощью флешек переносятся в платформу.
  3. Из внешних систем без ручного участия.
    Платформа интегрируется с внешними системами типа 1С, «Галактики EPR». Поэтому данные поступают из внешних систем с использованием REST API запросов или выгружаются, предоставляя REST API для внешних систем.

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

2. Сервис разметки данных

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

Например, приходят данные о температуре с датчика на двигателе. Благодаря созданному двойнику их можно записать в базу данных как «датчик №123 передает параметр Х». Для того чтобы можно было писать правила, остается объяснить системе что датчик №123 — это датчик на двигателе, а параметр Х — это температура. После этого можно будет писать правила вида «если температура больше 50 то…».

Без функционала разметки данных, эти параметры попали бы в ячейку базы данных №456. А правило по ним выглядело бы как «если значение ячейки №456 больше 50 то…». Это потребовало бы специально обученного персонала, тогда как с сервисом разметки данных экспертные правила могут писать инженеры по оборудованию.

3. Сервис создания и библиотека экспертных правил

Для анализа данных используются экспертные правила. F5 Platform дает возможность написания собственных правил на простом языке, понятном инженерам — Domain Specific Language. Для этого не нужно знать язык программирования.

Кроме этого, в Платформе есть библиотека экспертных правил для промышленного оборудования, которая содержит около 2 000 заранее написанных правил.

4. МХ-редактор и библиотека математических моделей

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

5. Микросервисная архитектура

Каждый функциональный модуль F5 Platform выделен в самостоятельный сервис, который расположен в своем «контейнере», никак не связанном с другими. В контейнерах содержится все, что нужно для работы приложения. Каждый контейнер изолирован и является безопасной основой для сервисов Платформы.

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

6. Масштабирование вычислительных мощностей

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

7. Преднастроенный набор инструментов для создания бизнес-приложений

В F5 Platform собраны и заранее настроены все инструменты для сбора и анализа данных, а также визуализации отчетов:

  • коннекторы к различным СУБД: PostgreSQL, ClickHouse;
  • коннекторы к промышленным протоколам: OPC-UA, REST API;
  • Pipeline Manager для настройки и выполнения произвольных сценариев обработки/анализа данных;
  • сервис экспертных правил;
  • сервис математических моделей;
  • различные виджеты для представления информации;
  • конструктор и дизайнер отчетов.

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

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

Как быстро протестировать продукт на рынке США и получить первую выручку: 3 практических шага

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

Мы в нашем агентстве уже помогли десяткам стартапов запустить маркетинговые активности на рынке США. Так что сегодня я поделюсь алгоритмом для тестирования спроса и получения первых ощутимых денег ($10-20-30 тысяч) всего за пару месяцев.

Шаг #1: локализация продукта

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

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

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

Шаг #2: тест на Product Hunt

Конечно же, самый главный англоязычный ресурс для анонса стартапов – это Product Hunt. О том, как стать лучшим продуктом дня, я писал в этой статье. 

Вкратце, алгоритм там такой:

  • Нужно будет найти популярного пользователя (хантера), который согласится опубликовать ссылку на ваш проект. Это даст первык приток трафика.

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

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

  • Активно общаться с пользователями, отвечать на вопросы.

  • Подготовить какой-то уникальный оффер для аудитории Product Hunt.

Для поиска хантера есть два неплохих варианта: сайт 500hunters.com или ручной поиск топовых продуктов в вашей сфере, которые показали хорошие результаты – потом смотрите, кто их захантил, и если это были не сами их создатели, то обращайтесь к таким хантерам.  

Затем, составьте короткий питч для того, чтобы быстро зацепить внимание человека. Я рекомендую писать в Twitter – эта соцсеть в США показывает гораздо лучшие показатели конверсии в ответы, чем, прости господи, LinkedIn. До сих пор не все это поняли, а зря.

Пример сообщения для хантера в Twitter
Пример сообщения для хантера в Twitter

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

  • Описание проекта + картинки и ссылки — все это запостит хантер.

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

  • Промо материалы – анимированный лого (обязательно!), визуалы для email-рассылки и  постов в соцсетях.

Потом нужно подготовиться к дню выхода – заготовить ответы на типовые вопросы (чем вы отличаетесь от главного конкурента и все такое). Разбить в команде дежурства – для наибольшего охвата стоит размещаться в 00:00 по времени Сан-Франциско, голоса в зачет считаются ровно сутки. Комментарии также могут идти все 24 часа. Если вы хотите войти в топ проектов и получить заветный бейдж #1 Product of the Day – сутки вы будете спать по очереди.

Также стоит прикинуть, как вы будете пиарить свой выход на Product Hunt. Стоит обратить внимание на фейсбук-группы для стартаперов (например, Y Combinator In Russian) – их подписчики обычно готовы поддержать коллег-предпринимателей. Также подумайте о том, кого из знакомых с большим числом подписчиков можно попросить расшарить вашу новость о выходе. Ну и пара постов на русском/английском на Хабре, VC и других сайтов, где вы что-то рассказываете и попутно упоминаете выход и просите поддержки – вполне хорошо работают.

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

Вспомните, что за день был 16 февраля? Я помню – мы тогда с одним из проектов заняли первое место на Product Hunt, а еще это было воскресенье. 
Вспомните, что за день был 16 февраля? Я помню – мы тогда с одним из проектов заняли первое место на Product Hunt, а еще это было воскресенье. 

Если все сделать правильно, к этому моменту вы получите первых американских пользователей, вопросы/комментарии, и возможно даже кое-какие продажи. Но что же делать дальше?

Шаг #3: зарабатываем первые тысячи $$$ на AppSumo 

AppSumo – это достаточно популярный (более 1 млн посетителей по SimilarWeb) сервис, который предоставляет своим пользователям и платным подписчикам возможность покупать софт по выгодным ценам. Обычно это пожизненный доступ к продуктам, которые обычно продаются только по подписке. 

Аудитория ресурса – профессионалы и владельцы интернет-стартапов. На AppSumo они могут получить доступ к профессиональному софту с серьезной скидкой. Грубо говоря, это купонный сервис для софта. 

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

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

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

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

Альтернативы AppSumo:

Эти и похожие сайты (а также купонные группы в Facebook) вы не сможете использовать на протяжение длительного времени после кампании на AppSumo – это одно из ее условий. 

О том, как попасть на AppSumo есть целый ряд статей на русском, в том числе и моя. Вкратце опишу алгоритм:

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

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

Если вам ответили – готовьтесь к довольно тяжелым переговорам. Ребята из AppSumo покажут вам, как ведут дела в Штатах, как здесь люди прожимают визави для получения выгоды. 

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

Freebie-оффер на сайте AppSumo: важно понимать, что там люди очень активно пишут отзывы и даже ваш бесплатный продукт могут активно раскритиковать
Freebie-оффер на сайте AppSumo: важно понимать, что там люди очень активно пишут отзывы и даже ваш бесплатный продукт могут активно раскритиковать

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

Чем больше кодов покупает пользователь, тем больше лицензий он получает по все более выгодной цене – условно, один код за $49 дает 3 лицензии, а три кода за $147 дают 15 лицензий. При этом здесь есть еще понятие стекинга – люди могут докупать коды по одному или больше и добавлять их в свой аккаунт, разблокируя все больше лицензий.

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

По нашему опыту с запуском конкретного продукта и согласно анализу доступной в интернете информации процент возвратов денег по итогам кампании и тех дней, что отводится на этот процесс, составлял примерно 20-25%. Именно на эти цифры следует ориентироваться.

Соответственно, если в рамках кампании ваш продукт купят на условные $100 тысяч за месяц (условная цифра для простоты подсчетов), то через пару месяцев и завершения moneyback window, вы получите $20-25 тысяч – это если возвратов будет не так много. 

Увеличить выручку можно несколькими способами:

  • Сделать фичи и продукт с упором на SEO – такие продукты заходят на AppSumo лучше всего (в кейсе Serpstat было $250k продаж за неделю, обычно показатели ощутимо ниже).

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

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

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

Заключение

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

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

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

Qt? ImGUI? wxWidgets? Пишем свое

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

Итак, вот уже в который раз я начал писать движок, и твердо решил что в этот раз сделаю все хорошо и правильно. Одним из этих «хорошо и правильно» является WYSIWYG редактор а-ля Unity3D. К слову сказать, до этого у меня уже был опыт разработки подобных редакторов, на Qt. И к тому моменту я уже понимал, что задача стоит не простая, если я хочу сделать по-настоящему хороший редактор. И для этого нужна очень хорошая и гибкая система UI, в которой я буду очень хорошо разбираться и знать всякие тонкости. Ведь в таком редакторе будет очень много кастомных виджетов, контролов и т.п. Поэтому не должно быть компромисса между качеством редактора и возможностями UI системы.

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

«Что ж, почему бы не убить двух зайцев одновременно?» — подумал я.

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

Сейчас система UI непосредственно держится на следующих вещах:

  • Рендер

  • Система обработчиков кликов

  • Иерархия сцены

  • Система UI-виджетов

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

Рендер

Все UI-элементы рисуются с помощью двух примитивов: спрайт и текст. Они в свою очередь рисуются мешами из треугольников. То есть каждый спрайт или текст — это набор треугольников на плоскости с наложенной на них текстурой.

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

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

Спрайт

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

Чтобы избежать этого используются 9-slice спрайты. Это те же спрайты, но разделенные на 9 частей:

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

Уже здесь есть нюанс — как должен вести себя спрайт, если его размер стал меньше размера углов? Размеры углов (и сторон) должны пропорционально уменьшаться. Это позволяет вписывать любой спрайт в любые размеры, а так же более-менее адекватно соединять скругленные части. Последнее оказывается очень полезно при отрисовке прогресс-баров с закругленными краями.

Кроме этих двух режимов есть и другие, которые применяются реже, но иногда нужны:

Много гифок с режимами спрайта
Простой спрайт, просто растягивается
Простой спрайт, просто растягивается
9-slice спрайт, растягивается пропорционально
9-slice спрайт, растягивается пропорционально
Показывает прогресс круговым заполнением
Показывает прогресс круговым заполнением
Вертикальное заполнение
Вертикальное заполнение
Горизонтальное заполнение
Горизонтальное заполнение
Повторение текстуры
Повторение текстуры
Сохранение соотношения сторон и вписывание
Сохранение соотношения сторон и вписывание

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

Код спрайта можно посмотреть здесь.

Текст

Как уже описано выше, текст — это набор треугольников.

Здесь два основных вопроса:

  • Получить текстуру с глифами символов

  • Сформировать меш

Глифы можно получить двумя путями:

  • Нарисовать самому в графическом редакторе или утилите, и сгруппировать в одной текстуре

  • Рендерить глифы через FreeType из векторного шрифта

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

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

  • Формирование посимвольного описания расположения символов

  • Формирование меша по сгенерированному ранее описанию расположения

Самое интересное конечно же первая часть. Здесь на входе поступает прямоугольник, в который необходимо вписать текст. А так же его форматирование: высота символов, цвет, выравнивание по горизонтали и вертикали, тип обрезания. Ну и конечно же сам текст. Алгоритм построчно размещает символы, начиная с точки соответствующей выравниванию. Учитываются межсимвольные расстояния, кернинг, межстроковые расстояния. Так же, если включен режим обрезания через окончание на «…», проверяется влезет ли следующий символ и производится замена на три точки.

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

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

Код текста можно посмотреть здесь.

IRectDrawable

Чтобы унифицировать отрисовку спрайта и текста, у них есть общий интерфейс IRectDrawable. Он отображает некую сущность, которая описывается прямоугольником (а точнее матрицей трансформации 2х3), которая может быть нарисована, может быть включена или выключена, и имеет цвет. Сам IRectDrawable наследуется от IDrawable (сущности которая может быть нарисована) и Transform (описывает трансформацию объекта матрицей 2х3, или Basis).

Отсечение

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

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

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

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

Забегая вперед скажу еще что интерфейс IDrawable в момент отрисовки запоминает текущий прямоугольник отсечения, чтобы затем корректно отметать клики по этим объектам вне зоны отсечения.

Обработка ввода

Итак, у нас есть возможность что-то нарисовать. Теперь хочется сделать это интерактивным — дать возможность потыкать курсором в эти рисуемые сущности.

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

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

Для обработки кликов от пользователя есть специальный интерфейс CursorAreaEventsListener. В нем есть солидная пачка виртуальных функций, которые вызываются на реакцию пользователя. Здесь клики, вход и выход курсора, для разных курсоров и клавиш мышки. А так же есть система, которая занимается правильной рассылкой этих сообщений EventsSystem, основной частью которой является CursorAreaEventListenersLayer.

Как же правильно понять в кого именно попал курсор? Не отсечен ли этот объект под курсором? Не перекрыт ли другим? Обычно это решается на уровне иерархии. Допустим, пришел ивент о том что пользователь нажал кнопку мыши. Начинаем с верхнеуровневых объектов, спрашиваем не попал ли курсор в них, не попал ли в отсеченную часть. Если попали — идем ниже по иерархии, спрашиваем то же самое у детей, и ниже и ниже, пока не доберемся до последней, которая скажет что в нее попали, и уже у нее вызовем соответствующий ивент на нажатие курсора.

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

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

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

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

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

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

Эта система работает быстро и стабильно при большом количестве объектов. При этом пользователю достаточно перегрузить функцию попадания точки в геометрию (что в большинстве случаев даже не нужно, если это IRectDrawable), и в момент отрисовки вызвать функцию IDrawable::OnDrawn(). Далее система автоматически рассылает нужные сообщения.

Иерархия сцены

В своем движке я выбрал типичный подход с иерархичной сценой с компонентами. Базовый элемент — Actor, примитивный объект, у которого есть имя, трансформация, набор компонент, определяющих его поведение, и список дочерних Actor’ов. Они строятся в древовидную структуру на сцене. Сцена — это просто список Actor’ов.

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

Система UI строиться на базе этой иерархии сцены. То есть все виджеты, все элементы UI — это наследники Actor’а. Но у них есть один общий интерфейс Widget.

Widget

Это самый элементарный «кирпичик» системы интерфейсов. Если Actor описывается простой трансформацией, включающей в себя позицию, поворот, размер и скейл, то положение Widget’а описывается более сложной структурой и уже зависит от родителя.

Положение Widgеt’а описывается структурой WidgetLayout, которая является наследников от ActorTransform. То есть это надстройка над обычными позицией, поворотом, размером и скейлом Actor’а.

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

WidgetLayer

Помимо обычной структуры дочерних Actor’ов, внутри Widget’а хранится список слоев WidgetLayer. Слой — это очень упрощенный Widget, который имеет на борту IRectDrawable и аналогичную WidgetLayout’у структуру с описанием адаптивного положения слоя WidgetLayerLayout.

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

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

Поэтому слои — это графическая часть Widget’а, отделенная от дочерних Widget’ов.

WidgetState

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

Для этого в Widget’е есть анимированные состояния — WidgetState‘ы. Они работают по принципу простой стейт-машины. Каждое состояние — это некая анимация, которая имеет два положения вкл. и выкл. При переводе во вкл. анимация проигрывается вперед, при переключении в выкл. анимация проигрывается назад. Причем, анимация может пойти в другую сторону не дождавшись окончания. За счет этого достигается быстрый отклик на действия пользователя.

Сами анимации вещь довольно сложная и для них можно написать отдельную статью. Но суть у них простая — они могут изменять любой параметр любого объекта внутри иерархии Actor’ов, включая Widget’ы, Layout’ы, WidgetLayer’ы и т.д. Здесь помогает собственная рефлексия, о которой когда-то уже писал. Она позволяет искать нужные параметры по стоковым путям, например children/0/transform/anchor.

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

  • курсор наведен — подсвечиваем кнопку

  • кнопка нажата — затемняем кнопку

  • кнопку в фокусе — показываем рамку вокруг

  • скрытие и показ кнопки — плавное исчезновение и появление

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

Эти состояния переключаются как изнутри Widget’ов, так и доступны для переключения извне.

Внутренние Widget’ы

Иногда бывает ситуация, когда внутри одного Widget’а может находиться другой Widget, но при этом не хочется чтобы он был виден как дочерний. Например кнопка закрыть в виде крестика на окне. Окно — это отдельный цельный Widget, и кнопка закрыть ощущается как его часть. А дети окна — это уже содержимое собственно окна.

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

Layout-Widget’ы

Это специальные Widget’ы, отвечающие за определенные алгоритмы расположения дочерних Widget’ов. Например, HorizontalLayout раскладывает своих детей в линию по горизонтали. Аналогично работает VerticalLayout, только раскладывает по вертикали. А так же есть GridLayout, который раскладывает равномерной сеткой.

Комбинация Horizontal/VerticalLayout
Комбинация Horizontal/VerticalLayout

У этих Layout’ов можно настраивать точку отсчета (от угла, середины), расстояние между элементами, растягивать ли элементы по горизонтали или вертикали. Эти настройки позволяют покрыть практически все возможные вариации с адаптивной версткой.

Пример адаптивной верстки в редакторе параметров
Пример адаптивной верстки в редакторе параметров

Алгоритм у этих Layout’ов такой:

  • Рекурсивно рассчитываем размеры дочерних Widget’ов. То есть как бы заглядываем в будущее, какого размера они будут. За основу берем минимальный размер элементов

  • Рассчитываем пространство, которое дочерние элементы могут занять. Берем текущий размер Layout’а, вычитаем все минимальные размеры дочерних элементов, вычитаем промежутки между ними. Получается «пространство, которое можно распределить»

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

  • Получив конечные размеры дочерних элементов, им проставляются соответствующие параметры WidgetLayout

Типы Widget’ов

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

На данный момент поддерживается следующий список типов:

  • Кнопка

  • Checkbox

  • Поле ввода текста, однострочное и многострочное

  • Выпадающий список

  • Список

  • Изображение

  • Надпись

  • Зона прокрутки

  • Горизонтальный/вертикальный progress-bar

  • Горизонтальный/вертикальный scroll bar

  • Спойлер

  • Окно

Попапы

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

Все попапы наследуются от общего класса PopupWidget. К попапам так же относятся контекстные меню. Внутри в виде статичной переменной хранится текущий видимый попап. Именно он рисуется в отложенном рендеринге сцены. Так же сам попап может содержать дочерний попап, который будет рисоваться вместе с этим отложенным попапом. Это применяется, например, в контекстных меню: некоторые пункты могут открывать подпункты меню, которые являются дочерними попапами.

Иерархичное контекстное меню
Иерархичное контекстное меню

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

Бонус: anti-aliased линии

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

Есть разные подходы к отрисовке графики а anti-aliasing’ом. Я решил попробовать один простой трюк: рисовать по краям линии полигоны, уходящие в нулевую альфу, то есть в плавно исчезающие. И так как эти края очень маленькие, но все же есть, при растеризации видеокарта выбирает некоторые полупрозрачные пиксели с краев основного тела линии, и получается эффект сглаживания.

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

Оптимизации

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

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

У меня есть большой опыт работы с Unity3D, и с интерфейсами в нем в частности. Если в Unity3D делать интерфейс «в лоб», то уже довольно скоро все начнет лагать, управление станет не отзывчивым, а процессор перегреется и начнет «троттлить«, ухудшая итак плохую производительность. И мне очень хотелось избежать такого же. Моей целью было сделать такую систему, которая при обычных задачах не требовала специальных оптимизаций или разделения на Canvas’ы, чтобы уменьшить перегенерацию мешей, как в Unity3D.

Собственно практически сразу, как я начал делать редактор, я столкнулся с проблемой производительности. И это произошло при разработке окна дерева сцены. Дело в том, что на сцене может быть несколько тысяч Actor’ов, и нужно уметь рисовать иерархию для каждого из них. Первый вариант был простой — для всех развернутых нод дерева создается Widget. Конечно при достижении пары сотен развернутых нод оперирование ими занимало приличное время. Поэтому пришлось отсекать.

Отсечение невидимых Widget’ов

Обычно, если в каком-то месте много Widget’ов, то большинство их них не видны. Это списки, деревья и зоны прокрутки. Очевидно то, что скрыто, можно не рисовать. И даже более — не обсчитывать в некоторых ситуациях.

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

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

Далее, в Widget’е есть специальный метод CheckClipping, который определяет отсечен ли он. Здесь же еще одна оптимизация: проверка на отсечение в основном нужна при прокрутке, то есть при линейных сдвигах. Например, есть зона прокрутки с кучей дочерних Widget’ов. Обычно прокрутка происходит вверх-вниз или влево-вправо, и размеры элементов не меняются. Поэтому достаточно взять площадь элемента и просто сдвинуть ее на величину прокрутки.

Так же в длинных списках или деревьях не создаются Widget’ы под каждый элемент. Создается некий буффер элементов, и при прокрутке показываются только те, что попадают в поле видимости. Это позволяет делать списки с тысячами элементов, без сильных затрат памяти и процессора.

Будущие оптимизации

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

Здесь напрашивается оптимизация на статичные части интерфейса. Их можно отрендерить один раз, и затем кусочно перерисовывать измененные участки. Для этого я планирую применить подход с «грязными» областями. Если Widget как-то изменился, что требует его перерисовки, то он сообщает общей системе что его область загрязнена. Если таких Widget’ов несколько, их площадь суммируется, одним прямоугольников покрывающим все. Далее, если этот итоговый «грязный» прямоугольник нулевой, то просто ничего не рисуем, оставляем на экране предыдущий кадр. Если он не нулевой, то изначально включаем отсечение по этому прямоугольнику, а затем рисуем только те элементы, который с ним пересекаются.

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

Редактор

Что было первое, курица или яйцо? Система интерфейсов или редактор этих интерфейсов? Да, редактор написанный на системе интерфейсов позволяет их редактировать. Даже есть отладочный режим, в котором видна иерархия редактора и там можно поисследовать редактор изнутри.

Сейчас редактор умеет практически все что нужно:

  • Отображение иерархии сцены и Widget’ов в том числе. Отображение слоев и внутренних Widget’ов

  • Визуальное окно редактирование верстки

  • Окно настроек параметров Actor’ов

  • Редактор анимаций

Заключение

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

В общей сумме на эту систему интерфейсов потрачено примерно 6 человеко-месяцев. Я вполне доволен тем что решил сделать свой велосипед. У меня есть опыт разработки подобного редактора на ImGUI, и могу сказать что чужое решение ограничивает, приходится тратить на его «допиливание» время, сопоставимо с написанием своего велосипеда.

PS: Если кому-то интересно позаниматься разработкой движка для 2D игры, буду рад посотрудничать. Одному получается очень долго 🙂 Репозиторий движка: https://github.com/zenkovich/o2, и тестового проекта на нем: https://github.com/zenkovich/PetStory

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

Проблемы со сном и их решения: личный опыт длиной в 15 лет

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

Чтобы вы поняли масштаб проблемы. Это — определение бессонницы из Википедии:

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

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

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

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

Вот они — с комментариями о моём личном опыте их использования.

1. Сну помогает темнота

Учёные неоднократно высказывались по этому поводу, и Хабр об этом писал (например, тут https://habr.com/ru/company/mailru/blog/230987/). В темноте спится лучше, чем при свете, каким бы незначительным этот свет ни был — со всей уверенностью подтверждаю. Хорошо купить шторы блэкаут, выключить все ночники и убрать с глаз долой любую технику со светящимися индикаторами. Но самое действенное и простое средство — маска для сна. Сначала она может немного мешать, но потом привыкаешь — и эффект не заставляет себя ждать.

2. Сну помогает тишина

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

3. Перед сном лучше избавить себя от источников света в синей части спектра

Это тоже подтверждено исследованиями — и вы наверняка об этом читали (например, тут есть подробности). Свет синей части спектра мешает выработке мелатонина, гормона, в том числе регулирующего сон. Такой свет источает непосредственно солнце, люминесцентные лампы дневного света, а также экраны наших гаджетов. Что делать с лампами и солнцем, примерно понятно (поможет та же маска). А вот если вы, как и я, и многие другие современные люди, любите посмотреть или почитать что-то в телефоне или планшете перед сном, включите специальный вечерний режим. Если в вашем гаджете такого нет, скачайте одну из программ (обычно их можно найти по словам «фильтр синего света»).
Мой опыт: это работает! Если не забыть про этот режим, читая с экрана в постели перед сном, довольно быстро начинаешь клевать носом, и гаджет можно выключать, чтобы наконец уснуть.
Бонус: утром синий свет, наоборот, помогает быстрее проснуться. Так что чтение спросонья новостей с экрана телефона вполне может быть полезным.

4. Мелатонин

К слову о мелатонине. Этот гормон, регулирующий «физиологические часы», наш организм вырабатывает самостоятельно, но если есть проблемы с засыпанием, можно принимать его дополнительно. Исследования показывают https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4273450/, что принятый перед отходом ко сну мелатонин помогает уснуть и улучшает общее качество сна.

Мой опыт: мелатонин лучше всего работает, если у вас проблемы именно с засыпанием, то есть, вы долго не можете уснуть вечером. Если же вы склонны к необоснованно ранним пробуждениям, он может не помочь (так было со мной). Я принимала мелатонин разных марок, и по соотношению цена-качество остановилась на «Мелаксене». https://xn--80ajbtdem4a.xn--p1ai/ Учтите: если вы принимаете мелатонин для лучшего засыпания, от любых (в том числе не содержащих синий спектр) источников света себя перед сном надо оградить. Иначе таблетка может не сработать.

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

5. Магний


(Так выглядит магний)

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

Чтобы узнать, есть ли у вас недостаток магния, лучше сдать кровь на анализ, а результаты показать врачу, чтобы подобрать нужный препарат и дозу. Часто магний назначают с витамином В6, вместе они работают лучше (многие препараты объединяют оба компонента). Лично мне подобный препарат (Магне-В6 magneb6.ru) помогает в периоды беспокойного неровного сна и периоды частых ночных и ранних утренних пробуждений.

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

Но переизбыток магния тоже вреден! И самая частая причина этого переизбытка — бесконтрольный приём БАДов с магнием. В общем, лучше сделать анализ и посоветоваться с врачом.

6. Пустырник, валерианка &Co


(А это пустырник)

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

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

Из комплексных, имеющих несколько экстрактов разных трав в составе, препаратов, мне лучше всего помог NightMix.

В его составе — иван-чай (успокаивает и уравновешивает), валериана (имеет седативный эффект), лаванда (помогает засыпанию), женьшень (нормализует “биологические часы”). Я использовала препарат как «точечно», в вечера, когда не могла уснуть, так и курсами, если нарушения сна становились регулярными. Учтите: если нервная система сильно «расшаталась» и со сном уже серьёзные проблемы, улучшение от NightMix может прийти не в первую же ночь, а на третью-четвертую. Получив результат, лучше не останавливаться, а пропить курс в течение 1-2 месяцев.

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

7. Голова в холоде + ноги в тепле

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

Мой опыт: это работает! Особенно — носки, и особенно — когда в квартире холодно. Согретые ноги помогают уснуть быстрее и спать лучше.

8. Хорошие постельные принадлежности

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

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

9. Режим и физические нагрузки

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

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

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

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

11. Достижение большего внутреннего спокойствия

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

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

Сентябрь. Считаем запуски — «Китай впереди»

Вячеслав Ермолин — 30 сентября 2020
Результаты пусковых программ за 9 месяцев 2020 года.

Статистика запусков с начала года (сентябрь). Легенда в конце текста.
Статистика запусков с начала года (сентябрь). Легенда в конце текста.

Сентябрь — месяц Китая. США борется с переносами. Россия и Европа по одному.

Все запуски сентября. Десять.
Все запуски сентября. Десять.

Итоги сентября.
Количество запусков «в норме» — 10. Две аварии.

■ Китай. Шесть запусков. Военные, гражданские , экспериментальные нагрузки. Одна авария.
США. Два запуска. Одна авария при запуске новой «частной» ракеты-носителя Rocket 3. Плюс 3-4 переноса.
 Европа. Один запуск Vega. Первый после аварии прошлого года. Первая миссия Rideshare.
 Россия. Один запуск.
■ Индия, Иран … ничего не запустили.

Амбициозные планы на 20-й год для напоминания (которые останутся только планами).

Максимальный прогноз (неофициальный) на 2020 год
Максимальный прогноз (неофициальный) на 2020 год

Hires статистика
Hires ракетки

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