Обновить

Бэкенд

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

Как управлять окружениями — venv / pip vs pipenv vs poetry?

Привет, Хабр! Продолжаем нашу рубрику с быстрыми ответами на некоторые часто встречающиеся вопросы. Сегодня разберем такую проблему: проекты постоянно ломаются из-за конфликтов зависимостей. Что выбрать для новых проектов и как сделать так, чтобы код работал одинаково, в том числе в CI?

Обычно начало всех проблем — смешение глобальных и локальных пакетов или отсутствие фиксированных версий библиотек. Главный совет: у каждого проекта должно быть собственное окружение с явно указанными зависимостями и сохраненным lock‑файлом в репозитории.

Если говорить о базе, то это связка venv и pip. Плюс она встроена в сам Python. Вы вручную создаете окружение, устанавливаете нужные пакеты и фиксируете их в requirements.txt. 

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

Сейчас это, пожалуй, наиболее сбалансированное решение: он создает и управляет окружениями, отслеживает версии, собирает wheel‑пакеты и умеет публиковать их в PyPI. Lock‑файл (poetry.lock) обеспечивает воспроизводимость сборок, а сам формат pyproject.toml — это стандарт. В итоге вы получаете чистое окружение, детерминированные зависимости и понятное поведение CI.

Вот пример рабочего цикла:

python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install poetry
poetry install
poetry run pytest

В CI чаще используют схему с экспортом зависимостей:

poetry export -f requirements.txt --without-hashes -o reqs.txt
pip install -r reqs.txt
pytest

Отдельно стоит упомянуть uv — относительно новый инструмент, созданный командой Astral (авторы Ruff). Он написан на Rust и совместим с Python. По сути, это те же функции pip, venv и частично poetry, но быстрее. От Poetry он отличается отсутствием публикации пакетов, но при этом умеет сам устанавливать и менять версии Python через .python-version

UV работает с pyproject.toml и имеет собственный uv.lock. Может использоваться вместе с Poetry, но лучше создавать единый uv.lock для строгой воспроизводимости. Для CI это удобно, вы пишите:

pip install uv

Далее есть два варианта:

  • uv venv — создает виртуальное окружение. Это аналог python3.13 -m venv .venv, но работает быстрее и с автоустановкой версии Python.

  • uv init — помимо .venv, добавляет шаблон проекта с pyproject.toml для зависимостей, Git-репозиторий и базовые файлы. Идеально для нового проекта.

И окружение в CI полностью совпадает с локальным, а билд воспроизводится без сюрпризов. Но чаще всего комбинируют два решения: Poetry для разработки и uv — для быстрых сборок и деплоймента.

Если хотите освоить инструменты Python, то в Академии Selectel у нас есть отдельная подборка статей. Там мы рассказываем, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга.

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

Вышел Echo 5.3

Echo - высокопроизводительный, расширяемый, минималистичный веб-фреймворк на Golang.

Echo построен на основе net/http и работает с ним через echo.WrapHandler / echo.WrapMiddleware, добавляя компоненты, которые стандартная библиотека оставляет разработчику: быстрый маршрутизатор на основе дерева решений, привязка запросов (с подключаемым валидатором), развитую экосистему middleware и централизованную обработку ошибок.

Ключевые новинки версии 5.3:

  • Добавлена ​​полноценная поддержка метода HTTP QUERY в соот с RFC 10008

  • Маршрутизатор: автоматическая обработка HEAD-запросов обработчиками GET

  • Изменение логики группировки middleware

GitHub: https://github.com/labstack/echo

ChangeLog: https://github.com/labstack/echo/releases/tag/v5.3.0

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

Как настроить TLS в клиенте Python при HTTPS-запросах?

Бывает так, что после обновления OpenSSL часть HTTPS-вызовов к внешним сервисам падает с ошибкой ssl.SSLError. Сейчас разберемся, как настроить Python, чтобы handshake проходил успешно и соединение оставалось безопасным.

После апдейтов OpenSSL часто отключают старые протоколы и слабые шифры — старые серверы не проходят handshake. Решение на клиенте — явно создать ssl.SSLContext, задать минимальную версию TLS и, при необходимости, набор шифров, а затем передать этот контекст в HTTP-клиент (например, httpx).

import ssl
import httpx

ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
ctx.minimum_version = ssl.TLSVersion.TLSv1_2
ctx.set_ciphers('ECDHE+AESGCM:!ECDSA:!aNULL:!eNULL')

with httpx.Client(verify=ctx, timeout=10.0) as client:
    r = client.get('https://api.example.com')
    r.raise_for_status()
    print(r.status_code)

В коде мы указываем TLSv1_2 как минимальный порог. Это удобно: если сервер уже поддерживает TLS 1.3, все само заработает на самой новой версии. Но если какой-то внешний сервис еще не успел обновиться, соединение не разорвется, и все продолжит работать на стабильном 1.2. Так мы получаем универсальный код, который не сломается при работе со старыми API.

Для отладки TLS handshake применяйте openssl s_client -connect host:443 -tls1_2 чтобы увидеть, какие шифры поддерживает сервер. Временное ослабление minimum_version даст совместимость, но хуже для безопасности — лучше апгрейдить серверную часть. Сертификаты и ключи храните вне кода (секреты/volumes), не логируйте их, и при работе в контейнерах используйте безопасные механизмы передачи секретов.

Если хотите освоить инструменты Python, то в Академии Selectel у нас есть отдельная подборка статей. Там мы рассказываем, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга.

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

Нанимают ли ИТ-компании летом — и стоит ли сейчас искать работу

Каждое лето среди ИТ-специалистов возникает один и тот же вопрос: есть ли смысл искать работу в июле или лучше дождаться сентября, когда все, кто принимает решения, вернутся из отпусков? Короткий ответ — искать стоит.

Летом темп найма действительно немного снижается. Часть руководителей и HR в отпусках, собеседования переносятся, некоторые проекты ждут утверждения бюджетов на вторую половину года. Но это не значит, что рынок замирает.

По данным hh.ru, рынок труда в 2026 году остается неоднородным. В одних профессиях работодатели конкурируют за специалистов, в других — конкуренция выше среди кандидатов. Для ИТ сохраняется один устойчивый тренд: опыт и реальные навыки полностью перевешивают дипломы и корочки курсов, а владение ИИ-инструментами названо одним из ключевых конкурентных преимуществ. Поэтому даже летом компании продолжают искать сильных специалистов под текущие проекты, а не откладывают всё до осени.

Теперь про наблюдение у Хабр Карьеры. По их статистике, активность найма в ИТ постепенно становится менее сезонной. Компании продолжают публиковать вакансии даже в периоды отпусков, хотя скорость принятия решений ниже. Многие работодатели используют лето для формирования кадрового резерва и проведения первых этапов отбора — чтобы быстрее закрыть позиции, когда отпускной сезон закончится.

Если вы сейчас в статусе «кандидат» — летнее затишье это ваше преимущество, а не помеха. Хорошее время, чтобы обновить резюме, привести в порядок портфолио, добавить завершенные проекты на GitHub, разобраться с каким-нибудь новым инструментом. Осенью, когда конкуренция за интересные позиции возрастет, такая подготовка будет заметна на собеседованиях.

Главное — не воспринимай лето как потерянные два-три месяца. Если бизнес запускает новый проект в июле — ждать сентября HR не станет.

Мы в SSP SOFT нанимаем сейчас

В SSP SOFT занятость — это не про «отсидеть часы». Это про задачи, которые заставляют думать, искать нестандартные решения и видеть результат своих усилий. Мы предлагаем удаленку, гибрид или офис в Москве и Томске, ДМС, обучение по выбору сотрудника и среду, где мнение сотрудников стараются слышать. Задачи — реальные, коллеги — сеньоры, у кого есть чему учиться.

Сейчас в середине июля мы ищем:

— Ведущего аналитика 1С (финансовый контур, КТ 2000)
— Системного аналитика (Ритейл)
— Разработчика ЦФТ
— Архитектора 1С (Управление Договорами)

Подробности о вакансиях читайте на нашей странице ХХ.ру, но там откликаться необязательно. Ждем резюме напрямую Евгении Беловой, директору по развитию персонала: @EvgVBelova в Telegram.
Не забудьте добавить «секретную фразу» в сопроводительное письмо: «Увидел(а) вашу вакансию на Хабре».

💚 Солнечного лета и До новых встреч!

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

Понял asyncio только когда бот начал зависать под нагрузкой

Писал на Python и честно говоря asyncio воспринимал как магию. Работает и ладно.

Пока однажды бот не завис.

Пользователей было немного, штук двадцать одновременно, но один запустил команду которая делала тяжёлый запрос к внешнему API. Пока запрос выполнялся, бот молчал. Остальные подвисли в ожидании.

Начал разбираться. Оказалось я вызывал синхронную функцию прямо внутри async хендлера. requests.get внутри async def. Это блокирует весь event loop. Все корутины ждут пока эта одна функция не завершится.

Решение простое: либо заменить requests на aiohttp, либо обернуть синхронный вызов через asyncio.to_thread. Второй вариант проще когда менять библиотеку лень:

python

result = await asyncio.to_thread(requests.get, url)

После замены бот перестал зависать. Все одновременные запросы к внешнему API обрабатываются параллельно без проблем, но теперь когда вижу синхронный вызов внутри async функции ощущение что что-то не так.

Кто сталкивался с похожим, как отлаживали?

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

Задача о 17 серверах и сетевом архитекторе

Привет, Хабр! Принесли задачу — попробуйте ее решить и сверить ответ с нашим.

Условие

В одной придуманной нами компании N сетевой архитектор получил задачу: развернуть изолированный контур из 17 серверов. Для обеспечения отказоустойчивости он решил соединить их напрямую патч-кордами так, чтобы от каждого сервера отходило ровно три кабеля к соседним машинам. Архитектор набросал схему и со спокойной душой ушел домой.

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

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

Задача

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

Узнайте решение в Академии Selectel.

Теги:
+9
Комментарии1
Биржа Инфостарта: новые задачи по 1С за 9–15 июля
Биржа Инфостарта: новые задачи по 1С за 9–15 июля

На Бирже заказов Инфостарта опубликована новая подборка задач по 1С за неделю с 9 по 15 июля. В списке - доработки типовых и отраслевых решений, обмены, перенос данных, настройка документооборота, участие во внедрении ERP и консультации.

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

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

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

Участвуй в МТС True Tech Champ 2026 — всероссийском чемпионате по программированию с призовым фондом 10 250 000 рублей 🔥

Выбирай, какой трек тебе интереснее 👇

  • Алгоритмический (индивидуальный зачет, 2 750 000 ₽). Решай задачи по алгоритмам и структурам данных, которые помогут прокачать навыки для технических собеседований и работы в ведущих ИТ-командах. Лучшие участники пройдут в финал, где в режиме реального времени будут соревноваться в правильности решений и скорости мышления.

  • Программирование роботов (командный формат, 7 500 000 ₽). Напиши алгоритмы для робособаки и робота-манипулятора и проведи их через три этапа соревнований. Сначала — через цифровой симулятор, где нужно пройти трассу и выполнить задания по передаче предметов. Затем — подключись к реальному полигону через удаленный доступ и выполни задания на физических роботах дистанционно. А в очном финале лучшим командам предстоит управлять роботами на площадке, дорабатывать алгоритмы под новые условия и бороться за победу на глазах у зрителей.

Шоу-финал с кодерскими челленджами и выступлениями спикеров состоится 22 октября в МТС Live Холл. А лучшие участники получат шанс на стажировку в MTC Web Services (MWS).

Так после МТС True Tech Hack 2026 к команде присоединились три стажера:

1. Илья Матвеев из команды MCLover, 18 лет, студент 1-го курса бакалавриата Института интеллектуальных кибернетических систем (НИЯУ МИФИ). Вышел на позицию стажера frontend-разработчика в MWS Octapi.

2. Роман Субботин из команды DEP_IT_MISIS, 19 лет, студент 2-го курса бакалавриата НИТУ МИСИС по направлению «Прикладная математика» в институте компьютерных наук. Вышел на позицию стажера Python-разработчика в MWS Octapi.

3. Кирилл Ефимович из команды Моторный шуруповерт, 20 лет, студент третьего курса бакалавриата направления «Разработка ПО», Университет Иннополис, GPA: 4.6. Вышел на позицию стажера DevOps в MWS Tables.

➡️ Зарегистрируйся и стань участником масштабного ИТ-чемпионата.

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

Вам знакома ситуация, когда лид приходит в ваш merge request и предлагает совершенно бессмысленную правку? Она не приносит пользы, не наносит вреда, но требует от вас дополнительных усилий.

Просто сделайте её.

Обсуждение может занять больше времени, чем сама правка, а в худшем случае перерасти в ненужный спор и проблемы в коммуникации. Разве нам это нужно? Скорее всего, нет.

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

У вас же есть всё необходимое для счастья: код, тесты и ощущение, что вы сделали что-то настоящее. У него остались только дашборды и диаграммы Ганта.

Сделайте эту правку, проявите добродетель. Дайте человеку хотя бы ненадолго почувствовать, что он всё ещё кому-то нужен и полезен.

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

Что делать, если Python-сервер падает из-за утечки памяти?

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

Итак, допустим, агент спустя время начинает расти по памяти и в итоге все падает. Где копать и как временно ограничить ущерб, пока ищете утечку?

Первое, что нужно сделать — измерить и локализовать. tracemalloc показывает, какие строки выделяют больше всего памяти, gc — количество объектов. 

Часто проблема в неограниченных кэшах, списках или в C-расширениях. Сначала стоит включить tracemalloc, дать процессу поработать и снять снапшот:

import tracemalloc
tracemalloc.start()
# после нагрузки
snapshot = tracemalloc.take_snapshot()
top = snapshot.statistics('lineno')[:10]
for stat in top:
    print(stat)

Параллельно делайте gc.collect() и логируйте число объектов len(gc.get_objects()), чтобы увидеть рост. На время расследования применяйте эксплуатационные меры: для WSGI-сервисов используйте Gunicorn с --max-requests и --max-requests-jitter, чтобы процессы периодически перезапускались и не накапливали мусор. А в контейнерах ставьте cgroup-пределы (--memory) и настраивайте restart-политику, чтобы платформа автоматически перезапускала упавшие поды.

Пример запуска Gunicorn:

gunicorn myapp:app --workers 4 --max-requests 1000 --max-requests-jitter 50

Если утечка в C-расширении или сторонней библиотеке, то временно автоматический перезапуск и мониторинг позволяют сохранить сервис работоспособным, пока вы находите корень проблемы и исправляете код.

Если хотите освоить инструменты Python, то в Академии Selectel у нас есть отдельная подборка статей. Там мы рассказываем, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга.

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

Дал боту имя и работать стало приятнее

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

Назвал Степаном.

Смешно, но код стал аккуратнее.

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

Наверное дело в том что когда называешь что-то именем, начинаешь нести за это ответственность иначе. Не «упадёт и ладно», а «Степан не должен падать».

Кто-нибудь ещё так делает или это только у меня странности?

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

Ошибки, которых не видно в сигнатуре: зачем C++ нужен std::expected

Функция выглядит предсказуемо, пока один из вызовов не бросает исключение, о котором никто не вспомнил. Типы ошибок остаются в документации, управление расползается по try/catch, а изменение глубоко в стеке неожиданно ломает обработку выше.

Недавно в статье разобрали std::expected из C++23: как сделать ошибку частью сигнатуры, собирать цепочки через and_then и transform, разделять типы ошибок между слоями и постепенно внедрять подход в legacy-код. Заодно увидели, где std::expected действительно полезен, а где добавит лишнюю сложность.

16 июля в 20:00 продолжим тему на бесплатном уроке «Выразительный C++: кодируем намерения». На практике разберём, как переносить неявные договорённости в типы, сигнатуры и структуру программы. Присоединяйтесь.

Полный список бесплатных уроков июля смотрите в дайджесте.

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

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

Я запустил скрапер вечером, он собрал пару тысяч страниц, я ушёл спать. Утром в логах сплошные 403 и капчи, а в базе за ночь легло страниц двести. Ок, думаю, прокси спалили. Поменял пул на резидентный, накинул puppeteer-stealth, сверху ещё пачку заплаток с гитхаба. Проработало ровно до следующего вечера. Потом опять тыква.

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

Осмотрим пациента

Любой стелс устроен одинаково: поверх Chrome вешается слой JavaScript, который переписывает то, на что смотрит антибот. navigator, canvas, WebGL и ещё десятки поверхностей. И вот тут первая засада.

Берём подменённую функцию и просим показать её исходник через toString(). Настоящая функция браузера отвечает [native code]. А моя заплатка честно показывает мой же JavaScript. Спалился на первой строчке.

Ладно, стелс это тоже патчит. Но детектор не дурак и лезет глубже.

  • Сверяет главный фрейм с воркером и iframe. Заплатка живёт в одном контексте, а тот же объект, вытащенный из другого, её не видит.

  • Ловит утечку Runtime.enable, по ней сразу понятно, что браузером кто-то рулит по CDP.

  • Смотрит на форму TLS-хендшейка (JA3/JA4) и сверяет её с тем, что обещает User-Agent. Заявляешь Chrome на Windows, а рукопожатие выдаёт питоновский клиент.

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

Где-нибудь да разъедется. И так будет всегда, потому что я крашу браузер сверху, а не меняю его изнутри. Это не «кривая заплатка», это тупик подхода: маскировка и то, что её просвечивает, написаны на одном языке. Тот, кто читает страницу, всегда на уровень ниже того, кто патчит её из той же страницы.

Вскрытие

Раз проблема в слое поверх браузера, надо убрать слой и лезть в сам браузер. Я взял исходники Chromium и пошёл править фингерпринт прямо в C++, в Blink, V8 и BoringSSL.

Идея простая. Каждое значение, которое читает детектор, должно быть не подменено сверху, а просто другим внутри, ровно как оно было бы на чужой машине. Тогда никакого слоя нет. Подменённый геттер это настоящий C++ геттер, поэтому toString() в любом реалме честно отдаёт [native code]. Сверка «фрейм против воркера» ничего не находит, потому что находить нечего: значение одно и то же везде, оно вкомпилировано в движок. Браузер, который изучает сам себя, видит обычный Chrome. Потому что это и есть обычный Chrome, просто с другими числами внутри.

Что заработало, а что нет

Сразу оговорю, чего не заявляю, потому что именно на этом обычно и врут. Это про фингерпринт браузера, а не про поведение сессии. Серверный антифрод конкретной площадки, поведенческий анализ, скорость и траектория мышки, тут я вам не помощник. Fortress чинит браузер, а не то, как вы им управляете.

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

  • CreepJS: 0% headless, 0% stealth.

  • Sannysoft: всё зелёное.

  • BrowserScan: пишет «Normal».

  • Живой Cloudflare Turnstile: проходит без клика мышкой.

Всё это воспроизводится одним скриптом tools/gauntlet.py из репозитория, так что можно прогнать самому и убедиться. Персона при этом собирается когерентно: платформа, GPU, таймзона, язык, набор голосов, раскладка клавиатуры и форма TLS съезжаются в один правдоподобный Windows-девайс, а не в ме

По коду менять нечего

Движок поднимает сырой CDP на порту 9222, без утечки Runtime.enable. Я цепляю к нему свой ж остальной код работает как работал. Меняется одна строчка, адрес подключения.

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

github.com/tiliondev/fortress

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

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

Backend без хрупких интеграций: 5 материалов, которые вы могли пропустить

На старте проекта многие решения выглядят простыми: сделать REST API, разнести сервисы, добавить очередь, договориться о моделях данных. Но по мере роста системы выясняется, что именно эти решения определяют, насколько легко её развивать дальше.

Эта подборка будет полезна тем, кто проектирует backend‑системы, работает с API, микросервисами, доменной моделью или просто регулярно сталкивается с вопросом: «как сделать так, чтобы архитектура не мешала разработке через полгода».

Собрали 5 материалов по теме:

  1. Как фронтенд получает данные с сервера: лучшие практики 2026 
    О том, как backend и frontend договариваются через API, где уместны REST, GraphQL, BFF и Server Components, и почему «быстро отдать JSON» ещё не значит сделать удобный интерфейс для клиента.

  2. Domain‑Driven Design: полный гайд по моделированию домена в 2026 году
    Разбор DDD как способа управлять сложностью: единый язык, ограниченные контексты, агрегаты, сущности и границы между частями системы.

  3. REST API: гайд по проектированию от принципов до боевых кейсов
    Практика проектирования API: ресурсы, методы, статус‑коды, ошибки, версионирование, кэширование и документация без формального следования REST ради REST.

  4. Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise
    Материал про асинхронное взаимодействие, очереди, события, идемпотентность, DLQ, мониторинг и типовые проблемы микросервисных интеграций.

  5. Архитектурные решения в backend: 5 практических приёмов
    О том, как принимать архитектурные решения без преждевременного усложнения: модульный монолит, YAGNI, порты и адаптеры, ADR и C4-диаграммы.

А если хотите не только читать, но и разбирать темы с практиками, смотрите дайджест — там собраны бесплатные открытые уроки по разработке, архитектуре и инфраструктуре.

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

Telegram Stars в боте: попробовал прикрутить, делюсь что удивило

Давно хотел добавить платежи в одного из своих ботов. Раньше использовал ЮKassa через нативный Telegram Payments. Но в этот раз решил попробовать Stars, всё-таки нативная валюта платформы, без внешних провайдеров.

Настройка оказалась проще чем ожидал. Никаких provider_token, никакой возни с webhook от платёжки. Просто отправляешь инвойс с указанием суммы в Stars и обрабатываешь successful_payment. Примерно так:

python

await bot.send_invoice(
    chat_id=message.chat.id,
    title="Премиум доступ",
    description="Доступ на 30 дней",
    payload="premium_30d",
    currency="XTR",
    prices=[LabeledPrice("30 дней", 100)]
)

Работает. Пользователь платит не выходя из Telegram, конверсия реально выше чем при редиректе на внешнюю страницу.

Но есть нюансы которые я не учёл сразу.

Первое: если пользователь покупал Stars через iOS или Android, Telegram отдаёт разработчику примерно 70% от суммы, остальное Apple и Google забирают себе. Если через десктоп или веб — почти всё твоё. Это принципиально меняет экономику для аудитории которая сидит на телефоне.

Второе: возвраты. Stars можно вернуть и Telegram это делает по запросу пользователя. Нужно обрабатывать refunded_payment иначе пользователь получит деньги обратно а доступ у него останется.

Третье: вывод только через Fragment в TON. Для российского юрлица это отдельная история.

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

Кто уже работает со Stars в продакшене, как решаете вопрос с выводом в рубли?

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

Вебинар «Как использовать ИИ на разных этапах разработки»

16 июля в 19:00 проидет гостевая встреча МФТИ и компании «Астон» о применении ИИ в разработке ИТ-продуктов.

На встрече разберем:

▪️ Как использовать ИИ для анализа исходной задачи, структурирования требований, подготовки вопросов к заказчику и создания черновика технического задания.

▪️ Как применять ИИ при проектировании архитектуры: выбирать компоненты, описывать взаимодействие сервисов, сравнивать варианты решений и находить риски.

▪️ Как инструменты Codex, Claude Code, Cursor и MCP-подходы помогают в разработке: написании кода, разборе кодовой базы, рефакторинге и поиске ошибок.

▪️ Как использовать ИИ в тестировании: подготовке тест-кейсов, генерации автотестов, анализе логов и проверке поведения системы.

▪️ Как ИИ-ассистенты помогают в DevOps — работе с Docker, Kubernetes, CI/CD, мониторинге и развертывании решений.

▪️ Какие навыки нужны начинающим специалистам и как развиваться в AI/ML-направлении. Кроме того, обсудим проекты компании «Астон» и карьерные возможности для студентов и начинающих специалистов.

Спикер— Алексей Сикора, ML-инженер, разработчик ИИ-агентов и аналитик данных в компании «Астон». Алексей имеет опыт работы в Big Tech и телеком-компаниях, развивает внедрение ИИ-решений, участвовал в создании ML-пайплайнов и аналитических платформ.

📅 16 июля (четверг), 19:00 (Мск)

💻 Онлайн

Регистрация:

Telegram: https://t.me/mipt_events_bot?start=dl-1783585994735

ВКонтакте: https://vk.com/app6379730_-224205661#l=27&auto=1

Теги:
+3
Комментарии0
Биржа Инфостарта: новые задачи по 1С за 1–8 июля
Биржа Инфостарта: новые задачи по 1С за 1–8 июля

На Бирже заказов Инфостарта опубликована новая подборка задач для 1С-специалистов. За неделю появились проекты по УТ, УНФ, БП, ЗУП, обменам между базами, XML-выгрузкам, печатным формам и интеграциям с внешними сервисами.

Среди новых заказов:

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

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

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

Волею судеб я занимаюсь престранными вещами, вроде написания Go бэкэнда под Windows. С опцией переноса его в Linux контейнер. Можно было бы сразу разрабатывать под контейнер, но на моей рабочей машине недостаточно оперативки для комфортной разработки.

Мой бэкэнд реализует ряд REST API функций и начинает свою работу с ловли входящих соединений на порту. Для этого я использовал net.Listener, который как выяснилось испытывает сложности с повторным захватом порта, а SO_REUSEADDR, который прекрасно работает в С++ в Go работает, как-то, не очень. Автоматический запуск приводил к порождению бесконечного числа процессов, которые только писали в лог ошибки безо всякой полезной деятельности. И когда мне надоело заставлять это работать я решил использовать старый и проверенный метод: сделать так, чтобы бэкэнд запускался по каждому порту один раз. Оставим в стороне неинтересные подробности того как связывать процессы с конечными точками (endpoints).

И всё было прекрасно до тех пор, пока я не добрался до того, что os.FindProcess() всегда находит процесс. Даже если процесс уже завершился. В случае запуска на POSIX системе можно было бы использовать process.Kill(0), но на моём Windows 11 это не работает. И, в условно переносимом коде появилась ветка для Windows:

var perr *os.SyscallError if runtime.GOOS == "windows" && errors.As(errKill, &perr) && errors.Is(perr.Err, syscall.ERROR_ACCESS_DENIED) {
log.Warnf("unable to kill dead process: %d. Error: %v", pid, perr)
} else {
log.Warnf("unable to kill process: %d. Error: %v", pid, errKill)
return errors.New("previous process running")
}

А морали в данном посте не будет. Для меня это сильно похоже на Python, где я также делил код на Windows и POSIX. Вполне вероятно, что я просто не знаю простого и лёгкого способа добиться необходимого мне поведения.

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

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

Откуда модель вообще узнаёт, что ошиблась? Именно с этого, как мне кажется, и стоит начинать изучение машинного обучения. В новой части книги я попытался объяснить это максимально просто и без фраз вроде "нейросеть сама обучается". Разбираем, что такое ошибка, почему она превращается в loss-функцию, зачем вообще нужны MSE и Log Loss, и как несколько строк математики становятся тем самым сигналом, который заставляет модель становиться лучше. Loss-функции являются центральным механизмом обучения современных моделей машинного обучения.

Если давно хотели понять, что происходит "под капотом" современных AI-моделей – буду рад, если почитаете.

📖 https://apphp.gitbook.io/ai-dlya-php-razrabotchikov-intuitivno-i-na-praktike/chast-ii.-obuchenie-kak-optimizaciya/2.1-oshibka-loss-funkcii-i-zachem-oni-nuzhny

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

Хотел сделать крутую онлайн игру. Расскажу где всё пошло не так

Идея была простая до безобразия. Браузерная змейка но с живыми соперниками. Canvas, websocket, Node.js. Всё это я более-менее знал, казалось делов на пару выходных.

Первый день вообще огонь. Змейка ползает, еду ест, растёт, цвета красивые. Думаю ну всё, осталось только игроков подключить.

Ага.

Синхронизация это ад

Подключил websocket, запустил два браузера на одной машине, вроде видят друг друга. Отлично. Добавил искусственную задержку 50мс чтобы проверить как будет на реальной сети.

Всё сломалось.

У одного игрока змейка уже повернула, у второго она ещё летит прямо. Столкновения каждый клиент считает сам по своей картинке мира. Один видит что убил соперника, второй видит что убил он. Оба правы по своей логике.

Полез гуглить. Нашёл что это называется authoritative server, client-side prediction, lag compensation. Понял что я вообще не туда смотрел когда проектировал. Думал займёт вечер. Потратил месяц и всё равно сделал через одно место.

Лобби которое я не планировал

Ок, физику перенёс на сервер. Теперь надо чтобы игроки могли найти друг друга, подождать, начать игру. Звучит как мелочь.

Это не мелочь.

Ожидание, старт, игра, конец, переиграть — каждое состояние надо синхронизировать. И самое весёлое это когда один игрок просто закрыл вкладку в середине партии. Что показывать второму? Кто победил? Как засчитать? Три вечера только на обработку разрывов соединения.

Читер за пять минут

Дал поиграть другу. Через пять минут он открыл консоль и начал отправлять серверу произвольные координаты. Змейка телепортировалась куда хочет. Я вообще не думал об этом когда писал архитектуру.

Что по итогу

Игра работает. Можно найти соперника и сыграть партию. Но код это такой клубок что я боюсь его открывать.

Главное что понял: онлайн игра это не игра плюс немного сетевого кода. Это совсем другая задача где сеть и есть основная сложность. Я недооценил это раз в десять минимум.

Код выложу на GitHub как разберу этот клубок. Пока стыдно показывать.

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

Теги:
+4
Комментарии2
1
23 ...