Начало работы и интерфейс
Введение
blunderDB — программа для создания баз данных позиций нардов. Её главное преимущество — единое место для накопления позиций, с которыми игрок сталкивался (онлайн, на турнирах), и возможность их повторного изучения с фильтрацией по произвольно комбинируемым критериям. blunderDB также можно использовать для создания каталогов эталонных позиций.
Позиции хранятся в базе данных, представленной файлом .db. Настольное приложение открывает этот файл напрямую, а не сетевой адрес: серверный режим — это другой режим того же двоичного файла, и переход от одного к другому делается экспортом или миграцией базы, а не указанием приложению URL.
Основные взаимодействия
Основные взаимодействия с blunderDB:
добавить новую позицию,
изменить существующую позицию,
скопировать изображение доски в буфер обмена (PNG) с помощью CTRL-X или с полным анализом через CTRL-X CTRL-X,
удалить существующую позицию,
искать одну или несколько позиций,
импортировать матчи из различных источников (XG, GNUbg, BGBlitz, Jellyfish, HedgeHog), включая комментарии из файлов XG,
навигировать по ходам импортированного матча,
организовывать позиции в коллекции,
организовывать матчи в турниры.
Пользователь может свободно присваивать позициям метки и аннотировать их комментариями.
Описание интерфейса
Интерфейс blunderDB состоит сверху вниз из:
[вверху] панель инструментов, объединяющая все основные операции с базой данных,
[по центру] основная область отображения, позволяющая отображать или редактировать позиции нардов,
[внизу] строка состояния, отображающая различную информацию о базе данных или текущей позиции и содержащая командную строку.
Панели могут быть отображены для:
отображения данных анализа текущей позиции из eXtreme Gammon (XG), GNUbg или BGBlitz,
отображения, добавления или изменения комментариев,
поиска и фильтрации позиций по комбинируемым критериям,
отображения и управления коллекциями позиций (панель коллекций),
отображения списка импортированных матчей и навигации по ходам матча (панель матчей),
отображения и управления турнирами (панель турниров),
отображения статистики производительности (панель Stats),
вычисления EPC (Effective Pip Count) позиции снятия шашек (панель Eval),
тренироваться на вычислительных упражнениях (панель Тренировки),
изучения позиций методом интервального повторения (панель Anki),
транскрибировать матч вручную (панель Транскрипции),
просматривать метаданные базы данных (панель «Метаданные»).
Высота панели регулируется перетаскиванием её рукоятки; она одинакова для всех вкладок.
Модальные окна могут отображаться для:
показать справку blunderDB, поле поиска которой (клавиша / ставит туда курсор) выделяет вхождения введённого текста без учёта регистра и диакритических знаков (ENTER переходит к следующему, SHIFT-ENTER — к предыдущему),
открыть каталог обучающих туров (см. Обучающие туры и образец базы данных),
настройки экспорта базы данных,
настройки blunderDB, в том числе языка интерфейса (см. Конфигурация).
Основная область отображения предоставляет пользователю:
доску для отображения или редактирования позиции нардов,
уровень и владельца куба,
пипкаунт каждого игрока,
счёт каждого игрока,
кости для розыгрыша. Если на костях не показаны значения, положение костей указывает, чей ход, и что позиция является решением по кубу. Когда решение по кубу — это ответ на удвоение (тейк/пас), предложенный куб отображается в центре доски, на предложенном значении.
Буфер обмена — повседневный жест; сохранение — другая нужда: иллюстрация к статье, к сообщению на форуме, к уроку. SVG предлагается потому, что доска им и является: это форма, которая переживает увеличение, та, что попадает в документ без размытия. PNG производится из неё, как и копия в буфер: одна отрисовка, три назначения — значит, ни одно не может разойтись с другими. Это меню не появляется ни в панели Eval, ни в панели поиска, где правая кнопка уже расставляет шашки другого цвета. См. Перенос позиции в панель Eval о том, как перенести позицию в панель Eval.
Строка состояния структурирована слева направо следующей информацией:
командная строка, доступная при нажатии клавиши ПРОБЕЛ,
информационное сообщение, связанное с выполненной пользователем операцией,
индекс текущей позиции, а за ним число позиций в текущей библиотеке (или сведения о ходе и партии при просмотре матча),
счётчик библиотеки — «позиций 412 · бландеров 38 · матчей 5» — где каждое число открывает то, что оно считает: позиции, поиск
E>по порогу библиотеки (запускается сразу, как если бы его набрали, и попадает в историю поиска) или список матчей. Когда список на экране — не вся библиотека (поиск, коллекция, матч), число бландеров записывается «12 / 340 бландеров»: бландеры этого списка, затем бландеры библиотеки при том же пороге; список из более чем 20 000 позиций не считается и сохраняет только итог. Число, за которым нельзя пойти, — украшение. Порог бландеров — это порог библиотеки, задаваемый на вкладке Библиотека настроек и общий со статистикой: два порога заставили бы одно слово значить два разных. Счётчик обещает ровно то, что открывает ссылка, в том числе для позиции, сыгранной несколькими способами, которая учитывается по наибольшей своей стоимости. В очень большой библиотеке (более 200 000 строк) счётчик не сканирует таблицы: число со знаком «≈» — оценка (верхняя граница, так как удалённые строки оставляют пропуски). Если позиции оценены, число бландеров, у которого нет честной оценки, — это последний точный подсчёт, который сохраняется, пока ни одна запись не может его изменить. После импорта или изменения оно показывается как «?», пока в фоне идёт новый подсчёт, а затем возвращается само; библиотека, открытая только для чтения, не пересчитывает и показывает «?», пока экземпляр, который в неё пишет, не выполнит подсчёт заново. Ссылка запускает поиск, который даёт точное значение. Два числа бландеров являются отдельными ссылками: первое запускает подпоискss E>в показанном списке, второе — поиск по всей библиотеке; когда показан только итог, ссылка одна.
Примечание
В случае позиций, полученных в результате поиска пользователем, количество позиций в строке состояния соответствует числу отфильтрованных позиций.
Вкладка Anki несёт бейдж, когда есть карточки к повторению, по всем колодам. Это число — причина открыть вкладку; ему нечего делать за ней. Ноль не показывается: бейдж с «0» — шум.
Команда log открывает журнал работы: последние двести строк файла журнала, кнопку для их копирования — ровно то, что нужно, чтобы приложить отчёт к сообщению, — и другую, чтобы открыть содержащую их папку. Журнал не фильтруется и не переформатируется: приглаженный журнал уже нельзя процитировать.
Команда grid открывает контактный лист: просматриваемый список — результаты поиска, библиотеку, коллекцию — в виде сетки мини-досок, нарисованных так же, как доска, страницами по двадцать четыре. Он открывается на странице текущей позиции, миниатюра которой обведена рамкой; щелчок или ENTER по миниатюре открывает её позицию на доске и закрывает лист, а весь лист можно пройти с клавиатуры (см. Контактный лист). Он не открывается ни в режиме редактирования, ни в матче, который просматривается по ходам.
В истории поиска панели поиска каждый токен сохранённой команды показан именованной плашкой — Без контакта, Ошибка хода — а не голым токеном. Точная команда остаётся в подсказке, ведь запускается именно она; а токен, которого blunderDB не знает, показывается как есть, а не переведённым к ближайшему.
Вкладки представлений
Под панелью инструментов панель вкладок позволяет работать с несколькими представлениями параллельно. Каждое представление — это независимое рабочее пространство, которое сохраняет собственный список позиций, индекс текущей позиции, отображаемую позицию, анализ и выбранный ход, активную панель, текущий комментарий, а также контекст навигации по матчу. Так, например, можно держать открытым поиск в одном представлении, просматривая матч в другом.
Создать представление: нажать кнопку + на панели вкладок (она называется + Новое представление, пока представление одно) или клавиши CTRL-T. Новое представление создаётся как копия текущего.
Закрыть представление: нажать крестик на вкладке или клавиши CTRL-W. Последнее представление закрыть нельзя.
Смена вида: щёлкнуть по вкладке, нажать CTRL-PageUp / CTRL-PageDown (или SHIFT-J / SHIFT-K), чтобы перейти к предыдущему / следующему виду, либо CTRL-1 … CTRL-9, чтобы сразу перейти к n-му виду активной библиотеки.
Переименовать представление: дважды щёлкнуть по вкладке, ввести новое имя и подтвердить клавишей ENTER.
Вид, оставленный в панели Eval, возвращается в неё таким, каким был оставлен: с черновой доской и, при выходе из панели, с позицией, которую он изучал. Последняя черновая доска панели Eval тоже своя у каждого вида.
Представления сохраняются вместе с состоянием сессии базы данных и восстанавливаются при её повторном открытии.
Несколько открытых библиотек
Несколько баз данных могут оставаться открытыми одновременно. Каждая образует группу вкладок: на панели цветной заголовок содержит имя файла, за ним следуют представления этой библиотеки, верхняя граница которых повторяет тот же цвет. Одновременно активна только одна библиотека: именно её читают и в неё пишут панели, поиск, импорт и ассистент.
При единственной открытой библиотеке панель не показывает заголовка: базу называет только заголовок окна.
Открытие библиотеки в новой группе: кнопка ⧉ Другая библиотека справа от панели вкладок (просто ⧉, как только открыты две группы), CTRL-SHIFT-O или команда
open_group(og). Ранее активная библиотека остаётся открытой в своей группе. CTRL-O, напротив, заменяет библиотеку активной группы; подсказка кнопки Открыть на панели инструментов напоминает оба сочетания.Смена библиотеки: щелчок по вкладке другой группы активирует её библиотеку и этот вид одним действием; щелчок по заголовку группы возвращает её на вид, где она была оставлена. CTRL-SHIFT-PageUp / CTRL-SHIFT-PageDown переходят к предыдущей / следующей библиотеке; CTRL-PageUp / CTRL-PageDown (или SHIFT-J / SHIFT-K) последовательно обходят виды всех групп.
Закрытие группы: крестик в её заголовке закрывает библиотеку и её виды. Закрытие активной группы показывает соседнюю; строка состояния называет закрытую библиотеку и показанную.
В заголовке активной группы имя белое на её цвете; в заголовках остальных групп имя на фоне панели, подчёркнутое сверху их цветом. Шесть цветов чередуются: седьмая группа снова берёт первый. Виды нумеруются внутри своей библиотеки: база, открытая в новой группе, начинается с «#1», а CTRL-1 … CTRL-9 указывают на виды активной группы. Когда вкладки больше не помещаются по ширине окна, панель прокручивается (колесо мыши или смена вида, выводящая показанную вкладку на экран), а не сжимает их.
Переключение мгновенное: каждая группа хранит в памяти свои виды, свой список позиций, текущую позицию, критерии поиска (даже в процессе ввода, без запущенного поиска), список матчей, счётчики и прокрутку каждого списка панели и восстанавливает их без повторного чтения базы. Библиотека, открытая в новой группе, начинает с пустой формы поиска: матчи и турниры, выбранные в одной группе, никогда не применяются в другой. Текущая работа тоже следует за группой: черновик транскрипции, урок, повторение Anki, очередь изучения и открытое Проведение остаются такими, какими были оставлены. То, что могло измениться за время отсутствия, перечитывается сразу после показа: счётчики всегда, список матчей, если изменилось их число или если фоновая задача записала в библиотеку за время отсутствия. Списки, свои для каждой базы (коллекции, турниры, колоды Anki, черновики, Дуэли, история поиска, сохранённые фильтры), перечитываются в показанной библиотеке.
Один и тот же файл не открывается в двух группах: при повторном открытии показывается группа, которая его уже держит.
Фоновые задачи остаются привязаны к своей библиотеке: импорт файлов матчей, отслеживаемая папка и пакетный анализ GammonNet продолжаются в группе, где начались, когда показана другая, и никогда не пишут в показанную библиотеку. Их ход и отчёт остаются в их группе: пока она не показана, в её заголовке стоит значок, который мигает, пока задача работает, и горит постоянно, когда она завершена. При возврате в группу значок исчезает, строка состояния сообщает, что сделала задача, и список матчей перечитывается. Автоматический анализ после импорта запускается в библиотеке импорта. Отслеживаемая папка принадлежит группе, где она была запущена: файлы матчей импортируются туда в фоне, а база для слияния или текст позиции ждут, пока эта группа снова не будет показана. Закрытие группы останавливает её задачи и отслеживание.
Копирование из одной библиотеки в другую. Строка, перетащенная на заголовок другой группы, копируется туда, в любом направлении: матч из списка матчей, коллекция из списка коллекций, позиция из открытой коллекции, показанная позиция (её берут за счётчик «n / N» в строке состояния) или читаемый урок (за его название в панели урока). Целевой заголовок обводится пунктиром. Копирование то же, что у команды transfer: выборка экспорта, объединённая родным импортом, с анализами, комментариями и сыгранными ходами; коллекция уносит свои позиции, матч — свою транскрипцию. То, что уже есть в принимающей библиотеке, не копируется повторно: копирование из A в B, а затем из B в A не создаёт дубликатов, и ничто там не говорит, откуда пришла копия. Копирование идёт в фоне, привязанное к принимающей группе: её заголовок несёт значок, а по возвращении строка состояния сообщает, сколько позиций и матчей новые и сколько уже было.
Корзина собирает строки из нескольких библиотек, чтобы высыпать их за один раз. SHIFT-B кладёт в неё показанную позицию или убирает её, как b для Стопки; строка, перетащенная на корзину, тоже попадает в неё. Корзина справа на панели вкладок показывает своё число; щелчок открывает её меню (Высыпать в … для каждой группы, Очистить корзину), а перетаскивание на заголовок группы высыпает её туда. Она живёт в памяти, никогда в базе: закрытие группы убирает её строки, и она исчезает при закрытии blunderDB. Позицию, которая ещё черновик, нужно сначала сохранить.
Замок на заголовке блокирует группу: в неё больше ничего не высыпается, ни перетаскиванием, ни из корзины, и строка состояния об этом сообщает. Блокировка не затрагивает ни импорт, ни изменения, сделанные в группе; второй щелчок её снимает.
Смена группы по-прежнему отклоняется, и щелчком, и с клавиатуры, с сообщением в строке состояния, которое называет причину и говорит, где это остановить, когда то, что выполняется, следует за экраном: rollout, результат которого показывается на позиции доски (rollout stop); показ турнира, который отдаёт показанную библиотеку по сети клуба (останавливается в Проведении); идущая Дуэль, которая занимает доску и её виды; тренировочный сеанс, чьи таймер и журнал не принадлежат ни одной группе; наконец, на всё время его работы, импорт файлов, которые умеет читать только интерфейс (тексты позиций, импортируются по одному), или слияние базы. При закрытии blunderDB сохраняется только сеанс активной библиотеки, а список групп не сохраняется: при следующем запуске blunderDB снова открывает последнюю активную базу.
Что знают другие библиотеки: вкладка «В других библиотеках»
Вкладка В других библиотеках (CTRL-SHIFT-A) показывает для отображаемой позиции, что о ней знают другие библиотеки, открытые в группах. Позиция находится там по идентичности доски (её хешу), а не по номеру: один и тот же номер обозначает две разные позиции в двух базах. У каждой библиотеки свой блок с рамкой цвета её группы:
её анализ: лучший ход или лучшее действие с кубом и движок, который его нашёл. Анализ, оценённый по таблице эквити матча, отличной от таблицы активной библиотеки, помечается другая MET;
её комментарии, каждый с автором или подписавшим и состоянием подписи, как в панели комментариев;
матчи, в которых сыграна позиция: игроки, турнир, дата, номер хода, сыгранный ход или решение и их стоимость. Оценка (хорошо, ошибка, грубая ошибка) выносится по порогам активной библиотеки, а не другой; стоимость, рассчитанная с другой MET, не сравнивается и остаётся помеченной другая MET. Если матчей больше 50, перечисляются 50 последних импортированных и указывается общее число;
её соседние позиции, пять ближайших, в виде миниатюр с указанием расстояния.
Библиотека, не содержащая позиции, сообщает об этом и всё равно показывает свои соседние позиции. Открыть там, щелчок по матчу или миниатюре, активирует группу этой библиотеки и показывает в ней позицию. Ничего не записывается ни в одну базу. Кнопка ⟳ заново считывает другие библиотеки.
Подмена на месте. Клавиша x показывает вместо доски, на том же месте и того же размера, позицию другой библиотеки под лентой её цвета, напоминающей её название, лучший ход и число комментариев. Если клавишу удерживать, доска возвращается при отпускании; при кратком нажатии подмена остаётся на экране до следующего нажатия. Смена позиции или окна тоже возвращает доску. Активная группа, вид и список не меняются. Показываемая позиция по умолчанию та же позиция в первой другой библиотеке, которая её содержит; кнопка Закрепить под миниатюрой на вкладке «В других библиотеках» выбирает вместо этого данную соседнюю позицию, до Открепить или смены группы.
Разделённый экран. На большом экране кнопка ◫ панели вкладок (CTRL-SHIFT-X) делит окно на две панели одинаковой ширины. Одна несёт активную группу целиком; другая — просмотрщик только для чтения другой открытой библиотеки (той же, если открыта только одна): её доску, анализ позиции и комментарий. Просмотрщик проходит всю библиотеку, матч, воспроизводимый ход за ходом (партия, ход и сыгранное показываются над доской), или коллекцию — на выбор в выпадающем списке, кнопками ⏮ ◀ ▶ ⏭. Он открывается там, где эту библиотеку оставили. Ничто из показанного никуда не записывается. Щелчок по просмотрщику вне его кнопок делает его библиотеку активной: панели меняются ролями, и каждая библиотека остаётся на своей стороне; CTRL-SHIFT-PAGE UP / PAGE DOWN делает то же с клавиатуры. При ширине меньше 1280 пикселей разделённый экран отклоняется и предлагается подмена на месте (x); он закрывается, если окно становится слишком узким.
Конфигурация
Кнопка настроек (значок шестерёнки) на панели инструментов, слева от кнопки справки, открывает окно настроек blunderDB. Оно разделено на десять вкладок:
Интерфейс — тема, язык, масштаб отображения, положение панели, шаг PageUp / PageDown (10, 50, 100, 500 или 1 000 позиций либо 10 % списка), журналы, проверка обновлений, ваше имя и соседние позиции;
Цвета доски — цвета игровой доски;
Библиотека — то, что принадлежит открытой базе: пороги ошибки и бландера, описанные ниже;
Обслуживание — состояние здоровья базы, одна строка на операцию, описано ниже;
Корпус — дубликаты при импорте, псевдонимы игроков и событий и поиск вероятных дубликатов (см. импорт матчей);
Bearoff — таблицы bearoff, используемые панелью Eval;
gammonNet — настройки встроенного движка оценки, описанные ниже;
Отслеживаемая папка — автоматический импорт матчей, попадающих в папку, описан ниже;
Ассистент и MCP — локальный MCP-сервер и встроенный ассистент, описанные ниже;
Идентичность автора — ключ, которым подписываются ваши отметки происхождения; описан в разделе Распространение базы: происхождение и пароль.
Вкладка Интерфейс начинается с темы: как в системе, светлая, тёмная, высокий контраст или для печати. Тема задаёт цвета интерфейса и предлагает палитру доски — тёмный интерфейс вокруг светлой доски это не тёмная тема, а её половина, ведь доска занимает бо́льшую часть окна.
Последнее слово за вами, и механизм это гарантирует, а не обещает: вкладка Цвета по-прежнему настраивает доску напрямую, и цвет, выбранный после темы, — ваш. При запуске применяются только токены интерфейса, никогда не палитра доски: та, что вы настроили, уже загружена, и переписывать её при каждом запуске значило бы стирать вашу работу сессию за сессией. См. ADR-0038.
Как в системе — значение по умолчанию: оно подчиняется светлой/тёмной настройке рабочего стола, в том числе при её смене посреди сессии. Инструмент не навязывает свой светлый или тёмный вид рабочему столу, который уже решил.
Вкладка Интерфейс также позволяет выбрать язык: английский, французский, немецкий, итальянский, испанский, финский, японский, греческий или русский. Весь интерфейс (панель инструментов, панели, сообщения, справка) переводится на выбранный язык. Выбор языка сохраняется и переносится из сессии в сессию.
Вкладка Библиотека собирает то, что принадлежит открытому файлу, а не машине. Она пуста, пока не открыта ни одна база, и она об этом говорит.
Прежде всего она несёт два порога, которые решают словарь всего приложения: решение является ошибкой, как только его стоимость достигает порога ошибки, и эта ошибка является бландером, как только она достигает порога бландера. Всякий бландер — ошибка, поэтому первый порог не может превышать второй, и blunderDB отвергает перевёрнутую пару. Значения вводятся в эквити — «0,080» — единице всех таблиц; командная же строка говорит в миллипунктах, так что порог 0,080 записывается в поиске как E>80.
Эти пороги следуют за файлом, а не за компьютером: одна и та же база считает одни и те же бландеры всюду, где её открывают, blunderdb info их показывает, а blunderdb edit --error-threshold / --blunder-threshold их задаёт. Они не путешествуют в экспорте: порог — это привычка чтения, а не факт о позициях.
Три предустановки предлагаются в один щелчок, каждая под именем программы, которая провела эту черту: blunderDB (0,050 / 0,100), XG (0,020 / 0,080) и gnubg (0,040 / 0,080). По умолчанию библиотека читает 0,050 и 0,100.
Что они меняют на экране: число бландеров в счётчике строки состояния и поиск, который готовит его ссылка, столбцы «Ошибки» и «Бландеры» в статистике и в таблице игроков, отметки ходов в карточке матча (Панель матчей), а также список позиций, которые blunderDB предлагает пересмотреть после импорта.
Строка Освобождаемое место вкладки Обслуживание содержит кнопку Сжать, которая возвращает место на диске, оставшееся после удалений (матчи, турниры, очистки): база никогда не уменьшается сама при удалении данных, это сжатие нужно запросить явно. На большой базе операция может занять время. Сжатая копия записывается рядом с файлом, затем заменяет его: временно требуется примерно размер базы свободного места на её томе, а не в оперативной памяти. Если базу открыла другая программа (например, второй экземпляр в режиме только чтения), файл не заменяется: база сжимается на месте, для чего нужно примерно вдвое больше её размера свободного места, а временный файл попадает во временную папку системы или в ту, на которую указывает переменная окружения SQLITE_TMPDIR: при небольшом /tmp направьте её на том базы. blunderDB отказывается запускать операцию, выдавая сообщение о том, чего не хватает (места на диске или менее 512 МБ доступной памяти), вместо того чтобы рисковать прерванным сжатием. Перед запуском операции запрашивается подтверждение. Результат — сэкономленное место в мегабайтах — затем отображается в строке состояния. Та же операция доступна в командной строке через blunderdb vacuum (см. Интерфейс командной строки (CLI)).
После сжатия на месте blunderDB проверяет, что файл действительно уменьшился. В Windows система отказывается укорачивать файл, который другая программа держит открытым определённым образом: тогда сжатие завершается сообщением об этом — закройте другую программу и запустите сжатие снова — вместо того чтобы объявить о выигрыше, которого не было.
Кнопка Открыть папку журналов на вкладке Интерфейс открывает папку с журналом приложения — это удобно, чтобы приложить подробности к сообщению о проблеме, особенно когда blunderDB запущен из ярлыка или двойным щелчком, без подключённого терминала, который что-либо показал бы.
Флажок Проверять обновления при запуске на той же вкладке, по умолчанию выключенный, при каждом запуске один раз обращается к странице последних релизов репозитория GitHub и показывает в строке состояния сообщение, если доступна более новая версия — но никогда не окно, мешающее работе. При установке через менеджер пакетов (Flatpak, Homebrew, пакет дистрибутива…) эта проверка автоматически остаётся выключенной: обновлениями тогда занимается этот канал, а не сам blunderDB.
Две настройки вкладки Интерфейс управляют ранжированием соседних позиций (токен like, см. Панель поиска): число выводимых соседних позиций и максимальное расстояние, за пределами которого позиция перестаёт считаться соседней. По умолчанию это расстояние равно нулю, то есть предела нет: шкала зависит от фазы партии, и выбранное здесь значение читалось бы как мера. Токен like<12 задаёт своё значение для одного поиска, не затрагивая настройку.
Вкладка Цвета доски позволяет настроить цвета доски. У каждого элемента свой выбор цвета: фон, рамка, светлые и тёмные пункты, шашки игрока 1 и игрока 2, кубики, точки на кубиках и куб удвоения. Кнопка Сбросить возвращает все цвета по умолчанию. Как и язык, выбранные цвета сохраняются между сеансами.
Вкладка Bearoff управляет таблицами выбрасывания панели Eval (см. Панель Eval). Они не встроены в исполняемый файл и не загружаются: blunderDB вычисляет их на машине, которая ими пользуется, и результат побайтово совпадает с тем, что выдаёт gnubg — отпечаток SHA-256 проверяется до того, как таблица принимается.
Две обычные таблицы (TS-06-06 для решения по кубу, OS-06 для EPC) вычисляются при первом запуске, в фоне и ни о чём не спрашивая: около шести секунд на одном ядре, в течение которых приложением пользуются как обычно. Панель Eval упоминает об этом, только если в неё поставлена позиция, которой нужна ещё не готовая таблица.
Вкладка показывает активную область и её происхождение, состояние односторонней таблицы, которую читает EPC, папку, где всё это живёт, и список имеющихся таблиц с их размером и вердиктом. Каждая строка удаляется отдельно, после подтверждения.
Проверена или не проверена. Проверенная таблица имеет ровно те байты, которые gnubg производит для её области: её отпечаток SHA-256 записан в blunderDB и был найден снова. Отпечатки, записанные для односторонних таблиц (от OS-06 до OS-10), — это отпечатки, которые производит инструмент makebearoff из GNUbg 1.08. Непроверенная таблица корректна, но для её области отпечаток не записан — к ней нет претензий, просто никто не сравнивал её с эталоном. Повреждённая таблица противоречит сама себе и никогда не читается; она пересчитывается.
Вычислить более широкую таблицу. Область выбирается из списка двух семейств вместе с числом ядер (по умолчанию все, кроме одного, чтобы машина оставалась пригодной для работы):
точный куб (двусторонняя), от TS-06-06 до TS-06-15: расширяет область, где вероятность выигрыша и вердикт куба читаются, а не оцениваются;
EPC вне дома (односторонняя), от OS-06 до OS-10: расширяет расстояние, на котором может стоять шашка без того, чтобы блок EPC умолк. Этот проход читает только позиции меньше вычисляемой, поэтому он последователен по построению и число ядер ему ничего не даёт — выбор говорит это, становясь серым.
Прежде чем что-либо начнётся, вкладка называет для выбранной области три числа: размер на диске, память, нужную во время вычисления, и время, которое оно должно занять на этой машине. Последнее начинается как оценка и становится измерением: каждый достаточно широкий проход фиксирует собственную скорость и сохраняет её. Область, которую доступная память не позволяет, предлагается серой, с указанием причины — «нужно 24 ГБ, осталось 12» есть ответ, отсутствующая строка ответом не была бы.
Для порядка величины, на машине с шестнадцатью потоками: TS-06-09 весит 191 МБ и требует десятка секунд, TS-06-11 весит 1,2 ГБ и нескольких минут, TS-06-13 превышает то, что большинство машин может удержать в памяти. Со стороны односторонних, на одном ядре: OS-07 весит 4,9 МБ и требует 17 с, OS-08 — 15 МБ и 1 мин 20, OS-10 — 117 МБ и полчаса.
Пауза и продолжение. Во время вычисления прогресс показывает измеренное оставшееся время и две отдельные кнопки: Пауза и Отмена. Пауза записывает состояние вычисления рядом с таблицей; повторный запуск продолжает с места остановки, а не начинает заново. Отмена не сохраняет ничего. Закрытие окна настроек ничего не прерывает — вычисление продолжается в фоне.
Приостановленное вычисление находится при следующем запуске, названным и с числом («TS-06-09 прервана на 43 %»), с кнопками Продолжить и Удалить. Ничто не перезапускается само: остановки просил пользователь.
Наконец, вкладка позволяет указать внешний двусторонний файл .bd, например базу, произведённую самим gnubg: побеждает таблица с самой широкой областью.
Вкладка Обслуживание показывает состояние базы: одна строка на операцию, с её счётчиком, последним запуском (дата и итог: завершено, отменено или ошибка) и действием. Сам по себе, при открытии, запускается только расчёт матчей без статистики.
Позиции без анализа — позиции, не несущие никакого анализа; действие — анализ gammonNet, описанный ниже. Позиции, которые gammonNet отказывается оценивать (танец, счёт вне таблицы матча), остаются в этом счётчике, который поэтому не обязательно доходит до нуля.
Устаревшие анализы gammonNet — описаны ниже.
Матчи без статистики — матчи, статистика которых ещё не рассчитана; действие рассчитывает их все. База, открытая для записи, в которой они есть, рассчитывает их сама в фоне, пакетами: строка состояния показывает ход этой строки и её кнопку отмены, значки турниров и вкладка «Игроки» панели «Статистика» ждут окончания расчёта, а остальное приложение остаётся доступным. Открытие другой базы останавливает его. В режиме только для чтения или в командной строке первое чтение статистики рассчитывает их, что может быть долго на большой базе: панель «Статистика» тогда показывает это число, которое открывает эту вкладку.
Столбцы анализа — столбцы, которые опрашивают поиск и статистика, являются проекцией сохранённых анализов, остающихся нетронутыми: действие пересчитывает их, ничего не импортируя заново.
Ошибки сыгранных ходов — выставляет оценку сыгранным ходам, у которых ещё нет ошибки.
Анализы в старом формате — переписывает в двоичном формате анализы, которые предыдущая версия хранила в JSON.
Корзина — число записей в корзине; щелчок по нему открывает её.
Освобождаемое место — свободное место файла, которое описанное выше сжатие возвращает диску.
Затратный подсчёт (он читает целую таблицу) ждёт кнопки Подсчитать. Число позиций открывает эти позиции в списке; число матчей без статистики открывает эти матчи в панели матчей. Операция выполняется в фоне: её ход и кнопка отмены отображаются в строке состояния, и одновременно выполняется только одна операция, пишущая в базу — идущий анализ gammonNet, роллаут или другая операция обслуживания приводит к отказу следующей, с названием той, что занимает базу. В базе, открытой только для чтения, действия отключены. Те же операции есть в командной строке (blunderdb maintenance).
Вкладка gammonNet настраивает встроенный движок оценки (см. ADR-0011). В ней задаются две глубины поиска, названные и хранимые раздельно — понижение одной никогда не меняет другую:
Глубина отображения — комфорт интерактивной работы при редактировании доски; никогда не записывается в базу.
Глубина анализа — то, что пакетный анализ после импорта записывает в анализ позиции.
Обе по умолчанию равны 2-ply — канонической конфигурации. Меню отмечает значком ⚠ глубины 3-ply и 4-ply, стоимость которых на одну позицию намного превышает стоимость 2-ply. Вкладка также предлагает отсечение (по умолчанию k=12) и число отображаемых кандидатных ходов (по умолчанию 10), а также флажок автоматически анализировать после импорта, который, будучи включён, после каждого импорта проверяет, остались ли позиции без какого-либо анализа (ни gammonNet, ни XG, ни GNUbg, ни BGBlitz — правило гласит: «оценка лишь заполняет пробел», но никогда ничего не заменяет), и при необходимости запускает в фоне анализ gammonNet на настроенной глубине анализа. Строка Позиции без анализа вкладки Обслуживание вручную повторно запускает то же доделывание, что полезно для библиотеки, созданной до появления этой функции.
Принятие или отказ оценивается gammonNet по решению удваивающего, до удвоения. Вердикт gammonNet, записанный на такой ответ предыдущей версией blunderDB, судил о редабл получателя: он удаляется при открытии библиотеки или при импорте базы, которая его содержит. Принятие или отказ снова становится позицией без анализа, отсутствующей в статистике, пока строка Позиции без анализа вкладки Обслуживание (или автоматический анализ после импорта) не оценит её заново.
Строка Устаревшие анализы gammonNet вкладки Обслуживание охватывает обратный случай: позиция, уже проанализированная gammonNet, но чей сохранённый анализ записан версией движка старше работающей или на глубине, отличной от настроенной выше глубины анализа, помечается там как устаревшая и оценивается заново. Позиция, несущая дополнительно анализ XG, GNUbg или BGBlitz, никогда не затрагивается этой пакетной обработкой, каково бы ни было её содержимое gammonNet — защита ADR-0013 остаётся безусловной. Число устаревших позиций читает каждый анализ gammonNet базы: оно ждёт кнопки Подсчитать. Пакет пересчитывает собственный список в момент запуска.
Обе партии ограничены, видимы и отменяемы — никакого молчаливого демона: их глубина, их ход (проанализировано позиций / всего, начиная с 0 при запуске) и кнопка отмены отображаются в строке состояния всё время их выполнения и исчезают по завершении, уступая место сообщению, подводящему итог результата — сколько позиций было проанализировано, сколько было отклонено (позиция, которую gammonNet отказывается оценивать, например, счёт матча за пределами диапазона его таблицы, что никогда не является сбоем) и сколько не удалось (повторяются без изменений при следующем запуске). Закрытие приложения во время того или другого ничего не теряет: каждая проанализированная позиция записывается по мере готовности, а следующий запуск возобновляет анализ ровно с того места, где он остановился, без какого-либо журнала. Отмена, как и закрытие, прерывает также позицию, которая считается в данный момент, — она остаётся без анализа.
В библиотеку одновременно пишет только одна работа: пакет gammonNet, сохраняемый роллаут или операция обслуживания. Пакет или операция, запущенные из вкладки Обслуживание, отклоняются, пока выполняется другая работа, и строка состояния называет эту работу; пакет, который запускает импорт, транскрипция или дуэль, напротив, ждёт её завершения, и строка состояния показывает его как «ожидающий» до начала.
На той же вкладке находится настройка роллаутов, запускаемых из панели Анализ (см. Роллауты), сохраняемая между сеансами: Быстрый (216 партий, обрезанных на 7 полуходах), Стандартный (1296 партий, обрезанных на 11 полуходах) или Свободный, где редактируются все параметры — усечение, минимальное и максимальное число партий (кратное 36), предел JSD, глубина (ply), число кандидатов, начальное значение генератора и число процессов.
Таблица эквити матча базы. В нижней части вкладки список Таблица эквити матча (MET) базы выбирает таблицу, по которой gammonNet оценивает счета матча: Kazaross-XG2, встроенная и используемая по умолчанию, либо таблица, импортированная из файла GNUbg .xml кнопкой Импортировать MET .xml…. Выбор принадлежит базе, а не приложению: открыв другую базу, вы получаете её таблицу. Читаются только явные таблицы (не параметрические таблицы zadeh или mec); за пределами длины импортированной таблицы её заменяет встроенная таблица. Таблица определяется по значениям, а не по имени: импорт Kazaross-XG2.xml из GNUbg ничего не добавляет, это встроенная таблица. Каждый анализ, вычисленный gammonNet, записывает таблицу, с которой он был вычислен; импортированные анализы (XG, GNUbg, BGBlitz) считаются вычисленными с Kazaross-XG2. Анализ при счёте матча, вычисленный с иной таблицей, чем текущая, помечается как Другая MET в панели анализа и исключается из статистики (средние ошибки, PR, рейтинги, личные встречи); анализ в money game не исключается никогда. Смена таблицы не переписывает ни один анализ: меняется лишь то, что учитывают сравнения.
Оценка в реальном времени на панели и матрица куба рассчитываются по таблице базы, как и сохраняемые ею анализы. Таблица путешествует вместе с анализами, которые на неё ссылаются: экспорт базы забирает её с собой, а импорт базы добавляет её в принимающую базу без дубликатов (уже имеющаяся таблица узнаётся по своим значениям) и не делая её текущей. Анализ gammonNet, заменённый анализом другого движка (XG, GNUbg), снова считается рассчитанным с Kazaross-XG2.
Матч, импортированный без анализа, теперь получает PR. Это случай матча, сыгранного онлайн, или файла Jellyfish .mat, который никто не пропускал через XG: blunderDB знал его позиции и сыгранные ходы, но никакой анализ не говорил, чего они стоят. После прогона фактически сыгранный ход сравнивается с ранжированием gammonNet, и разница питает PR, долю ошибок, худшие решения и все прочие показатели — ровно так же, как у матча, разобранного в XG. Сравнение ничего не выдумывает: сыгранный ход берётся из таблицы ходов самого матча, записанной при импорте, независимо от того, нёс ли файл анализ.
Базу, проанализированную более ранней версией, не нужно переоценивать: blunderdb repair пересчитывает столбцы по уже сохранённым анализам и ходам и возвращает этим матчам их PR (см. repair).
Честная оговорка: позиция определяется своей структурой, поэтому позиция, встреченная дважды — раз сыгранная хорошо, раз плохо — несёт только одну разницу, разницу первого записанного вхождения. Это не особенность данного расчёта: библиотека XG устроена ровно так же.
Отслеживаемая папка
Вкладка Отслеживаемая папка просит blunderDB во время работы следить за папкой и импортировать каждый файл матча, который в ней появляется. Сыграть сессию в eXtreme Gammon, вернуться в blunderDB — и матчи уже там.
Ничего не угадывается. Пока папка не указана, слежения нет: blunderDB не начинает читать каталог оттого, что предположил, где живут ваши матчи. Кнопка Предложить смотрит обычные места на этой машине и предлагает путь только если он действительно существует; иначе она об этом говорит, и указать папку — ваше дело.
Три вещи стоит знать, прежде чем поставить галочку:
Импортируются только появляющиеся файлы. То, что папка уже содержит в момент запуска слежения, записывается как известное и не трогается: направив слежение на четыре года матчей, не следует импортировать их все. Чтобы импортировать то, что уже есть, используйте импорт папки, который для этого и существует, — и эти два прекрасно складываются: сначала импорт, потом слежение.
Файл импортируется лишь тогда, когда его размер устоялся. Матч, который пишет другая программа, растёт от взгляда к взгляду; импорт недописанного дал бы ошибку разбора, с которой никто ничего не сделает. Поэтому blunderDB ждёт, пока увидит один и тот же файл дважды неизменным.
Импорт выполняется тихо. Вы изучали позицию, когда пришли ваши матчи: забрать у вас экран было бы худшим моментом. Режим, активный поиск, вкладка и отображаемая позиция не меняются; список позиций не перезагружается и покажет новые матчи при следующей перезагрузке. Импорт идёт без окна, а в строке состояния появляется баннер с числом импортированных, пропущенных (дубликаты) и неудачных матчей, с кнопкой, которая при желании открывает полный отчёт. Всё остальное совпадает с ручным импортом: те же обнаруженные дубликаты, та же пачка импорта, тот же автоматический анализ, если он включён.
Интервал по умолчанию — десять секунд; нижний предел — две. Папка не обходится рекурсивно: отслеживаемая папка — это место, куда инструмент кладёт свои матчи, а не дерево для обхода. Отмонтированный сетевой ресурс не останавливает слежение и не выдаёт своё содержимое за новое при возвращении.
То же слежение доступно в командной строке: blunderdb import --type batch --dir <папка> --watch (см. Интерфейс командной строки (CLI)) — это форма, которой могут пользоваться сервер, планировщик или скрипт.
Синхронизация двух компьютеров
Копирование базы .db с одного компьютера на другой или хранение её в синхронизируемой папке (Syncthing, Dropbox…) в конце концов портит её: SQLite пишет рядом с базой файлы журнала, которые синхронизация файлов копирует в беспорядке. blunderDB вместо этого синхронизирует две библиотеки с помощью инкрементальных экспортов, складываемых в папку, которую другой компьютер отслеживает. Способ передачи — на ваш выбор: Syncthing, USB-флешка, электронная почта; ни сервера, ни учётной записи не требуется.
На компьютере A в окне экспорта выберите Вся библиотека, отметьте Только новое с последнего экспорта в эту папку и укажите папку кнопкой Выбрать папку…. Каждый экспорт записывает туда файл
sync-<machine>-<date>.db, содержащий только то, что попало в библиотеку после предыдущего экспорта в ту же папку; первый содержит всё.На компьютере B сделайте эту папку Отслеживаемая папка. Каждый появляющийся там файл
.dbсливается без предварительного просмотра, как при импорте базы: уже известная позиция не дублируется, уже известный матч распознаётся, коллекции и уроки сливаются по имени.Сделайте то же самое в обратном направлении, со второй папкой.
Что нужно знать:
Отметка «последняя синхронизация» хранится у того, кто экспортирует, по одной на папку назначения, и сдвигается только тогда, когда файл завершён. Принимающий компьютер ничего не записывает. Неудавшийся экспорт оставляет отметку на месте: следующий передаёт те же строки.
Синхронизация идёт только добавлением. Удаление не распространяется: удаление матча на A не удаляет его на B. Изменение на месте тоже: переписанный комментарий, переименованный матч, повторно выполненный анализ уже отправленной позиции. Передаются позиции, матчи, турниры, коллекции, уроки и комментарии, добавленные после последнего экспорта; коллекция передаётся повторно и тогда, когда в неё добавлена позиция, а позиция — когда к ней добавлен комментарий. Переписанный комментарий повторно не передаётся, потому что принимающий компьютер никогда не заменяет уже имеющийся у него текст: чтобы передать исправление, добавьте его как новый комментарий. Сохранённые фильтры и колоды Anki в это не входят: экспорт режима Вся библиотека без этого флажка включает их.
То, что компьютер получил, один раз отправляется обратно другому, поскольку для его библиотеки это новое; другой узнаёт это, ничего не добавляя, и следующий обмен пуст.
Файл, пришедший, пока blunderDB был закрыт, не теряется: при запуске отслеживания каждый
.db, уже лежащий в папке, сливается — в отличие от файлов матчей. Принимающий компьютер не запоминает, что он прочитал; поэтому при каждом запуске он заново сливает все файлы, которые папка ещё содержит, ничего не добавляя, но ценой времени на их повторное чтение. Время от времени удаляйте уже полученные файлыsync-…, чтобы этот запуск оставался быстрым.Инкрементальный экспорт никогда не перезаписывает файл. Предыдущий файл, возможно, содержит строки, которые другой компьютер ещё не получил: экспорт в уже занятое имя файла отклоняется. Укажите папку, и каждый экспорт получит в ней новое имя.
Файл, перезаписанный под уже встречавшимся именем, объединяется снова: наблюдение узнаёт файл по имени, размеру и дате изменения.
Открытая библиотека никогда не сливается сама с собой: если она лежит в отслеживаемой папке, отслеживание её пропускает.
Экспорт, которому пришлось отложить строки (они отмечены в журнале), не сдвигает отметку: следующий повторяет их попытку вместе со всем, что идёт за ними.
Экспорт никогда не виден наполовину записанным: он записывается под скрытым именем и затем переименовывается одним действием. Файл, защищённый паролем (
.dbx), отслеживанием не подхватывается, так как оно не может запросить пароль.
В командной строке: blunderdb export --type database --incremental --file <папка> с одной стороны и blunderdb import --type batch --dir <папка> --watch с другой (см. Интерфейс командной строки (CLI)). Сервер принимает "incremental": true на /v1/exports.sqlite (см. Безголовый режим (сервер)).
Ассистент и MCP
Вкладка Ассистент и MCP настраивает две вещи, обе по умолчанию отключены.
Локальный MCP-сервер предоставляет инструменты blunderDB (поиск, чтение позиции и её анализа, статистика игрока, викторины…) ассистенту, говорящему на Model Context Protocol, такому как Claude Desktop или Claude Code, пока окно открыто. Он слушает только на этой машине, по адресу http://127.0.0.1:<port>/mcp (порт 8765 по умолчанию), и отклоняет запрос, пришедший с веб-страницы. Он добавляет два инструмента отображения: открыть представление по поиску и показать позицию. Инструменты только читают, если не отмечен флажок Разрешить запись: тогда они могут сохранить позицию, прокомментировать её, создать и наполнить коллекцию, оценить карточку Anki и сохранить роллаут рядом с анализом позиции; ничего не стирается. Без открытого окна blunderdb mcp предоставляет те же инструменты (см. Интерфейс командной строки (CLI)).
Встроенный ассистент — клиент этих же инструментов. Модель не встроена: он обращается к OpenAI-совместимому провайдеру — по умолчанию Ollama на этой машине, либо Groq, OpenRouter, Gemini, Anthropic или другой адрес. Удалённым считается любой адрес вне этой машины, каким бы ни был выбранный провайдер: ваши фразы и результаты инструментов тогда покидают машину, вкладка сообщает об этом и ждёт вашего согласия именно для этого адреса; для другого адреса согласие запрашивается снова. Ключ API хранится в связке ключей системы, никогда в базе данных или в файле настроек. Модель, предлагаемая по умолчанию для Ollama, qwen2.5:7b, — отправная точка, а не рекомендация: никакая модель не рекомендуется без результата измерительного стенда, поставляемого с исходным кодом.
После включения ассистент становится подвкладкой Ассистент панели «Поиск». Фраза — «мои ошибки более 50 миллипунктов в гонке» — открывает новый вид, названный по ней, запускает в нём поиск и переключается на него; её токены остаются в истории поиска. То, что возвращают инструменты, берётся из базы; то, что пишет модель, помечено как Свободный текст модели. Ассистент предлагает изменение только если отмечен флажок Разрешить ассистенту предлагать изменения (каждое с подтверждением) — настройка, отдельная от записи локального MCP-сервера, — и каждое изменение, которое он готовит, показывается и выполняется только после Подтвердить.
Окно конфигурации также содержит настройки отображения интерфейса. Ползунок масштаба интерфейса позволяет увеличить или уменьшить все элементы интерфейса, что полезно на экранах высокой плотности или для улучшения читаемости. Сочетания CTRL-+, CTRL– и CTRL-0 меняют тот же масштаб, как в браузере. Меню расположения панелей определяет, где панели (поиск, матчи, анализ) располагаются относительно доски: снизу, сбоку или автоматически (тогда на широких экранах выбирается боковое расположение, чтобы лучше использовать доступное пространство). Как и другие настройки, эти выборы сохраняются от сеанса к сеансу.
Обучающие туры и образец базы данных
Чтобы облегчить освоение, blunderDB предлагает обучающие туры по интерфейсу. Каталог туров открывается с панели инструментов или командой tutorial (псевдоним tour). Доступно семь туров: общий обзор интерфейса и туры, посвящённые поиску позиций, просмотру матчей, просмотру турниров, панели Eval, повторению Anki и статистике. Каждый тур шаг за шагом подсвечивает соответствующие элементы интерфейса, попутно открывает панель, о которой идёт речь, и может быть повторён в любой момент. При первом запуске общий обзор предлагается автоматически.
Команда demo загружает образец базы данных, позволяющий познакомиться с возможностями инструмента, не импортируя собственные партии: три матча (два из них объединены в турнир), проанализированные eXtreme Gammon, BGBlitz и gammonNet, три тематические коллекции, комментарии с тегами (#blunder, #cube) и колоду Anki с журналом повторений. Игроки, турнир и место вымышлены. Экскурсии по интерфейсу опираются на эту базу, когда ни одна база не открыта.
Редактирование позиций
Нажатие клавиши TAB открывает панель поиска и позволяет редактировать позицию на доске для добавления в базу данных или для задания структуры позиции для поиска. Распределение шашек, куб, счёт и право хода можно изменять с помощью мыши (см. Редактирование позиции).
Совет
Смотрите Горячие клавиши для доступных горячих клавиш.
Командная строка
Командная строка, встроенная в строку состояния, позволяет выполнять все функции blunderDB, доступные в графическом интерфейсе: общие операции с базой данных, навигация по позициям, отображение анализа и/или комментариев, поиск позиций по фильтрам… После первоначального освоения интерфейса рекомендуется постепенно использовать командную строку для мощной и плавной работы с blunderDB, особенно для функций поиска позиций.
Для открытия командной строки нажмите клавишу ПРОБЕЛ. Для отправки запроса и закрытия командной строки нажмите клавишу ENTER.
blunderDB выполняет запросы пользователя при условии их корректности и немедленно изменяет состояние базы данных при необходимости. Явное сохранение пользователем не требуется.
Совет
Смотрите список команд для списка команд, доступных в командной строке.
Палитра команд
Палитра команд (CTRL-SHIFT-P) находит по приблизительному имени то, что уже не знаешь, где искать: команду командной строки, вкладку, фильтр библиотеки или матч. Набранные буквы должны идти по порядку, не обязательно подряд, без учёта регистра и диакритики: «мтркб» находит матрицу куба, «lyon» — матчи турнира в Лионе.
Стрелки выбирают, ENTER выполняет, ESC закрывает. Команда выполняется так, как если бы её набрали; s и ss открывают командную строку, чтобы вписать в неё фильтры; фильтр запускается как двойным щелчком в библиотеке; матч открывается как двойным щелчком в панели матчей.
Когда Direction открыта, палитра добавляет турнир: игроков, столы, идущие матчи и состязания (см. быстрый поиск).