Обновить

Разработка

Сначала показывать
Порог рейтинга

Определение типа fullscreen

Понадобилось мне как‑то определять тип fullscreen для вывода подходящего типа уведомления (звуковое/системное/окном) во время запущенных игр и родился такой код:

    public enum WindowFullscreenState
    {
        None,
        Emulated,
        Shared,
        Exclusive,
        ExclusiveGdi,
        NotOwned
    }

    public static WindowFullscreenState GetForegroundWindowFullscreenType()
    {
        var result = WindowFullscreenState.None;   
        uint dwProcessId;
        D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP query = new D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP
        {
            hWindow = GetForegroundWindow()
        };

        GetWindowThreadProcessId(query.hWindow, out dwProcessId);

        query.hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, dwProcessId);
        if (query.hProcess != IntPtr.Zero)
        {
            D3DKMTQueryVidPnExclusiveOwnership(ref query);
            CloseHandle(query.hProcess);

            result = query.OwnerType switch
            {
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_UNOWNED => WindowFullscreenState.NotOwned,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_SHARED => WindowFullscreenState.Shared,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE => WindowFullscreenState.Exclusive,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI => WindowFullscreenState.ExclusiveGdi,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EMULATED => WindowFullscreenState.Emulated,
                _ =>WindowFullscreenState.None
            };
        }

        return result;
    }

    public enum D3DKMT_VIDPNSOURCEOWNER_TYPE
    {
        D3DKMT_VIDPNSOURCEOWNER_UNOWNED = 0,
        D3DKMT_VIDPNSOURCEOWNER_SHARED = 1,
        D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE = 2,
        D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI = 3,
        D3DKMT_VIDPNSOURCEOWNER_EMULATED = 4
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct LUID
    {
        public uint LowPart;
        public int HighPart;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP
    {
        public IntPtr hProcess;
        public IntPtr hWindow;
        public uint VidPnSourceId;
        public LUID AdapterLuid;
        public D3DKMT_VIDPNSOURCEOWNER_TYPE OwnerType;
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType);

    private const uint PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;

    [DllImport("gdi32.dll", EntryPoint = "D3DKMTQueryVidPnExclusiveOwnership")]
    private static extern int D3DKMTQueryVidPnExclusiveOwnership(ref D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP data);
    
    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

Схема использования с типами уведомлений:

WindowFullscreenState.Exclusive -> SendVoiceNotification
WindowFullscreenState.ExclusiveGdi -> SendVoiceNotification
WindowFullscreenState.Emulated -> ShowSystemNotification
WindowFullscreenState.Shared -> ShowSystemNotification
WindowFullscreenState.NotOwned || WindowFullscreenState.None -> IsForegroundWindowSmallerThanScreen ? ShowCustomWindow : ShowSystemNotification

Подробнее можно прочитать про виды захвата экрана тут и тут.

P.S. Некоторые игры (ExclusiveGdi) можно заставить (Emulated) получать системные уведомления через режим совместимости.

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

Элэлэмки, Сталин дал приказ.

Кого задолбали посты с тестированием LLM, дальше можете не читать, пардон. Пост про то как у бесплатных ллм, что попались под руку, я спросил - правильный ли код для такой задачи (сорри за кривую постановку вопроса и не менее кривой английский):

in C# for

int d;

I need to calculate number of same consecutive leading bits leadingCount. Does the next code do it correctly?

int d; 
uint uintD = unchecked((uint)d); 
int leadingCount = BitOperations.LeadingZeroCount(uintD) + BitOperations.LeadingZeroCount(~uintD);

Развернутый ответ, который начинается в стиле "Yes — that code does correctly compute the number of consecutive identical leading bits in a 32-bit int. " дали следующие ллм:

chatgpt
gemini-2.5-pro
copilot.microsoft.com
perplexity.ai
kimi.com
ernie.baidu.com

Развернутый ответ, который начинается в стиле "No, the code does not compute the number of same consecutive leading bits in d" дали следующие ллм:

grok.com/c
chat.deepseek.com
qwen.ai/c
chat.z.ai

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

Смысл вопроса - правильный ли код на C# для подсчета количество одинаковых бит в начале целого числа.

Теги:
0
Комментарии2

Встреча сообщество Moscow QA #17 x Ви Tech

Встреча по тестированию от сообщества Moscow QA, проводимая совместно с Ви Tech. Moscow QA — это регулярные мероприятия, которые объединяют специалистов в области качества и тестирования программного обеспечения для обсуждения последних трендов в отрасли и обмена опытом.

21 ноября  2025 года вместе с  Ви Tech пройдет митап Moscow QA.

Тайминг:

18:00 —18:30— начало регистрации 
18:35 — 19:10 —Как погрузиться в автоматизацию за 60 дней, Сергей Лебедев 
19:10 — 19:45 —  Подход к организации тестовых контуров,  Александр Крылов
19:45 — 20:00 —  перерыв
20:00 — 20:35 — Как получить высокую оценку на перф-ревью и не сгореть, Вероника Манкова
20:35 — 21:10— Выжить в одиночку: 20 советов и инструментов для прохождения, Ушакова Анастасия

Доклады:

Как погрузиться в автоматизацию за 60 дней

Расскажу о собственном опыте, как я будучи QA-lead ручного тестирования 2 месяца погружался в автотесты на Playwright + TypeScript
Как мне с этим помогал ИИ и как мешал учебник по программированию

Сергей Лебедев, QA Lead в «Яндекс Лавке»

Подход к организации тестовых контуров

Когда вы разрабатываете в микросервисах, всегда возникает вопрос — как быстро и эффективно выстроить технологический пайп для того, чтобы эффективней организовать процесс тестирования. Каким образом вы организуйте рабочее пространство тестирования? Будут это кластера K8s под задачи или namespace? Насколько много у тестировщиков будет прав и на что? О том, как ответить на эти вопросы и организовать процесс тестирования на базе K8s мы поговорим в сегодняшней теме.

 Александр Крылов, CPO «Штурвала»

Игра "Выжить в одиночку" — история, основанная на реальных кейсах, с которыми может столкнуться каждый QA. 

Вы только пришли в новый проект и … начинается настоящее испытание: задачи летят со всех сторон, документации нет, ожидания туманны, а сроки поджимают. Знакомо?

Покажу практические советы и инструменты — чек-листы, шаблоны, промты для ИИ, которые помогут быстро войти в процесс, определить приоритеты и пройти этот квест с минимальными потерями и максимальной пользой!

Ушакова Анастасия, QA Lead/Яндекс Маркет

Как получить высокую оценку на перф-ревью и не сгореть.

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

Вероника Манкова, Qa Lead в Ви.Tech

 

Следите за нашими анонсами в информационных каналах: telegram и telegram chat , а так же ЮТУБ

Теги:
-1
Комментарии0

Code Wiki — AI документация репозиториев от Google

Code Wiki поможет сейчас исследовать open source репозитории, а в будущем обещают CLI версию для документации собственного кода.
Code Wiki поможет сейчас исследовать open source репозитории, а в будущем обещают CLI версию для документации собственного кода.

Google релизнули новый интересный проект. Code Wiki — википедия с документацией open source репозиториев. А в будущем обещают CLI версию для автоматической документации приватных репозиториев! Неужели документация кода будет теперь всегда актуальной?

Как работает?

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

Code Wiki:

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

  • Позволяет общаться с репозиторием и его документацией через Gemini чат (в том числе можно на русском, если читать доку на английском не хочется).

  • Автоматически обновляет документацию и все схемы после каждого PR. А значит документация наконец-то всегда актуальна.

Я немного посравнивал документацию от Code Wiki и документацию в самих опенсорс репозиториях. На мой взгляд, в хорошо поддерживаемых open source репозиториях авторская документация, конечно, все равно лучше.

Но, все мы помним те самые опенсорс репы, где лежит как-будто что-то очень полезное для нашего проекта, но черт ногу сломит, пока разберешься, как оно работает. А автор удосужился написать только абзац с общим описанием, о чем репа. Вот на такой случай Code Wiki будет спасением!

Пробуем тут.

Подписывайся на телеграм канал Заместители. Там еще больше интересного про ИИ агентов.

Теги:
-1
Комментарии4

Глава OpenAI Сэм Альтман сообщил, что можно попросить ChatGPT не использовать длинные тире, он «наконец-то будет делать то, что должен». Разработчики ChatGPT уточнили, что чат-бот теперь «лучше» справляется с задачей не использовать длинные тире. Для этого нужно задать соответствующие настройки в разделе пользовательские инструкции (custom instructions) в настройках.

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

Всех приветствую!

В позапрошлом посту я писал про ремейк моего ядра.

На сколько я понимаю, оно теперь микроядро.

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

Вот ссылка на Github (ещё не сделал интерфейсы для Github): https://github.com/SystemSoftware2/PearKernel

Обязательно прочитать README.MD!

Удачи!

[UPD]: Где тут небрежное оформление? Смысл минусовать за "Другое" без комментарий?

Теги:
-11
Комментарии8

Всем привет. Это 4-ая часть когда я делаю ОС на E-Ink экране.

Сегодня я немного обновил своё ядро и добавил новый функционал:

  1. Добавил виртуальную файловую систему (правда пока она очень плохая).

  2. Добавил интерфейсы для простой работы с моим кодом (пока только 1).

  3. Сделал штуку, которая запускает файл "os.sfp" (это файл самой ОС).

Сейчас всё идет по плану.

Удачи.

Теги:
-1
Комментарии0

25 ноября в 17:00 мы проведем вебинар «5 способов потерять кластер Kubernetes. Угрозы, о которых вспоминают слишком поздно».

Разберем реальные инциденты, связанные с:

🔹 аспектом хвостовой ОС кластера,
🔹 проблемой настройки Kubernetes,
🔹 безопасностью образов,
🔹 YAML-ресурсами K8s,
🔹 контейнерами.

Вебинар будет полезен DevOps- и DevSecOps-инженерам, архитекторам, руководителям инфраструктурных команд, — всем, кто отвечает за устойчивость и безопасность сервисов.

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

🔹 Алексей Волков, лидер направления Developer Productivity в VK Cloud, VK Tech

🔹 Дмитрий Евдокимов, основатель и технический директор Luntry, Kubernetes-native платформы для контроля и безопасности контейнерной инфраструктуры

Регистрируйтесь, чтобы получить напоминание и ссылку на трансляцию вебинара.

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

Узнавайте новое и бесплатно практикуйтесь в панели управления Selectel

Привет, Хабр! Обычно (хоть и не всегда) по пятницам я приношу подборки полезных материалов для начинающих специалистов. Но в этот раз у меня кое-что новое. Сегодня я расскажу не только о том, что почитать, но и как бесплатно отточить полученные знания, не тратя кровно заработанные на аренду IT-инфраструктуры.

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

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

  • Python — как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга. А еще интересные задачи для практики (вот тут-то точно пригодятся бонусы).

  • Расширения PostgreSQL — самые полезные с объяснением, как применять их без лишней теории.

  • Docker — что такое Docker, как запускать контейнеры, собирать образы и использовать Docker Compose. А еще — чем технология отличается от Kubernetes.

  • Сети — научитесь настраивать базовые сетевые схемы, поднимать выделенные и облачные серверы, разбираться в связанности, публичных IP и облачных маршрутизаторах.

Кстати, все статьи в подборках, как обычно, полностью бесплатны и доступны без регистрации и вот этого всего. Читайте, узнавайте новое и практикуйтесь бесплатно.

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

И снова открытые вакансии SSP SOFT: ищем тех, кто готов создавать айти-будущее 🔥

Почему стоит присоединиться к SSP SOFT?
✨ У нас нет «скучных» проектов — только вызовы, от которых сначала удивляешься, потом делаешь, и в итоге растешь.
✨ Поддержка с первого дня: выдадут наставника, и он поможет влиться в работу без стресса.
✨ Настоящий рост: наш Проектный офис — ускоритель профессионального развития.
✨ Работай, как удобно: из дома, из офисов в Москве (ЦАО) или Томске, или в гибридном/удаленном формате.
✨ Жизнь ≠ только работа: мы ценим баланс и даем тебе время на все — и на проекты, и на личные цели.

А еще у нас:
🎁 ДМС (включая стоматологию) для штатных сотрудников
🎁 обучение за счет компании
🎁 бонусы
🎁 общие ивенты — от онлайн-квизов до выездных сборов

📢 Прямо сейчас мы ищем:

1️⃣ С# Разработчика
2️⃣ DevOps-инженера
3️⃣ Automation QA Engineer (Java)
4️⃣ Data Engineer

👉 Чувствуешь, что это про тебя? Тогда не теряй время — присылай резюме в ЛС нашему HR Lead Алине. Не забудь добавить сопроводительное письмо с ключевой фразой «Нашел(ла) вас на Хабре„.“»

Подробности о вакансиях читай на ХХ.ру

Ждем резюме!

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

Здравствуйте, уважаемые читатели. Обращаем ваше внимание, что в блоге SSP-Soft вышел детальный обзор нашей новой книги о технологии Jetpack Compose для Android. Jetpack Compose (в книге разобрана версия 1.6) - это передовой инструментарий для Kotlin-разработчиков, предназначенный для проектирования и модернизации пользовательских интерфейсов, рассчитанных именно на работу с мобильными устройствами. В книге также рассмотрены основы языка Kotlin для Android и работа с Android Studio. Заказывайте книгу у нас на сайте и читайте с удовольствием!

P.S. Эта книга - одна из наших лучших находок в области англоязычного самиздата, однако нас в целом интересует тема разработки на Kotlin. Если у вас есть гитхаб с черновиками, либо вы прямо сейчас готовите рукопись - не стесняйтесь написать об этом Валентину Холмогорову @Holmogorov, Олегу Сивченко @OlegSivchenkoили просто в личные сообщения в этом блоге.

Спасибо вам за ваш интерес и Сергею Березину @sergbeза вышеупомянутую рецензию.

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

Стал программистом в Контуре чтобы делать игры

Знакомьтесь: мобильный разработчик Контур.Диадока, Дима Моисеев. 😎 Уже 12 лет делает на Ютубе авторское шоу Old Hard о незаслуженно забытых играх, их переизданиях и ремейках, железяках и source-портах. А ещё — пилит собственную игрушку про мистическую техподдержку Creepy Support. 👽 Увлечению Димы мы посвятили второй выпуск «Пет проектов», где программисты гуляют по полю с собаками из приюта Хаски Екб и рассказывают о своих хобби. Выбрали для вас несколько главных тезисов из этой прогулки. 👇 

С чего всё начиналось и чем мотивировался, чтобы не бросить

Я вместе со своим другом вёл текстовый блог (он всё ещё существует, вот ссылка на него), нам понравилось, и мы решили: а что, если пойти дальше и начать снимать видео? Я тогда как раз закончил институт и пришёл работать в Контур. 

Первая игра, на которую мы сделали обзор, называлась «Подземелья Кремля». Это шутер 1995 года от первого лица — российский ответ американскому Doom. 

Сейчас на моём канале 71 тыс подписчиков. А когда начинал, то думал: если до такого-то числа наберу сотню, прекрасно — продолжаем. Если нет — видимо, это не моё, займусь чем-то другим. И вот дата икс, я смотрю, а там 101 подписчик! Это был знак 👣 идти дальше.

Сначала я поставил себе цель — выпускать ролики не реже двух раз в месяц 

Потом понял, что это начинает превращаться во вторую работу, ещё и начальник [Дима сам себе директор] требовательный. 😁Решил: буду делать в максимально комфортном темпе — появилась интересная железяка > я её неторопливо в свободное время исследую > записываю потихоньку ролик > выкладываю. Сейчас у меня около четырёх сценарных видео в год, раньше было 8-10. Иногда проскакивают и не сценарные форматы — подкасты, реже — стримы.

Где нахожу старое железо для выпусков

На барахолках. Часто попадается что-то классное, например, трёхмерный ускоритель 95-го года или джойстик под MS-DOS довиндосовских времён. А ещё — ноутбуки, звуковые карты, игровые консоли… Там много интересных штук!

Как работаю над выпусками

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

  • Закадровый текст я обрабатываю примерно один к двум: на 20 мин черновика выходит 10 мин готового текста. 

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

Блог забрасывать не хочу: мне нравится мой сегодняшний комфортный темп, плюс остаётся время на другие проекты. Например, я ещё делаю свою видеоигру под названием Creepy Support. Суть игры: ты играешь за работника техподдержки в тайной организации, в которую обращаются люди, столкнувшиеся с чем-то паранормальным. Например, кому-то на 15-м этаже постучал в окно человек или позвонил по телефону кто-то странный. 👻 Задача игрока — уточнить детали и дать совет, что человеку делать дальше. Потом можно даже узнать, как этот совет повлиял на жизнь того человека.

Надеюсь, на эту игру тоже в будущем будут делать обзоры. 😉 Кстати, я уже видел несколько отзывов на неё на английском языке. 

Что дают мне пет-проекты

  • Я познакомился с кучей новых людей.

  • Расширил кругозор. Например, для игры Creepy Support выбрал другой язык программирования, не тот, на котором пишу в Контуре. И это здорово помогает мне отвлечься от рабочих задач. 

***

Полный выпуск про Диму, его пет-проекты и ушастую Феню, с которой бродили по зелёному полю, можно посмотреть в VK Видео, на RuTube и YouTube. Подпишись на нас на любой из площадок, чтобы не пропустить новые видосы! 😉

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

Привет!

Может кто посоветовать статьи или посты про idempotency для REST API POST-методов и как гарантировать идемпотентность?

Наткнулся на разбор с реализацией через отдельную таблицу idempotency keys в Postgres: https://brandur.org/idempotency-keys. Хотелось бы собрать практики — какими ещё способами достигается идемпотентности для POST (и других эндпоинтов)? Какие у каждого подхода плюсы/минусы и в каких юс-кейсах лучше применять?


Спасибо!

Теги:
0
Комментарии9

Ближайшие события

Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5.

В Joomla для выполнения внешних запросов из PHP к сторонним API используется класс Joomla\Http\Http напрямую или же Joomla\Http\HttpFactory, который возвращает для работы преднастроенный по умолчанию класс Http. О работе с HTTP-запросами подробно рассказывалось в статье 2021 года Создание внешних запросов с использованием HttpFactory (Joomla) (на Хабре), (на сайте автора). Некоторые изменения касаются работы с ответами на запросы. Например, наш запрос:

use Joomla\Http\HttpFactory;

$http = (new HttpFactory)->getHttp($options, ['curl', 'stream']);
$response = $http->get('https://any-url.ru/api/any/endpoint');

Раньше можно было получить код ответа или тело ответа как свойство $response - $response->code или $response->body. Однако, Joomla, начиная с Joomla 4 во многом переходит на стандарты PSR. В частности для работы с HTTP-ответами - на PSR-7. Также хорошая статья на Хабре о PSR-7: PSR-7 в примерах.

Прямое обращение к свойствам code, headers, body объявлено устаревшим в Joomla 6.0.0 и обещают удалить в Joomla 7.0.0.

Вместо этого нужно работать с HTTP-ответом по стандартам PSR-7.

Код ответа.
Было $response->getContents(). Стало $response->getStatusCode().

Заголовки ответа.

Было $response->headers. Стало $response->getHeaders().

Тело ответа.

Было $response->body. Стало (string)$response->getContents().

В тело ответа теперь приходит не строка, а поток - объект класса Laminas\Diactoros\Stream. Поэтому его нужно привести к строке (если это json, к примеру): (string)$response->getContents(). Чаще всего в коде Joomla встречается именно такой вариант. Однако, есть и вариант с перемещением указателя чтения на начало потока:

// Получили ответ в виде потока
$stream = $response->getBody();
// "перемотали" на начало
$stream->rewind();
// Получили строковый ответ
$json = $stream->getContents();

В итоге результат одинаковый.

Telegram чат русскоязычного Joomla-сообщества.

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

Минималистичные healthcheck-утилиты для Docker-контейнеров

Однажды я был маленький, и задавался вопросом - вот собираешь ты свое приложение, нежно помещаешь его в Docker-образ, заботишься о том чтоб и зависимостей было поменьше, и скомпилируешь его так чтоб итоговая каша из байт было погуще, но покомпактее; используешь scratch, статическую линковку, но чтоб "из коробки" был еще и healthcheck - приходится или писать свой мальний чекер каждый раз, или тянуть статичкски слинкованный curl/wget, если приложение работает как http сервер.

Потому что без healthcheck жизнь ну совсем не торт, даже при локальной разработке, когда запускаешь уже готовые образы, ставишь их в зависимость для других (в том же docker compose) - без него это все работать не будет так, как тебе хочется - демоны будут стучаться друг к другу без уважения и учета, готово оно в этому или нет.

Так родился microcheck - набор крошечных статически скомпилированных бинарников, созданных специально для healthcheck-ов. Они не имеют зависимостей от динамических библиотек, написаны на C, и работают даже в scratch и distroless образах, да умеют корректно возвращать exit-коды, понятные Docker’у (0 - здоров, 1 - приходи завтра).

В комплекте:

  • httpcheck — проверка HTTP-эндпоинтов (~75 KB)

  • httpscheck — то же самое, но с TLS и автоопределением протокола (~500 KB)

  • portcheck — проверка TCP/UDP-портов (~70 KB)

У вас в продакшене наверняка Kubernetes, и все проверки делает kubelet - скорее всего, вам не нужно ничего менять. Но если вы запускаете контейнеры в «голом» Docker’е или других рантаймах без встроенных healthcheck-ов - такие инструменты могут здорово упростить жизнь.

Как выглядит в деле:

# Было (+~10MB)
RUN apt update && apt install -y curl && rm -r /var/lib/apt/lists/*
HEALTHCHECK --interval=10s CMD curl -f http://localhost:8080/ || exit 1

# Стало (+~75KB)
COPY --from=ghcr.io/tarampampam/microcheck /bin/httpcheck /bin/httpcheck
HEALTHCHECK --interval=10s CMD ["httpcheck", "http://localhost:8080/"]

Разница по размеру в десяток мегабайт против семи десятков килобайт, а в качестве бонуса - не нужен shell-процесс, всё работает напрямую и быстро (а еще и в переменные окружения умет).

Поддерживаются все популярные архитектуры (x86_64, ARM, ppc64le, s390x и др.), есть готовые образы в GitHub Container Registry и Docker Hub.

Посмотреть исходники, примеры Dockerfile и prebuilt-бинарники можно тут: github.com/tarampampam/microcheck

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

Как масштабироваться в Kubernetes автоматически и экономически выгодно? Расскажем через 15 минут

Подключайтесь к вебинару сегодня в 16:00 мск. Покажем, как Karpenter в кластерах Managed Kubernetes помогает оптимизировать затраты на инфраструктуру, и объясним, как использовать этот инструмент. Присоединяйтесь!

В программе:

✔️ Обзор возможностей Karpenter и его сравнение с Cluster Autoscaler;

✔️ Воркшоп по настройке решения в кластерах Managed Kubernetes;

✔️ Кейсы применения Karpenter. Оптимизация GPU-инфраструктуры с сервисом.

В конце ответим на вопросы — задавайте их в форме регистрации. На вебинаре особенно полезно будет DevOps-инженерам, техлидам и СТО, системным администраторам и архитекторам.

Подключайтесь к трансляции:

👉 YouTube

👉 VK

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

Save the date: встречаемся 27 ноября на Wildberries & Russ Golang Meetup!

27 ноября в 19:00 приглашаем на Golang Meetup, где поговорим о том, как строить надёжную бизнес-логику, управлять памятью без потерь производительности и проектировать масштабируемую событийную архитектуру.

В программе — три доклада от инженеров Wildberries & Russ, которые решают эти задачи в продакшене каждый день: про иерархические стейт-машины в Go, реальные кейсы оптимизации GC и указателей, а также опыт создания единой платформы событий Databus.

🎤 Доклады:

  • Иерархические стейт-машины: инструмент для организации бизнес-логики | Сергей Шлянин, Go-разработчик в WB Bank.

  • 1000 в 1: единая платформа для событий Databus | Виктор Такташов, Go-разработчик в платформе Trust & Safety.

  • Указатели в Go: от аллокации до GC — разбираем ошибки производительности на реальных примерах | Александр Бруяко, Unit Lead в сервисах Медиа.

После докладов — афтепати и нетворкинг с разработчиками Wildberries & Russ. 

Регистрируйтесь, количество мест в офлайн ограничено.

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

TeamLead Conf 2025

В начале недели проходила двухдневная конференция TeamLead Conf 2025. Хотелось бы присутствовать оффлайн… Нетворкинг, все дела, но вы цены видели?.. 

Ладно вернемся к конфе. Была бесплатная трансляция Главного зала оба дня. Огромное спасибо за такую возможность организаторам конференции. Смотрел краем глаза несколько докладов.

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

Ну погнали, расскажу о докладах, которые мне понравились больше всего.

Первым выступал Руслан Агамалиев с темой о тайм-менеджменте здорового человека. Если честно, если бы не он, то я бы, наверное, дальше не смотрел. Руслана было очень приятно слушать, как спикера. Очень живое выступление с элементами общения с залом. В целом по содержанию вроде ничего сверх нового, но… Он рассказал об этой интересной технике. Решение прямо на поверхности, хотя сам я об этом почему-то не подумал. Если у вас большое количество созвонов, а главное, что часть из них бесполезные, то можно провести запись своих звонков с анализом их эффективности и продуктивности. А затем уменьшить их количество с помощью этой аналитике на руках. Рабочая схема? Как по-мне, интересная точно.

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

Ну лучиком солнца мне в душу запал Эрик Бурыгин. Парень - профессиональный выгоральщик. Не нравится то, чем ты занимаешься - выгораешь. Нашел работу, которая тебе нравится, и начинаешь в нее упарываться - выгораешь. Начинаешь меньше работать и начинаешь упарываться в спорт - выгораешь. Где-то в середине его доклада, я начал думать, что у спикера просто нет семьи, раз он ни разу не сказал о балансе работы и семейной жизни. А потом он затронул и эту тему. Если ты максимально упарываешься в работу, спорт, увлечения, забывая о семье и быте - выгорает твоя семья. А если начинает рушиться твоя семья, то ты снова выгораешь. Мораль данного доклада в том, что всегда нужно ловить баланс. При чем нет универсальной формулы этого баланса. Над ним всегда нужно работать и рефлексировать.

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

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

Всем добра!

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

Как нагрузочное тестирование на бою помогает платёжному сервису готовиться к сезону распродаж

День холостяка, Чёрная пятница, предновогодние распродажи — для платёжного сервиса ЮKassa это не просто даты в календаре, а особенно важное время. Тех, кто одновременно нажимает на кнопку «Оплатить» в онлайн-магазинах, становится в разы больше, и за считанные минуты нагрузка на инфраструктуру нашего сервиса многократно увеличивается.

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

Для тестов на продакшене мы используем контролируемое нагрузочное тестирование, при котором синтетические платежи генерируются через боевые API и проходят полный цикл обработки: магазин → наш шлюз → банк → маркетплейс → платёжная система. Весь тестовый трафик маркируется и не подлежит биллингу — это гарантия отсутствия финансовых рисков. Нагрузка наращивается по двум сценариям — сначала ступенчато (step load), а затем резкими краткосрочными пиками (bursts), — чтобы достоверно сымитировать ситуацию в момент старта распродажи.

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

Более подробно о боевых стрельбах рассказываем в большой статье.

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

Предприниматель Йосеф Айеле из Эфиопии и основатель фонда LAVA пожаловался, что его рабочий аккаунт в Telegram был заблокирован без причины. После чего он объявил в соцсети X, что прекращает пользоваться этим мессенджером и переводит свои коммуникации в Signal и электронную почту. В ответ на это основатель Telegram Павел Дуров лично извинился за инцидент с блокировкой. Дуров пояснил, что аккаунт Айеле был разблокирован, а «урок извлечён».

Теги:
0
Комментарии1