Страница 1

Шпаргалка по использованию Roswell и Qlot в Common Lisp проектах

posted on 2025-02-16

Вчера в телеграм-чате LispForever, посвященном Сommon Lisp просили подсказать, какой подход лучше использовать для запуска лиспа. Мнения разделились. Кто-то рекомендовал использовать Roswell, кто-то наоборот - был против. Я же Roswell люблю по той причине, что он позволяет легко и просто устанавливать разные реализации Common Lisp и переключаться между ними. Это особенно удобно, когда у тебя куча проектов, и каждый может использовать свою версию CL.

По той же причине, кстати, я использую и Qlot. Эта утилитка позволяет создавать виртуальное окружение для каждого проекта, и не засорять пакетами систему. Кроме того, Qlot фиксирует версии библиотек в репозитории проекта, делая сборки воспроизводимыми.

Итак, вот какими командами я обычно пользуюсь в Roswell:

# Установка лиспа
ros install sbcl-bin
ros install sbcl-bin/2.5.1
# Запуск Emacs или REPL
ros emacs
ros run
# Создание command-line утилиты и сборка ее в бинарник
ros init some-script
vim some-script.ros
ros build some-script.ros
./some-script

Ещё имеет смысл в конфиге подкрутить ограничение памяти, потому что по умолчанию оно всего 1G:

ros config set dynamic-space-size 4gb

И да. Обычно я использую не roswell сам по себе, а вместе с Qlot. Qlot позволяет ставить либы не глобально, а в директорию проекта. Как virtualenv в Python или node_modules у npm.

Так, у каждого проекта свои зависимости, а поработав с каким-то можно без проблем снести директорию .qlot.

Краткая инструкция по Qlot:

# Подключаем cutting-edge репозиторий пакетов
echo 'dist ultralisp http://dist.ultralisp.org/' >> qlfile
# Инициализируем:
qlot install
# Далее запускаем Емакс и хакаем лисп код
CL_SOURCE_REGISTRY=`pwd`/ qlot exec ros emacs
CL_SOURCE_REGISTRY=`pwd`/ qlot exec ros <любые другие команды, такие как ros build>

# Когда надо обновить зависимости (qlot фиксирует версии в `qlfile.lock`), делаем:

qlot update

Вот и всё, друзья!

Обсудить пост в Telegram канале.

Мониторинг проектов в Yandex Cloud

posted on 2025-02-16

В последнее время я стараюсь максимально стандартизировать инфраструктуру своих проектов. Особенно это касается трех вещей:

  • деплоя
  • мониторинга
  • логов

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

Сейчас же хочу немного рассказать про мониторинг.

Для мониторинга каждый проект имеет "ручку" /metrics, которая умеет отдавать данные в формате Prometheus. Раньше у меня была своя инсталляция Grafana, которая умеет забирать данные, но с недавних пор я решил что лучше буду использовать Yandex Cloud и его сервис Мониторинг. У Яндекса есть свой демон, которому в конфиге можно указать с каких урлов собирать метрики. Выглядит конфиг сервиса примерно так:

routes:
  - input:
      plugin: metrics_pull
      config:
        namespace: my-project
        url: http://localhost:10114/metrics
        # Даже без app метрик, с одного lisp процесса получается 70 метрик,
        # чтобы было дешевле, шлём их только раз в минуту.
        poll_period: 60s
        format:
          prometheus: {}
    channel:
      channel_ref:
        name: cloud_monitoring

Кладёшь его в файлик типа /etc/yandex/unified_agent/conf.d/my-project.yml и дальше демон unified-agent сам собирает метрики и отправляет их в облако. Естественно, генерацию таких конфигов я тоже собираюсь автоматизировать.

Интерфейс облачного Мониторинга достаточно интуитивен. Там можно собрать дашборд сервиса и, что самое важное, сконфигурировать алерты - и когда с сервисом происходит что-то нехорошее, прилетит уведомление на почту или в Telegram.

Для сбора метрик внутри процессов использую библиотеку prometheus.cl и несколько своих дополнений:

  • clack-prometheus – позволяет сконфигурировать /metrics эндпоинт
  • reblocks-prometheus – делает примерно то же самое для проектов использующих фреймворк Reblocks + экспортирует пару метрик, показывающих сколько сессий сервер держит в памяти и сколько страниц в этих сессиях.
  • https://github.com/40ants/prometheus-gc – собирает информацию о том сколько памяти в каком поколении garbage collector у SBCL

Системный подход к сбору метрик позволяет предоставлять надёжные сервисы клиентам. На мой взгляд это очень важно.

Пишите в комментах, если интересно узнать про подход к сбору логов или деплою сервисов.

Обсудить пост в Telegram канале.

SEO для Telegram канала

posted on 2025-02-14

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

Однако я тут задумался, как оценить эффективность привлечения новых подписчиков с помощью постов на сайте? Ведь Яндекс Метрику нельзя навесить на телеграм канал. В идеале хотелось бы построить классическую воронку конверсии заходов с поиска на сайт, переходов с сайта в телеграм канал и финальную конверсию в подписчика. И вот какие варианты я нашел.

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

Какой плюс есть у способа с созданием отдельных инвайт-ссылок:

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

Минусы:

  • Проходя по ссылке, пользователь попадет просто в канал, а не на конкретное сообщение, соответствующее посту на сайте.
  • Неизвестно получится ли автоматически вытаскивать статистику о количестве регистраций с каждой invite-ссылки.
  • Так же я не нашел информации о том, есть ли какое-то ограничение на число invite ссылок. Если есть, то бот рискует упереться в этот потолок и такой способ перестанет работать.

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

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

Обсудить пост в Telegram канале.

Теория связанности всего только лишь теория?

posted on 2025-02-12

В одном из первых постов, я писл что 40Ants это холистическое IT агенство. И я не ошибся. Сегодня я получил подтверждение того, что "всё связанно" (так кстати, и Дирк Джентли говорил).

Некоторое время назад мне в рекомендациях Яндекс Книг попалось произведение Атула Гаванде "Чек лист". На днях я закончил слушать эту аудио-книгу, и со мной начали приключаться чудеса. Буквально за один день из разных источников мне прилетела информация про чеклисты, которые люди используют для различных задач.

Первым чеклистом был чеклист по выбору парсера для сайта, упомянутый в посте из рассылки PY-CY, на которую я подписан. Пост от части про SEO, но больше про разные виды парсеров. Этой темой я понемногу интересуюсь и даже сделал фреймворк для парсинга ScrapyCL. А тут чеклист подогнали.

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

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

Удивительно так же и то, что буквально полгода назад я изучал книгу Software Requirements (Karl Wiegers and Joy Beatty). A тут вдруг снова получил информацию о том, как правильно описывать требования к ПО.

Так что, всё связанно, и никуда от этого не деться!

Обсудить пост в Telegram канале.

Как включать протухшие workflow на GitHub Actions?

posted on 2025-02-11

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

У меня довольно много проектов на GitHub и у большинства из них есть workflow, которые регулярно запускают тесты на GitHub Actions. Зачем регулярно, а не только на пулл реквест? Потому что окружающий мир меняется - выходят новые версии SBCL, библиотеки-зависимости меняются, так что даже если мой код остается неизменным, в какой-то момент он может перестать работать и чем раньше я об этом узнаю, тем проще будет починить проблему. Вот для этого раз в неделю мои тесты и запускаются.

Есть только одна проблема - если в проекте больше месяца нет коммитов, GitHub автоматически отключает workflow и тесты перестают запускаться. И даже после того, как в проекте появляется PR, надо идти и вручную включать workflow. Это бесит.

И вот я подумал, было бы классно сделать сервис, который бы автоматически включал отключившиеся workflow. Как вам такая идея?

Обсудить пост в Telegram канале.

Красота для LispWorks

posted on 2025-01-31

Красота для LispWorks

Когда я впервые увидел LispWorks IDE, она показалась мне довольно непривычной и допотопной что ли. Там нет многих привычных вещей из Emacs. Но оказывается, если приложить усилия, то можно сделать из этого IDE конфетку. Но вероятно надо быть прямо очень мотивированным к тому, чтобы писать код именно в интерфейсе LispWorks, а не подключившись к нему из Emacs.

Недавно на Reddit анонсировали библиотеку расширений для LispWorks - lw-plugins. Она добавляет сайдбар с деревом папок, кастомные иконки, фолдинг докстрингов и многое другое. На скриншоте к моему посту демо некоторых фич.

Я добавил этот проект в "lispworks" дист на Ultralisp.org и теперь расширения можно установить легко и просто с помощью Quicklisp.

Приятно, когда люди вкладывают душу в подобные проекты.

Обсудить пост в Telegram канале.

Maxima скомпилировали для запуска в браузере!

posted on 2025-01-29

Maxima скомпилировали для запуска в браузере!

Maxima это программа для работы с математическими выражениями. Примечательно то, что эта система написана на Common Lisp.

И вот недавно на Reddit появилось сообщение, что Maxima удалось скомпилировать в WebAssembley так что теперь её можно запустить прямо в браузере.

Я записал для вас небольшую гифку с демкой, а кому интересно, тот может сам потыкать в пример развернутый на сайте:

http://maxima-on-wasm.pages.dev/

Что в этой истории примечательного? То что компиляция в WebAssembly расширяет возможности использования Common Lisp. Я пока не погружался в детали того как это работает, но судя по тому, что в данном проекте использовался ECL (Embeddable Common Lisp), могу предположить, что Maxima транслировали в C, а затем уже собрали в WebAssembly.

Обсудить пост в Telegram канале.

Прототип Static Site Bot

posted on 2025-01-28

Прототип Static Site Bot

Возможно некоторые из вас помнят, как почти год назад я писал про идею сервиса, который умеет транслировать контент из телеграм канала в статический вебсайт. Если не помните, то вот ссылка: https://40ants.com/ru/posts/telegram-reposter/

Основная фишка этой идеи в том, что поисковые роботы будут хорошо индексировать статический сайт. Уже существует довольно много "виджетов" для встраивания телеграм канала в сайт, но все они не видны для поисковых роботов. А вот статические странички будут индексироваться очень хорошо, и приводить к вам в канал новых подписчиков.

И вот, не прошло и года, как я нашел время и собрал прототип. Пока что он работает только для этого канала и транслирует все посты в блог https://40ants.com/ru/posts/

Для того, чтобы превратить мой прототип в полноценный продукт, предстоит ещё много работы, а пока что буду оценивать его полезность на своем канале. Кстати, если у кого-то есть идеи, как посчитать переходы с сайта в Telegram канал, пишите в комментариях, буду рад любым советам.

Обсудить пост в Telegram канале.

Почему GC SBCL может не освобождать память?

posted on 2025-01-18

Последнее время я работаю над новой версией фреймфорка для создания Telegram ботов. Этот фреймворк использует библиотеку реализующую акторы. И нем обнаружился досадный баг, который я намеревался исправить. Однако в процессе исправления оказалось, что оно может повлиять на производительность. Хорошо что у автора отыскался benchmark с помощью которого можно проверить скорость работы актора.

К моему удивлению этому бенчмарку не хватало 4G памяти для хоть сколько-нибудь длительной работы. Более того, если бенчмарк запустить ненадолго, то оказывалось, что после его работы процесс "толстел" на 2.5G и не отпускал эту память до тех пор, пока не сделаешь вручную (sb-ext:gc :full t).

Это поведение показалось крайне странным. Как вообще можно использовать это язык в production, если он не отпускает память!?

Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.

Read more...

Matrix Badger для GitHub

posted on 2024-04-05

Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.

Read more...


Created with passion by 40Ants