Время AI, время интересное.

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

Я не умею рисовать. Максимум квадраты Малевича получаются. Но могу объяснить, что я хочу видеть на рисунке.

В общем, добрался до сбычи мечт!

Решил начать с заставок для своих Youtube видео. Это первое видео в серии для начинающих.

Раньше там было мое ничем не запоминающееся лицо. А теперь китайская манга 🙂

Zed, добавление русского словаря в cSpell

MacOS

Я постепенно перехожу с vs code на zed. Мне для работы с claude code достаточно простой консоли и приложения для просмотра файлов. vs code штука хорошая, но достаточно медленная.

В zed всякие spell checkers подключаются как модули. Их там несколько и у всех есть различные проблемы. Самый простой по подключению к zed, по моему мнению — это cSpell. Но… У него в поставке по умолчанию нет русского словаря. И как его туда впихнуть, совсем непонятно.

Т.е. стандартная рекомендация: создайте файл ~/.cspell.json и добавтье в него:

{
"language": "en-EN,ru-RU",
}

не подходит. Словаря то нет. Да и ошибки в описании локали как то не заметил.

Хорошо, что под рукой есть claude code на этой же машине. Запрос:

Проблема проверка русского языка в Zed. Установлен cspell  есть файл ~/.cspell.json cspell сервер стартует, но все русские слова подчеркиваются как не правильные

В ответ

Проблема ясна. Две причины:

1. Пакет русского словаря не установлен — @cspell/dict-ru_ru отсутствует
2. Неправильные имена словарей в конфиге — cspell использует ru_RU (с подчёркиванием), а не ru-RU. Также en-EN не
  существует, нужен en_US

Вывод cspell trace "привет" подтверждает: русский словарь не подключён, слово не найдено ни в одном словаре.

Исправляем. Сначала установим словарь:

Дальше, в течении 5-ти минут он находит решение и все заработало.

Ниже привожу инструкцию, сгенеированную им для устранения прболемы на MacOs.

# Добавление русского языка в cspell (Zed editor)

## Проблема

cspell в Zed по умолчанию не включает русский словарь. Пакет `@cspell/dict-ru_ru` не входит в `@cspell/cspell-bundled-dicts`, поэтому даже при указании `"language": "en,ru"` русские слова не распознаются.

## Решение (пошагово)

### 1. Установить пакет русского словаря

```bash
cd ~/Library/Application\ Support/Zed/extensions/work/cspell
npm install @cspell/dict-ru_ru
```

Словарь устанавливается в node_modules расширения cspell для Zed.

### 2. Настроить cspell конфиг

Создать/обновить `~/.cspell.json` (глобальный конфиг для всех проектов):

```json
{
  "language": "en,ru",
  "dictionaryDefinitions": [
    {
      "name": "ru-ru",
      "path": "~/Library/Application Support/Zed/extensions/work/cspell/node_modules/@cspell/dict-ru_ru/ru_ru.trie.gz"
    }
  ],
  "dictionaries": ["ru-ru"]
}
```

### 3. Перезапустить Zed или перезагрузить cspell LSP

## Ключевые моменты

- **Имена словарей**: русский словарь регистрируется как `"ru-ru"` (нижний регистр, дефис). НЕ `"ru-RU"`.
- **Английский**: `Английский bundled и включается автоматически через `"language": "en,ru"`.
- **`import` не работает** для абсолютных путей к небандленным словарям — используй `dictionaryDefinitions` + `dictionaries`.
- **`language`** задаёт локаль для languageSettings, но без `dictionaryDefinitions` словарь не подключится, т.к. он не bundled.
- **Глобальный конфиг**: `~/.cspell.json` — cspell ищет конфиг вверх по дереву директорий.
- **Путь Zed extension**: `~/Library/Application Support/Zed/extensions/work/cspell/node_modules/`
- **cspell-ext.json** словаря находится в `@cspell/dict-ru_ru/cspell-ext.json`, но `import` из конфига его не подхватывает.

## Проверка

```bash
cd ~/Library/Application\ Support/Zed/extensions/work/cspell
node -e "
async function main() {
  const lib = await import('cspell-lib');
  const defaults = await lib.getDefaultBundledSettingsAsync();
  const config = await lib.searchForConfig(process.env.HOME + '/');
  const merged = lib.mergeSettings(defaults, config || {});
  const s = lib.constructSettingsForText(merged, 'привет мир', 'markdown');
  const dict = await lib.getDictionary(s);
  console.log('привет:', dict.has('привет'));  // true
  console.log('мир:', dict.has('мир'));        // true
  console.log('ошибко:', dict.has('ошибко'));  // false
}
main();
"
```

Windows

Процедура почти идентична, но пути другие, плюс есть пара нюансов с оболочками (PowerShell против Git Bash) и с тем, в каком файле лежат настройки в актуальной версии cspell.

Дальше предполагается, что общую идею вы уже поняли из Linux-версии, поэтому здесь акцент на отличиях для Windows.

Предварительные требования

  • Zed с установленным из галереи расширением cspell;
  • Node.js и npm (Zed и так использует их для расширений, поэтому обычно уже стоят).
npm --version

Где лежит расширение на Windows

В Linux это ~/.local/share/zed/extensions/work/cspell, а на Windows

%LOCALAPPDATA%\Zed\extensions\work\cspell

Для пользователя auser полный путь выглядит так:

C:\Users\auser\AppData\Local\Zed\extensions\work\cspell

В примерах ниже используется именно он — подставьте своё имя пользователя.

Шаг 1. Устанавливаем словарь

PowerShell:

cd $env:LOCALAPPDATA\Zed\extensions\work\cspell
npm install @cspell/dict-ru_ru

Git Bash:

cd "$LOCALAPPDATA/Zed/extensions/work/cspell"
npm install @cspell/dict-ru_ru

После выполнения в node_modules\@cspell\dict-ru_ru\ появится файл ru_ru.trie.gz — это и есть словарь.

Шаг 2. Правим конфиг bundled-словарей

Файл cspell-default.json. В актуальной версии cspell (8.19+) этот файл превратился в тонкую обёртку, которая просто импортирует реальные настройки из cspell-default.config.js. Поэтому править нужно именно .config.js.

Полный путь:

node_modules\@cspell\cspell-bundled-dicts\cspell-default.config.js

2.0. Резервная копия (обязательно)

PowerShell:

cd $env:LOCALAPPDATA\Zed\extensions\work\cspell\node_modules\@cspell\cspell-bundled-dicts
Copy-Item cspell-default.config.js cspell-default.config.js.bak

Git Bash:

cd "$LOCALAPPDATA/Zed/extensions/work/cspell/node_modules/@cspell/cspell-bundled-dicts"
cp cspell-default.config.js cspell-default.config.js.bak

2.1. Локаль по умолчанию

-    language: 'en',
+    language: 'en,ru',

2.2. Добавляем словарь в активный список

-    dictionaries: ['companies', 'softwareTerms', 'public-licenses', 'filetypes'],
+    dictionaries: ['companies', 'softwareTerms', 'public-licenses', 'filetypes', 'ru-ru'],

2.3. Подключаем cspell-ext.json русского словаря

В массиве import находим строку с dict-rust и добавляем сразу после неё импорт русского словаря (внимание на подчёркивания — именно _ru_ru):

         '@cspell/dict-rust/cspell-ext.json',
+        '@cspell/dict-ru_ru/cspell-ext.json',
         '@cspell/dict-shell/cspell-ext.json',

Шаг 3. Проверяем, что настройки применились

Самый простой способ убедиться, что правки прочитались, — прямо в Zed открыть cspell-default.config.js и сверить три изменённых блока. Если хочется программно, удобнее всего из Git Bash (PowerShell плохо переваривает многострочные node -e с кавычками):

cd "$LOCALAPPDATA/Zed/extensions/work/cspell" && node --input-type=module -e "import { getDefaultSettings } from 'cspell-lib';
const s = await getDefaultSettings();
console.log('language:', s.language);
console.log('ru-ru active:', (s.dictionaries || []).includes('ru-ru'));
const ru = (s.dictionaryDefinitions || []).find(d => d.name === 'ru-ru');
console.log('ru-ru path:', ru ? ru.path : 'NOT FOUND');"

Ожидаемый вывод (путь приведён для пользователя auser):

language: en,
ruru-ru active: true
ru-ru path: C:\Users\auser\AppData\Local\Zed\extensions\work\cspell\node_modules\@cspell\dict-ru_ru\ru_ru.trie.gz

В PowerShell без Git Bash можно хотя бы убедиться, что строки попали в файл:

cd $env:LOCALAPPDATA\Zed\extensions\work\cspell\node_modules\@cspell\cspell-bundled-dicts
Select-String -Path cspell-default.config.js -Pattern "en,ru","'ru-ru'","dict-ru_ru"

Должны увидеть все три совпадения.

Шаг 4. Перезапускаем Zed

Закройте Zed полностью — не reload через командную палитру, а именно закройте все окна и откройте заново. Нужно, чтобы перезапустился LSP-сервер cspell и подхватил новые настройки.

Откройте markdown-файл с русским текстом. Корректные слова (приветпредложение) подчёркиваться не должны, опечатки (опечятка) — должны.

Нюансы и отличия от MacOS/Linux

  1. Пути. ~/.local/share/zed/... → %LOCALAPPDATA%\Zed\.... В JSON/JS-строках обратные слеши надо экранировать (\\) либо использовать прямые (/) — Windows понимает оба варианта.
  2. Где настройки. В актуальной версии cspell реальные настройки лежат в cspell-default.config.js, а cspell-default.json только импортирует его. Если у вас cspell постарше — правьте cspell-default.json, как в оригинальной статье.
  3. Оболочка. PowerShell и cmd плохо переваривают многострочные команды с кавычками. Для установок и копирований они вполне годятся, а для проверок через node -e удобнее Git Bash. Сами правки конфига можно делать в любом редакторе — хоть в самом Zed.
  4. package.json расширения. npm install сам допишет @cspell/dict-ru_ru в зависимости расширения, поэтому при будущих обновлениях словарь подтянется автоматически и переустанавливать его вручную не нужно. Но: при крупном обновлении самого расширения, когда node_modules пересоздаётся с нуля, правки cspell-default.config.js слетят вместе с .bak-копией. Поэтому полезно держать ещё одну копию правленого файла где-то вне node_modules (например, в D:\backup\cspell-default.config.js) и при апдейте быстро возвращать.
  5. Кодировка. Сохраняйте cspell-default.config.js в UTF-8 без BOM. Zed по умолчанию так и делает, а вот классический Блокнот может добавить BOM, и тогда .js-модуль не загрузится.

Мобильный инет Tele2

Сидел всё лето на даче. Разумеется понадобился инет. Тянуть оптику (тут у нас все серьёзно 🙂 ) ради 3-х месяцев не решился. Купил соску, роутер и симку от теле2. Подробности тут: Mikrotik & Huawei E8372h-320.

Ну что сказать… надо было тянуть оптику. «Интернет для устройств» от теле2 редкостная кокаха. Причем там же забавные условия:

  • Типа анлим, но только для одного устройства. Если хочешь раздавать инет — доплати.
  • Хочешь быстрый инет — доплати. Но не более 40Gb.

В итоге 1300р в месяц.

Работать на компе, даже банальный ВПН + консоль, напряжно. Дикие задержки. Ютуб 360p, а лучше 240p. И это при одном подключенном к роутеру устройстве, в будни, когда соседей рядом почти никого. Про выходные вобще молчу. При этом, если например на телефоне отключиться от Wi-Fi и подключиться напрямую на 4g — то все летает.

Сложилось ощущение, что провайдер тупо зажимает канал при использовании тарифа «Интернет для устройств».

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

Как верно подмечено

Самая деревянная служба поддержки

Я видел и общался с различными службами поддержки. И могу с уверенностью сказать, что служба поддержки mos.ru — самая идиотская. Я имею в виду не только качество ответов, а в первую очередь техническую сторону организации «общения» с клиентом.

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

Вобщем, категория дерево.

Не ожидал я такой засады от Java

Я, не то чтобы часто, но как минимум раз в полгода пишу всякие утилитки и приложения на java. В основном клиенты к BD на десктоп. В качестве основного инструмента пользуюсь JavaFX.

И вот, поменял себе железо, начал ставить софт, в том числе и IDE для разработки. Ну и заодно решил попробовать 11-ю (да и 12-ю) версию SDK. Открываю старый проект, дописать пару фишек. А он не работает. IDE подчеркивает красным все что связано с JavaFX.

Вобщем, пока я был в танке, они выпилили JavaFX из java! Не, ну С… (Стабильность).

Оно конечно есть проект Open JavaFX, продвигаемый достойной компанией. Но мне теперь придется кучу проектов переделывать, что бы все заработало! Ну не уроды эти Ораклы?

Так что, пока остаюсь на 8-й жабе. Но уже как то не уютно стало мне в этой среде.

Отпуск.

Я в отпуске. Телефон почти не работает. Инет совсем не работает. Вернусь в следующем месяце. Завидуйте 🙂

Yamandu Costa (гитаРРРа!)

Недавно открыл для себя супер гитариста из Бразилии Yamandu Costa

Вот, решил поделиться с любителями хорошей музыки 🙂

Петиция против электросамокатов

У моего товарища, двух внучек сбил электросамокат на высокой скорости. Я как отец, тоже боюсь за свою дочь, когда мимо пролетают безбашенные смузисты.

Скоростной транспорт должен ездить по проезжей части, а не по тротуарам. Если согласны, подпишите петицию: Запретите ездить на электросамокатах по тротуару!

Wi-Fi в метро без рекламы или копай копай Штирлиц

Заколебало каждый раз подключаться к бесплатному Wi-Fi в метро. На старом телефоне оплачивал раз в год и без проблем пользовался сетью. Но старый фон ушел в лучший мир. Кремний к кремнию, медь к меди…

Вобщем оплатить сие чудо можно либо списав деньги с мобилы, либо через пейпал. Пейпал я давно забыл и не хочу вспоминать. Особенно, когда wi-fi.ru (операторы сети в метро) неожиданно без объявления войны списали последние деньги с привязанной к пейпал карты, как раз перед тем, как мне нужно было сделать обязательный платёж. А на мобилу кидать не хочу, тем более что я даже не догадываюсь сколько деньзнаков туда надо залить.

У всех нормальных сервисов, ну по идее, должна быть страничка, где описаны цены на услуги и возможность пополнить счет. Зайдите на http://wi-fi.ru и найдите где же это дело у них спрятано. Не догадались? Домик нажмите: https://cabinet.wi-fi.ru/. Домик это кабинет! И только на главной странице 🙂 Я грешным делом сначала зашел в товары, потом домик, мы на главной. Нажать второй раз на домик что бы попасть в личный кабинет — мощно! Что курим?

Регистрация в кабинете по номеру телефона и СМС. Там же есть тариф: 50 р в месяц (годовой подписки уже нет) и заветная кнопка купить. Ну на конец то я её нашел, подумал Штирлиц.

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