📊 Настроение — тоже метрика

 Публичный пост
4 сентября 2024  942

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

Вообще, идея вовсе не нова. Во время реабилитации я нашёл программку Daylio, которая примерно делала то, что мне нужно: показывала раз в день уведомление с вопросом "как самочувствие", давала пять вариантов ответа на выбор (awful, bad, meh, good, rad) и предоставляла возможность заполнить небольшой журнал активности. Однако, совсем скоро всплыли и недостатки. Поскольку журнал заполнялся раз в сутки или реже, его показания страдали неточностью. Чаще всего под конец рабочего дня мне было вообще не до журнала, даже на тупые видосы для одноклеточных ресурса не находилось, поэтому записи или откладывались, или становились заведомо более негативными, чем реальные показатели. Бесило также и то, что данные из Daylio если и экспортировались с телефона, то только вручную, а мне как всегда хотелось чтобы трекать данные можно было с любого утюга и просматривать там же. Что ж, пришлось применять совсем другой подход.

К тому времени я научился запускать уведомления через Tasker и скрипты в Termux. Вы справедливо заметите, что этот юродивый опять что-то всратое изобретает, но по сути форма не важна. Важны тут процесс и результат; мы решаем психологическую, а не техническую проблему. Так вот, я отвлёкся. Я нашёл способ протаскивания данных с телефона или с компьютера через миддлварь в базу, Termux и Tasker с этим отлично справились. Теперь о том, каким именно образом решалась задача "как можно точнее трекать настроение за день". Выкристаллизовалась следующая формула:

  • В уведомлении на простой вопрос "Как ты себя чувствуешь?" возможно с помощью кнопок дать три ответа:
    • "Хорошо!": что означает, что я рад и в целом доволен. За этот ответ скрипт начисляет +10 баллов
    • "Плохо": это означает, что мне больно, страшно, неуютно или каким-либо другим образом неприятно и что я не желал бы в таком состоянии долго находиться. За такой ответ скрипт начисляет -10 баллов
    • "Никак": это означает, что я не счастлив и не печален; что я сыт, одет, относительно здоров и за шиворот мне не капает дождь с небес. За этот ответ скрипт начисляет +2 очка.

Базовая линия, с которой начинается любой день — это 50 баллов, то есть та самая серединка, в которой мне и не хорошо, и не плохо; от этой точки за день через пять вопросов можно либо дойти до 100 баллов (чувствую себя на миллион долларов), либо yпасть до полного нуля (убейте меня кто-нибудь). После ответа на вопрос скрипт посылает специальный payload в очередь сообщений, откуда его забирает cronjob и складывает нужные данные в базу SQLite. Раз в сутки другой cronjob подбивает сумму и пишет её с таймстемпами в соседнюю таблицу, чтобы получился такой красивый график.

Да, я использую в данном случае базу SQLite как time-series database, что на таких небольших масштабах вполне неплохо работает. Прелесть использования Grafana ещё и в том, что данные можно представлять в любом срезе за любой промежуток времени. У меня, например, есть ещё pie-chart, который показывает распределение результатов по категориям.

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

Технические детали

Любой тайлик на дашборде — это по сути запрос в базу через data source plugin. Некоторые из тайликов нуждаются в time-series данных, поэтому обязательно нужна колонка в базе, которая содержит юниксовые таймстемпы в привязке к данным.

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

select cast(time as int) as ts, score from totalmoodscore;

В самой базке это выглядит вот так:

sqlite> select * from totalmoodscore limit 10;
1682373481|40
1682459881|48
1682546281|48
1680991200|85
1680904800|45
1680818400|45
1680732000|45
1680645600|45
1680559200|65
1680472800|45
sqlite> .schema totalmoodscore
CREATE TABLE totalmoodscore (time timestamp default (strftime('%s', 'now')), score integer);

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

Вместо заключения

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

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

Связанные посты
18 комментариев 👇

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

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Я тоже метрики начал собирать, но в силу возраста другие - про свое физическое состояние. Потому что график настроения у меня напоминал бы прямую линую чаще всего. Сначала использовал просто google таблицу для основных данных, но сейчас полностью перешел на таблицу в emacs org. Через org-capture шаблон задаю себе вопросы с вариантами и ответов и затем оно все сохраняется в таблицу:


Легко экспортируется в любой формат, например CSV

  Развернуть 1 комментарий

Все еще очень жду туториал по графане в применении к персональным дашбордам :)

  Развернуть 1 комментарий

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

У меня есть один дашборд, в котором я собираю доморощенную аналитику по блогу и сайту музыкального проекта, возможно на его основе стоит рассмотреть этот туториал (там тоже time series внутри SQLite).

  Развернуть 1 комментарий

Нужна докер-сборка!
Это же тот сервис, который нужно селф-хостить в первую очередь :)

  Развернуть 1 комментарий
Valia Walsk Программист на bash 4 сентября в 09:59

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

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

  Развернуть 1 комментарий

@walsk, можно по расписанию запускать блокнотик с заметками. Проблема лишь в том, что в сырые данные такой текст преобразовать сложно. Аннотации к графику — максимальное приближение.

  Развернуть 1 комментарий

@rcmd, теги? Кнопки "лучше/хуже" и теги: #вася, #велик, #завтраотпуск

  Развернуть 1 комментарий

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

То есть я не могу, например, как в Grafana взять тайлик с графиком настроения, поместить его под тайлик с burndown chart спринта и выяснить "ах воооооот почему я так долго ебланил, мне просто хуёво было".

В теории так-то можно сделать простой веб-интерфейс и звать его те же пять раз в день.

  Развернуть 1 комментарий

@rcmd, я похожую штуку через (боян!) телеграм-ботика делала. Складировать текст, потом в нём грепать по ключевым словам. Логи активности вела: сколько набегала в день, сколько отжиманий-приседаний. В моменте помогало.

  Развернуть 1 комментарий

@walsk, что такое птч?

  Развернуть 1 комментарий

@hanggard, Потому что.

  Развернуть 1 комментарий

О, я не один такой, который каждый день про себя разные метрики трекает и баллы начисляет! Проект классный, графики огонь!

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

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

  Развернуть 1 комментарий

@justroo, Спасибо, что зашёл почитать!

Получается такой тамагочи, где вместо зверька я сам.

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

Я планирую скоро написать про трекинг рабочего времени. Там настолько интересно получилось, что я изобрёл собсвтенное устройство в качестве контроллера!

  Развернуть 1 комментарий

😎

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

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


Войти  или  Вступить в Клуб