TGViewer
Channel Public Channel
Инструменты программиста

Инструменты программиста

@prog_tools

Полезные инструменты для программистов — бесплатные и платные

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Регистрация в перечне РКН: https://tprg.ru/mX0S
Subscribers
12.9K
Photos
1.7K
Videos
158
Links
2.1K

Showing posts older than #2875 · Back to latest

Older Posts 20 shown
Post #2874 1.27K
Prometheus — база временных рядов, которая сама ходит по сервисам и собирает метрики, а потом отвечает на запросы вроде «сколько ошибок в секунду было вчера в 15:00». На нём же держатся алерты. Альтернативы есть, но они либо совместимы с ним по протоколу, либо решают другую задачу, так что для метрик это опорная точка индустрии.

11 августа опубликован кандидат в релиз 3.14.0. Самое важное — три починенные тихие поломки:

🔘 у обнаружения целей через Docker появились таймауты: зависший демон больше не морозит список целей навсегда, оставляя мониторинг со старыми адресами;
🔘 исправлена потеря данных и зацикливание перезапусков при определённом пороге уплотнения устаревших рядов;
🔘 исправлена потеря данных после перезапуска, если метрики приходят не по порядку.

Из нового: выражения длительности в PromQL включены по умолчанию, появилась функция start_timestamp(), добавлено обнаружение целей в облаке OCI.

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

@prog_tools
  • ❤ 2
Post #2873 1.36K
Старый Kindle можно повесить на стену как дашборд домашнего сервера. Считает сервер: dashink рисует картинку 600x800 в оттенках серого и отдаёт по /dash.png, а читалка раз в 5 минут скачивает её и выводит на экран. На панели — сервисы из Uptime Kuma, заполненность пула, аптайм Proxmox и погода, а с 22:00 до 07:00 — фото из Immich.

Как повторить, автор расписал:
🔘 сервер — docker compose up -d, в .env для полезного экрана хватает широты и долготы;
🔘 Kindle — джейлбрейк (метод сверяют по серийнику и прошивке, у автора подошёл WinterBreak), Hotfix, чтобы .sh из /mnt/us/documents/ открывался из библиотеки как книга, блокировка OTA и SSH через USBNetwork;
🔘 на устройстве — 77 строк на busybox sh: скачать PNG, вывести через eips -g, каждый 12-й цикл — полная перерисовка от следов e-ink.

Код на MIT. Ближайшая альтернатива, kindle-dash, между обновлениями усыпляет устройство в память, поэтому экономнее по батарее, но проверена только на Kindle 4 NT, а код не обновлялся с 2022 года.

@prog_tools
  • 🔥 7
  • ❤ 2
Post #2871 1.52K
Podman запускает контейнеры без демона: команды вроде podman run делают то же, что Docker, но нет фонового процесса с правами root, и контейнеры можно гонять от обычного пользователя. Docker остаётся популярнее, но там, где демон мешает — на сборочных машинах, в systemd, в закрытых окружениях, — Podman прижился именно поэтому.

12 августа вышла версия 6.1.0. Что стоит знать:

🔘 у podman manifest push появились --retry и --retry-delay: публикация образа больше не валит сборку из-за секундной сетевой ошибки;
🔘 починено зависание удалённого клиента при работе через SSH;
🔘 добавлены podman volume rename и podman machine restart;
🔘 у podman network rm появился --ignore — удобно в скриптах очистки;
🔘 podman generate kube переносит проверки состояния контейнера в livenessProbe;
🔘 для проброса портов из Windows через WSL теперь нужен параметр force_port_listen в containers.conf.

@prog_tools
  • ✍ 2
  • ⚡ 2
Post #2870 1.46K
Helm — способ ставить приложения в Kubernetes не вручную. Вместо десятка YAML-файлов, которые надо править под каждое окружение, берётся чарт: шаблоны плюс файл значений. Стандарт де-факто, ближайший сосед Kustomize решает более узкую задачу и шаблонов не даёт.

13 августа вышла версия 4.2.4, патч. Изменения касаются отладки:

🔘 helm template --debug --show-only внятнее объясняет, какой шаблон сломался;
🔘 тестовые поды отдают логи всех контейнеров, а не только первого — раньше логи вспомогательных контейнеров просто терялись;
🔘 вернулся повтор при конфликте применения на стороне сервера;
🔘 helm push с аутентификацией по токену перестал падать на правах доступа к реестру;
🔘 в пакетах перестали исчезать пустые строки.

Отдельная причина обновиться: подтянуты зависимости с уязвимостями, gRPC и OpenTelemetry.

@prog_tools
  • ❤ 3
  • 🤔 1
Post #2869 1.78K
Один пуш в репозиторий с манифестами дёргает вебхук, и полсотни приложений одновременно бросаются обновляться. Сервер разработки прогибается ровно в этот момент, хотя ни одно из приложений по отдельности не тяжёлое.

Argo CD — инструмент доставки в Kubernetes по модели GitOps: состояние кластера описано в репозитории, а контроллер приводит кластер к описанию и показывает расхождения. Версия 3.5.0 вышла 4 августа.

Что внутри:
🔘 у обновлений, вызванных вебхуком, появился настраиваемый разброс по времени, так что одновременный наплыв размазывается;
🔘 контроллер наборов приложений научился обрабатывать приложения параллельно, а сами наборы теперь показываются в дереве ресурсов;
🔘 в интерфейсе появилась вкладка предпросмотра приложений для набора: видно, что именно сгенерирует шаблон, до применения;
🔘 в путях к файлам значений Helm заработали шаблоны со звёздочкой, вместо перечисления файлов вручную;
🔘 в альфа-режиме появилась проверка целостности источника для сухих ревизий, то есть подтверждение, что развёрнутое пришло из ожидаемого места;
🔘 у команд argocd app добавлен флаг --app-namespace, а у команд наборов приложений — соответствующий флаг пространства имён;
🔘 внутри выполнен переход с Helm 3 на Helm 4 и обновление интерфейса на React 19.

Переход на Helm 4 и React 19 делают релиз ломающим для тех, кто держит собственные расширения интерфейса: для них выпущено отдельное руководство по обновлению. Перед прыжком через минорную версию авторы просят читать документацию по обновлению, там же лежат заметки о переходе с 3.4.

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

23,9 тысячи звёзд на GitHub против примерно 8 тысяч у ближайшего конкурента Flux.

Язык: Go. Лицензия: Apache 2.0.

@prog_tools
Post #2868 1.72K
В кеше лежат миллионы одинаковых по структуре хешей: карточка товара, профиль пользователя, сессия. Схема у всех одна, а имена полей хранятся заново в каждом ключе, и оперативная память уходит на повторение одних и тех же строк.

Redis — хранилище структур данных в памяти: кеш, счётчики, очереди, потоки событий. Версия 8.10 вышла 29 июля.

Что внутри:
🔘 компактные хеши: новое кодирование, при котором имена полей хранятся один раз для ключей с общей схемой, и расход памяти на однотипных объектах падает;
🔘 команда HIMPORT для быстрой массовой загрузки таких хешей;
🔘 команда BACKUP делает резервную копию и восстановление на стороне узла, поверх многочастного AOF, без внешних скриптов;
🔘 LMOVEM и BLMOVEM переносят между списками сразу несколько элементов, а не по одному за вызов;
🔘 SUNIONCARD и SDIFFCARD возвращают размер объединения и разности множеств, не собирая сами множества в ответ;
🔘 у XREAD и XREADGROUP появились MAXCOUNT и MAXSIZE, которые ограничивают суммарное число записей и размер ответа: полезно, когда читатель отстал и рискует получить всё разом;
🔘 аутентификация между серверами по клиентскому сертификату TLS.

Из исправлений после кандидата в релиз стоит знать про клиентов, которые могли остаться заблокированными на BLPOP и BLMOVE, если SORT с STORE подменил целевой ключ списком, и про деление на ноль при равных или перевёрнутых порогах активной дефрагментации.

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

Язык: C. Лицензия: на выбор RSALv2, SSPLv1 или AGPLv3.

@prog_tools
  • ✍ 1
Post #2867 1.51K
Скрипт печатает в терминал то, что пришло из чужого репозитория: описание гиста, дифф пул-реквеста, логи сборки. Если в этом тексте есть управляющие последовательности, терминал их выполнит, и увиденное вами перестанет совпадать с тем, что там написано.

gh — официальный клиент GitHub для терминала: пул-реквесты, задачи, релизы, сборки, произвольные запросы к API. Версия 2.97.0 вышла 31 июля и закрывает сразу четыре уязвимости, так что обновиться стоит не откладывая.

Что внутри:
🔘 команды, печатавшие внешний текст без обезвреживания управляющих последовательностей, наконец его обезвреживают: это gh gist view, gh api, gh pr diff, gh release download --output -, gh codespace logs и несколько новых команд про агентов;
🔘 адреса запросов собирались без экранирования переменных частей пути, поэтому значение со служебными символами могло увести запрос к другому ресурсу;
🔘 gh auth status без флага показа токена мог напечатать часть токена открытым текстом для форматов с подчёркиванием после префикса, таких как github_pat_, ghs_ и ghu_;
🔘 gh attestation verify строил проверку подписанта из --signer-repo и --signer-workflow, не экранируя спецсимволы регулярных выражений, поэтому похожее имя репозитория или процесса могло пройти проверку, рассчитанную на доверенного;
🔘 в gh project item-edit и gh project item-list поля и значения одиночного выбора теперь адресуются по имени: --field "Status" --value "In Progress" вместо внутренних идентификаторов, а именованные поля можно вывести отдельными колонками;
🔘 таймаут обращения к хранилищу ключей поднят с 3 до 60 секунд, чтобы окно разблокировки успевало дождаться человека.

Пригодится всем, кто гоняет gh в скриптах и в сборках, и особенно тем, кто ведёт доски GitHub Projects из терминала и до сих пор искал идентификаторы полей руками.

45,7 тысячи звёзд на GitHub, официальный клиент без сопоставимых альтернатив: hub давно не развивается.

Язык: Go. Лицензия: MIT.

@prog_tools
  • 🗿 2
  • ❤ 1
  • 🐳 1
  • 💯 1
  • 👨‍💻 1
Post #2866 1.55K
В проекте два источника пакетов: приватный реестр компании и публичный npm. В файле блокировки пакет записан просто как имя и версия, без указания, откуда он приехал. Если оба реестра отдают одно имя и одну версию, побеждает тот, кто ответил первым, и понять это по файлу невозможно.

pnpm — пакетный менеджер для JavaScript с общим хранилищем пакетов на диске и строгим деревом зависимостей. Версия 11.20.0 вышла 3 августа и закрывает как раз эту дыру.

Что внутри:
🔘 пакеты из именованных реестров теперь записываются в файл блокировки с указанием источника, в виде имя@реестр:версия, поэтому каждый реестр получает собственную запись;
🔘 формат файла намеренно не менялся, так что старые версии pnpm его прочитают, но сами такие ключи не пишут: если часть команды сидит на старом pnpm, файл будет переключаться туда-обратно, и в старом виде проект снова уязвим;
🔘 появился встроенный псевдоним npmjs:, который жёстко привязывает зависимость к публичному реестру, даже если общий registry указывает на внутреннее зеркало;
🔘 псевдоним, совпадающий с зарезервированным префиксом вроде file, link, workspace или npm, теперь отклоняется с понятной ошибкой, а не молча перекрывается резолвером;
🔘 пустые значения http-proxy, https-proxy и no-proxy больше не валят установку, а читаются как отсутствующие; proxy=false наконец выключает прокси, а не воспринимается как хост с именем false;
🔘 разрешение зависимостей ускорено: при включённом minimumReleaseAge метаданные фильтруются один раз на пакет, а разобранные версии и диапазоны переиспользуются между сравнениями.

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

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

36 тысяч звёзд на GitHub, ближайшие соседи по нише — Yarn и bun.

Язык: Rust. Лицензия: MIT.

@prog_tools
Post #2865 1.34K
Чтобы посмотреть, прошли ли проверки по своему пул-реквесту, приходится идти в браузер, а чтобы поменять местами два коммита перед отправкой — вызывать интерактивный rebase и править список в редакторе.

lazygit — терминальный интерфейс к git: панели веток, коммитов и файлов, добавление в индекс по отдельным строкам, интерактивное перебазирование. Версия 0.64.0 вышла 4 августа.

Что внутри:
🔘 модель многопоточности переписана целиком: обновления данных и экрана выполняются в потоке интерфейса вместо россыпи мьютексов, известных гонок не осталось, а набор интеграционных тестов гоняется в CI с флагом -race;
🔘 в списке ветвей и в главной панели показывается сводный статус проверок GitHub для соответствующего пул-реквеста;
🔘 мышью теперь можно менять порядок коммитов и строк плана перебазирования перетаскиванием, выделять диапазон в списках, а при выделении в панели индекса экран сам прокручивается;
🔘 внешней команде сравнения доступна подстановка {{diffContext}}, а настройка custom pager переименована в diff renderer, старое имя в конфиге придётся поправить;
🔘 исправлено залипание индикатора в конце отправки и загрузки, зависание при ctrl+z и возврате процесса, а также поломанное отображение боковых панелей, когда ветки или коммиты открыты не на первой вкладке;
🔘 на Windows починили падение при переходе в полноэкранный режим с внешним просмотрщиком, осиротевшие процессы при быстром перемещении по коммитам и остающиеся файлы index.lock.

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

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

81 тысяча звёзд на GitHub, ближайшие терминальные аналоги gitui и tig держатся на 22 и 13 тысячах.

Язык: Go. Лицензия: MIT.

@prog_tools
Post #2864 1.66K
Если интересно, как разработчику вырасти в человека, который запускает свои продукты и бизнес, — 9 августа в 13:00 приходите послушать выпускников магистратуры МФТИ «Технологическое предпринимательство».

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

Из спикеров: фаундер MountingBox (его проект начинался как учебный в магистратуре, сейчас приносит 60 млн ₽ в год), General Manager квантового стартапа в Люксембурге, директор по ИИ-трансформации «Альпина Диджитал», основатель FindQuiz и CDO Российского футбольного союза, а также серийный технический предприниматель и основатель DiamondLab.

Полтора часа, онлайн, бесплатно, вопросы из чата берут.

Регистрация:
https://tprg.ru/ozW3
Post #2863 1.68K
Связка nvm, pyenv, rbenv и отдельного раннера задач разрастается в набор конфигов, которые у разных разработчиков расходятся. mise держит версии тулчейнов, переменные окружения и задачи проекта в одном файле mise․toml.

Версия 2026.7.18 вышла 30 июля.

Что внутри:
🔘 флаг --compact у mise tasks deps: общее поддерево зависимостей печатается один раз, повторные ссылки помечаются как (already shown);
🔘 в монорепах заработали относительные пути ./ в зависимостях задач, а шаблон ... теперь включает и базовый проект;
🔘 при установке через cargo mise запоминает использованные опции (features, bin, locked) и сам переустанавливает инструмент, когда они меняются;
🔘 PATH в mise env, mise x и mise doctor дедуплицируется по первому вхождению, поэтому при вложенных активациях перестал раздуваться;
🔘 в секции [plugins] разрешены локальные пути и симлинки, а пакетная установка и обновление плагинов доходят до конца, даже если отдельные падают;
🔘 mise install больше не трогает конфиг-файлы, а prune --tools учитывает недоверенные файлы версий;
🔘 на Windows mise находит и запускает файлы .cmd, .ps1 и .vbs, последний через cscript, на macOS починен watch --wrap-process group.

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

Номер версии складывается из даты, релизы выходят почти ежедневно.

Язык: Rust. Лицензия: MIT.

@prog_tools
  • ❤ 4
  • 🔥 1
Post #2862 1.61K
Команда с восемью флагами, которую собирал полчаса неделю назад, в обычной истории команд шелла не находится: файл перезаписан параллельной сессией, каталог и код возврата не сохранены, а на второй машине её нет вовсе.

Atuin складывает историю в SQLite, добавляет к каждой команде контекст и синхронизирует её между машинами со сквозным шифрованием. Версия 18.18.0 вышла 27 июля, следом выпустили патч 18.18.1.

Что внутри:
🔘 подсветка синтаксиса команд в интерактивном поиске, разбор идёт грамматикой конкретного шелла, цвета задаются в конфиге;
🔘 фильтр по шеллу: флаг --shell у atuin search и переключатель в интерактивном интерфейсе, у записей истории появилось поле shell;
🔘 bash-preexec встроен внутрь, Atuin подгружает его сам, если другого preexec-бэкенда в bash нет;
🔘 поиск корректно считает смещения в не-ASCII, импорт больше не обрывается на повреждённой записи;
🔘 по производительности: подсчёт истории перестал блокировать, активная история индексируется, строки удаляются физически, а демон индексирует синхронизированную историю напрямую вместо некорректного SQL-запроса;
🔘 удалён устаревший протокол синхронизации V1, обновлены уязвимые зависимости, sqlx обновлён до версии 9;
🔘 патч 18.18.1 чинит установку с crates.io и убирает зависимость fs4, блокировка файлов переехала на std::fs.

Пригодится тем, кто по нескольку раз в день выуживает из истории длинную команду с флагами и работает с двух-трёх машин.

Язык: Rust. Лицензия: MIT.

@prog_tools
Post #2860 1.49K
Маркетинг просит на неделю поднять товары со скидкой в выдаче и закрепить один конкретный товар по фразе «подарок». Обычно под такое пишут прослойку над поисковым движком.

Meilisearch — поисковый движок для приложений, с опечатками, фасетами и фильтрами из коробки. Версия 1.51 вышла 27 июля.

Что внутри:
🔘 у экспериментальных Dynamic Search Rules появилось условие filter: в ключе values перечисляются фасеты и их значения, при которых правило включается;
🔘 у правила появилось поле lastUpdatedAt со временем последнего изменения, а список правил отдаётся начиная с самых свежих;
🔘 поиск ускорили за счёт однократного чтения данных с диска, на наборе с 14 тысячами разных полей заявлен выигрыш до 5,4 раза;
🔘 обновление без дампа перестало быть экспериментальным, флаг --experimental-dumpless-upgrade переименован в --upgrade-db;
🔘 в 1.50 механизм правил переписали целиком: поле priority заменено на precedence, где меньшее значение означает более ранний порядок, а conditions превратился из массива в объект;
🔘 там же появились лимиты «DSR fuel» через переменные окружения и заявленный потолок 75 000 правил без влияния на скорость поиска;
🔘 в 1.50 GET documents в шардированной конфигурации по умолчанию собирает документы со всех узлов (старое поведение включается через useNetwork: false), а сами правила реплицируются с лидера на реплики.

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

Dynamic Search Rules остаются экспериментальной функцией, а формат правил сменился в 1.50, так что написанное для более ранних версий придётся переписать. Заодно в 1.51 убрали неиспользуемые экспериментальные возможности, включая --experimental-replication-parameters.

Язык: Rust. Лицензия: MIT, часть кода Enterprise Edition под Business Source License 1.1.

@prog_tools
  • ☃ 1
  • 👍 1
Post #2859 1.41K
Тест падает раз в двадцать прогонов, и повтор ничего не проясняет: он идёт сразу же, в том же состоянии браузера, а зависшее действие всё равно досиживает свой таймаут до конца.

Playwright — фреймворк сквозного тестирования, который гоняет Chromium, Firefox и WebKit через один API. Версия 1.62.0 вышла 24 июля.

Что внутри:
🔘 стратегия повторов настраивается через testConfig.retryStrategy: immediate перезапускает тест сразу, isolated откладывает все повторы на конец прогона и выполняет их последовательно в одном воркере;
🔘 большинство действий и web-first проверок принимают AbortSignal, поэтому зависшее ожидание можно отменить из кода; обычный таймаут при этом продолжает работать, а timeout: 0 его выключает;
🔘 скриншоты и снимки для визуальных тестов сохраняются в WebP, при quality: 100 сжатие идёт без потерь, меньшие значения дают сжатие с потерями;
🔘 компонентные тесты переехали на модель stories и galleries: fixtures.mount() монтирует story и возвращает Locator с методами update() и unmount();
🔘 у репортеров появился хук reporter.preprocess(), он вызывается после разбора конфигурации и до onBegin(), в нём тест можно пометить как пропущенный, исключённый, починенный или падающий;
🔘 в storage state сохраняются виртуальные ключи WebAuthn, их можно подставить в следующие контексты браузера и не проходить вход по passkey заново;
🔘 добавлены режимы автопрокрутки scroll: "auto" и scroll: "none", метод apiResponse.timing() и locator.waitForFunction(), а page.evaluate() и addInitScript() теперь принимают функции аргументами, поэтому реже приходится собирать JavaScript строками.

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

Debian 11 больше не поддерживается. В релизе проверены Chromium 151.0.7922.34, Firefox 153.0 и WebKit 26.5.

Язык: TypeScript. Лицензия: Apache 2.0.

@prog_tools
  • 👍 1
Post #2858 1.55K
Запущенный сервером, через rclone serve или удалённый API с флагом --rc, rclone попадает в периметр наравне с любым другим сетевым сервисом. В этом релизе закрыли большой блок уязвимостей именно такого рода.

rclone — консольная утилита для копирования и синхронизации данных между локальными дисками и облачными хранилищами, поддерживает больше семидесяти бэкендов. Версия 1.75.0 вышла 31 июля.

Что внутри:
🔘 около 20 записей об уязвимостях (GHSA), большая часть CVE пока в статусе PENDING: инъекция команд в SFTP через имена файлов на удалённых системах с PowerShell, инъекция в FTP при кодировке без CRLF, утечка ключей S3 при редиректе с HTTPS на HTTP, исчерпание памяти неограниченными заголовками HTTP CONNECT в прокси, выход за пределы каталога в serve restic;
🔘 обработчики pprof у rc-сервера больше не открыты без аутентификации, трассировки стека при панике наружу не отдаются;
🔘 пароли и токены перестали попадать в отладочный лог при rclone config;
🔘 serve s3 получил потоковые multipart-загрузки без буферизации в памяти, заодно починили зависшие оборванные загрузки, исчерпание памяти и ошибку InvalidPart при параллельной работе;
🔘 в языке фильтров появились вложенные альтернативы в фигурных скобках и флаг --files-from0 для списка файлов, разделённого нулевым байтом;
🔘 примерно в пятнадцати бэкендах починили потерю времени модификации после загрузки: Azure Files, FTP, HDFS, Mail․ru, Jottacloud, WebDAV и другие;
🔘 добавлены бэкенды Scality и Zero Services, встроенный веб-интерфейс обновлён до 1.1.11.

Пригодится тем, кто держит rclone в кроне для бэкапов, и в первую очередь тем, у кого serve или --rc смотрит в сеть.

Язык: Go. Лицензия: MIT.

@prog_tools
Post #2857 1.54K

Forwarded from Веб-страница

Modern Web Guidance: не даём ИИ-агенту тащить лишние зависимости

Просишь агента сделать модалку — получаешь портал, setTimeout и лишнюю библиотеку. Modern Web Guidance учит агента использовать актуальные API веб-платформы.

Устанавливается через npx modern-web-guidance@latest install или плагин для редактора. Укажите целевой Baseline в AGENTS.md/CLAUDE.md — и агент спросит, можно ли обойтись браузером.

В демо это сработало: CSS Anchor Positioning вместо Floating UI для тултипа, нативный <dialog> вместо самодельного модала, scheduler.yield() вместо useMemo при поиске по 2000 задач.

Сразу говорю, версия ранняя. Но идея здравая: ИИ-код должен ориентироваться на актуальную платформу. Подробности.
  • ❤ 3
Post #2856 13K
Ternlight: поиск по смыслу прямо в браузере, без сервера и ключей

Ternlight превращает текст в векторы и ищет по смыслу прямо в браузере на CPU. Весь пакет включает модель, токенизатор и движок вывода и занимает ≈7 МБ, а сервер, GPU и API-ключи не нужны. Установка: npm i @ternlight/base, после чего embed() даёт 384-мерный вектор, а similar() ранжирует небольшую выборку документов за ≈5 мс на одной вкладке.

Это можно воспринимать как Fuse.js, но с поиском по смыслу вместо символов: библиотеку вешаете на страницу документации или справки, и она находит «как отменить подписку», даже если пользователь написал «хочу вернуть деньги». Демо работает офлайн, посмотрите на ternlight.dev/demo.

Если нужен семантический поиск без инфраструктуры, загляните в статью: там примеры кода и сравнение с классическим текстовым поиском.
Post #2855 1.84K
Turborepo до сих пор был инструментом для монорепозиториев на JavaScript: он кеширует результаты задач, гоняет только то, что затронули изменения, и умеет отдавать кеш на всю команду. В версии 2.10.6 от 22 июля он научился работать с репозиторием, где вообще нет ни одного package․json.

Что внутри:

🔘 поддержка Cargo-воркспейсов включается флагом experimentalCargoWorkspaces в turbo.json, после чего крейты становятся обычными узлами графа пакетов;
🔘 задачи выводятся из самого Cargo: build, test, check, bench превращаются в соответствующие cargo-команды с --package и --locked, lint и clippy зовут cargo clippy, docs зовёт cargo doc;
🔘 run и dev появляются у крейта только если у него ровно один бинарник;
🔘 библиотечные крейты остаются в графе, поэтому --filter и подсчёт затронутых пакетов идут по реальным зависимостям Rust;
🔘 в TUI перестали теряться цвета, а turbo watch переписали;
🔘 при обрезке репозитория сохраняются записи node@runtime: из pnpm-локфайла и расширения пакетов Yarn.

Пригодится тем, у кого в монорепозитории и фронтенд, и Rust-сервисы, а кеширование и определение затронутых пакетов до сих пор жило только на половине проекта.

Cargo-поддержка помечена как экспериментальная, у неё отдельный раздел документации. Обновлять turbo придётся везде сразу, включая CI и локальные хуки: старые версии не понимают новых future-флагов и просто откажутся запускаться.

Язык: Rust. Лицензия: MIT.

@prog_tools
  • 👍 1
Post #2853 1.7K
Biome — линтер и форматтер для веб-проектов: JavaScript, TypeScript, CSS, HTML. Одна программа на Rust вместо связки ESLint и Prettier, работает из терминала и через LSP в редакторе.

Версия 2.5.5 вышла 21 июля.

Что внутри:

🔘 новое правило noNegationInEqualityCheck ловит выражения вида !foo === bar. Из-за приоритета операторов это выполняется как (!foo) === bar, хотя автор почти наверняка имел в виду foo !== bar;
🔘 useExhaustiveSwitchCases разобрался с юнионами bigint-литералов: теперь сравнивает их по значению, поэтому двоичная, восьмеричная и шестнадцатеричная запись одного числа больше не путают правило;
🔘 noBaseToString и useNullishCoalescing замолкают, когда тип не удалось вывести до конца. Раньше на рекурсивных типах они выдавали замечания по неполной информации;
🔘 правило noThenProperty ускорили примерно на 50%;
🔘 CSS-форматтер перестал ломать регистр: служебные ключевые слова приводит к нижнему, а имена, придуманные автором, оставляет как есть;
🔘 парсер понимает атрибуты Angular и сокращённую запись v-bind вида :="props";
🔘 закрытие одного редактора больше не гасит общий демон Biome, к которому подключены остальные.

Пригодится тем, кто держит в проекте ESLint с плагинами и Prettier и присматривается, чем это всё заменить.

Язык: Rust. Лицензия: Apache-2.0.

@prog_tools
  • 👍 2
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →