/playbook
Последняя правка: 02.03.2026
Здесь будет микс из /carry, /style и чего-то ещё. В общем, штуки, которые помогают мне работать, тренить, следить за здоровьем и не потеряться в лавине рабочих и личных встреч, дедлайнов и прочих «очень важных» дел.
Ниже рассказ про мою систему отслеживания процента жира в организме и расчёта калорийности питания на основании этих данных, вычисления One-Rep Max для тренировок, а ещё карта любопытных мест в Петербурге и окрестностях, гит-репозиторий про деревянную археологию дворца, в котором я работаю и способы автоматизировать работу на маке и ПК.
Путеводитель по Петербургу
Когда-то давно я составил очень субъективный список мест, в которые стоит сходить в Петербурге, чтобы знать, где вкусно есть, пьяно пить и делать селфи. Я тогда вёл телеграм-канал о культуре, водил экскурсии по городу и очень устал от запросов посоветовать то или иное место, в которое стоит сходить. Поэтому сделал эту карту.
За всё время путеводитель просмотрели чуть больше 4,5 тысяч уникальных пользователей. Обновлял я его в последний раз в 2021 году, на второй год пандемии. Затем началась война, и стало как-то не до красот и не до веселья. Многие бары и рестораны из списка успели закрыться или испортиться, но архитектуру — всю — ещё не успели уничтожить. Так что пусть ещё здесь повисит.
Sash Windows from the Menshikov Palace in St. Petersburg, Russia
У меня есть репозиторий с материалами, необходимыми для научной работы по исследованию подъёмных окон эпохи Петра Великого в Меншиковском дворце на Васильевском острове. Поскольку это git, я всегда могу вставить ссылку на диаграмму или иные данные, указав дату доступа и номер коммита, когда пишу статью или выступаю на конференции.

Body Fat
Каждое воскресенье (ну, почти) я делаю замеры тела, чтобы отслеживать, как меняются процент жира и масса тела в зависимости от диеты и тренировок. Все данные вношу в табличку в Ноушене.

Для расчётов я вношу возраст и толщину кожных складок, которые замеряю калипером на груди, животе и бедре. Затем ноушен считает их сумму:
sum(prop("Chest"),prop("Abdomen"),prop("Thigh"))
На основе этой суммы вычисляется процент жира:
lets(
sum, prop("Sum"),
age, prop("Age"),
density,
1.10938
- 0.0008267 * sum
+ 0.0000016 * pow(sum, 2)
- 0.0002574 * age,
if(
sum > 0 and not empty(age),
round(495 / density - 450, 1),
empty()
)
)
Формула берёт сумму складок и возраст, вычисляет плотность тела по трёхточечной формуле Джексона-Поллока для мужчин, переводит её в процент жира по формуле Сири и округляет результат до одного знака. Для наглядности у меня есть отдельная колонка, где этот процент переводится в одну из категорий с цветовой маркировкой:
let(
fat,
if(empty(prop("JP BodyFat")), prop("Body Fat"), prop("JP BodyFat")),
ifs(
fat <= 7, "🔵 Lean",
fat <= 19, "🟢 Ideal",
fat <= 24, "🟡 High",
"🔴 Obese"
)
)
Ранее процент жира рассчитывался по другой формуле. Отсюда два столбца: по Джексону-Поллоку и старые данные — они нужны мне для истории измерений.
Если будете использовать мои формулы, сначала убедитесь, что они вам подходят — проконсультировавшись с врачом, тренером или хотя бы с ИИ. Я привожу пример расчётов для мужчин; в формулах для женщин используются другие коэффициенты.
Calories
На основе знания своего веса и процента жира в следующей табличке я рассчитываю целевой калораж на базе TDEE с поправкой на цель: набрать, удержать или снизить вес. Расчёт веду для тренировочных дней и дней отдыха.

Сначала рассчитываю LBM — сухую массу тела без жира:
round(
prop("Weight") * (100 - prop("Body Fat")) / 100,
1
)
На основе LBM рассчитываю базовый метаболизм (BMR) по формуле Кетча-МакАрдла. Округляю результат до целого числа:
round(370 + (21.6 * prop("LBM")))
И, наконец, рассчитываю TDEE для дней отдыха, умножая BMR на коэффициент активности и прибавляя калорийный профицит. Обратите внимание, что я считаю не чистый TDEE, а, скорее, Target Calories с учётом профицита, поскольку моя цель — набирать мышечную массу, а не просто поддерживать текущий вес.
lets(
activity, 1.3,
calorieSurplus, 350,
round(prop("BMR") * activity + calorieSurplus)
)
После этого я могу рассчитать целевые значения КБЖУ на день. Задаю норму белка в зависимости от сухой массы тела и жира — от своего общего веса:
lets(
proteinPerKg, 2.0,
fatPerKg, 1.0,
calPerGramProtein, 4,
calPerGramFat, 9,
calPerGramCarb, 4,
protein, round(prop("LBM") * proteinPerKg),
fat, round(prop("Weight") * fatPerKg),
carbs, round(
(prop("TDEE Rest") - (protein * calPerGramProtein + fat * calPerGramFat)) / calPerGramCarb
),
join([protein, fat, carbs], ":")
)
Для тренировочных дней формулы те же, но коэффициент активности выше: 1.5, профицит калорий равен 450; белков на килограмм тела я беру 2.2 г, а жиров — 0.8.
Все эти коэффициенты подобраны конкретно под меня, вам придётся самим вникать в тонкости их расчёта в зависимости от того, хотите вы набрать мышцы, снизить жир или просто поддерживать текущий вес. Здесь можно посмотреть рекомендации по норме белка. Вот тут есть неплохой разбор пропорций БЖУ в зависимости от цели диеты. Ну а в этом гайде есть неплохой разбор того, насколько увеличивать общий калораж продуктов, если цель — набор массы.
Система получается несколько усложнённой, но я, во-первых, люблю сложные расчёты, а во-вторых, я однажды записал все эти формулы, наладил личную систему еженедельных (ну, почти) наблюдений и теперь могу спокойно корректировать своё питание, отталкиваясь от полученных данных.
One-Rep Max
Я также расчитываю в Ноушене свой One-Rep Max (1RM) — максимальную массу, которую я могу поднять один раз во время упражнения. Это позволяет мне корректно подбирать вес для тренировок и отслеживать прогресс. Хороший разбор того, что такое 1RM и как применять его на практике есть, к примеру, на сайте HPRC.
Максимум я рассчитываю по формуле Эпли. Их, на самом деле, довольно много, можете глянуть на вики и выбрать ту, что подойдёт для вас. Многоповторкой я не увлекаюсь, а разброс всех формул начинается как раз после десятого повторения.
round(prop("Weight") * (1 + (prop("Repetitions") / 30)))
Зная свой теоретический максимум, я могу планировать нагрузку, а не гадать у стойки с гантелями при следующем походе в зал. Расчет процентов от 1RM помогает держать дисциплину и избегать недо- или перетренированности. Я разделяю нагрузку примерно так:
- 50–70% — разминочные сеты;
- 70–80% — основная рабочая зона на гипертрофию;
- 90% и выше — редкая работа на силу и уход в осознанный отказ.
Вот пример формулы для расчёта 50% от моего 1RM. Т.к. у меня в табличке прописаны и свободные веса, и тренажёры, и шаг везде разный, никаких ухищрений не делаю — просто округляю до ближайшего целого числа.
round(prop("1RM 100%") * 0.5)
Такие расчёты слишком часто делать бессмысленно, поэтому я обновляю данные в табличке где-то раз в месяц. Я ретроспективно пробегаю глазами записи тренировок в Hevy, выбираю лучший результат и фиксирую его как новую точку отсчета.

В целом, многие фитнес-трекеры и так умеют рассчитывать 1RM, но мне нравится считать его вручную + так я сразу получаю все данные в упорядоченном виде в одном месте. Остаётся лишь не забывать делать бекап самого Ноушена, чтобы их не потерять.
Raycast & dotfiles
Меня бесит выполнять однотипные действия вручную, поэтому при первой же возможности я стараюсь их автоматизировать. На маке с этим здорово помогает Raycast, с помощью которого я сначала заменил Spotlight для поиска и запуска программ, а затем начал постепенно выяснять, что этот комбайн ещё умеет. Фактически, я пользуюсь минимумом его возможностей, но мне хватает.
Сейчас у меня есть два скрипта, которыми я пользуюсь регулярно. Один деплоит этот сайт на GitHub Pages, а второй убивает процессы, заставляющие идти мой древний MacBook Air на интеле на взлёт (насколько я понял, это типичная проблема с маками на интеле, и ничего принципиально иного кроме покупки нового лэптопа тут не поможет). Запускаются они через Raycast Script Commands:


Скрипт позволяет задеплоить текущую версию этого сайта одной командой прямо из поисковой строки рейкаста. Он сам переключает ветки, подтягивает изменения, создает PR через GitHub CLI и мержит его в main. Единственное неудобство — Raycast не умеет показывать реальный прогресс выполнения команды, поэтому чтобы следить за ходом деплоя через gh run watch приходится всё-таки из терминала.
#!/bin/zsh -f
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Deploy tropin.one
# @raycast.mode fullOutput
# @raycast.packageName System Tools
# Optional parameters:
# @raycast.icon 🌐
# @raycast.needsConfirmation false
set -eu
set -o pipefail
cd ~/tropin || exit 1
git fetch origin
git switch dev
git pull --rebase origin dev
if git diff --quiet origin/main..dev; then
echo "✅ Нет изменений для деплоя"
exit 0
fi
gh pr create --base main --head dev --fill
sleep 3
gh pr merge --merge
echo "✅ CI прошёл, за его ходом см.: gh run watch"
Все мои кастомные команды, алиасы для терминала и прочие конфиги живут в репозитории с дотфайлами на гитхабе. Это позволяет не вспоминать каждый раз, как именно я настроил ту или иную утилиту, оболочку или окружение для питона.
На винде ситуация несколько хуже. Я пользуюсь Microsoft PowerToys, которые дают возможность искать и запускать программы по Alt + Space, но вот со скриптами не очень дружат. Поэтому пока что я тупо скопировал скрипт для деплоя в свою репу с дотфайлами, дал ему права и прописал для него алиас в .zshrc для WSL. Там он прекрасно работает, т.к. Zsh и GH CLI у меня на рабочей машине настроены аналогично маку (с учётом различий в архитектуре, из-за которых пришлось писать условие инициализации конфига оболочки при старте терминала в зависимости от ОС).
