shikhalev.*

Рубрикатор

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

ТехнологииПрограммирование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.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планысайт

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

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

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

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

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

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

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

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


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

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

ТехнологииПрограммированиеRubyБёрдвотчингПрирода

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

INat::Get — ранняя альфа

Скриншот репозитория

— Я зделяль. ©

Итак, прошу любить и жаловать — INat::Get — софтина для по­лу­че­ния и обработки данных с iNaturalist. Основное изначальное пред­наз­на­че­ние — подбивать всякую статистику для про­ек­тов на том же iNaturalist’е, но варианты использования гораздо шире.

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

Зачем?

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


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

iNaturalist

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

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

Паникуем иначе

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

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

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

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


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

ChatGPTTDDИИавтопилотбудущееискусственный интеллектнейросетипоискпреступностьспам

ТехнологииПрограммированиеЖизньМышление

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

Отставить панику...

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

С вы­хо­дом ChatGPT как-то внезапно обострились апокалиптические настроения в ду­хе: заменит программистов, оставит нас всех без ра­бо­ты, и прочее «мы все умрем». По­след­нее, конечно, верно, но не ново.

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

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

И да, КДПВ сгенерирована нейросетью по запросу «deep learned girl in fantasy style».


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

ChatGPTИИбудущееискусственный интеллектнейросети

ТехнологииПрограммированиеСофт

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

xbash

Скриншот командной строки с xbash

Давно собирался и таки стартанул пет-проект — https://github.com/shikhalev/xbash.

Навеяно gitsh, который я когда-то активно использовал, но у него были проблемы с русской локалью, новыми версиями Git и так далее. При этом, на мой взгляд, gitsh сильно переусложнен, да и использование Ruby, при всей моей любви к этому языку, тут лишнее. Посему я решил сделать что-то подобное, но попроще, на чистом bash, и более универсальное.

Что делает?

Итак, что этот скрипт (набор скриптов) делает?

  1. Позволяет использовать субкоманды того же git, как непосредственные команды. Помимо git, так же можно коротким образом вводить субкоманды cargo1.

  2. Отображает в приглашении командной строки репозиторий, ветку, путь внутри репозитория и значок статуса (звездочка разных цветов на данный момент). Кроме того, вместо имени локального пользователя показывается e-mail пользователя, под которым идет запись в репозиторий2.

  3. Другие системы управления версиями, сборки и управления зависимостями могут быть добавлены просто и единообразно. Для Mer­cu­ri­al и Ruby­gems планирую сделать, как только руки дойдут.

Стадия разработки пока самая ранняя (хотя я уже пользуюсь и отлаживаю «наживую»), поэтому инсталлятора нет, есть инструкция по ус­та­нов­ке в фай­ле README.md.

  1. Если кто не знает, cargo — это система сборки и управления зависимостями языка Rust. 

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


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

Linuxbashcargogitxbashкомандная строкапрограммированиепроекты

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

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

Отчет о рефакторинге

Скриншот с [официального сайта Jekyll](https://jekyllrb.com/)
Скриншот с официального сайта Jekyll

Итак, я таки отрефакторил и обновил данный сайт. Почему нельзя было сразу делать правильно? Ну, в основном потому, что я впервые имел дело с Jekyll, изрядно подзабыл (а что-то и не знал) базовые приемы верстки… И так далее, и тому подобное.

Вторая (в моем случае) причина — это то, что, как это часто бывает, представление о желаемом результате уточнялось и формировалось в процессе достижения результата просто работающего. Соответственно, решение «исторически сложилось», если вы понимаете, о чем я. Любой проект ставит разработчика перед выбором: или бесконечное (и потому бесплодное) делание «как надо», или движение к идеалу через неидеальные, зато рабочие, варианты, которые, впрочем, без регулярного рефакторинга быстро становятся неулучшаемым и иногда не совсем рабочим болотом.

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


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

CSSFont AwesomeGitHubGoogle FontsGoogle MapsHTMLJavaScriptJekyllLiquidPNGSASSSCSSSVGaspect-ratiodisplayflexgridkramdownmarkdownshikhalev.orgstickyблогивеб-шрифтыверсткаграблииконкимедиа-селекторыпробелырефакторингсайтыстатическая генерацияшрифты