惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
Vercel News
Vercel News
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
Jina AI
Jina AI
B
Blog
Recorded Future
Recorded Future
MyScale Blog
MyScale Blog
I
InfoQ
aimingoo的专栏
aimingoo的专栏
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
爱范儿
爱范儿
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
博客园 - Franky
Schneier on Security
Schneier on Security
V
V2EX
TaoSecurity Blog
TaoSecurity Blog
H
Hacker News: Front Page
Cloudbric
Cloudbric
D
DataBreaches.Net
B
Blog RSS Feed
P
Palo Alto Networks Blog
云风的 BLOG
云风的 BLOG
NISL@THU
NISL@THU
I
Intezer
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cyberwarzone
Cyberwarzone
F
Fortinet All Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
K
Kaspersky official blog
Forbes - Security
Forbes - Security

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Браслет для Бони
lws0954 · 2026-05-03 · via Все публикации подряд на Хабре

Браслет для Бони

Уровень сложностиСредний

Время на прочтение9 мин

Охват и читатели477

Возможно, на мой предвзятый взгляд, нынче автоматным программированием (АП) называют любое программирование, в которое вводят состояния (а параллельным – где используют потоки). Но не все, что с колесами – машина, а с крыльями – самолет. И далеко не всегда то, что «выглядит» как автомат, «плавает» как автомат и «крякает» как автомат им является. Это ясно, если руководствоваться математическим определением конечного автомата (КА). Только соответствие этому позволяет  считать программирование автоматным. Подробнее же об АП рассказано в [1].

Среди существующих программных подходов некоторые на взгляд программистов относятся к категории АП. Это, например, варианты диаграмм Харела (Statecharts) и языков на них основанных. Например, UML (Unified Modeling Language). Именно этой теме посвящена статья на Хабре, которая описывает проектирование на базе КА  в среде Engee[2].  В последней есть библиотека «Конечные автоматы» – «лучший инструмент для визуального проектирования сложной управляющей логики» [3].

Разберем данную статью, создав аналог рассмотренного в ней решения, но только на языке С++ и в среде ВКПа – классическом варианте технологии автоматного программирования. Это позволит объективно сравнить подходы, а вам, «хабравчане», останется только составить уже свое мнение о разных вариантах АП.

Human-симулятор

Общая структурная модель решения, заимствованная из [2], приведена на рис. 1. Здесь блок human_simulator представляет модель человека, а fitness_tracker реализует логику фитнесс-браслета. Предположительно реализовать их будет не так уж сложно, поскольку в основе решений аналогичные по своей сути алгоритмические модели – конечные автоматы.  Но, как говорится, легко было на бумаге… 

Начнем, как и в исходной статье, с создания модели человек. Моделирование (симуляция) его поведения поможет проектированию и пригодится при тестировании. В рамках поставленной задачи необходимо смоделировать частоту пульса, число шагов и текущую активность пользователя. В последнем случае будем различать следующие его состояния -  Сон (Sleep), Покой(Rest), Ходьба(Walk) и Бег(Run).

Модель поведения human_simulator в форме классического КА показана на рис. 1. Здесь состояние s1 является промежуточным, через которое проходят пути во все другие состояния. При этом предикат x1  принимает истинное значение, если изменится любой из входов модели. К ним относятся: parameter_activity - вид активности человека  и parameter_intensity - интенсивность его поведения.  Остальные предикаты различают состояния модели, а действия моделируют изменение выходных параметров модели.

Рис. 1. Структурная модель проекта

Рис. 1. Структурная модель проекта

Рис.2. КА модель симулятора человека

Рис.2. КА модель симулятора человека

Автомат, начав работу из начального состояния st, переходит в s1 устанавливает начальные значения  каденса (шагов в сек.), частоту пульса  и запускает отсчет времени моделирования (y3). Попутно предикат x1 фиксирует входные параметры модели. Заметим, что это не совсем верно, т.к. предикаты в идеале не должны выполнять каких-либо действий. Просто в данном случае так показалось удобнее.

Когда x1 принимает истинное значение, то в зависимости от значения x2, x3, x4 модель переходит в то или иное состояние и устанавливает целевые значения пульса и каденса (y2). И пока текущее состояние стабильно (x1 – false) действие y1 изменяет параметры в сторону достижения целевых значений. При изменении любого из входов блока (x1 – true) автомат возвращается в промежуточное состояние, а затем, если это необходимо, переходит в новое состояние.

Модель автомата в [2] содержит «параллельные состояние» (так звучит в терминах UML) типа Result_Processing для моделирования изменения пульса и подсчета числа шагов. Это спорное решение, т.к. фактически объединяет параллельные не вязанные между собой процессы. В рамках АП подобные задачи решаются параллельными автоматами. В данном случае, а речь уже об ВКПа, их будет два: один моделирует случайный процесс изменения пульса, второй – подсчитывает шаги.

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

Фитнес-браслет

Переходим к реализации аналога блока fitness_tracker,  который собственно и отвечает за логику работы браслета. Он должен:

1.       Имитировать подсчет шагов.

2.       Устанавливать флаг отдыха, если превышено время тренировки.

3.       Устанавливать флаг перехода к тренировке, если превышено время отдыха.

4.       Контролировать превышение частоты пульса.

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

В рамках нового решения мы не отказались и от исходного решения. В первую очередь там, где оно легко преобразуется в эквивалентную модель КА. И здесь есть кандидат - «первое состояние» Check_Heart_Rate. Его исходная модель показана на рис. 3, а граф соответствующего КА приведен на рис. 4.

Рис.3. Состояние Check_Heart_Rate на UML

Рис.3. Состояние Check_Heart_Rate на UML

Рис.4. Модель Check_Heart_Rate в форме конечного автомата

Рис.4. Модель Check_Heart_Rate в форме конечного автомата

Модель в Engee содержит темпоральный оператор duration(), параметром которого является логическое выражение. И хотя подобного оператора пока в ВКПа нет, он легко реализуется аналогично оператору аfter() в форме параллельного автоматного процесса, в котором один из его предикатов в соответствии с концепцией ООП перегружен логическим выражением.

Изначально процесс, моделирующий оператор duration(), находится в состоянии «0» и переходит  в состояние «1»,  если логическое выражения true в течение заданного времени. Процесс вернется в состояние «0», как только выражение примет значение false. Предикат x1 автомата на рис. 4 анализирует текущее состояние некоторого процесса (указатель на него – pFDura10sec) и если значение пульса превысит максимум более 10 сек, автомат перейдет в состояние Notify, установив значение флага notification_dangerous_heart_rate (y2). Действие y3 сбросит флаг, когда пульс вернется в норму. Так мы реализовали п. 4 из приведенного выше списка.

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

Рис.5. Модель классификации состояния человека

Рис.5. Модель классификации состояния человека

Другой автомат - FActiveAction (см. рис. 6) будет анализировать состояния автомата на рис. 5 и переходить в состояние Action или Inaction, отражающие активность человека. Но прежде чем перейти в эти состояния модель в промежуточных состояниях act и inac в течение определенного времени выполняется анализ текущего состояния. И только если оно стабильно происходит переход в новое состояние. В процессе переходов запускается отсчет времени, который фиксируются при переходе в противоположное состояние активности. Так определяются времена нахождения в том или ином состоянии активности.

Рис.6. Модель классификации состояния человека

Рис.6. Модель классификации состояния человека

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

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

Сервисные процессы

Мы не рассматриваем подробно модели процессов, окружающих модель браслета. Они созданы на базе типовых процессов и реализуют отображение текущего  состояния браслета и выдают соответствующие текстовые сообщения. Дополнительно был создан диалог управления моделью. На нем размещены элементы управления и кнопка запуска теста, аналогичного тесту в [2]. Кстати, это тоже еще один параллельный автомат, который в заданные моменты времени изменяет входные параметры модели человека.

Рис.7. Результаты тестирование модели в ВКПа

Рис.7. Результаты тестирование модели в ВКПа

Средствами среды ВКПа реализован вывод диаграмм сигналов. Все это,  в том числе и результаты тестирования,  демонстрирует рис. 7. Можно видеть, что диаграммы графиков сигналов на этом рисунке совпадают с аналогичными диаграммами в [2].

Браслет для Виктории Бони

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

Подобные рассуждения привели к уточнению модели. Она показана на рис. 8. В свете текущих событий назовем ее моделью поведения условной Виктории Бони. И, возможно, это не так уж далеко от действительности. Особенно в свете поведения персонажей Дом-2.

Рис. 8. Модель поведения Виктории Бони.

Рис. 8. Модель поведения Виктории Бони.

Модель сразу после инициализации попадает в состояние Сон (Sleep). Попасть в другое состояние, не поспав при рождении, просто невозможно. А уже из этого состояния может перейти, например, в состояние Бег (Run), но только через состояние Покой (Rest). А вот уже из него, минуя состояние Хотьба (Walk), можно перейти и к бегу. Но вот вернуться обратно в состояние Покой столь же коротким путем не удастся. Сделать это можно, следуя логике поведения модели, только перейдя на шаг.

Если мы заменим ранее созданную модель на модель Бони, то результаты теста не изменятся. Но вот выбор следующего состояния в рамках прямого диалога управления моделью уже будет зависеть от текущего состояния модели.  Например, из любого активного состояния в состояние Сон (Sleep) можно будет попасть только через состояние Покой (Rest). Другие попытки нарушить последовательность смены состояний будут проигнорированы. Можно считать, что модель в каком-то смысле «поумнела».

Код модели Бони

А теперь перейдем, пожалуй, если не к самому интересному, то самому показательному в нашем проекте моменту – коду модели Виктории Бони. Он показан на листинге 1. Благодаря объектным возможностям С++, создать его получилось легко и, можно даже сказать, красиво.  

#include "FHumanSimulator.h"

LArc TBL_Bonya[] = {
    LArc("st",	 "Sleep",    "--",           "y3"),
    LArc("Sleep",   "Sleep",    "x2",           "y1"),
    LArc("Sleep",   "Rest",     "x3",           "y2"),
    LArc("Rest",    "Rest",     "x3",           "y1"),
    LArc("Rest",    "Sleep",    "x2",           "y2"),
    LArc("Rest",    "Walk",     "x4",           "y2"),
    LArc("Rest",    "Run",      "^x2^x3^x4",    "y2"),
    LArc("Walk",    "Walk",     "x4",           "y1"),
    LArc("Walk",    "Rest",     "x3",           "y2"),
    LArc("Walk",    "Run",      "^x2^x3^x4",    "y2"),
    LArc("Run",     "Run",      "^x2^x3^x4",    "y1"),
    LArc("Run",     "Walk",     "x4",           "y2"),
    LArc()
};

class FBonya : public FHumanSimulator
{
public:
    LFsaAppl* Create(CVarFSA *pCVF) {Q_UNUSED(pCVF)return new FBonya(nameFsa, pCVarFsaLibrary);}
    FBonya(string strNam, CVarFsaLibrary *pCVFL):FHumanSimulator(strNam, pCVFL, TBL_Bonya) {}
protected:
    void y2() {
        setting_intensity = pVarIntensity->GetDataSrc();
        setting_activity = pVarActivity->GetDataSrc();
        FHumanSimulator::y2();
    }
};

Листинг 1. Код модели Бони

Листинг 1 представляет полный код, в котором нет ни чего лишнего. Он содержит лишь алгоритм поведения модели, имя класса, свойства которого наследуются, сам конструктор класса, метод Create() для создания библиотечных объектов и немного подправленное действие y2 базового класса. Подчеркнем, что подобный «фокус» возможен в немалой степени потому, что поведение автоматного класса отделено от методов автомата. В обычной ситуации все это перемешано, т.к. программа на любом языке программирования представляет собой в большинстве случаев смесь операторов управления, арифметических, логических и других программных операторов.

Рис. 9. Тестирование модели Бони

Рис. 9. Тестирование модели Бони

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

Заключение

Самое сложное – писать заключение. Нужно подбирать слова, чтобы описать то, что очевидно для автора. Возникают и вопросы. Например, как так получилось, что, взяв за основу конечный автомат, сделали диаграмму Харелла, которая программисту может показаться удобной и технологичной, но от классического автомата и его  теории явно отстоит далеко? А потому закономерен вопрос: можно ли Engee откатить, чтобы вернуться к истокам КА? И как это будет выглядеть в результате?

Самому «копать», чтобы получить ответ на заданный выше вопрос, если честно, попросту лень. Но времена такие, что можно привлечь такой «интеллект, как DeepSeek, который быстро и с удовольствием «копнет» за вас. Нужно только с ним эту тему «перетереть». Вот мы и поболтали…

Беседа получилась не совсем уж краткая, но в процессе даже появился интерес к результату. Цель все же была достигнута, и стало понятно, как можно вернуть Engee к классическим истокам, используя ее визуальный язык, чтобы повторить автоматную технологию ВКПа. Но нужно ли это?  И возможно ли в полном объеме реализовать модель АП? Хотя это, возможно, темы уже другого разговора…

Литература

1. Автоматная модель управления программ. https://habr.com/ru/post/484588/

2. Визуальное проектирование управляющей логики фитнес-браслета.

https://habr.com/ru/companies/etmc_exponenta/articles/910114/

3. Библиотека «Конечные автоматы».  https://start.engee.com/state_machines