Обновить
4K+
2
Дмитрий Живица@Franky4F

Специалист по выжиганию бесплатных тиров

0,9
Рейтинг
Отправить сообщение

Как не дать Windows уснуть, и почему это сложнее, чем кажется

Кто-нибудь ещё живёт в режиме ноут-кровать? Спать уже хочется, работа почти сделана: дождаться агента, прочитать отчёт, выключиться. Ноутбук на одеяле, яркость в пол, агент молотит рефакторинг. Закрываю глаза на минуточку, открываю через сорок минут: тихо, машина спит. Агент уснул вместе со мной. Только у меня сессия восстановилась, а у него нет: прогон оборван, контекст заново, и спать теперь ещё полчаса не пойдёшь.

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

Так что я сел и написал утилиту вместе с тем же агентом, который в ней нуждается. На Free Pascal, да, в 2026-м: один нативный exe без рантайма, и это всё равно видно по строкам в бинарнике, так что проще сказать сразу.

Грабли

  1. Состояние живёт у потока, а не у процесса. SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED) — слово Thread не для красоты. Поток завершился, состояние снялось, машина уснула, а приложение считает, что всё под контролем. Держать запрос надо в потоке, который доживёт до выхода.

  2. Утилиту могут убить в любой момент, а она меняет глобальное состояние. Порядок операций: сначала записать на диск, что и на что меняешь, потом менять. На следующем старте прочитать, сверить и откатить.

  3. ES_SYSTEM_REQUIRED не спасает на Modern Standby. Он лишь сбрасывает таймер простоя; на ноутбуках с S0 Low Power Idle при потушенном экране система всё равно уезжает в connected standby. Документированный путь с Windows 8: PowerCreateRequest + PowerSetRequest(PowerRequestExecutionRequired). На этих граблях до сих пор стоит PowerToys Awake (issue #48965, открыт), а Buho 1.0 стоял — на моём старом S3-ноуте всё работало, и я не увидел. В 1.0.1 запрос держится рядом с ES-флагами; проверка за секунду: powercfg /requests, секция EXECUTION. Так можно проверить любую утилиту этого рода, не дожидаясь ночи.

  4. План питания и режим питания это разные сущности. PowerSetActiveScheme двигает классическую схему, а ползунок «Режим питания» в Windows 11 живёт поверх неё и управляется недокументированными PowerSetActiveOverlayScheme / PowerGetEffectiveOverlayScheme из powrprof.dll (только через GetProcAddress). GUID-ы неочевидные: максимальная производительность ded574b5-…, экономия 961cc777-…, сбалансированный — нулевой GUID; в сетевых таблицах их путают. В Buho этого пока нет: там, где планы скрыты, утилита честно говорит «недоступно». Следующий пункт в списке.

Получился Buho. Нативный Win32, зип 1,3 МБ, в памяти около 20 МБ. Пять режимов (не тушить экран, держать машину бодрой с потухшим экраном, экономия, максимальная производительность, выключено), таймер до восьми часов или до конца дня, глобальные хоткеи, 12 языков. Портативная версия: настройки в buho.ini рядом с exe, ничего в реестре и профиле, в сеть не ходит. Автоматики «увидел процесс агента — включился сам» нет, она в старшем брате BuhoSleep; здесь хоткей перед запуском, чего для «жму Enter и закрываю глаза» хватает.

Зип и SHA-256: ru.buhosleep.com. Defender может ругнуться ML-эвристикой на неподписанный бинарник — это ложное срабатывание, заявка в Microsoft подана; хэши на странице сверяйте.

Теги:
+6
Комментарии6

Свой движок спинтакса: WordPress и Cloudflare Workers

Спинтакс это запись вида {a|b|c}, из которой генерятся вариации текста. Свой движок я допилил дальше базового синтаксиса: переменные #set и %var%, инклуды, условия {?VAR?…}, плюралы {plural %n%: …}, пост-обработка. Не рулетка со словами, а маленький язык шаблонов, где качество вшиваешь один раз.

Движок обкатан в проде на WordPress-плагине: рендерит вариации прямо в полях ACF и в карточках WooCommerce, детерминированно и локально, без внешних API.

Отдельно есть TS-реализация @spintax/core: zero dependencies, работает на Cloudflare Workers, в Node и в браузере. PHP на Worker не занесёшь, а рендерить хотелось на эдже. Обе реализации держу на одной лыже, чтобы не разъехались. В репозитории лежат Worker и Telegram-бот как рабочий пример.

Всё open source

Плагин: wordpress.org/plugins/spintax. Пакет: @spintax/core. Синтаксис и песочница: spintax.net.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Хотел просто тестировать свои OTP, а выкинул почтовый сервер

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

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

Приёмник почты без приёмника почты

Cloudflare Email Routing бесплатно ловит catch-all на мой домен и отдаёт письмо прямо в Worker, в email()-handler. Не пересылкой на другой ящик, а сырым письмом в код. Ни sendmail, ни Postfix, ни IMAP-поллинга. MX поднимается за меня, я только пишу обработчик.

Дальше то, ради чего я, собственно, и сел писать. Приём держит Email Routing. Доставку готового результата мне в чат держит Telegram Bot API. И то, и другое это инфраструктура, которую я не админю. На выходе рабочий транспорт для входящей почты без единого своего сервера, без SMTP, без IMAP и без своего IP, который можно потерять под блокировкой.

письмо → MX → Email Routing (catch-all) → Worker.email() → разбор → Telegram

По команде /start выдаётся адрес, вставляешь куда надо, письмо падает в чат. Адрес живёт сутки и умирает сам.

Самое интересное это достать код

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

Поэтому не регэксп в лоб, а скоринг. Сначала нормализую тело: срезаю шапки пересылки, невидимый мусор, превращаю Текст <url> в нормальные ссылки, иначе скорер спотыкается об id из урлов. Потом собираю кандидатов: цифровые и буквенно-цифровые последовательности правдоподобной длины, от 4 до 8 символов. И раздаю баллы.

Вверх:

  • близость к триггерам: код, code, verification, OTP, подтвержд…;

  • стоит на отдельной строке;

  • выделен жирным или моноширинным.

Вниз, анти-паттерны:

  • похоже на год (19xx/20xx);

  • похоже на телефон;

  • стоит после заказ/order;

  • сидит внутри ссылки;

  • рядом знак валюты.

Кто набрал больше, тот и код. Уезжает в первую строку сообщения, тап, скопировал. Вот эта часть и заняла итерации, остальное обвязка.

Честные границы

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

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

Inbound-only. Отправить с него нельзя. Под мою задачу, тестировать собственные флоу, этого ровно достаточно.

И про экономику честно. Лично мне бесплатного тира хватало за глаза. Но KV на free это 1000 записей в сутки, и стоило решить сделать из поделки сервис для братьев по клаве, как квота на записи кончилась. Так что перед тем как открыть доступ наружу, я доплатил за Workers. «На чужой инфре» это правда, но не «бесплатно из воздуха»: транспорт всё равно стоит пять долларов в месяц.

Итог

Завернул в опенсорс: https://github.com/investblog/mailbot. Если тоже гоняешь регистрации и 2FA и устал от рулетки временной почты, может пригодиться целиком. А нет, забирай хотя бы скоринг OTP к себе, он отвязан от Telegram и переносится легко.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Информация

В рейтинге
2 103-й
Откуда
Сербия
Дата рождения
Зарегистрирован
Активность

Специализация

UI/UX дизайнер, PR-менеджер
Ведущий
От 1 000 000 ₽
Git
PHP
Docker
Английский язык
Python
TypeScript