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

Я постепенно перехожу с 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();
    "
    ```

    vCluster — Виртуальный кластер kubernetes

    В общий доступ вышли два видео про технологию создания виртуальных кластеров kubernetes — vcluster.

    Первое видео.

    Описание проекта.
    Настройка и запуск виртуального кластера.

    00:00 — Вступление
    01:09 — Пример, где это можно использовать
    13:13 — Внутреннее устройство vCluster
    17:47 — Предварительные требования
    21:33 — Конфигурационный файл
    32:13 — Запуск vCluster
    34:55 — Config файл виртуального сервера
    37:12 — Заключение

    Второе видео

    Примеры настройки.
    Синхронизация ресурсов между хост и виртуальными кластерами.

    00:00 — Вступление
    00:18 — Безопасность
    08:23 — Тестовое приложение
    13:56 — Синхронизация ресурсов между хост и виртуальным кластерами
    15:51 — Синхронизация PVC
    21:09 — Использование ingress controller хост кластера в vcluster
    27:14 — Заключение

    Istio

    Начинаем разбираться с Istio.
    Теория.
    Установка Istio.

    00:00 — Вступление
    00:46 — Теория
    04:40 — Тестовый стенд
    12:02 — Теория (продолжаем)
    14:54 — Ambient mode
    21:43 — Установка тестового приложения
    26:19 — Установка istio
    32:35 — Доступ к тестовому приложению
    37:38 — Заключение

    Поддержи канал на Boosty
    Тем, кто не верит в boosty можно на ВТБ: 2200 2460 1569 3404

    Файлы, используемые в видео.

    Это видео на других площадках:

    Первое видео для начинающих изучать kubernetes.

    Компоненты кластера kubernetes.

    Первые 2 видео про Gateway API

    Что такое GatewayAPI?
    Сравнение с Ingress.
    Пример реализации на базе traefik.

    Gateway — два https listener и cert-manager.
    Всякое разное про TCPRoute.

    Цикл видео про OpenLDAP

    Начиная с основ. Заканчивая деплоем в kubernetes.

    OpenLDAP как обычное приложение на Linux сервере.
    Master — Slave, Master — Master, Master — Master — Slave.
    OpenLDAP containers.
    OpenLDAP helm chart.
    OpenLDAP и SSL, Keycloak, Linux users.

    Новый цикл видео — Kyverno

    На https://boosty.to/bigkaa вышли первые три видео о kyverno.

    01 —
    Общие сведения о kyverno.
    Дружим kyverno и argocd.
    Установка kyverno

    02 —
    Постановка задачи.
    Validating rules: patterns and deny.

    03 —
    Generate и Mutate rules.
    Aggregated ClusterRoles
    Создание шаблона для содержимого namespace.

    Премьера на Youtube, Rutube, VK Video и Telegram, запланирована в Январе 2025.

    Понедельник, вторник, среда? Среда передачи данных!

    Задача стояла простая – развернуть кубер в закрытом периметре. Для этого в этот самый периметр надо передать используемые контейнеры. Загрузить их в локальное хранилище оных. Банальная операция:

    docker save -> ctr image import

    Дальше теги, пуши и установка кубера.

    И вот… Ставлю это я кубер. Запускается контейнер coredns и отваливается. Запускается и отваливается. Мягко говоря – необычная ситуация. Ясное дело, без внутреннего DNS ничего работать не будет.

    Дескрайб пода показывает, что не срабатывают пробы. Судя по сообщению, очень похоже на то, когда кто-то режет подключение по сети к порту. Логов контейнер не дает, только сообщения о рестарте контейнера кубелетом из-за проваленных проб. Это очень странно.

    Линукс, используемый на ноде, импортозамещенный с наворотами по безопасности. Первая мысль – опять что-то ИБ закрутило. Но нет. Там все оказалось в пределах нормы. Но время на проверку потратили много.

    Дольше смотрим CNI куба. Первый раз в жизни я по логам containerd и calico отследил процесс от загрузки контейнера до выдачи поду IP адреса. Серьезно прокачал эту тему. Не то что бы что-то новое узнал, но погрузился значительно глубже чем нырял раньше.

    В итоге картина: контейнер загружен, под запущен, сетевой интерфейс для пода создан, IPAM IP выделил, маршруты в таблице маршрутизации есть. В кубе это все видно. В Linux это все видно. Но не работает. Curl говорит, что отказано в подключении.

    В голову полезли нехорошие мысли: потерял квалификацию, пора на пенсию, придется возвращать гонорар.

    Ладно, проведем еще один эксперимент: вместо стандартного coredns, который ставит по умолчанию kubeadm, поставлю его последнюю версию. Закачали образ, намутил манифесты. Установил кубер без coredns по умолчанию. Запустил свой coredns – заработало! Эээ!

    И тут я вспомнил – Telegram! В качестве среды передачи контейнера от меня к ним на первом хопе был Telegram. Где-то года полтора назад, мы через телегу перекидывали большой конфиг одного приложения. После подкидывания конфига, приложение тупо не заводилось. Обнаружили, что телега внесла изменения в файл, пока передавала его на ту сторону. Вот так вот.

    Проверил контрольную сумму файла контейнера предыдущего coredns на своей машине и на сервере. Оба на! Контрольная сумма не совпадает.

    Получается, что containerd запустил контейнер из битого образа! Скорее всего какой-то слой контейнера не того. (Это что получается, в файле контейнера не передаются контрольные суммы слоев?) Все остальные приложения обращаются к containerd, тот уверенно говорит: все Ок! Запущен, работает. Вот вам контейнер ID, работаем! Да уж.

    Долго и витеевато матерился. Мораль:

    • — Telegramm не торт.
    • — CRC придумали не просто так.

    OpenLDAP, анонс цикла видео

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

    На данный момент сняты первые 4-ре видео. В свободном доступе видосики начнут появляться в Сентябре 2024 года. Смотрите анонсы премьер на моём канале в Youtube.

    По традиции, все новые видео сразу выкладываются на мой канал на Boosty.

    Среда разработки на базе kubernetes

    Для разработки достаточно сделать однонодовый кластер kubernetes. Где он будет располагаться не важно. В моём случае это будет виртуальная машина 8CPU 16Gb RAM.

    Планируемые приложения

    Все необходимые для разработки приложения планируется размешать к kubernetes.

    В качестве дистрибутива kubernetes будет использоваться k3s.

    Планируемые приложения:

    • Gitlab.
    • Gitlab runner.
    • Harbor.
    • Контейнер с инструментами разработчика.
      • Доступ по ssh.
      • Домашняя директория пользователя смонтирована как внешний том.
      • Установленные инструменты разработчика (компиляторы, доп утилиты) в домашнюю директорию пользователя.
    • База данных PostgreSQL без кластера.
    • Minio.
    • ArgoCD.

    И т.д. и т.п.

    Первое видео из серии

    В публичном доступе уже 7 серий из 10. Все серии доступны на Boosty.