shikhalev.*

Что ж… Вот я и за­ре­ли­зил 🌿 iNatGet v0.9. Через два с небольшим года после v0.8, и через примерно год после последней вер­сии — v0.8.0.16. Обо всех этих минорных корректирующих версиях я ничего не писал, главным образом потому, что там мучительно правились мелкие баги, а нормальная работа требовала глобального рефакторинга (т.е. переписать заново с нуля), на который никак не находилось времени.

Однако все это время я не прекращал пользоваться своей программой, регулярно формируя отчеты для своих проектов1 на iNa­tu­ra­list. Таким образом я постепенно уточнял свое понимание того, как это в принципе должно работать и где у меня провалы в архитектуре. Плюс развитие ней­ро­се­тей… В проекте ни строчки сгенерированного кода, но для консультаций и ревью я пользовался различными LLM очень активно2, что и позволило сравнительно быстро написать новую, полностью переделанную, версию.

Если версии v0.8.x я характеризовал как альфа-версии, то ветка v0.9.x пусть будет бетой, но пока — очень ранней бетой

Коротко о том, что это за проект вообще, можно прочитать в README-ru.md в репозитории.

Что нового?

Важно: никакой совместимости со старыми версиями нет. Ни старые скрипты, ни старая БД кэша, с новой версией работать не будут. И до полноценного релиза — версии 1.0 — совместимости обещать не могу. Впрочем, механизм миграций внедрен и настроен, так что по возможности данные таки будут сохраняться.

Точнее, что принципиально нового для пользователя? Что из внутреннего устройства влияет на работу с программой?

  • Многозадачность на основе дочерних процессов (через fork), а не потоков. Все-таки GIL в Ruby никто не отменял, и потоки существенно друг другу мешают.

    Кстати, сначала я попытался использовать новомодные Ractor‘ы, но увы — с боль­шин­с­т­вом имеющихся библиотек, в част­нос­ти — Sequel, они работать пока не могут, поскольку в принципе запрещают общие данные, тогда как классический запуск под­про­цес­сов через fork их клонирует (там есть нюансы, которые приходится учитывать, но работать можно).

    Важно: межпроцессное взаимодействие делается через unix-сокеты. Под виндой ничего работать не будет, во всяком случае, без WSL.

  • Более-менее нормально перенесена работа с данными на уровень БД, без загрузки больших объемов в память.

  • Отказался от настраиваемых режимов кэширования/обновления. Впрочем, они все равно не работали… Сейчас остался только обычный режим и off­li­ne — во втором случае не делаются никакие обращения к API. Кэширование теперь работает только так, как задумано, зато работает.

    Вообще, параметров командной строки стало меньше, настройки остались только в конфиге. Зато в командной строке есть ключ выбора конфига.

    По конфигу нужно писать отдельную доку. К релизу (т.е. к 1.0) обязательно будет.

  • Потенциально все должно работать с разными СУБД. Но пока не тестировалось3.

  • DSL тоже поменялся. См. его описание в репозитории в DSL-ru.md.

  • Пока нет средств формирования отчетов и таблиц в них.

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

  • Ну и наконец, репозиторий переехал с моего личного аккаунта в одноименную «организацию». По сути это ничего не меняет, но мне так удобнее — сгруппировать этот проект и все, с ним связанные, в одном месте.

Что дальше?

Отчасти ближайшие планы уже расписаны по задачам и майлстоунам версий, см. Milestones на гитхабе.

Если коротко, то основных направлений три:

  • Доработка кэширования,

  • Разработка системы мультиформатных отчетов,

  • Добавление графики и карт.

И, конечно, документация.

Сроки, естественно, совершенно неопределенные — мне за эту разработку никто не платит, и все делается в свободное время. В майлстоунах какие-то даты прописаны, но это так — чисто ориентировочно, чтобы они в правильном порядке выстраивались.

На полях…

Наверное, стоит написать отдельные посты о разных нюансах, с которыми пришлось столкнуться в процессе разработки… И в пер­вую очередь — о плюсах, минусах и сложностях Sequel — это очень мощный инструмент, но местами без подсказок LLM мне бы пришлось туго.

А кроме того, я впервые за долгое время снова всерьез погрузился в Ruby, и там обнаружилось много нового и вкусного. В частности, мне понравилось, как работает JIT — выигрыш вполне ощутимый во многих случаях.

Надеюсь, напишу…

  1. См. журналы проекта «Биоразнообразие районов Свердловской области» и его дочерних. 

  2. О своем отношении и подходе к использованию нейросетей я подробно писал в посте: «Заметки об LLM и нейросетях вообще»

  3. Тестирование на разных СУБД и сравнение их работы запланировано на версию 0.9.4 — там вообще итерация задумана как тестирующая и корректирующая.