

[{"date":"2025-10-05T20:00:00+03:00","description":"Инструмент для раскачки вдохновения случайными словами. Вдохновлено [Уличной поэзией](https://t.me/matvey_matyushkin).\n\nЭкспортировано из моей коллекции прототипов [biozz/wow](https://github.com/biozz/wow/tree/main/t9-poetry).\n","project_url":"/apps/t9-poetry","slug":"t9-poetry","summary":"Поэтический костыль","tags":["open source","solidjs"],"title":"t9-poetry"},{"date":"2024-02-22T20:25:28+03:00","description":"Я хотел написать об этом шаблоне уже давно, потому что он использовался для моих [#wow-проектов](/tags/wow) ([groceries](/projects/wow_groceries), [debt](/projects/wow_debt), [lately](/projects/wow_lately) и [secret](/projects/wow_secret) на момент написания этой статьи).\n\nПрежде всего, это шаблон [Cookicutter](https://github.com/cookiecutter/cookiecutter), который позволяет мне стартовать новые проекты с минимальными усилиями. Я знаю, что некоторые предпочитают `go gen`, когда работают в экосистеме Go, но поскольку я пришел из мира Python, я привык к Cookicutter. Честно говоря, Cookiecutter не зависит от языка и работает отлично.\n\nЭтот шаблон сгенерирует Go-проект, который структурирован в основном в соответствии с [golang-standards/project-layout](https://github.com/golang-standards/project-layout). Есть пакет `cmd`, который использует [urfave/cli](https://github.com/urfave/cli). Одна из команд всегда `server`, потому что этот шаблон предназначен для веб-приложений. Другие команды обычно создаются в соответствии с конкретными потребностями приложения. Это может быть импорт данных или бот.\n\nКоманда `server` использует переменные окружения для настройки. В целом, я предпочитаю использовать переменные окружения как можно чаще. Я думал добавить умную конфигурацию, которая может загружаться из YAML, TOML, переменных среды и аргументов командной строки, но это было слишком сложной задачей для меня, и я решил придерживаться подхода с одним источником.\n\nГоворя о задачах, я использую [Taskfile](https://taskfile.dev/) вместо `Makefile`, потому что мне нравится, как можно запустить сервер и сделать так, чтобы Taskfile следил за изменениями без установки дополнительных инструментов. Мне также нравится запускать процессы фронтенда и бэкенда [параллельно](https://taskfile.dev/usage/#task-dependencies), Taskfile позволяет это делать без проблем.\n\nЯ упомянул фронтенд, давайте поговорим о нем. Он находится в папке `web`, которая представляет собой пакет Go, в который встраивается сгенерированный бандл. Я не беспокоюсь о коммите файлов бандла в репозиторий, и это облегчает мне жизнь при деплое.\n\nСам фронтенд сделан с помощью [SolidJS](https://www.solidjs.com/) с [Solid Router](https://github.com/solidjs/solid-router), потому что мне нравится, что это в основном чистый TypeScript с небольшим количеством TSX. Никакого специального синтаксиса (как в Svelte), никаких странных тегов не по стандарту HTML5 (как `className` в React), только базовые примитивы и очень интуитивно понятный для бэкенд-разработчиков вроде меня.\n\nФронтенд приложения оформлен с помощью [TailwindCSS](https://tailwindcss.com/), так как я нахожу его очень простым в использовании и, опять же, довольно интуитивным. Возможно, в какой-то момент я перейду на [UnoCSS](https://unocss.dev/), потому что он полностью совместим с TailwindCSS и использует меньше файлов для настройки.\n\nОдин из вариантов, к которому я склоняюсь, когда пробую что-то новое, - это [HTMX](https://htmx.org/). Я еще не придумал, как заставить мой Cookiecutter генерировать различные структуры файлов и папок по условию, так что, возможно, в будущем я создам отдельный вариант шаблона.\n\nИ последнее, но не менее важное: у меня есть базовая конфигурация для взаимодействия с [Centrifugo](https://centrifugal.dev/). Раньше у меня был свой собственный WebSocket-сервер, основанный на [olahol/melody](https://github.com/olahol/melody), но я быстро понял, что мне нужно что-то более надежное с предопределенными механизмами аутентификации и способами передачи сообщений с использованием различных правил. В общем, я хотел что-то вроде [SocketIO](https://socket.io/), который я по какой-то причине не использовал, но, возможно, попробую когда-нибудь в будущем, потому что есть [googollee/go-socket.io](https://github.com/googollee/go-socket.io), который, кажется, подходит для этого.\n\n---\n\n*Если вы смогли дочитать до конца, я советую вам попробовать [PocketBase](https://pocketbase.io/), прежде чем рассматривать мой шаблон, потому что они в основном достигли того, что я пытался сделать, и превзошли меня в некоторых аспектах (например, красивый интерфейс администратора).*\n","project_url":"https://github.com/biozz/cookiecutter-biozz-project","slug":"cookiecutter-biozz-project","summary":"A template for the #wow projects","tags":["dev","wow","go","solidjs"],"title":"cookiecutter-biozz-project"},{"date":"2023-10-27T10:51:17+03:00","description":"I was inspired by the amazing Mac app [Boop](https://boop.okat.best/) and decided to make a NeoVim alternative.\n\nThis plugin is a result of my attempts and it works really good. It uses [Telescope](https://github.com/nvim-telescope/telescope.nvim) or `vim.ui.select()` to pick commands. Then it uses entire buffer content as an input to the chosen command. After running the command, the buffer content is replaced with the result of the command.\n\nThere was also an [announcement](https://www.reddit.com/r/neovim/comments/17g8twk/whopnvim_whop_your_text_snippets_with_custom/) on Reddit, which gave a me a few ideas to improve the plugin.\n","project_url":"https://github.com/biozz/whop.nvim","slug":"whop.nvim","summary":"Whop your snippets with custom commands","tags":["open source","neovim"],"title":"whop.nvim"},{"date":"2023-09-10T10:00:00-05:00","description":"Full   summary and technical details are available on GitHub. Here are the main features:\n\n- written in Go\n- self-contained binary (except the database, if used), no need for `cgo`\n- can be used with SQLite, including in-memory setup (use `DB_DSN=:memory:`)\n- can (probably) be used witn PostgreSQL, which is supported, but wasn't tested (please open a PR if you find a bug)\n- uses [htmx](https://htmx.org/) and [TailwindCSS](https://tailwindcss.com/)\n- syntax highlighting using [chroma](https://github.com/alecthomas/chroma) (the same one used in Hugo)\n- resulting pastes can be suffixed with the extension (`.md`, `.py`, etc.) and highlighted accordingly\n- the contents are selectable with `Ctrl+A` and line-numbers will not be copied (see tips \u0026 tricks if you are using Firefox)\n\nLive version hosted by me - https://pb.biozz.dev.\n","project_url":"https://github.com/biozz/paste","slug":"paste","summary":"Yet another paste bin","tags":["open source","go"],"title":"paste"},{"date":"2023-08-01T22:00:00-05:00","description":"Как-то раз мы с друзьями ехали по дороге из Рыбинска в Ярославль и увидели на поворте на дорогу в Большое село невероятно дурацкого, даже ублюдочного, медведя. Это кстати первый пост в [@stupidbears](https://t.me/stupidbears). \n\nКогда мы обсуждали этого мишку, я вспомнил про канал [@stupidlion](https://t.me/stupidlion) (Дурацкие львы) и одно сложилось с другим.\n\nЕсли коротко описать проект, то я бы сказал, что это Telegram-канал про то, как люди, не всегда удачно, изображают медведей. \n\n[@stupidbears_bot](https://t.me/stupidbears_bot) - бот предложки, который я написал за 30 минут с помощью [n8n](https://n8n.io/), это было просто и увлекательно, рекомендую.\n","project_url":"https://t.me/stupidbears","slug":"stupid-bears","summary":"Как \"Дурацкие львы\", только про медведей","tags":["fun"],"title":"Дурацкие медведи"},{"date":"2023-07-02T00:00:00+00:00","description":"Спустя почти 3 года после [Ansible #1 - Подготовка](/blog/ansible-1) я вернулся к теме простого туториала по Ansible и дописать остальные части. А начал, как обычно, не с контента, а с инфраструктуры. Потому как новость, про то что [mdBook](https://rust-lang.github.io/mdBook/) трендится на HackerNews стала поводом заценить новую тулзу. Заодно и камень с плеч, что практически дописанный туториал пылится в заметках.\n\nЕще одним поводом было наше обсуждение с [Ваней Черновым](https://vanadium23.me/) в подкасте [Два Ивана](https://doubleivan.ru/) в выпуске [№7 Deploy](https://doubleivan.ru/podcasts/2023_05_26_0007_deploy/). \n","project_url":"https://ansible.biozz.dev/","slug":"ansible-tutorial","summary":"Онлайн книга, рассказывающая про основы Ansible","tags":["open source","ansible"],"title":"Ansible для начинающих"},{"date":"2023-06-23T15:00:00-05:00","description":"Вместе с [Иваном Черновым](https://vanadium23.me) разговариваем про Python и IT.\n","project_url":"https://doubleivan.ru/","slug":"doubleivan.ru","summary":"Подкаст Два Ивана (название обсуждается)","tags":["site","hugo","ru"],"title":"doubleivan.ru"},{"date":"2023-03-02T22:00:00-05:00","description":"When I found [this](https://gist.github.com/leucos/a9f42e111a8cfc2ebf6e) pre-commit script, I immediately thought, that it was too inconvenient to use.\n\nSo I decided to reimplement it using [pre-commit.com](https://pre-commit.com).\n\nHopefully it will be useful for the community. And I will probably add more pre-commit hooks, like [ansible-lint](https://github.com/ansible/ansible-lint).\n","project_url":"https://github.com/biozz/ansible-pre-commit-hooks","slug":"ansible-pre-commit-hooks","summary":"A collection of pre-commit hooks for ansible projects","tags":["open source","ansible"],"title":"ansible-pre-commit-hooks"},{"date":"2023-01-08T10:00:00-05:00","description":"Идеи из блога про [Last Time I](/blog/last-time-i/) наконец-то воплощаются в жизнь.\nНеосознанно я сделал большую часть того что придумал тогда и даже где-то улучшил.\n","project_url":"/apps/lately","slug":"lately","summary":"Утилита для отслеживания того, что я недавно делал","tags":["closed source","wow","go"],"title":"lately"},{"date":"2023-01-08T10:00:00-05:00","description":"Вариация на сервис [umputun/secrets](https://github.com/umputun/secrets). Только вместо pin-кода генерируется TOTP.\n\nИзначально хотел поиграться с TOTP и не знал где применить. Потом услышал в подкасте Радио-Т про secrets и одно сошлось с другим.\n\nЧтобы делать проверку TOTP приходится хранить его ключ. То есть теоретически, если база слита, то можно будет получить доступ к пин-кодам.\nНо шифрование происходит по секретному ключу, а данные хранятся в зашифрованном виде.\nА значит придется сломать вообще все. Сценарий маловероятный, там уж ничего не скроешь.\n","project_url":"https://secret.biozz.dev","slug":"secret","summary":"Инструмент для передачи секретных данных с TOTP кодами","tags":["closed source","wow","go"],"title":"secret"},{"date":"2022-12-23T22:00:00-05:00","description":"На одном из хакатонов в Островке участвовал в качестве разработчика для этой идеи. Сначала написал на django, прототип был готов где-то за 6 часов. И я совсем не кайфанул от того что использую одни и те же технологии. Поэтому решил выйти из зоны комфорта и написать на Go и SolidJS. В итоге переписал за следующий день.\n\nТакже на этом хакатоне познакомился с fly.io. Оказалось, что это довольно удобная платформа. Интересный факт: они простили мне $0.01, которые я случайно потратил, когда забыл удалить старый инстанс с джангой.\n\nУдалять проект не собираюсь, поэтому велики шансы, что он все еще онлайн. Рекомендую попробовать, отели там в конце реальные и их можно забронировать.\n","project_url":"https://hotel-mamba.fly.dev","slug":"hotel-mamba","summary":"Свайпаешь мемы и подбираешь отель","tags":["closed source","go","work","hackathon"],"title":"hotel-mamba"},{"date":"2022-11-30T22:00:00-05:00","description":"Как-то раз я забыл сколько должен был одному человеку и нужно было еще раз взять у него в долг. \"В этот раз точно не забуду\" сказал я. И написал вот такую утилиту.\n\nИстория такая же, как и с другими проектами под тегом [wow](/tags/wow): бекенд на go, бд postgres, на фронте solidjs.\n","project_url":"/apps/debt","slug":"debt","summary":"Утилита для отслеживания выплаченных долгов","tags":["closed source","wow","go","solidjs"],"title":"debt"},{"date":"2022-11-04T22:00:00-05:00","description":"Реинкарнация лучшего todo-приложения [biozz/groceries](https://github.com/biozz/groceries).\n\n\u003e - web app only (for now)\n\u003e - unlimited number of tasks (hi, Todoist)\n\u003e - free and the only costs are my self managed server and the domain (hi any-todo-app-on-the-AppStore)\n\u003e - dead-simple storage setup (you can use any redis-compatible solution, like Redis itself or Bitcask)\n\u003e - dead-simple interface, even my mom can use it (hi, Taskwarrior)\n\u003e - does not want to be a note taking app or something more than a todo list (hi, Notion, Joplin, NextCloud, etc.)\n\u003e - does not pretend to solve your todo needs, your milage may vary, it just works for my family\n\u003e - painless grouping by category, no messing around with sub tasks (hi, Reminders)\n\u003e - predictable live updates via WebSockets (oh, hi again, Reminders)\n\u003e - just a single binary for any server platform with embedded static files (thank you, Go)\n\nИз оригинальных идей сохранилось все, кроме хранилища и того, как устроен бекенд. Все-таки я вернулся к PostgreSQL. Была даже версия на MongoDB, но моей машинке за 5 евро всего 2гб памяти, а хочется захостить как можно больше всего. Теперь это этакий гибрид постгри и монги, где данные хранятся в jsonb полях. Как собственно и все остальные под тегом `wow`.\n\nБекенд и как устроено API я пока что открывать не хочу, поэтому можете насладиться фронтовой версией проекта по ссылке выше.\n","project_url":"/apps/groceries","slug":"groceries","summary":"Список покупок, в котором нет ничего лишнего","tags":["closed source","wow","go"],"title":"groceries"},{"date":"2022-02-23T22:00:00-05:00","description":"Я постоянно экспериментирую со своими заметками и как-то размышлял над тем, чтобы вести в них и ежедневные задачи.\n\nДолго смотрел на разные открытые форматы для задач и утилиты и остановился на [Todo.txt](http://todotxt.org/).\n\nТак совпало, что в это время я увлекся компиляторами и генераторами парсеров, в частности [Tree-Sitter](https://tree-sitter.github.io/tree-sitter/).\n\nЧтобы попрактиковаться в использовании tree-sitter я описал грамматику Todo.txt. И даже какое-то время использовал в своем конфиге NeoVim.\n","project_url":"https://github.com/biozz/tree-sitter-todotxt","slug":"tree-sitter-todotxt","summary":"Грамматика Todo.txt для tree-sitter","tags":["open source"],"title":"tree-sitter-todotxt"},{"date":"2021-11-03T22:00:00-05:00","description":"","project_url":"https://github.com/biozz/postgredis","slug":"postgredis","summary":"Redis-сервер, только под капотом PostgreSQL","tags":["open source","go"],"title":"postgredis"},{"date":"2021-09-14T22:00:00-05:00","description":"","project_url":"https://github.com/biozz/ringss","slug":"ringss","summary":"Telegram-бот для оповещений из Miniflux","tags":["open source","rss","bot","go"],"title":"ringss"},{"date":"2021-07-11T20:00:00-05:00","description":"","project_url":"https://github.com/biozz/mqtt2timescaledb","slug":"mqtt2timescaledb","summary":"Скрипт для чтения из MQTT и записи в TimescaleDB","tags":["open source","go"],"title":"mqtt2timescaledb"},{"date":"2021-07-05T20:00:00-05:00","description":"","project_url":"https://github.com/biozz/wrss","slug":"wrss","summary":"Делает RSS-фид из прогноза погоды","tags":["open source","go","rss"],"title":"wrss"},{"date":"2021-07-01T22:00:00-05:00","description":"Как-то так вышло, что я узнал о [Taskfile](https://taskfile.dev/#/) и новом релизе [Sublime Text](https://www.sublimetext.com/) примерно в одно время. Я временно пересел на ST4 и думал как бы мне запускать задачки из Taskfile, не выходя из редактора. И такого пакета не оказалось в [Package Control](https://packagecontrol.io/). И я решил написать свой плагин для Taskfile. \n\nБыло удивительно, как хорошо продумана инфраструктура плагинов в ST. API удобные, сообщество довольно активное и поддерживающее.\n","project_url":"https://packagecontrol.io/packages/Taskfile","slug":"sublime-taskfile","summary":"Плагин Sublime Text 4 для запуска задач из Taskfile.","tags":["open source"],"title":"sublime-taskfile"},{"date":"2021-06-29T22:00:00-05:00","description":"","project_url":"https://github.com/biozz/speedtest-go-prometheus","slug":"speedtest-go-prometheus","summary":"Утилита для проверки скорости интеренета","tags":["open source","go"],"title":"speedtest-go-prometheus"},{"date":"2021-01-05T20:00:00-05:00","description":"Не помню кто вдхоновил на эту тему, но был момент, когда я учился сам делать графики активности в других проектах.\nИ эти графики начали выглядеть как пиксель-арт. А что если на этих графиках рисовать что-то с помощью данных?\n\nВ этом проекте сделан proof-of-concept, таким образом, что если в какой-то день сделать много коммитов, а в какой-то нет, то на графике активности появится желаемый рисунок.\n\nПока делал это, обнаружил, что GitHub прикрыл эту тему и по сути скрипт не сработает.\n\nЕсли очень хочется испытать, то можно найти кучу реально работающих альтернатив.\n","project_url":"https://github.com/biozz/activity-art","slug":"activity_art","summary":"Рисование на графике активности GitHub","tags":["open source","python"],"title":"activity-art"},{"date":"2021-01-04T20:00:00-05:00","description":"","project_url":"https://github.com/biozz/plants","slug":"plants","summary":"База знаний про растения","tags":["open source","python","django"],"title":"plants"},{"date":"2021-01-01T20:00:00-05:00","description":"","project_url":"https://github.com/biozz/vim-notes","slug":"vim-notes","summary":"Консервативный способ вести заметки с помощью vim","tags":["open source","vim"],"title":"vim-notes"},{"date":"2020-07-28T00:00:00-00:00","description":"Сайт для Федерации парусного спорта Ярославской области","project_url":"https://fps-yar.ru","slug":"fps-yar.ru","tags":["site","wordpress"],"title":"fps-yar.ru"},{"date":"2020-06-10T00:00:00-00:00","description":"Обычный сайт на WordPress.\n","project_url":"https://muzeyushakova.ru/","slug":"muzeyushakova.ru","summary":"Сайт для Рыбинского музея адмирала Ф. Ф. Ушакова","tags":["site","wordpress"],"title":"muzeyushakova.ru"},{"date":"2019-04-25T20:00:00-05:00","description":"","project_url":"https://github.com/ostrovok-team/redmine-plugin-webhook","slug":"redmine-plugin-webhook","summary":"Плагин для Redmine, который отправляет изменения на указаный URL","tags":["open source","ruby","ruby on rails"],"title":"redmine-plugin-webhook"},{"date":"2019-03-24T22:00:00-05:00","description":"Подробности в [блоге](/blog/hal/).\n","project_url":"","slug":"hal-9000","tags":["closed source","work","go"],"title":"HAL 9000"},{"date":"2019-02-10T20:00:00-05:00","description":"Изначально сайт задумывался, как онлайн-магазин. Но в итоге не продвигался и было решено сделать просто статику с необходимой и полезной информацией.\n\nСейчас сайт генерируется с помощью [Lektor](https://getlektor.com), а стилевая часть на [Bulma](https://bulma.io). За счет практического отсутствия JavaScript (скрытие навбара, плавный скрол и галерея без jquery), сайт работает довольно быстро. В Lektor сделаны кастомные страницы для удобного добавления нового контента.\n","project_url":"https://antikvarshop.com","slug":"antikvarshop.com","summary":"Сайт магазина АнтикварЪ","tags":["site"],"title":"antikvarshop.com"},{"date":"2019-02-10T16:53:06-05:00","description":"Ничего необычного, просто сайт на Hugo и стили TailwindCSS.\n\nПериодически я его переписываю на новые интересные технологии (из последнего - TailwindCSS).\n","project_url":"/","slug":"biozz.dev","summary":"Этот сайт","tags":["site","hugo"],"title":"biozz.dev"}]
