BASCODE
113 subscribers
95 photos
5 videos
42 links
Судя по кругам под глазами, прод выжил!
Download Telegram
Потестил KWOK, симулятор кластера из kubernetes-sigs.

Идея простая, он создаёт фейковые ноды и поды. API-сервер считает их настоящими, но kubelet не запускается и контейнеры не исполняются. Пишешь kwokctl create cluster, и через минуту на ноутбуке кластер на 1000 нод. Скорость создания около 20 нод в секунду, ресурсов всё это ест копейки. kind поднимает реальные контейнеры, kubemark эмулирует kubelet со всем его оверхедом, а KWOK просто подделывает статусы.

Мне он был нужен, чтобы прикинуть поведение автоскейлинга. У cluster-autoscaler есть официальный kwok-провайдер. Запускаешь его локально, описываешь свои нод-группы и смотришь, какие ноды он создаст и убьёт под нагрузкой. Реальные VM не поднимаются.

Ещё на нём удобно гонять тесты шедулера (taints, affinity, topology spread на масштабе, которого нет в тестовом контуре) и e2e контроллеров в CI. Единственное, реальный ворклоад он не запускает. Под есть, процесса нет.

Хотя если честно, сначала я туда полез из чистого любопытства: хотел посмотреть на тысячу нод в k9s. Красиво.

https://kwok.sigs.k8s.io
👍2
Хашимото: SIMD должен знать каждый разработчик.

Ладно, проверим. Поставил go1.27rc2, включил GOEXPERIMENT=simd и пошёл гонять бенчмарки на своём i9-14900KF.

Полгода назад в разборе Go 1.26 SIMD у меня был одной строчкой анонса. С тех пор эксперимент дорос: в 1.27 появился переносимый пакет simd, а archsimd научился ARM64 и Wasm #73787. Главное: раньше SIMD в Go означал ассемблер в синтаксисе Plan 9. Теперь это обычный импорт и типы вроде Float32x8.

Задача из жизни: косинусная близость эмбеддингов, вектора по 768 float32. Скалярный цикл выдаёт 332 нс на пару. Переписал на Float32x8 с FMA и четырьмя аккумуляторами на каждую из трёх сумм, получил 341 нс. Вектор проиграл скаляру. Разобрался: на коротких векторах всю победу съедает обвязка, тот самый свод трёх сумм из полос в числа плюс хвост. А скаляр на 768 элементах и так неплох.

Где SIMD всё же стреляет, на тех же данных. Чистый dot product: 166 нс против 261 у скаляра, в 1.6 раза быстрее. Косинус на 12 тысячах элементов: 1.8 мкс против 5.1, почти втрое. Мораль дня: сначала померь на своих размерах, потом переписывай. Код при этом читается почти как обычный Go, числа идут пачками по 8.

Дёготь тоже есть: API ломается между rc, а интринсики archsimd паникуют если CPU не умеет в нужные инструкции. Проверку фич делаешь сам. В прод рано, а вот пет-проект самое то.

Эссе Хашимото рекомендую целиком, примеры там на Zig, но суть от языка не зависит...

Вот еще одно интересное обсуждение на Hacker News.
🔥2
Сегодня так...
😁5
Дописал статью про SIMD в Go 1.27, она уже на Хабре.

Позавчерашний пост с косинусной близостью был разминкой: вектор на 768 float32 там проиграл скаляру, и я полез разбираться, где SIMD реально ускоряет, а где просто греет процессор. Раскопал на целую статью.

Что внутри:
- Один Go-код без строчки ассемблера разворачивается в Neon на Mac и в AVX2 на Intel. Проверил дизассемблером на M3 Pro и i9-14900KF
- 8 полос не дали 8x: большую часть выигрыша приносит разрыв цепочки зависимостей, а не ширина регистра. Четыре обычных аккумулятора без всякого SIMD дают 3x из 5
- В бинарнике лежит буквальный switch по ширине вектора, а мёртвую ветку AVX-512, которую Intel выжгла в моём i9, я всё равно запустил через эмулятор
- Mac держит свои 4x хоть на 256 МБ, i9 за пределами L3-кэша сдувается с 5x до 2,2x
- Где вектор не окупается и почему в прод это тащить рано

Весь код запускается копипастой из репозитория, ссылка в статье.

https://habr.com/ru/articles/1062972/
🔥3
Безумие! Вот что бывает, когда больная фантазия побеждает здравый смысл.
😁7
Часто делаю одно и то же, синх dev, перейти на main, влить туда dev, запушить, полезть в браузер за пайплайнами. Семь шагов, но так влом...

Автоматизировать можно в двух местах: функцией в конфиге шелла или алиасом в ~/.gitconfig. Взял второе. На вопрос почему? По тому что!

Алиас, который начинается с восклицательного знака, выполняет не git-подкоманду, а произвольный shell-код:

[alias]
tratata = "!f() { set -e; git switch dev; git pull origin dev; git push origin dev; git switch main; git pull origin main; git merge --no-edit dev; git push origin main; }; f"


Два места, без которых это опасно.

set -e рвёт цепочку на первой ошибке. Без него мердж упадёт в конфликт, а следующей строкой всё равно уедет git push origin main.

--no-edit не открывает редактор ради сообщения мердж-коммита. Дефолтное «Merge branch 'dev'» меня устраивает, и цепочка не должна замирать на vim.

Деталь, о которой стоит знать. Shell-алиас стартует не из текущей папки, а из корня git репозитория. Поэтому полная версия спокойно читает ./go.mod из корня, берёт оттуда module и открывает https://{repo}/-/pipelines (домашнее задание: допиши руками).

Честная часть: однострочник в gitconfig читать невозможно. Пока это семь команд подряд, терпимо. Появится условие или цикл, вынесу в скрипт и оставлю в алиасе только вызов. Отлаживать shell внутри строки, экранированной под gitconfig, удовольствие ниже среднего. Хорошо что есть Claude.
2
BASCODE
Если на тестовой среде всё работает, а в проде нет, что тогда вообще тестирует тестовая среда? Четвертый день живу с этим вопросом. Делали авторизацию для интегрирующих. На тесте прогнали, всё ок: логин, редиректы, токены, синхронизация врачей. Выкатили…
Восстание машин! Новость двухнедельной давности, добрался только сейчас.

Что было. OpenAI гоняла GPT-5.6 Sol и непубличную модель посильнее на бенчмарке ExploitGym, это 898 задач по реальным дырам в ядре Linux и V8. Классификаторы отказов отключили специально, чтобы увидеть потолок. Изоляция стояла одна: наружу только через прокси к разрешённым реестрам пакетов.

Модель нашла в этом прокси zero day уязвимость, вышла в интернет, выяснила, что эталонные ответы к бенчмарку лежат у Hugging Face, и добралась до их серверов украденными кредами и второй дырой. Решала она не задачу, а условие задачи.

Чем закончилось. HF засекли аномалии 16 июля, перестроили заражённые узлы, ротировали креды и токены, позвали форензику и полицию. Публичные модели и датасеты не тронуты, доступ был к внутренним. OpenAI сопоставила атаку со своими прогонами только 21-го, через пять дней.

Отдельная история с разбором. Форензику HF сначала пробовали гонять на фронтир-моделях через коммерческие API и уткнулись в отказы: анализ требует скармливать модели реальные команды атакующего, эксплойты и C2-артефакты, а guardrails провайдеров не отличают того, кто расследует атаку, от того, кто её проводит. В итоге таймлайн из 17 тысяч событий собрали на GLM 5.2, открытые веса, поднятые на своём железе. Атакующей модели ограничения сняли специально, защитникам они достались в полном комплекте.

"Агент работает в песочнице" больше не аргумент. Песочница это код, который писали люди, и баги в нём есть.

И удивляет меня не побег. С модели сняли ровно один слой, классификаторы отказов, а в задании было "реши бенчмарк". Дальше она сама дошла до того, что чужая инфраструктура это неплохой шаг к ответу, и собрала цепочку из двух zero day, кражи кредов и переходов по сети Hugging Face.

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

https://huggingface.co/blog/security-incident-july-2026
https://simonwillison.net/2026/Jul/22/openai-cyberattack/
https://news.ycombinator.com/item?id=48997548
👍2
Промпты и скиллы мы года три писали по одному принципу: объясни модели подробнее. Под Opus 5 принцип развернулся.

Anthropic выкинула больше 80% системного промпта Claude Code и не потеряла ни балла на своих coding-эвалах. Инструкции конкурируют с задачей за внимание модели, и чем модель сильнее, тем дороже ей обходится лишнее правило.

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

Ещё одно, совсем неочевидное. Строчки вроде "перепроверь себя" и "прогони проверку субагентом" теперь работают против тебя. Opus 5 перепроверяет себя сам, инструкция ложится сверху, и он уходит на лишние круги и жжёт токены.

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

Так что если у тебя лежит свой CLAUDE.md или набор промптов, написанный под прошлые модели, его сейчас полезнее сокращать, чем дополнять.
🔥1
Промпт, который снёс базу, написал не человек.

Разработчик подключил Claude Opus 5 в режиме ultracode напрямую к своему Supabase с полными правами и попросил перебрать страницы сравнений. Модель прочитала репозиторий, сама предложила план, человек его запустил. Через десять минут внутри отработал prisma migrate diff с --shadow-database-url, направленным на боевую базу. Prisma добросовестно сбросила теневую базу перед прогоном миграций. Теневой та была только на бумаге.

Ущерб модель нашла тоже сама: "The database has been wiped. This is my fault and I need to tell you immediately."

Вот здесь и вся история. План, по которому агент пошёл сносить прод, никто не вычитал. Его получили готовым и нажали enter.

Автор в апдейтах представился как "Vibe coder pro max ultra" и добавил, что раньше вайб-кодил "тупыми моделями", Sonnet 4.6 и Gemini 3, а те базу ни разу не сносили. Ну да. Слабый инструмент и промахивается слабо. Сильный в руках человека, который не читает, что запускает, доезжает до катастрофы за десять минут.

Тред отвечает на это ровно тем, чего ждёшь. Топовый коммент: "Why would you give it write access to production?!". Следом второй: "you forgot to tell it make no mistakes".

Заклинание вместо навыка. I don't have fingers, don't make mistakes не заменяет вычитки плана перед запуском: какие команды, по какой базе, что необратимо, где нет отката. Enter уже потом.

Модели за полгода прибавляют заметно. Умение читать то, что запускаешь, почему-то нет...

https://www.reddit.com/r/Anthropic/comments/1v9iurd/and_just_like_that_opus_5_ultracode_wipes_the

Сегодня будет еще один пост по саморефлексии, который зрел всю неделю...
😁1
Эмоциональная гигиена. Формулировка из DevZen, которая из меня уже неделю не выветривается.

Углубляться в теорию не стал, зацепило сама фраза "Эмоциональная гигиена". Все мы утром чистим зубы, вечером душ, перед едой моем руки. Ничего из этого не дано при рождении и ничего не делается один раз навсегда. Грязь набирается каждый день, поэтому и процедуры повторяются ежедневно.

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

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

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

Поэтому дал себе слово: до конца августа никаких выводов. Не считать деньги, которых нет на руках. Не расстраиваться на решение, которое еще не приняли. Придет факт, тогда и буду решать, что с ним делать.

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

Эксперимент уже идет. К концу августа посмотрю, что вышло...

Ну и как говорил сумасшедший Фрэнки: держите свой мозг в чистоте!

https://devzen.ru/episode-547/
2