惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
A
Arctic Wolf
S
Securelist
O
OpenAI News
T
Threatpost
Forbes - Security
Forbes - Security
N
News and Events Feed by Topic
S
Secure Thoughts
H
Heimdal Security Blog
S
Security Affairs
P
Privacy International News Feed
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Palo Alto Networks Blog
S
Security @ Cisco Blogs
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
T
Tailwind CSS Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
S
SegmentFault 最新的问题
腾讯CDC
V
Visual Studio Blog
Last Week in AI
Last Week in AI
H
Hacker News: Front Page
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Project Zero
Project Zero
WordPress大学
WordPress大学
NISL@THU
NISL@THU
博客园 - 【当耐特】
博客园 - Franky
Webroot Blog
Webroot Blog
博客园_首页
T
Tenable Blog
雷峰网
雷峰网
Google Online Security Blog
Google Online Security Blog
阮一峰的网络日志
阮一峰的网络日志
V2EX - 技术
V2EX - 技术
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
Lohrmann on Cybersecurity
The Hacker News
The Hacker News

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Возвращение блудного программиста (ч. 4)
VAnderskaeV · 2026-05-16 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение6 мин

Охват и читатели150

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

Содержание

Для начала, напомню о себе: «у меня свой бизнес, а в IT, я так, для души». Шутка. В общем, после 12 лет отсутствия в сфере я решил вернуться к своему базовому образованию – инженер-программист. Что-то приходится «вспоминать с нуля», но я не люблю начинать изучение полностью с теории, я больше экспериментатор. Во-первых, так можно учиться до бесконечности, оттачивая свои знания, но никогда их не применить. Во-вторых, банально, но ты не узнаешь, что такое горячо пока не потрогаешь. Есть еще, в-третьих, теперь есть ИИ – интерактивная энциклопедия и помощник в одном лице (хотя тут столько своих НО).

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

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

Так вот. Спустя почти 2 недели, попутно изучая что и зачем, я закончил бэкенд. Насколько я знаю, здесь не очень принято обсуждать опыт использования ИИ, но я вас спрашиваю, как это работает: «я никогда не сталкивался с IT, по образованию я преподаватель литературы, но решил всё изменить, и за один вечер с ИИ написал супер-пупер мега сервис». Как, Карл?

Вы видели, что он выдаёт? О, это вполне работоспособный код, но это «бомба замедленного действия». В первую очередь, меня напрягла куча фреймворков, кажется, буквально на всё. Ладно, может это сейчас так и делается. Потом, выдуманные параметры (например, для ендпоитнов ISS MOEX), или наоборот, заверения, что ничего не надо. Самое прикольное – это когда ИИ выдает полный листинг файла, а потом текстом примечание, типа «я тут использовал устаревший/неэффективный/еще какой-то подход, если хотите, чтоб всё работало как часы – надо сделать то-то и то-то». Блин, а когда ловишь его на ошибке/неточности «да, вы правы. Сейчас исправлю. И, кажется, всё равно кривой код попадает к контекст».

Отдельные перлы

Ты прав по обоим пунктам.

По первому — current_price * quantity абсолютно верно. Рыночная цена облигации уже отражает амортизацию — ISS её считает с учётом остаточного номинала. Нам не нужно ничего пересчитывать.

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

И это после того, как он мне это вставил в код, я столкнулся с "кривыми" данными, нашел почему и... да, я прав.

ISS хранит только 2 дня внутридневных данных — значит таймфреймы 1м и 5м будут доступны только за текущий и предыдущий торговый день.

Это совершенно не так, ISS отдаёт свечи, чуть ли не c 2008-10 годов по 7 разным интервалам, но там нет 5 минут. Я долго пытался понять почему я получаю пустой массив.

Именно, ты правильно мыслишь. Раз данные в MySQL обновляются раз в минуту — WebSocket вообще не даёт никакого преимущества. Смысла в нём ноль.

А тут он мне на shared-хостинге (да он знает мои ограничения) советует мне заморочиться с WebSocket (это вообще реально?) для данных, которые на сервере обновляются раз в минуту, а на клиенте, если чаще минуты вообще берутся из кэша (на фронте TanStack Query, при чем сам ИИ предложил).

Фуух, всё. В защиту скажу, что для изучения, в чём-то это даже хорошо. Как это работает для меня на конкретном примере. Я понимаю, что нужно сделать. Надо раз в сутки делать запрос к ISS, получать список бумаг и заливать их в MySQL на сервере в несколько таблиц. Затем, ежеминутно запрашивать с ISS котировки и тоже заливать в MySQL. Так сделано, чтобы не долбить ISS запросами от каждого клиента. Я лучше один раз заберу к себе, а потом раздам клиентам, в том числе из кэша. Но я не знаю всех прелестей python (мой стек был Delphi+ADO+MS SQL. Да, я баловался и PHP, и Python, даже Perl чуток, но это не в счёт). Я прошу ИИ написать код и изучаю его. Всё здорово, всё понятно и работает.

Я рад, но не долго. Начинаю делать ручные тесты (пока не в теме QA Automation). Вот тут и начинается обучение: я вижу, что скрипт работает не так как запланировано, разбираюсь с этим (были неправильные ендпоитны, не учитывал пагинацию, уверяя что её нет, брал вообще не те поля, брал названия полей не из модели данных и так далее). Начинаю фиксить сам, потом делаем это вместе с ИИ. Снова тесты. Снова сам, снова ИИ. И на одной из итераций победа! Локально. Всё работает, всё правильно берёт, правильно раскладывает. Деплой.

С первого взгляда всё отлично, но помните отступление про хостинг? А теперь эти скрипты «отжирают» 13% CPU, вместо разрешённых CPU. Разбираемся. Тут, конечно, я развёл руками. Отдался ИИ. Оказывается, мало того, что они долбят ISS каждый раз SSL церемониями на каждую бумагу, так еще и MySQL по несколько раз дергают, т.е. для 100 бумаг – это 100 соединений, и 200-300 обращений к базе через дополнительную прослойку (SQLAlchemy). Это только 1 скрипт, во втором всё еще хуже: на каждую бумагу несколько запросов к ISS (из-за пагинации ответов), и кратно записей в MySQL. Не удивительно, что каждый из них в момент работы занимал до 50-60% процессорного времени.

Починили. В начале скрипта открываем сессию к ISS и запросы шлём в рамках этой сессии, собираем по результатам массив и на native SQL делаем bulk insert. Для меня пока что всё логично, и время CPU сократилось до 2-4%, т.е. имеем ожидаемый результат.

Для тех, кто любит пинать ногами

Первоначальный код
def fetch_coupons(ticker):
    while True:
        url = f'{ISS_BASE}/statistics/engines/stock/markets/bonds/bondization/{ticker}.json'
        try:
            r = requests.get(url, params=params, timeout=15)
            r.raise_for_status()
            data = r.json()
            # some more code

        except Exception as e:
            print(f' Ошибка при загрузке купонов {ticker} (start={start_coupons}): {e}')
            break
    
    while True:
        url = f'{ISS_BASE}/statistics/engines/stock/markets/bonds/bondization/{ticker}.json'
        try:
            r = requests.get(url, params=params, timeout=15)
            r.raise_for_status()
            data = r.json()
            # some more code

        except Exception as e:
            print(f' Ошибка при загрузке амортизаций {ticker} (start={start_amort}): {e}')
            break
    
    return sorted_coupons, sorted_amorts

with app.app_context():
    bonds = Security.query.filter_by(is_active=True, type='bond').all()
    for i, sec in enumerate(bonds, 1):
        rows, amort = fetch_coupons(sec.ticker)
        
        for c in rows:
            try:
                db.session.execute(“INSERT …. ON DUPLICATE KEY UPDATE”)
            except Exception as e:
                print(f'  Ошибка записи купона {sec.ticker}: {e}')
                continue

        for a in amort:
            try:
                db.session.execute(“INSERT …. ON DUPLICATE KEY UPDATE”)
            except Exception as e:
                print(f'  Ошибка записи амортизаций {sec.ticker}: {e}')
                continue                                   

    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        print(f'  Ошибка commit {sec.ticker}: {e}')
К чему пришли в итоге
def fetch_coupons(session, ticker):
    while True:
        url = f'{ISS_BASE}/statistics/engines/stock/markets/bonds/bondization/{ticker}.json'    
        try:
            r = session.get(url, params=params, timeout=15)
            r.raise_for_status()
            data = r.json()
            # some more code

        except Exception as e:
            print(f' Ошибка при загрузке купонов {ticker} (start={start_coupons}): {e}')
            break    

    while True:
        url = f'{ISS_BASE}/statistics/engines/stock/markets/bonds/bondization/{ticker}.json'
        try:
            r = session.get(url, params=params, timeout=15)
            r.raise_for_status()
            data = r.json()
            # some more code

        except Exception as e:
            print(f' Ошибка при загрузке амортизаций {ticker} (start={start_amort}): {e}')
            break 

    return sorted_coupons, sorted_amorts       

with app.app_context():
    with requests.Session() as session:
        bonds = Security.query.filter_by(is_active=True, type='bond').all()              
        for i, sec in enumerate(bonds, 1):
            rows, amort = fetch_coupons(session, sec.ticker)        
            for a in amort:
                bulk_amortizations.append({})
            for c in rows:
                bulk_coupons.append({})   

        if bulk_amortizations:
            try:
                db.session.execute(
                    db.text(),
                    bulk_amortizations
                )
                db.session.commit()
            except Exception as e:
                db.session.rollback()
                print(f'  Ошибка массовой записи амортизаций: {e}')  
                  
        if bulk_coupons:
            try:
                db.session.execute(
                    db.text(),
                    bulk_coupons
                )
                db.session.commit()
            except Exception as e:
                db.session.rollback()
                print(f'  Ошибка массовой записи амортизаций: {e}')                     

        db.session.remove()

Чему я научился за это время короткое:

  • доверяй ИИ, но проверяй. Тут как раз становятся актуальны статьи (здесь же, на Habr), почему нельзя вайбкодить если ты не разбираешься в программировании;

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

  • изучил ряд новых для себя конструкций, как например, декораторы функций в python;

  • ознакомился сразу с несколькими фреймворками. Не говорю, что изучил, ведь только опробовал часть функционала применительно к данной задаче;

  • ну и понял множество нюансов, вроде handshake в начале каждой сессии.

Смогу ли я повторить бэкенд без ИИ теперь. Вполне, но в любом случае мне потребуется документация на большинство инструментов, которые я применил. Здесь я рассказал только про два cron скрипта, которые мне показались наиболее интересными именно с точки зрения моего подхода к обучению. Кроме описанного у меня используется кэширование (Flask-Caching), аутентификация JWT (Flask-JWT-Extended), естественно сам Flask, ORM (SQLAlchemy), alembic для миграций.

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