بسم اللّه الرحمن الرحيم
Наконец-то после месяца упорной работы готов представить вам бота для изучения 99 имён Аллаха (Асма уль‑Хусна). Если вы давно хотели начать, но откладывали — это хороший момент: можно успеть выучить имена к Рамадану, ин ша Аллах.
Что это за бот
Asma‑ul‑Husna Bot — телеграм-бот, который помогает учить имена Всевышнего через короткие занятия, квизы и систему повторений.
Как он помогает учить
Бот даёт карточки имён (арабский текст, транслитерация, перевод, значение и аудио), квизы с разными режимами, учёт прогресса (новое / в изучении / выучено), лимит «имён в день» (1–5) и напоминания, чтобы не забрасывать.
Ссылка на бота:
@asma_ul_husna_bot
Это первая версия, поэтому возможны недочёты. Если заметите баг или есть идеи, что улучшить — пишите в поддержку:
@husna_support
Пусть этот бот станет причиной облегчения в изучении имён Всевышнего для нас всех, с дозволения Аллаха.
Если нужен бот, API или сайт — обращайтесь: @aliskhannn
И буду благодарен за репост этого поста: так о боте узнает больше людей.
Наконец-то после месяца упорной работы готов представить вам бота для изучения 99 имён Аллаха (Асма уль‑Хусна). Если вы давно хотели начать, но откладывали — это хороший момент: можно успеть выучить имена к Рамадану, ин ша Аллах.
Что это за бот
Asma‑ul‑Husna Bot — телеграм-бот, который помогает учить имена Всевышнего через короткие занятия, квизы и систему повторений.
Как он помогает учить
Бот даёт карточки имён (арабский текст, транслитерация, перевод, значение и аудио), квизы с разными режимами, учёт прогресса (новое / в изучении / выучено), лимит «имён в день» (1–5) и напоминания, чтобы не забрасывать.
Ссылка на бота:
@asma_ul_husna_bot
Это первая версия, поэтому возможны недочёты. Если заметите баг или есть идеи, что улучшить — пишите в поддержку:
@husna_support
Пусть этот бот станет причиной облегчения в изучении имён Всевышнего для нас всех, с дозволения Аллаха.
Если нужен бот, API или сайт — обращайтесь: @aliskhannn
И буду благодарен за репост этого поста: так о боте узнает больше людей.
👍10⚡4🔥2🏆2
Недавно спустя несколько месяцев простоя снова зашёл в Factorio.
В прошлый раз я игру забросил не потому, что она надоела. А потому что упёрся в одну конкретную штуку — железнодорожные сигналы. До этого всё шло отлично: строил, оптимизировал, расширялся. Но когда дошёл до ЖД-логики, мозг просто сказал: «нет». Разобраться не получилось — и я отложил игру на месяцы.
И вот сейчас вернулся. Спокойно, без давления. Посидел, потыкал, почитал, попробовал — и наконец-то понял, как работают сигналы. И случилось самое приятное: игра снова “включилась”. Появилось желание продолжать, строить дальше и развивать базу.
И это очень похоже на программирование.
Иногда ты не “ленивый” и не “не создан для этого”. Ты просто упёрся в один узкий кусок: конкурентность, интерфейсы, архитектура, алгоритмы — у каждого своё. И когда не получается, самое опасное решение — полностью бросить. Потому что потом можно выпасть на месяцы, а то и на годы.
Мораль простая:
если что-то не даётся — не делай из этого точку. Сделай паузу, смени тему, упрись чуть позже, но не бросай полностью.
Очень часто желание учиться приходит не до сложности, а после того, как ты её прошёл.
В прошлый раз я игру забросил не потому, что она надоела. А потому что упёрся в одну конкретную штуку — железнодорожные сигналы. До этого всё шло отлично: строил, оптимизировал, расширялся. Но когда дошёл до ЖД-логики, мозг просто сказал: «нет». Разобраться не получилось — и я отложил игру на месяцы.
И вот сейчас вернулся. Спокойно, без давления. Посидел, потыкал, почитал, попробовал — и наконец-то понял, как работают сигналы. И случилось самое приятное: игра снова “включилась”. Появилось желание продолжать, строить дальше и развивать базу.
И это очень похоже на программирование.
Иногда ты не “ленивый” и не “не создан для этого”. Ты просто упёрся в один узкий кусок: конкурентность, интерфейсы, архитектура, алгоритмы — у каждого своё. И когда не получается, самое опасное решение — полностью бросить. Потому что потом можно выпасть на месяцы, а то и на годы.
Мораль простая:
если что-то не даётся — не делай из этого точку. Сделай паузу, смени тему, упрись чуть позже, но не бросай полностью.
Очень часто желание учиться приходит не до сложности, а после того, как ты её прошёл.
🔥5⚡3
В разработке бот для таксопарка
Он автоматизирует рутину вокруг смен и путевых листов (через Telegram + админку).
Workflow довольно прост:
1. Водитель отправляет свои данные диспетчеру
2. Диспетчер через админ-панель заносит данные в базу
3. Дальше все просто:
- В начале смены водитель в боте нажимает «Начать смену» и отправляет текущий пробег автомобиля
- В конце смены нажимает «Завершить смену», вводит снова пробег и бот формирует путевой лист в PDF
Доп. фичи:
- Отслеживание штрафов: учет, чтобы ничего не терялось
- Загрузка чеков АЗС: водитель прикрепляет фото, чек сохраняется и привязывается к смене
По плану через 5 дней нужно собрать MVP и показать демо.
Он автоматизирует рутину вокруг смен и путевых листов (через Telegram + админку).
Workflow довольно прост:
1. Водитель отправляет свои данные диспетчеру
2. Диспетчер через админ-панель заносит данные в базу
3. Дальше все просто:
- В начале смены водитель в боте нажимает «Начать смену» и отправляет текущий пробег автомобиля
- В конце смены нажимает «Завершить смену», вводит снова пробег и бот формирует путевой лист в PDF
Доп. фичи:
- Отслеживание штрафов: учет, чтобы ничего не терялось
- Загрузка чеков АЗС: водитель прикрепляет фото, чек сохраняется и привязывается к смене
По плану через 5 дней нужно собрать MVP и показать демо.
🔥12👍1
Подключил знакомого к разработке бота для таксопарка — чтобы оба получили опыт работы в команде и прокачали процесс, а не просто "написали код".
Разработка максимально приближена к коммерческой:
- Типичный Gitflow: ветки под задачи, аккуратные коммиты.
- PR на каждую фичу.
- Ревью кода перед мерджем.
Ревью провожу я. Каждый PR проходит строгий контроль и не попадает в основную ветку, пока всё не будет доведено до нормального уровня (читаемость, крайние кейсы, ошибки, структура).
Хоть это и не "работа в бигтехе", ответственность тут настоящая: это реальный проект под клиента, и цель — отдать качественный продукт, который дальше будет работать как часы и легко поддерживаться.
Разработка максимально приближена к коммерческой:
- Типичный Gitflow: ветки под задачи, аккуратные коммиты.
- PR на каждую фичу.
- Ревью кода перед мерджем.
Ревью провожу я. Каждый PR проходит строгий контроль и не попадает в основную ветку, пока всё не будет доведено до нормального уровня (читаемость, крайние кейсы, ошибки, структура).
Хоть это и не "работа в бигтехе", ответственность тут настоящая: это реальный проект под клиента, и цель — отдать качественный продукт, который дальше будет работать как часы и легко поддерживаться.
🔥10👍3
Курьёз в ревью: коллега чуть не подрался из-за errors.Is
После моего ревью знакомый написал:
Суть в том, что он в каждом слое — и в сервисе, и в хэндлере — дублировал одну и ту же кастомную ошибку. Примерно так:
В сервисе он объявлял ошибку и возвращал её. А в хэндлере создавал такую же, с тем же текстом, и проверял:
Знакомый был уверен, что если текст ошибок одинаковый, то
Но это не так. Давайте разберёмся почему.
Как сравниваются указатели
Go-спецификация говорит:
Т.е. если у тебя есть две разные переменные, пусть даже с одинаковым значением, их указатели будут разными.
Что делает errors.New
Посмотрим на реализацию:
Каждый вызов
выведет
Что это значит
Если ты объявил
Тексты одинаковые, но значения (указатели) разные, и
Поэтому правильный подход — определять ошибку в одном месте (например, в пакете сервиса) и использовать именно её:
Так ты избежишь путаницы и неожиданных сравнений, которые "на глаз" казались логичными.
После моего ревью знакомый написал:
«Мне не нравится, что ты удалил мои дубликаты ошибок и тащишь их из сервиса».
Суть в том, что он в каждом слое — и в сервисе, и в хэндлере — дублировал одну и ту же кастомную ошибку. Примерно так:
var ErrUserAlreadyExists = errors.New("user already exists")В сервисе он объявлял ошибку и возвращал её. А в хэндлере создавал такую же, с тем же текстом, и проверял:
if errors.Is(err, ErrUserAlreadyExists) {
...
}Знакомый был уверен, что если текст ошибок одинаковый, то
errors.Is вернёт true.Но это не так. Давайте разберёмся почему.
Как сравниваются указатели
Go-спецификация говорит:
Два указателя равны, если они указывают на одну и ту же переменную, либо оба nil.
Указатели на разные переменные (даже с одинаковым содержимым) — не равны.
Т.е. если у тебя есть две разные переменные, пусть даже с одинаковым значением, их указатели будут разными.
Что делает errors.New
Посмотрим на реализацию:
func New(text string) error {
return &errorString{text}
}Каждый вызов
errors.New создаёт новую переменную в памяти и возвращает на неё указатель. Поэтому такой код:err1 := errors.New("custom error")
err2 := errors.New("custom error")
fmt.Println(err1 == err2)выведет
false.Что это значит
Если ты объявил
ErrUserAlreadyExists в разных пакетах — у тебя получились две разные ошибки.Тексты одинаковые, но значения (указатели) разные, и
errors.Is никогда не сочтёт их равными.Поэтому правильный подход — определять ошибку в одном месте (например, в пакете сервиса) и использовать именно её:
if errors.Is(err, service.ErrUserAlreadyExists) {
...
}Так ты избежишь путаницы и неожиданных сравнений, которые "на глаз" казались логичными.
🔥6
Давно тут не писал. Всё это время допиливал Telegram-бота и админку для таксопарка, параллельно вел ещё один проект.
Сам по себе проект несложный, но постоянно всплывали мелкие баги и недоработки — их приходилось ловить и доводить до ума. Сейчас всё привёл в порядок и можно выдохнуть.
С этого дня хочу вернуться к регулярным постам: хотя бы 1–2 в неделю, даже если завален делами. Думаю, у меня есть что рассказать.
Сам по себе проект несложный, но постоянно всплывали мелкие баги и недоработки — их приходилось ловить и доводить до ума. Сейчас всё привёл в порядок и можно выдохнуть.
С этого дня хочу вернуться к регулярным постам: хотя бы 1–2 в неделю, даже если завален делами. Думаю, у меня есть что рассказать.
⚡9👍1
Сейчас закрываю пробелы в знаниях, чтобы увереннее проходить собеседования.
Самое слабое место — аллокатор памяти в Go. Не потому что он сложный, а потому что по нему мало понятных материалов, а те, что есть, заходят тяжело.
Поэтому решил копнуть глубже и разобраться в аллокаторе через исходники Go — с ними мне проще.
Параллельно хочу запустить отдельный блог в формате личного сайта: там будут уже не короткие заметки, как здесь в канале, а более развернутые разборы по Go и backend-разработке.
Первая статья, скорее всего, будет как раз про аллокатор.
Самое слабое место — аллокатор памяти в Go. Не потому что он сложный, а потому что по нему мало понятных материалов, а те, что есть, заходят тяжело.
Поэтому решил копнуть глубже и разобраться в аллокаторе через исходники Go — с ними мне проще.
Параллельно хочу запустить отдельный блог в формате личного сайта: там будут уже не короткие заметки, как здесь в канале, а более развернутые разборы по Go и backend-разработке.
Первая статья, скорее всего, будет как раз про аллокатор.
🔥6👍3
Решил прокачаться в алгоритмах и структурах данных.
Зачем? Хочу пройти Яндекс Контест — там алгоритмы обязательны. Плюс прокачает решение задач на собесах.
План: NeetCode-роадмап + 75 Study Plan на LeetCode.
Старт завтра. Кто проходил Контест — кидайте опыт в комменты.
Зачем? Хочу пройти Яндекс Контест — там алгоритмы обязательны. Плюс прокачает решение задач на собесах.
План: NeetCode-роадмап + 75 Study Plan на LeetCode.
Старт завтра. Кто проходил Контест — кидайте опыт в комменты.
🔥6
Добавили цвет для кнопок: danger, success, primary и стандартный. Теперь можно визуально расставлять акценты и делать интерфейс понятнее.
Плюс иконки у кнопок — если боту разрешены кастомные эмодзи, иконки можно вставлять прямо на клавиши.
Для разработчиков, которые держат ботов в проде, это явный шаг в сторону удобного и интуитивно понятного UX.
Весь changelog — https://core.telegram.org/bots/api
Please open Telegram to view this post
VIEW IN TELEGRAM
core.telegram.org
Telegram Bot API
The Bot API is an HTTP-based interface created for developers keen on building bots for Telegram. To learn how to create…
🔥2
Обновил бота «99 имён Аллаха»
Прошло больше 1,5 месяца с запуска. За это время в поддержку написало несколько человек: кому-то было непонятно, как бот работает, а кто-то просил сделать его проще.
Для Telegram‑бота это оказалось лишним. Поэтому убрал квизы, напоминания и часть прогресса, оставив только самое нужное.
Теперь всё проще:
Получился не апгрейд, а даунгрейд, но именно в ту сторону, в которую людям станет удобнее.
Прошло больше 1,5 месяца с запуска. За это время в поддержку написало несколько человек: кому-то было непонятно, как бот работает, а кто-то просил сделать его проще.
Для Telegram‑бота это оказалось лишним. Поэтому убрал квизы, напоминания и часть прогресса, оставив только самое нужное.
Теперь всё проще:
/today показывает имена по дневной квоте, прогресс сохранён — новые имена продолжают идти с последнего изученного.Получился не апгрейд, а даунгрейд, но именно в ту сторону, в которую людям станет удобнее.
Telegram
99 имен Аллаха
Бот для изучения 99 прекрасных имен Аллаха
👍5🔥3
У меня такое происходит часто. В какой‑то момент я устал каждый раз искать одно и то же и начал сохранять вопросы в Obsidian — из собственного опыта и с разных площадок.
На этом родилась идея сделать отдельную платформу для подготовки к бэкенд‑собеседованиям. Это будет место, где собраны реальные вопросы с собесов, с удобной навигацией по темам.
Дальше — разработка. Буду показывать, как из набора заметок в Obsidian постепенно вырастает рабочий инструмент для подготовки к собеседованиям.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🏆4
Сейчас пишу backend-часть. А пока можно заценить дизайн первой версии — прикрепил несколько экранов в темном режиме.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
Там буду делиться развитием продукта: фичи, архитектурные решения, планы и этапы запуска.
Под проект взял домен https://backforge.tech — позже платформа будет доступна именно там.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
BackForge
Сервис для системной подготовки к backend-собеседованиям.
backforge.tech
Связь: @aliskhannn
backforge.tech
Связь: @aliskhannn
👍6⚡1🔥1
Практически с самого начала изучения backend‑разработки я ломал голову над тем, как организовать сервис: куда класть бизнес‑логику, конфиги, репозитории, модели и т.д.
Со временем я пришёл к простому выводу: идеальной универсальной архитектуры не существует — структура зависит от проекта и задач.
В своей первой статье в блоге я подробно разобрал, как сейчас организую сервис на Go: слои, директории и принцип разделения ответственности.
Почитать можно здесь: https://aliskhan.ru/blog/go-service-project-structure
Это мой личный подход — берите, что подходит, и адаптируйте под себя
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡3👍3🔥2
Кстати, блог я сделал на Hugo.
Hugo — это быстрый и гибкий генератор статических сайтов, написанный на Go: идеален, чтобы быстро поднять свой блог без лишней возни.
Контент — обычные Markdown‑файлы, а сам Hugo превращает их в HTML‑страницы. Для меня это удобно: можно писать статьи прямо в редакторе кода или в Obsidian, не связываясь с громоздкими rich text‑редакторами.
Hugo — это быстрый и гибкий генератор статических сайтов, написанный на Go: идеален, чтобы быстро поднять свой блог без лишней возни.
Контент — обычные Markdown‑файлы, а сам Hugo превращает их в HTML‑страницы. Для меня это удобно: можно писать статьи прямо в редакторе кода или в Obsidian, не связываясь с громоздкими rich text‑редакторами.
⚡3👍3🔥2
Ранее я писал, что по аллокатору памяти в Go мало хороших и понятных статей.
✅ Кажется, вышла нормальная статья от Timeweb Cloud на Habr. Пока сам не читал, но выглядит солидно: подробно разбирают все механизмы аллокатора.
Но в то же время местами всё выглядит довольно сложно — придётся самому копаться и разбираться.
https://habr.com/ru/companies/timeweb/articles/1000232/
Но в то же время местами всё выглядит довольно сложно — придётся самому копаться и разбираться.
https://habr.com/ru/companies/timeweb/articles/1000232/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2