Забытые кавычки вокруг переменной — самая частая ошибка в скриптах на шелле: пока в пути нет пробела, всё работает, а потом внезапно ломается. ShellCheck ловит это и ещё сотни похожих случаев до запуска, а не в проде.
Запуск простой:
Важно, чем он не является:
Проекту почти четырнадцать лет, 39,9 тысячи звёзд, последний стабильный релиз в августе прошлого года, есть готовые интеграции с редакторами, хуками перед коммитом и сборкой.
Язык: Haskell. Лицензия: GPL-3.0.
@prog_tools
Запуск простой:
shellcheck script.sh. Дальше по вкусу — -s bash или -s dash для конкретного диалекта, -S error чтобы оставить только серьёзное, -e SC2086 чтобы заглушить конкретное правило. Флаг -x заставляет анализировать и файлы, подключённые через source. Для сборки есть форматы вывода -f json, -f gcc и -f checkstyle, а отключения можно писать прямо в коде директивой # shellcheck disable=SC....Важно, чем он не является:
bash -n проверяет только синтаксис, shfmt форматирует, Bats гоняет тесты. ShellCheck закрывает статические ошибки и не заменяет проверку поведения.Проекту почти четырнадцать лет, 39,9 тысячи звёзд, последний стабильный релиз в августе прошлого года, есть готовые интеграции с редакторами, хуками перед коммитом и сборкой.
Язык: Haskell. Лицензия: GPL-3.0.
@prog_tools
👍1
На позиции Senior+ в международных компаниях System Design — это 50% решения об оффере.
AI-рекрутёр Alex с опытом 4 000+ интервью прогонит вас через реалистичную секцию System Design.
За 15 минут вы получите:
Первый прогон и отчёт — бесплатно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1🤣1
Покрытие тестами обычно считают по файлам, которые тесты подключили. Файл, до которого не дошёл ни один тест, в отчёт не попадает — и картина выглядит лучше, чем есть.
В Node.js 26.7.0 от 5 августа у встроенного запускальщика тестов появился флаг
Остальное в релизе:
🔘 в
🔘 в
🔘 в хуки модулей добавлена поддержка
🔘 обновлены корневые сертификаты и npm до 11.19.0.
Если собираете Node из исходников: теперь нужен компилятор Rust не ниже 1.86.
@prog_tools
В Node.js 26.7.0 от 5 августа у встроенного запускальщика тестов появился флаг
--test-coverage-include-all, который считает все файлы проекта. Отдельный инструмент вроде nyc для этого больше не нужен: свой раннер и покрытие в Node есть с 18-й версии.Остальное в релизе:
sqlite закрыты обращения к освобождённой памяти в Exec() и ApplyChangeset(), добавлен сброс сессий при закрытии базы;crypto появилась загрузка приватных ключей через загрузчики STORE — ключ можно брать из внешнего хранилища, а не только из файла;Symbol.dispose;Если собираете Node из исходников: теперь нужен компилятор Rust не ниже 1.86.
@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
yazi — файловый менеджер для терминала: ходишь по каталогам с клавиатуры, видишь превью картинок, PDF, кода и архивов прямо в панели, а действия и подсветку дописываешь на Lua. 15 августа вышла версия 26.8.15, у проекта 41,4 тыс. звёзд на GitHub на 17 августа.
🔘 drag-and-drop файлов из терминала в GUI-приложения и обратно;
🔘 корзина вместо безвозвратного удаления и массовое создание файлов;
🔘 меню помощи стало палитрой команд, у строки ввода появилась история;
🔘 автоматическое переключение светлой и тёмной темы вслед за терминалом;
🔘 собственный VFS-провайдер: плагин может подключить удалённое хранилище как каталог;
🔘 официальный APT-репозиторий для Debian и Ubuntu, превью через kitty-протокол внутри Zellij.
Очевидная альтернатива —
@prog_tools
Очевидная альтернатива —
mc: две панели, есть на любом сервере, работает без Rust-бинарника и плагинов, и для копирования файлов между двумя каталогами он удобнее. yazi берёт асинхронными превью, скоростью на больших каталогах и расширяемостью; из той же ниши ranger на Python и lf на Go, но у обоих превью и плагины скромнее.@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
openleetcode запускает задачи LeetCode локально. Решение выполняется у вас на машине, а тесты лежат в открытом репозитории, а не на сервере сервиса: команда
🔘 около 1400 задач;
🔘 Python, C++, Rust, Go, Java, Kotlin, TypeScript и ещё несколько языков;
🔘 в версии 1.0.4 от 17 августа обновили зависимости и починили раннер, в том числе конфликт имён переменных и обработку однобайтных символов.
Сам LeetCode по многим пунктам лучше: каталог больше, тесты скрытые, есть редактор и обсуждения, а отправка решения на сервер всё равно остаётся отдельным шагом. Авторы прямо предупреждают, что локальные наборы тестов поддерживаются вручную и могут пропустить крайние случаи, а system design, SQL и задачи на многопоточность не поддерживаются вовсе.
Смысл в другом: решения и тесты живут в вашем git, работают офлайн, запускаются из вашего редактора и прогоняются в CI перед коммитом. На Linux и macOS установщик сам поднимает Piston через Docker Compose, на Windows ставится только CLI, бэкенд запускается руками.
@prog_tools
openleetcode submit ./solution.py --id 1 сама находит задачу, собирает обвязку под язык и прогоняет решение через Piston, который поднимается рядом в Docker.Сам LeetCode по многим пунктам лучше: каталог больше, тесты скрытые, есть редактор и обсуждения, а отправка решения на сервер всё равно остаётся отдельным шагом. Авторы прямо предупреждают, что локальные наборы тестов поддерживаются вручную и могут пропустить крайние случаи, а system design, SQL и задачи на многопоточность не поддерживаются вовсе.
Смысл в другом: решения и тесты живут в вашем git, работают офлайн, запускаются из вашего редактора и прогоняются в CI перед коммитом. На Linux и macOS установщик сам поднимает Piston через Docker Compose, на Windows ставится только CLI, бэкенд запускается руками.
curl -fsSL https://raw.githubusercontent.com/therepanic/openleetcode/main/install.sh | sh
@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Открываете
Клиентов много и на любой вкус:
Честно про место в экосистеме:
Проект живёт с 2013 года, 63,4 тысячи звёзд и 5,4 тысячи форков — страницы пишет сообщество, и правки принимают постоянно.
@prog_tools
man tar, там четыре тысячи строк, а нужно всего лишь распаковать архив. tldr решает ровно эту задачу: показывает не полный справочник, а несколько типовых примеров использования команды.tldr tar — и вы видите пяток строк с готовыми командами: создать, распаковать, посмотреть содержимое. То же для find, ssh, chmod, git. Страницы написаны обычным Markdown, места для подстановки помечены двойными фигурными скобками, есть отдельные варианты для Linux, macOS и Windows.Клиентов много и на любой вкус:
pipx install tldr для Python, npm install -g tldr для Node, cargo install tlrc --locked для быстрого клиента на Rust.Честно про место в экосистеме:
man остаётся авторитетным и полным источником, cheat.sh ищет сразу по нескольким базам, navi даёт интерактивные шпаргалки. tldr выигрывает именно как быстрый ответ на вопрос «как этой командой сделать обычную вещь».Проект живёт с 2013 года, 63,4 тысячи звёзд и 5,4 тысячи форков — страницы пишет сообщество, и правки принимают постоянно.
@prog_tools
❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Плагин mobile-use даёт агенту в терминале управлять Android-телефоном: экран телефона рисуется прямо в боковой панели OpenCode, а агент нажимает, печатает, свайпает и открывает приложения через
Внутри 12 инструментов —
Ставится как npm-пакет, нужен OpenCode V2 (
@prog_tools
adb, каждый раз сверяясь со свежим скриншотом или дампом интерфейса. Автор показал это на видео.Внутри 12 инструментов —
phone_tap, phone_swipe, phone_type, phone_dump_ui, phone_logcat, phone_shell и другие, — плюс готовые сценарии для WhatsApp, X, камеры, Spotify и звонков и подагент phone-vision для моделей без зрения. Где можно, навигация начинается с deep links am start, а не с тыканья по интерфейсу. Телефон подключается по USB, по Wi-Fi или через Tailscale, то есть может лежать дома.Ставится как npm-пакет, нужен OpenCode V2 (
opencode2) и включённая отладка по USB; код на MIT. Не привязан к OpenCode другой вариант — mobile-mcp: тот же adb плюс iOS, через MCP и с любым совместимым клиентом, зато без живого экрана в интерфейсе.@prog_tools
👍2
OpenTelemetry Collector — прослойка между вашими сервисами и системами наблюдаемости. Сервисы шлют логи, метрики и трейсы в него, а он фильтрует, дописывает атрибуты и раскладывает по адресатам. Смысл в развязке: сменить систему хранения можно правкой конфига, не трогая код приложений. Fluent Bit и Vector делают похожее, но collector — эталонная реализация стандарта, и агенты под него пишут все.
4 августа вышла версия 0.158.0. Главное — новый компонент
Остальное:
🔘 в описаниях компонентов появились готовые типы
🔘 расширение
🔘 исправлено ложное предупреждение, из-за которого молча отключалась старая метрика;
🔘 отладочный экспортёр перестал печатать числовые атрибуты в сыром виде.
Ломающее: убраны проверяющие функции из пакета
@prog_tools
4 августа вышла версия 0.158.0. Главное — новый компонент
queuebatch вместо старого batchprocessor: он построен поверх общей обвязки экспортёров и настраивается теми же параметрами, что и очередь отправки, так что двух разных наборов настроек для соседних вещей больше нет.Остальное:
duration, opaque_string, opaque_map и другие;memory_limiter доросло до беты;Ломающее: убраны проверяющие функции из пакета
xconfmap, брать теперь из confmap.@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1
Jujutsu, или
🔘 стабилизирована работа с тегами:
🔘 новый revset
🔘
🔘
🔘 повторно переданный аргумент больше не ошибка, побеждает последний.
Альтернатива очевидна: сам Git. У него любой хостинг, submodules, IDE и десять лет чужих скриптов; у
@prog_tools
jj, — система контроля версий, которая работает поверх обычного Git-репозитория: коллеги видят привычные ветки и коммиты, а у вас другая модель. Рабочая копия сама по себе коммит, staging area нет, любая операция отменяется через jj undo, конфликты хранятся в истории и не блокируют работу. 6 августа вышла версия 0.44.0, у проекта 31 тыс. звёзд на 17 августа.jj git fetch забирает их как <имя>@<remote>, теги можно отслеживать и не отслеживать как bookmarks, jj git push --all теперь пушит и теги;merge_point() находит точку слияния веток, по аналогии с fork_point;jj file search печатает совпавшие строки с именем файла, номер строки добавляет -n, старое поведение — через --name-only;jj run идёт по ревизиям от старых к новым, получил --passthrough, --ignore-changes и --ignore-errors;Альтернатива очевидна: сам Git. У него любой хостинг, submodules, IDE и десять лет чужих скриптов; у
jj Git-совместимость объявлена стабильной, а команды и рабочий процесс до 1.0 могут меняться, о чём проект пишет в каждом релизе. Зато переписывание истории и работа с несколькими правками одновременно здесь заметно проще.@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Приглашаем Go- и Python-разработчиков, аналитиков и продакт-менеджеров на тревел-тех хакатон от Островка.
Вам предстоит решить одну из двух AI-задач в сфере тревел-теха и побороться за главный приз — 1 000 000 ₽.
Присоединиться к хакатону можно из любой точки мира. Участвуйте командой до пяти человек и выбирайте один из двух треков:
Скорее присоединяйтесь по ссылке!
Please open Telegram to view this post
VIEW IN TELEGRAM
DuckDB — база данных, которая живёт прямо внутри вашего процесса: ставится как библиотека, читает Parquet и CSV с диска и считает по ним аналитические запросы, без сервера и настройки. Примерно как SQLite, только заточенная не под строки, а под колонки и тяжёлые агрегаты.
Авторы показали превью версии 2.0, релиз обещают осенью. Главная перемена в том, что база перестаёт быть только внутрипроцессной: расширение
Кроме этого — триггеры BEFORE и AFTER, тип
@prog_tools
Авторы показали превью версии 2.0, релиз обещают осенью. Главная перемена в том, что база перестаёт быть только внутрипроцессной: расширение
quack даёт сетевой протокол, и через CONNECT один DuckDB подключается к другому, запрос выполняется на сервере, а результат течёт обратно.Кроме этого — триггеры BEFORE и AFTER, тип
VARIANT как полноценный, асинхронный ввод-вывод, новый парсер SQL и новый формат хранения. Рекурсивный обход графа из миллиона рёбер в замерах авторов ускорился с 4,90 до 0,12 секунды.@prog_tools
🔥3
Проблема с git не в командах, а в том, что непонятно, что они делают с графом коммитов. Learn Git Branching решает это буквально: вы вводите команду, и на экране двигаются кружочки и стрелки.
Песочница живёт целиком в браузере, ничего ставить и регистрироваться не нужно. Уровни идут от простого к сложному: создание веток, движение
Особенно полезно тем, кто уже несколько лет пользуется git по трём заученным командам и каждый раз боится перебазирования. После пары уровней становится видно, что ветка — это просто указатель на коммит, и половина страха уходит.
Проекту тринадцать лет, и он не устарел: модель коммитов и ссылок с тех пор не менялась, а тренажёр учит именно ей, а не кнопкам конкретного интерфейса.
@prog_tools
Песочница живёт целиком в браузере, ничего ставить и регистрироваться не нужно. Уровни идут от простого к сложному: создание веток, движение
HEAD, разница между merge и rebase, cherry-pick, отличие reset от revert, работа с удалённым репозиторием, разрешение конфликтов. Есть свободный режим, где можно ломать что угодно и откатывать через undo.Особенно полезно тем, кто уже несколько лет пользуется git по трём заученным командам и каждый раз боится перебазирования. После пары уровней становится видно, что ветка — это просто указатель на коммит, и половина страха уходит.
Проекту тринадцать лет, и он не устарел: модель коммитов и ссылок с тех пор не менялась, а тренажёр учит именно ей, а не кнопкам конкретного интерфейса.
@prog_tools
❤1
blitcp копирует файлы по карте диска: сначала строит карту, потом читает данные в том порядке, в каком они физически лежат. Задача та же, что у
🔘 склеивает мелкие файлы в один поток чтения;
🔘 пропускает дубликаты по хешу xxHash-128;
🔘 умеет reflink и жёсткие ссылки, понимает разрежённые файлы;
🔘 после копирования сверяет результат с исходником.
Цифры авторы приводят в заметках к версии 4.0.2: 85 ГБ с NVMe на USB скопировались за 44 минуты 47 секунд вместо часа и четырёх минут, а построение карты диска в Windows для 6600 файлов ускорилось с 12 минут 48 секунд до 0,7 секунды, потому что теперь файл открывается только на чтение атрибутов и Windows Defender не сканирует его содержимое. На тесте в Linux с 12 347 мелкими файлами вышло 5,93 секунды против 14,14 у
Автор сам говорит, где его инструмент не нужен: на быстром SSD без дубликатов обычный
Для работы по SSH дополнительно нужен
@prog_tools
cp и rsync, разница проявляется на множестве мелких файлов и на медленных носителях, то есть на HDD, флешках и NAS.Цифры авторы приводят в заметках к версии 4.0.2: 85 ГБ с NVMe на USB скопировались за 44 минуты 47 секунд вместо часа и четырёх минут, а построение карты диска в Windows для 6600 файлов ускорилось с 12 минут 48 секунд до 0,7 секунды, потому что теперь файл открывается только на чтение атрибутов и Windows Defender не сканирует его содержимое. На тесте в Linux с 12 347 мелкими файлами вышло 5,93 секунды против 14,14 у
rsync и 14,99 у cp -ar.Автор сам говорит, где его инструмент не нужен: на быстром SSD без дубликатов обычный
cp лучше, потому что хеширование и анализ диска добавляют накладные расходы. Для инкрементальной синхронизации с удалённым сервером rsync тоже остаётся более подходящим, и автор это признаёт.
mkdir -p ~/.local/bin && curl -fsSL https://raw.githubusercontent.com/gekap/blitcp/v4.0.2/blitcp.py -o ~/.local/bin/blitcp && chmod +x ~/.local/bin/blitcp
Для работы по SSH дополнительно нужен
paramiko.@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
just — запускальщик команд проекта. Ту же роль обычно играет Makefile, но make всё-таки система сборки: он думает про файлы и зависимости, ругается на пробелы вместо табов и норовит не выполнить цель, если рядом лежит одноимённый файл. В
3 августа вышла версия 1.58.0, небольшая:
🔘 у рецепта появился атрибут
🔘 у него же есть аргумент формата;
🔘
🔘 при форматировании вокруг выражений подстановки добавляются пробелы.
Ломающих изменений нет.
@prog_tools
justfile пишутся просто именованные команды с аргументами, и это всё, что нужно, когда цель — собрать в одном месте «прогнать тесты», «поднять окружение», «выложить».3 августа вышла версия 1.58.0, небольшая:
[timestamp], печатающий время выполнения, — удобно для долгих сборок, где раньше приходилось обкладывать команду вызовами date;--justfile-name теперь принимает несколько имён через запятую;Ломающих изменений нет.
@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
k6 гоняет нагрузочные тесты, которые пишутся обычным JavaScript и запускаются одной командой из терминала. Сценарий лежит в репозитории рядом с кодом, порог вида «99-й перцентиль меньше трёх секунд» описывается прямо в файле, а результат печатается в консоль или уезжает в дашборд.
🔘 HTTP, WebSockets, gRPC и браузерные сценарии в одном инструменте;
🔘 в версии 2.2.0 от 10 августа появился
🔘
🔘
Очевидная альтернатива это JMeter, и по ряду пунктов он лучше: графический редактор тест-планов, запись сценариев и протоколы, которых у k6 нет вовсе, вроде JDBC, LDAP, FTP и JMS. k6 берёт другим: тест это код в git, запускается в CI одной командой и ревьюится как обычный пул-реквест.
Оговорка из документации: на больших тестах узким местом становится сама машина-генератор, и завышенная задержка окажется вашей собственной. Авторы советуют оставлять около 20% процессора свободными.
@prog_tools
chromium.connectOverCDP(), то есть тест можно подключить к уже запущенному Chromium и брать адрес сессии во время выполнения;TextEncoder и TextDecoder стали глобальными, а в экспериментальных потоках появился WritableStream;SharedArray перестал замораживать примитивы и оборачивать длинные строки в объекты: в присланной репродукции потребление памяти упало примерно с 1 ГБ до 100 МБ.Очевидная альтернатива это JMeter, и по ряду пунктов он лучше: графический редактор тест-планов, запись сценариев и протоколы, которых у k6 нет вовсе, вроде JDBC, LDAP, FTP и JMS. k6 берёт другим: тест это код в git, запускается в CI одной командой и ревьюится как обычный пул-реквест.
Оговорка из документации: на больших тестах узким местом становится сама машина-генератор, и завышенная задержка окажется вашей собственной. Авторы советуют оставлять около 20% процессора свободными.
brew install k6
@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В университетах учат алгоритмам и системам, но не учат пользоваться инструментами, на которых стоит вся работа. MIT сделал под это отдельный курс — The Missing Semester of Your CS Education: одиннадцать лекций примерно по часу, с конспектами, упражнениями и видео, бесплатно.
Что разбирают: устройство оболочки и почему пробелы и кавычки ведут себя так странно; перенаправление потоков и конвейеры; сценарии на bash с переменными, циклами и кодами возврата; редактор Vim по режимам; управление процессами, сигналы,
Это тот случай, когда курс полезнее не студенту, а практикующему разработчику: большинство пробелов в этих темах закрываются годами по крупицам, а тут они собраны в один заход с упражнениями.
Ссылка ведёт на архив 2020 года — самодостаточный и без современных дополнений.
@prog_tools
Что разбирают: устройство оболочки и почему пробелы и кавычки ведут себя так странно; перенаправление потоков и конвейеры; сценарии на bash с переменными, циклами и кодами возврата; редактор Vim по режимам; управление процессами, сигналы,
jobs, fg, bg, nohup; модель git как ориентированного графа из объектов; отладка через логи, gdb, strace и профилировщики; сборку и Makefile; хеши, энтропию и ssh; обработку данных стандартными утилитами.Это тот случай, когда курс полезнее не студенту, а практикующему разработчику: большинство пробелов в этих темах закрываются годами по крупицам, а тут они собраны в один заход с упражнениями.
Ссылка ведёт на архив 2020 года — самодостаточный и без современных дополнений.
@prog_tools
👍1🙈1
DuckDB — аналитическая база, которая живёт внутри вашего процесса, как SQLite. Отличие в том, что SQLite заточена под много мелких операций со строками, а DuckDB под запросы, которые читают миллионы строк и считают агрегаты. Практический смысл: SQL прямо по файлам Parquet и CSV, без поднятия сервера и без загрузки данных куда-либо.
Именно из-за этого сценария важен свежий выпуск 1.5.5 от 22 июля: файлы часто приходят извне, а база встроена в приложение, поэтому падает не отдельный сервер, а весь процесс.
🔘 перенесены исправления чтения за границами выделенной памяти;
🔘 разбор Parquet отклоняет страницы
🔘 исправлена взаимная блокировка в управлении временной памятью;
🔘 в журнал HTTP-запросов добавлены длина тела и ошибки транспорта — полезно при чтении данных прямо из S3.
Выпуск целиком про исправления, ломающих изменений нет.
@prog_tools
Именно из-за этого сценария важен свежий выпуск 1.5.5 от 22 июля: файлы часто приходят извне, а база встроена в приложение, поэтому падает не отдельный сервер, а весь процесс.
DATA_PAGE_V2 с несогласованным полем сжатого размера;Выпуск целиком про исправления, ломающих изменений нет.
@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM
Bun — среда выполнения JavaScript и TypeScript, которая заодно работает пакетным менеджером, сборщиком и тест-раннером: один бинарник вместо связки
20 августа вышла версия 1.4. Главное в ней — совместимость: в набор, который гоняется на каждом коммите, добавили 1517 тестов из официального тестового набора Node.js; файлов этого набора теперь проходит 3743 против 1450 на версии 1.2.
Простой процесс ест впятеро меньше процессора, память до 35% меньше, старт на Linux быстрее наполовину. Реализация переписана с Zig на Rust.
Релиз задержался на три месяца — самый долгий разрыв между стабильными версиями с 2022 года. Теро Пиирайнен посчитал авторство коммитов за месяц: 15,8 тысячи от бота robobun, 790 от Джарреда Самнера. Полной совместимости с Node.js по-прежнему нет, команда это признаёт.
@prog_tools
node, npm, tsx и jest.20 августа вышла версия 1.4. Главное в ней — совместимость: в набор, который гоняется на каждом коммите, добавили 1517 тестов из официального тестового набора Node.js; файлов этого набора теперь проходит 3743 против 1450 на версии 1.2.
node:events и node:sqlite проходят его на 100%, node:quic на 99%, node:http, node:fs, node:cluster и node:stream на 97%. Под Bun заработали Playwright, vitest и Next.js 16 с Turbopack.Простой процесс ест впятеро меньше процессора, память до 35% меньше, старт на Linux быстрее наполовину. Реализация переписана с Zig на Rust.
Релиз задержался на три месяца — самый долгий разрыв между стабильными версиями с 2022 года. Теро Пиирайнен посчитал авторство коммитов за месяц: 15,8 тысячи от бота robobun, 790 от Джарреда Самнера. Полной совместимости с Node.js по-прежнему нет, команда это признаёт.
@prog_tools
❤2
Профилировщик выдал десятки тысяч стеков вызовов. Читать это построчно бессмысленно, и ровно для этого Брендан Грегг придумал флейм-графы — способ свернуть все стеки в одну картинку.
Читается она не так, как кажется на первый взгляд. По горизонтали не время, а совокупная частота: ширина блока показывает, в скольких снимках встретился этот кадр. По вертикали — глубина вызовов, родитель снизу, потомки сверху. Верхняя кромка — то, где программа реально находилась в момент снятия. Цвет смысла не несёт, он нужен только чтобы блоки различались.
Появилась техника из практической беды: трассировка производительности MySQL оказалась слишком дорогой, и вместо полного трассирования Грегг стал брать выборку стеков.
Скрипты работают поверх
Отдельно стоит запомнить разницу: во флейм-чарте ось X — это действительно время, во флейм-графе — нет.
@prog_tools
Читается она не так, как кажется на первый взгляд. По горизонтали не время, а совокупная частота: ширина блока показывает, в скольких снимках встретился этот кадр. По вертикали — глубина вызовов, родитель снизу, потомки сверху. Верхняя кромка — то, где программа реально находилась в момент снятия. Цвет смысла не несёт, он нужен только чтобы блоки различались.
Появилась техника из практической беды: трассировка производительности MySQL оказалась слишком дорогой, и вместо полного трассирования Грегг стал брать выборку стеков.
Скрипты работают поверх
perf, DTrace, SystemTap, eBPF и профилировщиков Windows. Кроме обычного графа по процессору есть графы по памяти, по времени вне процессора, разностные и горячие-холодные.Отдельно стоит запомнить разницу: во флейм-чарте ось X — это действительно время, во флейм-графе — нет.
@prog_tools
👍1
Сервис на проде внезапно ест процессор. Перезапускать с профилировщиком нельзя: проблема как раз пропадёт.
py-spy подключается к уже работающему процессу Python по идентификатору и показывает, где тот проводит время. Код менять не нужно, перезапускать тоже, сам процесс при этом продолжает работать.
🔘
🔘
🔘
🔘
🔘
🔘
🔘
Встроенный
15,2 тысячи звёзд. Язык: Rust. Лицензия: MIT.
@prog_tools
py-spy подключается к уже работающему процессу Python по идентификатору и показывает, где тот проводит время. Код менять не нужно, перезапускать тоже, сам процесс при этом продолжает работать.
py-spy top --pid 1234 — живой список горячих функций, как top, только по функциям;py-spy record -o profile.svg --pid 1234 — запись flame graph в файл;py-spy dump --pid 1234 — стеки всех потоков прямо сейчас, полезно, когда процесс завис;--locals добавляет к стекам значения локальных переменных;--subprocesses включает дочерние процессы и обработчики очередей;--native показывает и нативные расширения, а --gil отделяет время под глобальной блокировкой;--nonblocking не приостанавливает процесс ради снимка — чуть менее точно, зато безопаснее на проде.Встроенный
cProfile требует запускать программу под собой, pyinstrument — правки кода. Если нужен разбор ещё и памяти с видеокартой, смотрите в сторону Scalene, но для «зайти и посмотреть, что происходит прямо сейчас» py-spy проще.15,2 тысячи звёзд. Язык: Rust. Лицензия: MIT.
@prog_tools
Please open Telegram to view this post
VIEW IN TELEGRAM