shikhalev.*

Рубрикатор

Последние записи

ТехнологииПрограммированиеАбстракцииRubyДыбр

2026.01.19 • Иван Шихалев

Об инвалидацию кэша

КДПВ сгенерирована нейросетью по запросу «cache invalidation»

Как известно, в программировании есть только две реально сложные задачи: именование переменных и инвалидация кэша1. С первой мы сделать ничего не можем, со второй, конечно, тоже, но что-то делать приходится…

И вот в процессе большого рефакторинга inat-get я в очередной раз задумался. Суть тут вот в чем: данные, которые требуется получать из API iNa­tu­ra­list — очень большие (зависит от це­лей, конечно, но они могут быть очень большими), и логично их за­кэ­ши­ро­вать в локальной базе данных. Естественно, кэшированные данные нужно обновлять.

Есть прекрасный параметр updated_since в запросах к API, т.е. мы храним у себя информацию о сделанных запросах, и когда нам нужно получить новые данные по тем же условиям, указываем дату/время предыдущего запроса в этом параметре. Но полностью проблему это не решает: updated_since не отменяет (и не должен отменять) все остальные параметры запроса, т.е. те наблюдения, которые выпали из запроса, в выборку не попадут. И останутся в локальной БД в старом состоянии.

Ну, то есть, выбрали мы, например, данные по проекту, который фильтрует наблюдения с quality_grade=research, а потом пришел добрый человек и заметил, что в наблюдении культурное растение. Наблюдение выпадает из проекта, но мы об этом не можем узнать через обновление…

Какие есть пути решения? Вижу несколько вариантов, ни один из которых меня не устраивает полностью…

  1. Автор этой фразы, предположительно, Фил Карлтон (Phil Karlton), ведущий инженер компании Netscape. 


Читать далее »

iNaturalistinat-get

ЖизньДыбрПриродаФотоБёрдвотчингЖелезо

2025.12.25 • Иван Шихалев

Натурадыбр – 2025

Самец сибирской косули (Capreolus pygargus)

Что ж, год подходит к концу, я продолжаю снимать птичек на кормушке, но не думаю, что туда заявится кто-то новый и неожиданный. Так что можно подвести итоги наблюдательского года. Конечно, iNaturalist предлагает свою инфографику, но это все же сухая цифра, хоть и приятно оформленная.

Здесь я попробую изложить итоги года более субъективно и оценочно.

Количественно, как можно видеть, в этом году я снимал меньше, чем в прош­лом и позапрошлом. Так получилось, в основном, потому, что в ию­ле, августе и начале сентября я учился на водительские права (сдал), и у меня резко перестало совпадать свободное время с подходящей погодой.

Хотелось бы сказать «зато качественно…», но судя по количеству новых видов (и видов вообще), качество наблюдений осталось примерно таким же. Разве что чисто технически оно выросло, о чем ниже.

Ну и еще про количество, чтобы потом не возвращаться: в мае перешагнул отметку в 5000 наблюдений на iNa­tu­ra­list, а в сен­тяб­ре — 6000. Сейчас у меня в профиле показывается 6069 наблюдений всего и 1111 видов. Правда, если брать только наблюдения исследовательского уровня, т.е. подтвержденные, получится 4748 и 836 видов соответственно, так что тысячником называться еще не смею. Ну да ладно, новые виды пока прибавляются, так что пара-тройка лет — и за ты­ся­чу перевалю.


Читать далее »

iNaturalistзверинаблюдениянатурадыброптикапрогулкиптицыфототехника

ТехнологииПрограммированиеRubyАбстракции

2025.12.23 • Иван Шихалев

Паттерн «Фасад» и гем для DSL

Картинка для привлечения внимания

При написании inat-channel я столкнулся вот с какой проблемой: с одной стороны, более-менее сложные действия должны быть декомпозированы, то есть разбиты на модули и отдельные методы в них; с другой — глубокая декомпозиция заставляет писать длинные обращения к методам типа INat­Chan­nel::​Te­le­gram::​send_​ob­ser­va­ti­on, что неудобно, да и не эстетично. По хо­ро­ше­му вообще нужно верхний уровень методов ин­клю­дить и писать send_observation в основной программе, но если писать все как включаемые методы модулей, то во-первых, они все из всех модулей попадут в финале в одно пространство имен, а во-вторых, туда же попадут и приватные методы.

Для подобных случаев и предназначен паттерн «Фасад» — мы создаем отдельный программный модуль — в данном случае это модуль же в терминах Ruby — который содержит только нужные извне методы, делегируя их в основной нормально де­ком­по­зи­ро­ван­ный код. И затем его спокойно ин­клю­дим в ко­де основного скрипта.

Собственно, именно так я и сделал, определив модуль IC и заполняя его методами в тех же файлах, где они определены. Туда же отправились некоторые методы, не нужные вовне, а используемые слабо логически связанными модулями — здесь речь скорее не о логике и отделении фасада, а о сокращении (текстовом) кросс­мо­дуль­ных вызовов. Впрочем, по мере разрастания структуры вопрос, что считать внутренним, а что внешним, становится не очень однозначным.

Подумав немного на эту тему, я решил вынести абстракцию в код и написал is-dsl — гем, упрощающий, а главное — структурирующий делегирование методов и констант фасаду. Подробнее — в README репозитория (есть русская версия), а также в yard-документации. Здесь коротко обозначу основные особенности:

  • Помимо основного модуля фасада формируется теневой модуль — для использования внутри библиотеки. Все, что попадает в основной, попадает и в теневой, обратное неверно. См. shadow-методы.

  • Можно делегировать как статически сингл­тон-методы классов и модулей, так и лениво методы произвольных сингл­тон-объектов, где сам объект создается или получается через вызов блока. См. lazy-ме­то­ды. Предполагается применение с ме­то­дом класса instance в пер­вую очередь.


Планов менять или добавлять что-то в основную функциональность нет, думаю когда-нибудь сделать плагин для YARD, чтобы делегирование методов правильно автоматически документировалось.

DSLgemis-dslпаттерны проектирования

ЖизньПриродаWeb

2025.12.23 • Иван Шихалев

Продолжая повышать энтропию интернетов...

В порядке продолжения повышения энтропии, а также эксперимента ради, я недавно завел еще три канала в те­ле­грам с на­блю­де­ни­я­ми из iNa­tu­ra­list:

Daily Flowers of the World

Наблюдения цветов — в запросе указаны term_id и term_value_id, чтобы в выборку попадали именно наблюдения с цве­та­ми, а не во­об­ще все наблюдения цветковых растений.

Daily Birds of the World

Наблюдения птиц. Тут ничего специфического, просто каждый день разные птицы.

Daily Butterflies of the World

Наблюдения бабочек — в запросе опять же указаны term_id и term_value_id, чтобы в выборку попадали только взрослые особи, т.е. собственно бабочки, а не гусеницы, куколки или яйца.


Читать далее »

TelegramiNaturalistбабочкиптицыцветы

ТехнологииПрограммированиеWebО себе

2025.12.16 • Иван Шихалев

Пара апдейтов

inat-channel v0.9.2

Что это такое — см. пре­ды­ду­щий пост.

Помимо исправления мелкого бага (имя lock-файла по умолчанию), изменил немного ло­ги­ку — при за­про­се свежих наблюдений отсечка происходит не по да­те загрузки наблюдения, а по да­те его последнего обновления. Это позволяет попадать в выборку наблюдениям, которые долго пролежали без ис­сле­до­ва­тель­с­ко­го статуса. В це­лом это должно улучшить ситуацию с по­с­туп­ле­ни­ем наблюдений в «не­се­зон», по край­ней мере, я на это надеюсь.

При этом удаление устаревших наблюдений из пу­ла по преж­не­му контролируется по да­те загрузки наблюдения.

jekyll-is-announcer v0.8.3

Опять же, о нем я уже писал. Впрочем, детали и концепция, чую, будут еще меняться и меняться…

А сейчас поменял кнопку перехода в ка­нал на виджет от те­ле­гра­ма с ком­мен­та­ри­я­ми. Что характерно, когда я делал кнопку, я ведь спрашивал у двух нейросетей, существует ли такой виджет… Но, видимо, как-то неправильно сформулировал и заузил область поиска1. А потом почти случайно сам наткнулся.

Что-то широкий и разнородный плагин получается… Пока не могу сообразить, как его окончательно заархитектурить — кноп­ки-то мож­но бы делать к разным сервисам легко, а вот встраиваемые виджеты — уже сложнее. Буду думать дальше. Раскидывать же его на несколько плагинов по отдельным сервисам не хочется, чтобы не плодить массу отдельных вспомогательных JSON-файликов.

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

Jekyll ISTelegramiNaturalistinat-channeljekyll-is-announcerкомментарии

ТехнологииПрограммированиеRubyWebПриродаОбщество

2025.12.12 • Иван Шихалев

iNaturalist + Telegram

Анонс

Написал скрипт для автопостинга выборок из iNaturalist в tg-каналы. Скрипт делает выборку по произвольно сконфигурированным параметрам (которые, разумеется, должны поддерживаться iNaturalist API), затем берет случайное наблюдение, постит его, а остальные складывает в пул, который будет задействован, если свежие кончатся. Это если коротко.

Более подробно, как это все работает, а главное — как настраивается, я описал в README проекта inat-get/inat-channel. В том числе и на русском. Здесь пара моментов:

  • Наблюдения не дублируются.

  • Можно включить режим, когда и таксоны не будут дублироваться, с ограниченным, правда, сроком. Но его можно выставить произвольно большим.

  • Форматирование делается ERB-шаблоном, т.е. максимально гибко.

  • Скрипт прекрасно работает на GitHub Actions, запускаясь по расписанию. Для контроля неповторямости необходимо настроить обратный пуш, чтобы данные, которые хранятся в JSON-файлах, сохранялись в репозитории между сеансами.

  • Используется iNaturalist API v2, которое находится в ранней бете и может поломаться. Однако, на первой версии пришлось бы вытягивать в десятки, если не в сотни раз бо́льшие объемы данных, что малоприемлемо.

Примеры

На реальных примерах работу скрипта можно посмотреть на двух моих каналах:

Подписывайтесь, ставьте лайки, комментируйте… Отелеграмливайте свои проекты. В общем, велкам.


Читать далее »

TelegramiNaturalistinat-channelавтоматизация

ТехнологииПрограммированиеWebО себе

2025.11.29 • Иван Шихалев

Анонсер — техническая сторона

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

Что ж, причесал Actions, отладил это хозяйство до более-менее стабильного со­сто­я­ния — хоть и далекого от завершения, но уже приемлемого для описания. Принципиальных изменений в ближайших версиях, скорее всего, не будет, а о плановых доделках я здесь еще скажу.

Задача

Собственно, основная задача стояла в следующем:

  • Отправлять анонсы (пока только в телеграм-канал) новых постов;

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

Уже по ходу дела решил добавить в Actions отправку уведомлений себе о выполненных операциях.


Читать далее »

GitHubGitHub ActionsJekyllJekyll ISTelegramпланысайт

О себеТехнологииWebДыбр

2025.11.26 • Иван Шихалев

Телеграм-канал сайта

Картинка для привлечения внимания

Завел себе (точнее, этому сайту) канал в те­ле­ге — https://t.me/shikhalev_blog.

  • Во-пер­вых, для анонсов новых постов (даже заморочился и автоматизировал анонсирование на GitHub Actions).

  • Во-вторых, для комментариев, а то, похоже, аккаунт на GitHub мало у ко­го есть… Хотя, может, просто обсуждать нечего.

  • Ну, и в-третьих, там можно донатить «звездами». Впрочем, тут я иллюзий не питаю.

Кнопка для перехода в канал в постах выглядит корявенько, но я сейчас не хо­чу заморачиваться с частностями дизайна, поскольку планирую большой рефакторинг в относительно скором времени (весной).

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

Что касается технической стороны вопроса: плагин для Jekyll можно посмотреть на GitHub — jekyll-is/jekyll-is-announcer, а его использование — в каталоге .github/workflows репозитория сайта. Думаю, еще написать об этом подробнее, но перед этим выделить основные действия из workflow в отдельные ac­ti­on-ре­по­зи­то­рии — тогда можно будет поговорить на этом примере и об устройстве GitHub Actions в целом.

GitHubGitHub ActionsJekyllJekyll ISTelegramпланысайт

ТехнологииПрограммированиеЖизньОбществоПсихологияМышление

2025.11.21 • Иван Шихалев

Заметки об LLM и нейросетях вообще

Автоматически сгенерированная картинка

За последнее время (особенно последний год) мне довелось довольно активно поработать с боль­ши­ми языковыми моделями (LLM), которые сейчас модно называть искусственным интеллектом. Захотелось кое-что сформулировать и подытожить.

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

Кстати, КДПВ сгененирована по тому же промпту, что и в тех старых постах — «deep learned girl in fantasy style». Пожалуй, это будет моя новая традиция для постов на подобные темы. В кон­це концов, не ис­кус­ст­вен­ный же интеллект ри­со­вать — его никто не видел.

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


Читать далее »

ChatGPTGrokPerplexityИИискусственный интеллектнейросети

ТехнологииСофтГрафикаФотоОбработка

2025.10.26 • Иван Шихалев

Первая глава «Практического руководства...»

Картинка для привлечения внимания

Выложил первую главу «Практического руководства по darktable» — «Базовая обработка».

Вместе с «Введением» первая глава должна дать полноценный быстрый старт — основные вещи, которые необходимы, чтобы начать уже делать что-то полезное.

Описаны действия и модули для:

  • Выставления баланса белого;

  • Исправления оптических искажений и шумоподавления;

  • Кадрирования и изменения геометрии;

  • Работы с общим контрастом и экспозицией, вытягивания теней;

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


Огроменный вышел справочный раздел, подумываю о том, чтобы вынести переводы справки отдельно от глав все-таки… Но пока не уверен.

По прежнему жду замечаний и вопросов.

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

DarktableLinuxRAW

ТехнологииСофтГрафикаФотоОбработка

2025.10.05 • Иван Шихалев

Этим стулом...

Картинка для привлечения внимания

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

Это всё пока черновик, который будет правиться и дорабатываться, поэтому замечания и вопросы крайне приветствуются.


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

На данный момент справочная часть — это ИИ-перевод, тогда как практическая — оригинальный текст (писать не-перевод посредством ИИ оказалось практически невозможно, т.е. писать промпт куда сложнее и дольше, чем сам текст… это отдельная интересная тема, надо будет пост написать). По ходу дела буду и справочную часть активно редактировать, чтобы привести язык в порядок и единообразие.


Вообще, конечно, задумка масштабная, писать буду долго, тем более, что не могу этому посвятить все свое время… Но надеюсь где-то за полгода-год закончить. И опять же, рассчитываю на фидбэк по ходу дела, чтобы ничего не забыть и не схалтурить.

DarktableLinuxRAW

ФотоБёрдвотчингТехнологииЖелезоДыбр

2025.06.19 • Иван Шихалев

Объектив Sigma 60-600mm

Приобрел себе в апреле сабж. Сейчас уже довольно много на него поснимал и можно начинать рефлексировать…

Итак, объектив Sigma AF 60-600mm f/4.5-6.3 DG OS HSM Sports с байонетом Canon EF (напомню, что тушка у меня Canon EOS 77D). Думаю, понятно, что главный критерием покупки было фокусное расстояние на длинном конце — 600mm, что в два раза длиннее моего старого любимого объектива Sigma 18-300mm. Те, кто снимал когда-нибудь птиц в дикой природе, думаю, понимают, какое преимущество это дает.

Это не единственный вариант с таким фокусным на дальнем конце, поэтому стоит, наверное, прояснить выбор.

Альтернативы и выбор

Поскольку менять систему в мои планы не входило (и в ближайшее время не входит), выбор ограничен системой Canon EF. Какие варианты тут доступны?

В общем, реально я рассматривал объективы 150-600mm от Tamron и Sigma1, которые дешевле и, что важно, ощутимо легче2, чем 60-600… Оба варианта неплохи, но дело в том, что я снимаю далеко не только птичек, и такая разница на коротком конце (60mm vs 150mm) для меня существенна — можно снять, например, небольшой кустик целиком, отступив на два-три шага, а не на десять. Ну а менять объектив на ходу (и вообще «в поле») — дело крайне неблагодарное. Финальным аргументом стало то, что у 60-600 на фокусном 200mm МДФ позволяет максимальное увеличение 1:3.3 (у Sigma 150-600mm — 1:4.9, у Tamron 150-600mm — 1:3.9, а у вышеупомянутого 18-300, для сравнения — 1:3). В общем, сабж позволяет снимать достаточно крупно цветы и насекомых, тогда как альтернативы в этом отношении сильно хуже.

Так или иначе, свой выбор я сделал, но хочу отметить, что это именно мой выбор, под мои задачи и привычки. Надеюсь, кстати, на днях записать свои размышления на тему собственно моих прогулок со съемками… Перейдем к впечатлениям от реального использования.

  1. Если сравнивать именно объективы 150-600mm, то судя как по характеристикам, так и по отзывам, Tamron предпочтительнее, но тут я ничего от себя сказать не могу — не пробовал. Более того, я вообще не держал в руках никаких объективов Tamron и питаю к ним некоторую настороженность, в отличие от Sigma… 

  2. Легче — не значит легкие: оба чуть-чуть больше 2 кг, тогда как 60-600 — 2.7 кг. 


Читать далее »

SigmaSigma AF 60-600mm f/4.5-6.3 DG OS HSM SportsiNaturalistобъективтелеобъектив