Всем привет ⌨️ . По итогам прошлого поста давайте разберём основу структуры QR-кода. Также посмотрим, почему камера не путается, когда его считывает. Делаем 1-ую часть 🎮 !
Кратко про QR-код.
QR-код — это квадратная матрица одинаковых клеток (модулей ), в которых хранятся 0 или 1. У каждой такой клетки есть адрес в формате: [№ строки, № столбца]. Вся суть QR-кода заключается в том, где именно лежат служебные поля (группы клеток ) и каким образом данные раскладываются по «свободным» клеткам 👩💻 .
Что нужно, чтобы камера считала QR-код?
Сначала камера должна считать служебные поля🥱 . После этого камера может построить точную сетку координат по всем клеткам, чтобы считать биты из свободных клеток, в которых шифруется ваша ссылка или текст 🤨 .
Теперь подробно про служебные поля:
Тут важно отметить, что в служебных полях ваши данные не передаются🙌 🙌 .
А как данные оказываются в свободных клетках?
Опишем этот процесс по шагам:
Если во время обхода встречаются служебные поля, то просто пропускаем их и идём дальше🚶 .
А сколько данных можно записать в QR-код?
Это зависит от размера и версии QR-кода: чем больше сторона матрицы, тем больше информации можно передать. Давайте опишем зависимость длины стороны матрицы от версии:
Отметим, что вне зависимости от роста версии — синхронизирующие линии все равно остаются в 6-й строке и 6-м столбце🖥 .
Зачем используется маска, если все и так может работать?
Перед выкладкой данных в матрицу к ним применяют маску, которая перекрашивает часть клеток, меняя их цвет на противоположный, по понятному правилу, например: «перекрасить, если сумма номера строки и столбца чётная»⚙️ .
Такой подход делает картинку QR-кода равномерной: без огромных однотонных пятен и длинных повторов, которые мешают распознаванию🔍 .
Важно то, что служебные поля маска не трогает. Поэтому номер маски успешно передаётся в служебном поле формата, о котором писал выше. Зная этот номер, камера выполняет обратное перекрашивание⏳ .
Кстати, часто слышу о том, что QR-код может считываться при ~30% повреждений, но это не совсем так. Тут важно отметить, что речь именно об ошибках в свободных клетках. Если повреждены служебные поля QR-кода, то считывание может сломаться и при меньших повреждениях🤯 . Вот такой итог ☠ !
P.S. Ниже приложил QR-код моего канала, теперь вижу на нем служебные поля, да и на других QR-кодах тоже😀 .
😎 — здраво.
💡 — жду 2-ую часть.
🍾 — теперь тоже вижу служебные поля.
#статья 📚
Кратко про QR-код.
QR-код — это квадратная матрица одинаковых клеток (
Что нужно, чтобы камера считала QR-код?
Сначала камера должна считать служебные поля
Теперь подробно про служебные поля:
• Опорные угловые маркеры — это большие «мишени» в правом верхнем, левом верхнем и левом нижнем углах. Размер такого маркера 7×7 клеток и ещё белая рамка толщиной в 1 клетку вокруг него🤔 .
• Синхронизирующие линии — это две дорожки из клеток, цвета которых чередуются: то чёрный, то белый. Расположены они всегда в одних местах: это 6-я строка и 6-й столбец матрицы, если нумеровать строки и столбцы с 0. Отметим, что эти линии тянутся между опорными угловыми маркерами и не заходят в их области😐 .
• Выравнивающие метки — это маленькие «мишени» 5×5 внутри поля QR-кода. Такие метки не могут лежать на опорных угловых маркерах и на синхронизирующих линиях. В небольших QR-кодах они обычно видны в нижней правой части. Если QR-код большой, то таких меток несколько. Вообще они очень важны, так как помогают правильно считывать QR-код с кривых поверхностей, нивелируя искажения👍 .
• Тихая зона — это пустая рамка вокруг QR-кода шириной в 4 клетки, отделяющая QR-код от фона🫣 .
• Поле формата — в нем указан уровень защиты от ошибок и номер маски-узора QR-кода🌚 .
• Поле версии — в нем указывается номер версии, но только если она ⩾ 7☺️ .
• Фиксированная чёрная клетка в известной позиции — это просто дополнительная отметка для распознавания☺️ .
Тут важно отметить, что в служебных полях ваши данные не передаются
А как данные оказываются в свободных клетках?
Опишем этот процесс по шагам:
• Берём две самые правые колонки✍️ .
• Идём снизу вверх: в каждой строке работаем с правой клеткой пары, потом с левой✍️ .
• Дошли до верха — сдвигаемся на две колонки влево✍️ .
• Идём сверху вниз, начиная с правой клетки пары, заканчивая левой клеткой✍️ .
• Далее, просто повторяем до тех пор, пока не дойдем до конца✍️ .
Если во время обхода встречаются служебные поля, то просто пропускаем их и идём дальше
А сколько данных можно записать в QR-код?
Это зависит от размера и версии QR-кода: чем больше сторона матрицы, тем больше информации можно передать. Давайте опишем зависимость длины стороны матрицы от версии:
сторона = 21 + 4 · (версия – 1).
Отметим, что вне зависимости от роста версии — синхронизирующие линии все равно остаются в 6-й строке и 6-м столбце
Зачем используется маска, если все и так может работать?
Перед выкладкой данных в матрицу к ним применяют маску, которая перекрашивает часть клеток, меняя их цвет на противоположный, по понятному правилу, например: «перекрасить, если сумма номера строки и столбца чётная»
Такой подход делает картинку QR-кода равномерной: без огромных однотонных пятен и длинных повторов, которые мешают распознаванию
Важно то, что служебные поля маска не трогает. Поэтому номер маски успешно передаётся в служебном поле формата, о котором писал выше. Зная этот номер, камера выполняет обратное перекрашивание
Кстати, часто слышу о том, что QR-код может считываться при ~30% повреждений, но это не совсем так. Тут важно отметить, что речь именно об ошибках в свободных клетках. Если повреждены служебные поля QR-кода, то считывание может сломаться и при меньших повреждениях
P.S. Ниже приложил QR-код моего канала, теперь вижу на нем служебные поля, да и на других QR-кодах тоже
#статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
1 37 21 18 1
Сегодня настолько классная погода, что я не удержался и решил написать сюда — до 2-й части про структуру QR-кодов 🥱 .
Сегодняшний и вчерашний дни позволили понять, почему многие так любят сентябрь и раннюю осень: ощущение, что она должна быть именно такой👍 .
Ещё один огромный плюс — не все тёплые дни выпали на будни. Чаще наоборот: они приходятся на середину недели, когда все на парах или на работе. Согласны🤔 ?
Кстати, будет максимально здраво, если забустите мой канал, ссылка ниже:
https://t.me/boost?c=2187172722
Возникло очередное желание поискать кастомные эмодзи и поиграть с оформлением канала🌊 .
P.S. Фотокарточка внизу поста не сегодняшняя, но кайф этих дней точно передаёт😺 .
💎 — в тему про погоду.
⌨️ — держи в курсе.
☺️ — закинул(-а) бусты.
#лайф 🤝🏻
Сегодняшний и вчерашний дни позволили понять, почему многие так любят сентябрь и раннюю осень: ощущение, что она должна быть именно такой
Ещё один огромный плюс — не все тёплые дни выпали на будни. Чаще наоборот: они приходятся на середину недели, когда все на парах или на работе. Согласны
Кстати, будет максимально здраво, если забустите мой канал, ссылка ниже:
https://t.me/boost?c=2187172722
Возникло очередное желание поискать кастомные эмодзи и поиграть с оформлением канала
P.S. Фотокарточка внизу поста не сегодняшняя, но кайф этих дней точно передаёт
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
1 32 21 8
Всем привет! Закончил 2-ю часть по QR-кодам. Тут про то, как текст превращается в биты, как всё защищено и причем тут математика. Как обычно, поехали 🌎 !
Сначала давайте разберем маршрут данных от текста до матрицы QR-кода😱 :
Как конкретно текст превращается в байты⏳ ?
Тут отметим, что есть 4 режима, которыми можно кодировать вашу строку с текстом⚙️ :
Теперь соберем мини-алгоритм, по которому любой QR-код превращает вашу строку с текстом в битовую дорожку🟦 :
Что с этими байтами происходит дальше и причем тут коды Рида-Соломона (RS)🥱 ?
В двух словах, QR-код защищается кодами RS в «байтовом поле» GF(256)👩💻 .
Что важно знать про GF(256)🤔 :
Основа защиты строится на страховочных байтах. Что важно знать тут🤔 :
Как страховочные байты получаются🤔 ?
Что именно они страхуют🤔 ?
Тут нужно помнить, что страховочные байты не страхуют поломку служебных полей: если камера не построит сетку, то до кодов RS сканер просто не дойдет🫣 .
Теперь про перемежение🥵 .
Перемежение — это когда байты из нескольких блоков выкладывают в матрицу не подряд, а «по кругу», чтобы любое локальное пятно повреждений превратилось в небольшое количество ошибок в каждом блоке😐 . В таком случае с помощью кодов RS можно будет спокойно исправить эти ошибки 👍 .
В итоге: как именно сканер чинит поломки🤔 ?
Краткий алгоритм:
Как-то так☺️ .
🌊 — здраво.
⌨️ — жду лайтовый пост.
🖥 — думал, что QR-коды устроены проще.
#статья 📚
Сначала давайте разберем маршрут данных от текста до матрицы QR-кода
Текст → Битовая строка → Байты (кодовые слова ) → Защита от ошибок → Перемежение → Применение маски → Выкладка в матрицу.
Как конкретно текст превращается в байты
Тут отметим, что есть 4 режима, которыми можно кодировать вашу строку с текстом
• Числовой (numeric ) — когда кодируем только цифры.
• Буквенно-цифровой (alphanumeric ) — когда кодируем цифры и буквы.
• Байтовый (byte ) — когда кодируем любые байты, обычно в UTF-8.
• Кандзи (kanji ) — когда кодируем японские иероглифы, но его обычно редко используют.
Теперь соберем мини-алгоритм, по которому любой QR-код превращает вашу строку с текстом в битовую дорожку
• Сначала выбираем режим кодирования: numeric / alphanumeric / byte / kanji.
• Дописываем индикатор режима: numeric — 0001, alphanumeric — 0010, byte — 0100, kanji — 1000.
• Затем сразу дописываем длину сообщения — это нужно, чтобы сканер знал, где заканчиваются данные. Эта длина сообщения также записывается битами, а их количество зависит от версии QR-кода и выбранного режима.
• Далее ваш текст кодируется в ту самую битовую дорожку. Тут не буду подробно останавливаться, так как это тема для отдельного поста🚶 .
• Теперь добиваем получившуюся битовую дорожку терминатором — это 4 нуля в ее конце. И, если нужно, дописываем еще нули, чтобы количество битов в дорожке было кратно 8 — это как раз для перевода битов в байты.
• На выходе получаем байты. Если их мало, то добиваем количество до нужного числа, используя байты: ЕС, 11. Тут важно учесть, что «добивочные» байты чередуются, то есть: EC, 11, EC, 11, ...
Что с этими байтами происходит дальше и причем тут коды Рида-Соломона (RS)
В двух словах, QR-код защищается кодами RS в «байтовом поле» GF(256)
Что важно знать про GF(256)
• Элемент поля — это один байт.
• Сложение в поле — поразрядное исключающее ИЛИ (XOR ), переносов нет.
• Умножение выполняется по фиксированному правилу, чтобы результат снова был байтом. Технически — это приведение по модулю заданного многочлена 8-й степени.
• Прикладной смысл — байт в этом поле это полноценное число, с которым удобно строить и проверять «страховку».
Основа защиты строится на страховочных байтах. Что важно знать тут
• Данные режутся на блоки. Для каждого блока к его k байтам добавляют r страховочных байтов.
• Обозначается как RS(n, k), где n = k + r.
• «Починить» можем до r/2 байт-ошибок в каждом блоке. Измеряется именно в байтах-ошибках, а не пикселях или процентах.
Как страховочные байты получаются
• Берем полином данных со степенью k – 1 над GF(256) — M(x).
• Умножаем на x^r.
• Делим на g(x) — генераторный полином степени r.
• Остаток (полином степени < r ) — это содержимое проверочных байтов.
Что именно они страхуют
• Ошибки из-за печати или плохой камеры, когда отдельные байты считываются неверно.
• Маленькие повреждения, например: царапины, логотипы в центре QR-кода.
Тут нужно помнить, что страховочные байты не страхуют поломку служебных полей: если камера не построит сетку, то до кодов RS сканер просто не дойдет
Теперь про перемежение
Перемежение — это когда байты из нескольких блоков выкладывают в матрицу не подряд, а «по кругу», чтобы любое локальное пятно повреждений превратилось в небольшое количество ошибок в каждом блоке
В итоге: как именно сканер чинит поломки
Краткий алгоритм:
• Считали все байты блока → Посчитали синдромы по принятому кодовому слову → Синдромы нулевые? → Если да, ошибок нет.
• Если нет, то алгоритмом Берлекэмпа-Мэсси восстанавливаем полином локаторов ошибок.
• С помощью поиска Чиена находим позиции сломанных байтов.
• Используя формулу Форни, получаем величины ошибок, а затем, зная их, восстанавливаем сломанный блок.
Как-то так
#статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
1 22 15 12
Добрый вечер 🚶 ! Пропал почти на неделю, потому что столкнулся с сильной апатией. Долго думал, в чем причина — просто так она не появляется 🤔 . После небольшого анализа понял, что жил несколько месяцев в очень жестком ритме:
В какой-то момент мне казалось, что я привык к такому ритму и не чувствую усталости от кучи дел и планов😀 . Сначала решил загружать будни по максимуму, а потом начал делать то же самое и с выходными 🎮 . Результат не заставил себя ждать:
Как вы думаете, я эти моменты учел? В этот раз —да 🌚 . Поэтому сделал следующее:
Чтобы вы понимали, энергия начала возвращаться только спустя неделю вот такого «детокса», который в начале давался непросто из-за чувства вины перед собой за то, что я не занят чем-то полезным🫣 . Сейчас хочу пересмотреть то, как устраиваю свою недельную занятость, стараюсь потихоньку возвращать планы, цели и контроль над временем 👍 .
Главный вывод из этого эпизода: перегрузки не проходят бесследно. У них есть накопительный эффект, и чем он сильнее, тем выше шанс, что он «выстрелит» в виде сильной апатии и усталости. Очень важно про это не забывать☠ .
P.S. А как у вас обстоят дела с занятостью? Часто ли сталкиваетесь с такими же проблемами?
💡 — регулярно выгораю.
⌨️ — пока что не сталкивался с таким.
🍾 — идеально держу баланс между занятостью и отдыхом.
#лайф 🤝🏻
• С работой.
• С каналом.
• С приложением.
• С регулярным спортом.
• С ежедневными записями целей и итогов дня.
В какой-то момент мне казалось, что я привык к такому ритму и не чувствую усталости от кучи дел и планов
• Стало трудно вставать по утрам — хотелось спать как можно дольше.
• Каналу почти не уделял внимания, но постоянно думал о нем.
• Приложение застопорилось после большого и, к слову, успешного теста.
• Спорт отпал от слова совсем.
Как вы думаете, я эти моменты учел? В этот раз —
• Перестал думать о канале и корить себя за то, что не пишу посты наперед.
• Отпустил ситуацию с приложением и дал себе от него отдохнуть.
• Оставил только тот спорт, который спонтанный и в удовольствие.
• Постарался наладить режим сна.
• Убрал ежедневное планирование и подведение итогов.
• Хорошо отдохнул от любых рабочих задач на выходных и провел время с друзьями.
Чтобы вы понимали, энергия начала возвращаться только спустя неделю вот такого «детокса», который в начале давался непросто из-за чувства вины перед собой за то, что я не занят чем-то полезным
Главный вывод из этого эпизода: перегрузки не проходят бесследно. У них есть накопительный эффект, и чем он сильнее, тем выше шанс, что он «выстрелит» в виде сильной апатии и усталости. Очень важно про это не забывать
P.S. А как у вас обстоят дела с занятостью? Часто ли сталкиваетесь с такими же проблемами?
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
1 47 16 10 7 3 3
Всем привет 💡 ! Недавно в голову пришла такая мысль: «прогресс либо растет, либо падает — третьего не дано» 😦 . Давайте разберем и проанализируем 👩💻 .
Кажется, что можно просто «держать уровень» прогресса, но на практике это почти невозможно☠ . На любой навык или проект, которым вы занимаетесь, действуют три силы:
Для того, чтобы более глубоко понять мысль из заголовка поста — построим простую дискретную модель, в которой один шаг равен одному дню🤯 :
Отдельно стоит отметить, что наша модель мультипликативная🤪 . Если говорить по простому, то мультипликативность — это когда общий уровень навыка меняется в процентах относительного текущего уровня навыка 🌚 . То есть новый уровень навыка получается не прибавлением, а умножением на коэффициент. Вот небольшой пример с мультипликативным ростом подписчиков в канале:
Что говорит в пользу мультипликативности нашей модели😐 :
Исходя из этого итоговая модель будет такой👍 :
Что делать с ней дальше😀 ? Давайте пойдем по шагам:
1. Посмотрим, что будет с уровнем прогресса за k дней🤔 :
2. Возьмем логарифм от левой и правой части формулы, чтобы избавиться от умножения🤔 :
3. Теперь посчитаем средний темп роста уровня навыка за день🤔 :
4. Теперь возьмем правую часть уравнения, которая как раз является средним темпом роста уровня навыка за день, и посмотрим, что будет с ней, если k → ∞. Тут важно отметить, что мы будем считать, что дни похожи между собой по статистике, т.е. наш процесс стационарный. Тогда, по закону больших чисел верно следующее🤔 :
5. Если перевести то, что мы получили в пункте №4 на слова, то получим следующее🤔 :
6. В итоге, после нашего анализа получаем🤔 :
7. А что будет если «истинный» средний рост навыка γ равен нулю🤔 ?
Какие практические выводы можно вынести👁 ?
Во-первых, ноль нестабилен — чтобы держать уровень, нужно перекрывать не только спад, но и «колебания» около этого нуля⛰ .
Во-вторых, дни поддержания — не пустые: они не дают общему результату катиться вниз🥇 .
В третьих, ежедневные микро-приросты основной метрики сильно влияют на рост общего результата💎 .
😎 — согласен.
⌨️ — запишу себе выводы.
🖥 — жду пост про приложение.
#статья 📚
Кажется, что можно просто «держать уровень» прогресса, но на практике это почти невозможно
• Улучшения — это то, что вы делаете осознано🚶 .
• Естественный спад — это забывание, утомление, энтропия🫣 .
• Случайности — форс-мажорные ситуации, ошибки или везение🤔 .
Для того, чтобы более глубоко понять мысль из заголовка поста — построим простую дискретную модель, в которой один шаг равен одному дню
• Уровень прогресса — это xₜ.
• Намеренное улучшение прогресса — это gₜ.
• Естественный спад (энтропия ) — это d. К слову, d > 0, потому что энтропию нельзя отключить.
• Ошибки или везения — это εₜ, которая может быть как положительной, так и отрицательной.
• «Шаг» модели — это t.
Отдельно стоит отметить, что наша модель мультипликативная
• 1 день — 1000 + 10% = 1100 участников🖥 .
• 2 день — 1100 + 10% = 1210 участников🖥 .
Что говорит в пользу мультипликативности нашей модели
• Интуитивно понятно, что качество навыка растет в процентах от его текущего уровня.
• Естественный спад также описывается процентом от текущего уровня навыка.
• В целом навык растет или падает всегда относительно текущей базы.
Исходя из этого итоговая модель будет такой
xₜ₊₁ = xₜ ∙ (1 + gₜ + εₜ – d) = xₜ ∙ (1 + rₜ), где rₜ = gₜ + εₜ – d.
Что делать с ней дальше
1. Посмотрим, что будет с уровнем прогресса за k дней
xₖ = x₀ ∙ ∏(1 + rₜ), где ∏ — это произведение элементов (1 + rₜ) c индексом t от 0 до k-1.
2. Возьмем логарифм от левой и правой части формулы, чтобы избавиться от умножения
ln(xₖ) = ln(x₀) + ∑ln(1 + rₜ), где ∑ — это сумма элементов ln(1 + rₜ) c индексом t от 0 до k-1.
3. Теперь посчитаем средний темп роста уровня навыка за день
(ln(xₖ) – ln(x₀)) / k = (∑ln(1 + rₜ)) / k.
4. Теперь возьмем правую часть уравнения, которая как раз является средним темпом роста уровня навыка за день, и посмотрим, что будет с ней, если k → ∞. Тут важно отметить, что мы будем считать, что дни похожи между собой по статистике, т.е. наш процесс стационарный. Тогда, по закону больших чисел верно следующее
((∑ln(1 + rₜ)) / k) → 𝔼[ln(1 + rₜ)] ≡ γ.
5. Если перевести то, что мы получили в пункте №4 на слова, то получим следующее
Если дни похожи, то средний рост навыка по небольшому количеству дней практически равен «истинному» среднему росту навыка за очень большое количество дней.
6. В итоге, после нашего анализа получаем
• γ > 0 → наш навык геометрически растет.
• γ < 0 → наш навык геометрически падает.
7. А что будет если «истинный» средний рост навыка γ равен нулю
• Если проценты прироста навыка небольшие, то верно следующее приближение: 𝔼[ln(1 + rₜ)] ≈ 𝔼[rₜ] – 0.5 ∙ Var(rₜ), где 𝔼[rₜ] — это средний дневной процент прироста навыка в долгую, а Var(rₜ) — это дисперсия дневных процентов прироста навыка.
• В итоге, если 𝔼[rₜ] ≈ 0, Var(rₜ) будет понемногу уменьшать общий прогресс.
• Простой пример: в первый день +10%, во второй день –10%. Кажется, что общий прогресс за эти два дня не изменится, но если посчитать: (1.1) ∙ (0.9) = 0.99. То есть общий прогресс за такие два дня упал на 1%.
Какие практические выводы можно вынести
Во-первых, ноль нестабилен — чтобы держать уровень, нужно перекрывать не только спад, но и «колебания» около этого нуля
Во-вторых, дни поддержания — не пустые: они не дают общему результату катиться вниз
В третьих, ежедневные микро-приросты основной метрики сильно влияют на рост общего результата
#статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
2 23 20 16
Всем привет ⌨️ ! Наконец-то нашел время на небольшой лайф-пост про свой Telegram мини-апп, на который сейчас уходит почти все свободное время 😱 .
Сначала кратко👩💻 :
Теперь подробнее, что получилось сделать:
• Единый стиль🧐 .
• Списки без дерганий🧐 .
• Пришел к тому, что использовать тикер нужно только там, где он нужен🧐 .
• Живые графики без мельтешения🧐 .
• Анти-свайп — мастхэв🧐 .
• Нормальный деплой🧐 .
Что вообще удалось вынести из всего этого🤔 :
В общем, вот почему слегка задержал выход лайф-поста: было много невидимой, но важной работы. Дальше — подключение БД к мини-аппу😢 .
💡 — лайк авансом.
🌊 — жду про подключение БД.
⌨️ — пойду поделаю свое приложение.
#лайф 🤝🏻
Сначала кратко
• Много времени ушло на темную и светлую тему, чтобы мини-апп корректно подхватывал их из Telegram⏳ .
• Долго разбирался, как отключить системный свайп, который сворачивает мини-апп🕹 .
• Когда все стало «нормально работать», занялся рефакторингом, чтобы стало плавно и стабильно🌃 .
Теперь подробнее, что получилось сделать:
• Единый стиль
Вынес размеры, формы, стили кнопок и карточек в один слой. Удобно при масштабировании мини-аппа, не нужно дублировать одно и то же. В итоге, при добавлении новых кнопок нужно только задать расстояние между ними.
• Списки без дерганий
Я использую вертикальные списки, и при смене порядка элементы подскакивали. Чтобы исправить, пришлось кэшировать текущее состояние списка и пересобирать логику рендера этого списка — теперь перетаскивание гладкое, без «подскоков».
• Пришел к тому, что использовать тикер нужно только там, где он нужен
Звучит очевидно, но вначале об этом не думаешь и просто вешаешь тикер на всю страницу. По итогу изменение одного элемента влечет за собой перерисовку всей страницы. Долго правил и встраивал тикер в конкретные виджеты. В результате мини-апп перестал подлагивать. Если честно — получилось только с третьего раза. В будущем сразу буду продумывать логику обновления виджетов на страничке.
• Живые графики без мельтешения
Нашёл баланс: тултипы (подсказки на графиках) обновляются каждую секунду, отсюда ощущение «живости», а высота столбиков меняется раз в минуту, поэтому картинка спокойная и не дёргается. Смотреть приятно.
• Анти-свайп — мастхэв
Если у вас есть вертикальные списки, системный свайп Telegram будет сворачивать ваш мини-апп при прокрутке вверх. Это бесит. Решение: отключать свайп ещё на старте, прямо из index.html, и делать это с ретраями — Telegram API не всегда «просыпается» сразу. Звучит вроде просто, но боролся я с этой проблемой долго. Зато очень приятно, что анти-свайп работает стабильно.
• Нормальный деплой
Я ушёл от ручной заливки и сделал автодеплой со схемой версий: каждый релиз — в отдельную папку, стартовая страница index.html указывает на релизный index.html из последней релизной папки. Плюс смог настроить кэш-политику. Теперь Telegram не «липнет» к старым версиям, а первая загрузка быстрая. Когда этого не было — я переустанавливал Telegram, чтобы пробить кэш, это просто ад.
Что вообще удалось вынести из всего этого
• Если у вас есть желание что-то закодить своими руками — лучше это сделать, чем просто думать об этом. К слову, со временем очень затягивает📚 .
• Нейросети, особенно продвинутые — очень сильно помогают. Главное не просто делать ctrl+C и ctrl+V, а разбираться в том, что предлагает нейросеть и задавать вопросы. Со временем получится самостоятельно закрывать какие-то доработки и без сторонней помощи писать хелперы или описывать нужные классы. Очень хороший бустер, особенно когда хочется сразу видеть какой-нибудь результат👁 .
• Если, в итоге, мини-апп будет неиспользуемым, то я смогу забустить свое резюме описанием разработки от и до. Это приятный бонус🔮 !
В общем, вот почему слегка задержал выход лайф-поста: было много невидимой, но важной работы. Дальше — подключение БД к мини-аппу
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
1 31 18 11 3
Внеплановый лайф-пост: почему притормозил с подключением БД?
Буквально в день, когда я сел подключать БД к мини-аппу, в голову пришли новые фичи и вообще новый отдельный раздел мини-аппа🔥 !
Принял решение отложить подключение БД и реализовать новый функционал⌨️ .
Сейчас этим уже занимаюсь и понимаю, что на 90% это правильное решение👍 . Объясню почему:
Вообще заметил, что в этот раз новый раздел вводить было намного проще. Жаль, что я не отслеживал, сколько времени это заняло в самый первый раз. По ощущениям, сейчас 100% быстрее😀 .
На самом деле очень жду момент, когда смогу сделать большое код-ревью, чтобы исходный код был максимально читаемым и масштабируемым. А там уже и до переезда на JS недалеко🤨 .
Но вообще переезд — не факт, что хорошая идея. Сяду с этим разбираться, когда закрою текущие задачки, а то, как всегда, бегу вперед🌚 .
💎 — нравится такой лайф-формат, его нужно больше.
💡 — жду какой-нибудь лонгрид на интересную тему.
😎 — интересно узнать, что с этим приложением будет в итоге.
#лайф 🤝🏻
Буквально в день, когда я сел подключать БД к мини-аппу, в голову пришли новые фичи и вообще новый отдельный раздел мини-аппа
Принял решение отложить подключение БД и реализовать новый функционал
Сейчас этим уже занимаюсь и понимаю, что на 90% это правильное решение
1. Во-первых, перед подключением БД нужно оптимизировать приложение, чтобы потом не гадать, из-за чего оно подвисает.
2. Во-вторых, подключать БД проще, когда локальные слои данных (по сути локальная БД, которая помогает пережить перезапуск приложения ) уже реализованы и хорошо работают.
Вообще заметил, что в этот раз новый раздел вводить было намного проще. Жаль, что я не отслеживал, сколько времени это заняло в самый первый раз. По ощущениям, сейчас 100% быстрее
На самом деле очень жду момент, когда смогу сделать большое код-ревью, чтобы исходный код был максимально читаемым и масштабируемым. А там уже и до переезда на JS недалеко
Но вообще переезд — не факт, что хорошая идея. Сяду с этим разбираться, когда закрою текущие задачки, а то, как всегда, бегу вперед
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
1 30 18 15 2 1
Привет 😐 ! Недавно задумался о том, как именно работает доминанта. Если говорить кратко, то это утренняя установка на день, которая задает общее настроение 😎 .
Простыми словами🥱 .
Доминанта — это призма: она не меняет факты, она меняет веса их интерпретации. Закрепишь в голове «сделаю минимум и продвинусь» — рутинные и сложные события читаются спокойнее🤤 . Закрепишь «я не вывезу» — те же события кажутся хуже и «подтверждают» провал 😨 .
Раскроем суть⌨️ .
На мой взгляд, доминанта двигает два ключевых рычага:
1. Порог реакции🤔 .
2. Луч внимания🤔 .
Плюс есть инерция. Как только одна тема вырывается вперед, она «подтягивает» соседние: в голове формируется сюжет, и дальше все начинает подстраиваться под него👩💻 . Поэтому важны не только мысли, но и среда, в которой ты находишься в данный момент: настроение, люди рядом, физическое состояние — другими словами, это входы, которые усиливают доминирующий сюжет и ослабляют другие 🚶 .
Давайте формализуем⏳ .
1. Разберем пороговый взгляд на ситуацию🤯 . Сырую оценку ситуации можно посчитать так: z = w · x + b, где:
Решение по ситуации — это y = sign(z)🤪 . Функция sign() возвращает либо +1, либо -1 в зависимости от входной сырой оценки. Доминанта в этой формуле — это именно сдвиг b . Ее роль заметна при фиксированных w · x:
2. Рассмотрим конкурирующие мысли и распределение внимания☠ . Обычно несколько оценок z₁, z₂, …, zⱼ соревнуются за внимание. Доли внимания можно посчитать так: aᵢ = (e^(βzᵢ)) / (∑ⱼe^(βzⱼ)), β = 1 / T, где:
Если β большое, а T низкая, то распределение острое и мысль, которая забирает большую часть внимания, в итоге получает все внимание, которое есть. Если β маленькое, а T высокая — взгляд шире и мысли получают больше «воздуха»😁 .
3. Перейдем к структуре связей👻 .
4. Закончим динамикой🥵 .
В итоге доминанта отвечает за изначальный вход в существующий режим. Но в реальности бывает так, что этой доминанты просто не хватает, если негативный режим очень сильно устоялся в твоей голове и ничего на него не влияет😦 . В таком случае помогают сильные импульсы, например: смена обстановки, смена деятельности и так далее. Важно только ловить момент перехода и подкручивать доминанту так, чтобы режим, который тебе нравится, стал устойчивым 🧠 .
⌨️ — никогда об этом не задумывался.
💡 — просто закину эту реакцию.
😎 — пользуюсь доминантой ежедневно.
#статья 📚
Простыми словами
Доминанта — это призма: она не меняет факты, она меняет веса их интерпретации. Закрепишь в голове «сделаю минимум и продвинусь» — рутинные и сложные события читаются спокойнее
Раскроем суть
На мой взгляд, доминанта двигает два ключевых рычага:
1. Порог реакции
Что считать важным, а что — нет. Одно и то же событие с разным порогом проходит фильтр по-разному: либо «сделаю позже», либо «занимаюсь этим сейчас».
2. Луч внимания
Куда реально уйдут время и энергия. Узкий луч — сильный фокус, но на одну тему. Широкий луч — видишь альтернативы, но легко потерять фокус и уйти в рассуждения вместо конкретных действий.
Плюс есть инерция. Как только одна тема вырывается вперед, она «подтягивает» соседние: в голове формируется сюжет, и дальше все начинает подстраиваться под него
Давайте формализуем
1. Разберем пороговый взгляд на ситуацию
• x — факты, связанные с ситуацией.
• w — веса этих фактов.
• b — смещение.
Решение по ситуации — это y = sign(z)
• Рост b повышает шанс, что z > 0 → нейтральная ситуация читается как «у меня получится / я разберусь».
• Падение b → нейтральная ситуация читается как «я не смогу / ничего не получится».
2. Рассмотрим конкурирующие мысли и распределение внимания
• aᵢ — доля внимания к i-й мысли (сумма всех aᵢ = 1).
• β — «острота» распределения.
• Т — «температура» распределения.
Если β большое, а T низкая, то распределение острое и мысль, которая забирает большую часть внимания, в итоге получает все внимание, которое есть. Если β маленькое, а T высокая — взгляд шире и мысли получают больше «воздуха»
3. Перейдем к структуре связей
Мысли связаны как граф: одни активируют другие. Во времени внимание стремится выравниваться вдоль доминирующего собственного вектора матрицы связей графа, а именно туда, где связи сильнее всего. Роль доминанты — «подкрутить старт» и усилить нужные мысли так, чтобы система тянулась в правильную сторону☺️ .
4. Закончим динамикой
Реальная система будет нелинейной: сильная конкуренция между мыслями (большая β ), петли обратной связи, утомление. В такой системе возникают аттракторы — устойчивые режимы, например: «залипание» в страхе или стабильная продуктивность. В такой системе малые флуктуации держат внутри аттрактора, а редкие сильные импульсы могут выбить из устоявшегося аттрактора🌚 .
В итоге доминанта отвечает за изначальный вход в существующий режим. Но в реальности бывает так, что этой доминанты просто не хватает, если негативный режим очень сильно устоялся в твоей голове и ничего на него не влияет
#статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
1 25 20 8 1
Всем привет! Решил закинуть небольшой лайф-пост о разработке приложения, плюс пару мыслей, которые ясно осознал к 26 годам 🥸 .
Начну с приложения🥵 .
Я практически закончил с полировкой и оптимизацией новых фич, про которые писал в позапрошлом посте.
Также собираюсь потратить хорошее количество времени на то, чтобы разложить код по разным папкам и файлам внутри проекта, если можно так выразиться.
Хотя отмечу, что вначале я этим правилом не пренебрегал, поэтому уже есть достаточно хорошая структура, но из-за усложнения проекта она устарела. В общем и целом, буду дорабатывать☠️ .
Теперь о мыслях👍 .
Сейчас они засели в моей голове, как основа основ:
Список мыслей выше — практически очевиден, но я точно могу сказать, что либо раньше об этом не задумывался, либо просто понимал их как-то по-другому🤯 .
P.S. Это, пожалуй, максимальный лайф-пост: я писал его во время ночной прогулки, довольно спонтанно. Выйдет он уже утром, чтобы не грузить вас ночью. Если напишете что-нибудь в таком же духе в комментариях — с удовольствием почитаю🤔 .
P.P.S. Внизу поста прилагаю фотокарточку первого дня зимы.
🍾 — Согласен с выводами в посте.
💎 — Лайк за фотокарточку.
⌨️ — Напишу в комментариях, а может, и нет.
#лайф 🤝🏻
Начну с приложения
Я практически закончил с полировкой и оптимизацией новых фич, про которые писал в позапрошлом посте.
На самом деле заниматься своим продуктом и видеть, как он вырастает от простой идеи до чего-то, чем можно пользоваться ежедневно, — это очень воодушевляет😺 .
Также собираюсь потратить хорошее количество времени на то, чтобы разложить код по разным папкам и файлам внутри проекта, если можно так выразиться.
Сейчас, из-за того, что хочу быстрее сделать боевую версию, я этим пренебрег, но, поверьте, лучше так не делать, потому что мой main уже около 2к строк и похож на помойку. В нем неприятно ориентироваться😁 .
Хотя отмечу, что вначале я этим правилом не пренебрегал, поэтому уже есть достаточно хорошая структура, но из-за усложнения проекта она устарела. В общем и целом, буду дорабатывать
Теперь о мыслях
Сейчас они засели в моей голове, как основа основ:
• Лучше фокусироваться на том, что в твоей зоне влияния, и действовать, чем просто ждать, что все само сложится так, как ты хочешь😐 .
• Жить проще, когда берёшь на себя свою долю ответственности за свои решения. Тогда вместо поиска виноватых мозг переключается на самоанализ, и почти каждое такое переключение становится точкой роста🌚 .
• В молодости важно как можно раньше начать осознанно искать дела, которые по-настоящему интересны. Чем раньше начинаешь такой поиск и задерживаешься вокруг того, что цепляет, тем меньше потом сожалений о годах в откровенно чужой деятельности🤯 .
• Чем раньше учишься нормально чувствовать себя наедине с собой — без бегства в шум и чужие ожидания, — тем проще потом общаться с людьми и не терять себя в них☺️ .
Список мыслей выше — практически очевиден, но я точно могу сказать, что либо раньше об этом не задумывался, либо просто понимал их как-то по-другому
P.S. Это, пожалуй, максимальный лайф-пост: я писал его во время ночной прогулки, довольно спонтанно. Выйдет он уже утром, чтобы не грузить вас ночью. Если напишете что-нибудь в таком же духе в комментариях — с удовольствием почитаю
P.P.S. Внизу поста прилагаю фотокарточку первого дня зимы.
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
1 27 24 12 2 1
Всем привет! Закидываю в ленту очередной лайф-пост 😤 .
Закончил две трудные недели:
Без косяков, конечно, не обошлось:
Сегодня наконец-то позволил себе нормально выдохнуть и просто отдохнуть.
Этот пост как раз о том, чтобы вы тоже не забывали по-человечески отдыхать и выделять себе хотя бы пару дней без гонки.
Это прям важно, если хочется держать продуктивность ровнее, без жёстких качелей.
Всем хороших выходных😎 !
⌨️ — читаю в режиме отдыха.
🍾 — заберу выводы себе.
💎 — тоже пора устроить себе выходной.
#лайф 🤝🏻
Закончил две трудные недели:
• Отработал 12 рабочих дней подряд🥵 .
• Прогнал своё приложение по «краевым» кейсам, попробовал его сломать и поискать дыры в архитектуре — на удивление, ничего критичного не нашёл😎 .
• Разнёс кучу кода из main по отдельным файлам, пересобрал структуру проекта и нормально связал части между собой👾 .
• Не забывал про спорт и растяжку — наконец-то вижу прогресс, а не просто галочки😺 .
Без косяков, конечно, не обошлось:
• Рваный режим и недосып🌚 .
• Не самое правильное питание — классика, когда хочется закрыть просадку дофамина🥸 .
Сегодня наконец-то позволил себе нормально выдохнуть и просто отдохнуть.
Этот пост как раз о том, чтобы вы тоже не забывали по-человечески отдыхать и выделять себе хотя бы пару дней без гонки.
Это прям важно, если хочется держать продуктивность ровнее, без жёстких качелей.
Всем хороших выходных
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет 🥱 ! Давно ничего не писал сюда, пора исправляться. Сегодня пост про рабочее место в прямом смысле и немного про мой мини-апп. Если непонятно, как это связано — сейчас расскажу 🎮 .
Я впервые по-настоящему почувствовал, насколько сильно эргономичное рабочее место влияет на продуктивность. Раньше вообще не думал ни про эргономику кресла, ни про высоту стола, хотя за ним провожу полдня😨 .
Осознал я это только тогда, когда сам всё выбрал, купил и собрал под себя🤑 . Вышло недёшево, но в этот раз сознательно не экономил. Кстати, клавиатура и мышь тоже важны: чем они приятнее в использовании, тем легче сидеть дольше и не разваливаться вниманием 👈 .
С мышкой и клавиатурой всё понятно, а вот со столами и креслами сложнее. Кому-то стандартные варианты мелкие, кому-то, наоборот, огромные. Вот здесь в игру и включается математика, а именно: нормальное (гауссово ) распределение 😐 . Большинство людей — около «среднего» роста, под них и делают массовую мебель. Если вы ближе к краям распределения, т.е. выше или ниже среднего, — подобрать удобное рабочее место сложнее и чаще всего дороже 👊 :
Через эту призму удобно смотреть на многое вокруг: сиденья в транспорте, высоту потолков в новостройках и т.д. Большая часть вещей делается под «среднего» человека, потому что такие вещи проще массово продать. Всё, что ориентировано на более узкую группу, почти всегда выходит дороже⌨️ .
А при чём тут приложение? Очень даже при чём: рабочее место для меня стало экспериментальным полигоном, сначала я его заапгрейдил, а потом замерил эффект своим же мини-аппом😎 .
Я замерял, сколько времени трачу на свои проекты и дела за пределами работы — сначала со старым рабочим местом, потом уже с новым. По цифрам и ощущениям вышло так:
Параллельно я наконец-то пробил психологический блок по бэкенду мини-аппа и уже сделал несколько шагов:
Это, конечно, не финал. Дальше — забор данных из БД при старте приложения, аккуратный деплой и тесты с разных устройств🙌 🙌 .
P.S. Как только закончу с бэком, сделаю отдельный пост про само приложение: что оно умеет и зачем оно вообще нужно. Если честно, мне самому уже надоело тянуть с этим🥵 .
💡 — давай подробнее про распределения и их применение.
💎 — интересно про порядок разработки бэка мини-аппа от и до.
⌨️ — жду анонс приложения и лайф-посты.
#лайф 🤝🏻
Я впервые по-настоящему почувствовал, насколько сильно эргономичное рабочее место влияет на продуктивность. Раньше вообще не думал ни про эргономику кресла, ни про высоту стола, хотя за ним провожу полдня
Осознал я это только тогда, когда сам всё выбрал, купил и собрал под себя
С мышкой и клавиатурой всё понятно, а вот со столами и креслами сложнее. Кому-то стандартные варианты мелкие, кому-то, наоборот, огромные. Вот здесь в игру и включается математика, а именно: нормальное (
Я, например, долго думал, что придётся делать всё на заказ, но в итоге нашёл почти идеальный вариант, потратив реально много времени на поиски🚪 .
Через эту призму удобно смотреть на многое вокруг: сиденья в транспорте, высоту потолков в новостройках и т.д. Большая часть вещей делается под «среднего» человека, потому что такие вещи проще массово продать. Всё, что ориентировано на более узкую группу, почти всегда выходит дороже
А при чём тут приложение? Очень даже при чём: рабочее место для меня стало экспериментальным полигоном, сначала я его заапгрейдил, а потом замерил эффект своим же мини-аппом
Я замерял, сколько времени трачу на свои проекты и дела за пределами работы — сначала со старым рабочим местом, потом уже с новым. По цифрам и ощущениям вышло так:
• Примерно на 65% выросло время, которое я могу спокойно тратить на работу со своими задачами🤔 .
• Полностью ушли фоновые боли в спине и шее — сейчас что-то ноет только после хорошей тренировки с гирей🤔 .
• Тренироваться стал больше на 1 тренировку в неделю🤔 .
Параллельно я наконец-то пробил психологический блок по бэкенду мини-аппа и уже сделал несколько шагов:
• Настроил виртуальное окружение на Python⏳ .
• Описал БД и поднял кластер PostgreSQL в облаке — оказалось, что это не так страшно. Сейчас разработка стоит мне примерно 1 рубль в час (кластер останавливаю, когда не работаю, и выбрал минимальные настройки ). Боевая конфигурация, конечно, будет дороже🟦 .
• Полностью описал методы API и погонял их через Swagger — очень удобный способ тестировать эндпоинты⚙️ .
• Подключил API к клиенту так, чтобы новые записи сразу улетали в БД🖥 .
Это, конечно, не финал. Дальше — забор данных из БД при старте приложения, аккуратный деплой и тесты с разных устройств
P.S. Как только закончу с бэком, сделаю отдельный пост про само приложение: что оно умеет и зачем оно вообще нужно. Если честно, мне самому уже надоело тянуть с этим
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
2 29 21 18 1
Всем привет ⌨️ ! Так получилось, что я приболел на днях и сейчас пожинаю все плоды температуры, кашля и заложенного носа 😐 .
Как хорошо, что есть место, где можно просто поделиться мыслями и рассказать, как это всё проходит. Вы бы знали как я не люблю болеть😦 .
Вообще, то, что я заболел, сюрпризом не было: ещё на прошлой неделе чувствовал себя не очень🥵 . В этот раз решил снять нагрузку сразу, как только понял, что что-то не так:
Как думаете, помогло ли мне это всё🤔 ?
Ответ:нет.
Помогло ли это отсрочить надвигающуюся простуду🥵 ?
Ответ:определённо да.
По итогу, сейчас в голове крутятся два варианта:
Я склоняюсь к первому варианту, потому что второй слишком пессимистичный и категоричный.
Думаю, что как только простуда начала отходить, я слишком резко вкатился обратно в жизнь с кучей активностей😨 .
Вот такая небольшая работа над ошибками в виде лайф-поста. Подержал вас в курсе, получается😁 .
☺️ — Выздоравливай.
⌨️ — Сам сейчас болею.
💡 — Держи в курсе.
#лайф 🤝🏻
Как хорошо, что есть место, где можно просто поделиться мыслями и рассказать, как это всё проходит. Вы бы знали как я не люблю болеть
Вообще, то, что я заболел, сюрпризом не было: ещё на прошлой неделе чувствовал себя не очень
• Делал растяжку и отжимания вместо гири😩 .
• Перестал заниматься приложением по поздним вечерам — оставлял небольшие окна по 40–50 минут😩 .
• Как видите, канал тоже ненадолго заморозился😩 .
• Старался спать больше 8 часов, в идеале — 9😩 .
• Старался нормально есть😩 .
Как думаете, помогло ли мне это всё
Ответ:
Помогло ли это отсрочить надвигающуюся простуду
Ответ:
По итогу, сейчас в голове крутятся два варианта:
• Либо я слишком рано решил, что надвигающаяся болезнь отступила🤪 .
• Либо если уж чувствуешь, что заболеешь, то ничего с этим не сделать☠ .
Я склоняюсь к первому варианту, потому что второй слишком пессимистичный и категоричный.
Думаю, что как только простуда начала отходить, я слишком резко вкатился обратно в жизнь с кучей активностей
Вот такая небольшая работа над ошибками в виде лайф-поста. Подержал вас в курсе, получается
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
2 49 24 14 2
Ребята, всем привет 😐 ! Врываюсь с очередным лайф-постом прямо накануне Нового года 🚶 .
Прошло чуть больше двух недель с момента, как я заболел. Я даже не думал, что будет настолько тяжело вернуться к обычным рабочим нагрузкам😐 .
Казалось бы, всё отлично — можно продолжать активно работать, тренироваться и заниматься приложением с каналом. На деле — не всё так просто.
Приходя домой, не выходит продуктивно сидеть и делать что-то полезное. Есть только желание получать быстрый дофамин с помощью компьютерных игр и фильмов🙌 🙌 .
Очень тяжело вылезти из состояния апатии после болезни. Хотя, наверное, это нормально: организм тратит все силы на то, чтобы выздороветь, а потом ему нужно перезарядить «батарейку». Кстати, это состояние не похоже просто на выгорание от большой нагрузки. Оно скорее как внешнее ограничение на систему (твой организм ), которое кто-то поставил 🌧 .
Вот тут и возникает проблема: головой рвёшься вперёд, а телом просто сидишь на диване — и уже устал🎮 .
Буду стараться выбираться из этого физической активностью на праздниках: сначала прогулки, потом тренировки. А там и остальное должно наладиться🪖 .
Просто немного контекста для понимания: за эти две недели я занимался разработкой приложения часа 3 всего. Потестил работу API, зафиксировал баги с обращением к API в клиенте приложения — и всё. До правок я не дошёл😙 .
Но думаю, что на праздниках получится прийти в себя, к тому же основная работа на этот период отступит⌨️ .
Вот как-то так на данный момент. Я, кстати, ещё думал над темами постов и решил написать лонгрид на тему перфекционизма. Ну и ещё много чего придумал — со временем расскажу😎 .
💎 — терпеть не могу болеть.
🍾 — тоже в апатии после болезни.
⌨️ — почитал бы про перфекционизм.
#лайф 🤝🏻
Прошло чуть больше двух недель с момента, как я заболел. Я даже не думал, что будет настолько тяжело вернуться к обычным рабочим нагрузкам
Симптомы гриппа прошли достаточно быстро: температура вернулась в норму, восстановился аппетит, я смог нормально дышать носом и не кашлять 24/7. На это всё ушло где-то 6–7 дней🫥 .
Казалось бы, всё отлично — можно продолжать активно работать, тренироваться и заниматься приложением с каналом. На деле — не всё так просто.
У меня буквально есть силы только на работу🤔 .
Приходя домой, не выходит продуктивно сидеть и делать что-то полезное. Есть только желание получать быстрый дофамин с помощью компьютерных игр и фильмов
Очень тяжело вылезти из состояния апатии после болезни. Хотя, наверное, это нормально: организм тратит все силы на то, чтобы выздороветь, а потом ему нужно перезарядить «батарейку». Кстати, это состояние не похоже просто на выгорание от большой нагрузки. Оно скорее как внешнее ограничение на систему (
Вот тут и возникает проблема: головой рвёшься вперёд, а телом просто сидишь на диване — и уже устал
Буду стараться выбираться из этого физической активностью на праздниках: сначала прогулки, потом тренировки. А там и остальное должно наладиться
Просто немного контекста для понимания: за эти две недели я занимался разработкой приложения часа 3 всего. Потестил работу API, зафиксировал баги с обращением к API в клиенте приложения — и всё. До правок я не дошёл
Но думаю, что на праздниках получится прийти в себя, к тому же основная работа на этот период отступит
Вот как-то так на данный момент. Я, кстати, ещё думал над темами постов и решил написать лонгрид на тему перфекционизма. Ну и ещё много чего придумал — со временем расскажу
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
2 26 18 13 1
Всем привет 🔥 ! С наступающим Новым Годом вас, ребята. Я благодарен вам за то, что мы вместе прошли через 2025 год и также войдем в 2026. Я очень рад, что вы со мной 🥇 .
Давайте разберем базовую проблему с перфекционизмом, и если она у вас есть — это будет повод оставить ее в 2025, а в 2026 войти уже без нее😎 .
Перфекционизм — это когда ты не делаешь дело, потому что оно "ещё не идеально"💀 .
Снаружи это выглядит благородно: "я просто хочу качество", но если копнуть это обычно так:
Самое токсичное, что перфекционизм часто маскируется под высокие стандарты. Хотя по факту — это не про качество, это про избегание боли🧠 .
Давайте формализуем этот перфекционизм, чтобы стало понятно как с ним бороться:
1. Модель перфекционизма как "функция потерь" (loss function ):
Представь, что качество результата — это число q от 0 до 1, где 0 — это мусор, а 1 — это идеально🚶 . Тогда "боль" от задачи можно представить как функцию L(q), которая показывает, насколько плохо получилось. Если подход к задаче здоровый, то потери убывают плавно, например так:
Сделал лучше → стало меньше "болеть". Всё логично. А вот перфекционизм часто выглядит как штраф с обрывом, смотрите:
То есть мозг говорит: "Сделал на 0.94? Всё равно теряем 100 из 100, всё плохо." И ты залипаешь в правках того, что скорее всего даже не заметят пользователи, читатели и так далее💡 .
Вытащим проблему: такая L(q) не оптимизирует результат — она заставляет избегать действия, потому что почти любой результат воспринимается как провал😦 .
2. Почему “идеально” почти не случается (и это нормально ):
Почти на любой результат — текст, код, выступление можно посмотреть со стороны статистики. Давайте представим качество результата как случайную величину🤔 :
Перфекционизм хочет, чтобы каждая попытка была из правого хвоста нормального распределения, то есть: "10/10 всегда". Но хвосты нормального распределения — это редкость😐 .
Допустим, если "идеально" — это: μ + 3σ, то вероятность такого результата ≈ 0.13%. А это примерно 1 раз на 770 попыток🤷♀️ .
И при всем этом перфекционист обычно такой: "Почему у меня не получилось идеально с первой?"🚶♀️
3. Маленький пример “из жизни” (чтобы было на что опереть теорию ):
Допустим, ты пишешь пост:
И дальше начинается перфекционистская классика: ты добиваешь 0.95+, но каждая правка даёт микроэффект, а времени и нервов сжирает в разы больше🥴 .
То есть по факту ты платишь очень дорогую цену за прирост с 0.93 до 0.96 — и часто такие правки заканчиваются моментальным выгоранием🎮 .
4. Как бороться с этим (самое простое, что пришло в голову ):
Подытожим: лучший антидот от перфекционизма — это не мотивация, а статистика. Тебе не нужно каждый раз попадать в правый хвост нормального распределения. Тебе нужно делать больше попыток, тогда твое положение само сместится в правую часть хвоста😑 .
💡 — перфекционизм моя проблема.
☺️ — поборол перфекционизм, в посте база.
🌊 — что же ждать в следующем посте?
#статья 📚
Давайте разберем базовую проблему с перфекционизмом, и если она у вас есть — это будет повод оставить ее в 2025, а в 2026 войти уже без нее
Перфекционизм — это когда ты не делаешь дело, потому что оно "ещё не идеально"
Снаружи это выглядит благородно: "я просто хочу качество", но если копнуть это обычно так:
• шлифуешь мелочи: шрифт, формулировку, переменную, анимацию🥱 .
• откладываешь релиз / пост / разговор🤔 .
• прогресс = 0, потому что ничего не вышло в мир😋 .
Самое токсичное, что перфекционизм часто маскируется под высокие стандарты. Хотя по факту — это не про качество, это про избегание боли
Давайте формализуем этот перфекционизм, чтобы стало понятно как с ним бороться:
1. Модель перфекционизма как "функция потерь" (
Представь, что качество результата — это число q от 0 до 1, где 0 — это мусор, а 1 — это идеально
L(q) = (1 – q)².
Сделал лучше → стало меньше "болеть". Всё логично. А вот перфекционизм часто выглядит как штраф с обрывом, смотрите:
L(q) = { 100, q < 0.95;
(1 – q)², если q ≥ 0.95 }
То есть мозг говорит: "Сделал на 0.94? Всё равно теряем 100 из 100, всё плохо." И ты залипаешь в правках того, что скорее всего даже не заметят пользователи, читатели и так далее
Вытащим проблему: такая L(q) не оптимизирует результат — она заставляет избегать действия, потому что почти любой результат воспринимается как провал
2. Почему “идеально” почти не случается (
Почти на любой результат — текст, код, выступление можно посмотреть со стороны статистики. Давайте представим качество результата как случайную величину
Q ~ N(μ, σ²),
• μ — текущий уровень выполнения.
• σ — разброс: сон, настроение, задача, удача и так далее.
Перфекционизм хочет, чтобы каждая попытка была из правого хвоста нормального распределения, то есть: "10/10 всегда". Но хвосты нормального распределения — это редкость
Допустим, если "идеально" — это: μ + 3σ, то вероятность такого результата ≈ 0.13%. А это примерно 1 раз на 770 попыток
И при всем этом перфекционист обычно такой: "Почему у меня не получилось идеально с первой?"
3. Маленький пример “из жизни” (
Допустим, ты пишешь пост:
• Первая версия — Q = 0.70. Норм, но сыровато.
• Вторая — Q = 0.82. Уже читаемо и по делу.
• Третья — Q = 0.90. Приятно и легко читается.
• Четвёртая — Q = 0.93. Почти идеал.
И дальше начинается перфекционистская классика: ты добиваешь 0.95+, но каждая правка даёт микроэффект, а времени и нервов сжирает в разы больше
То есть по факту ты платишь очень дорогую цену за прирост с 0.93 до 0.96 — и часто такие правки заканчиваются моментальным выгоранием
4. Как бороться с этим (
• Ставим порог в "достаточно хорошо": например, Q ≥ 0.80. По факту, это критерий остановки. Если его не выставлять, то продолжать задачу можно бесконечно🤯 .
• Ставим таймбокс на задачу: "Не более n минут". Это возвращает в реальность🤯 .
• Ставим здоровую стратегию: не выжимать один результат до 0.99,
а сделать 10 результатов по 0.8 и поднять μ через опыт и фидбек🤯 .
• Разделяем "черновик" и "итог": сначала делаем так, чтобы работало, потом так, чтобы работало правильно, потом так, чтобы работало быстро. Это я использую, когда пишу своё приложение🤯 .
Подытожим: лучший антидот от перфекционизма — это не мотивация, а статистика. Тебе не нужно каждый раз попадать в правый хвост нормального распределения. Тебе нужно делать больше попыток, тогда твое положение само сместится в правую часть хвоста
#статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
1 34 16 13 5
Ребята, всем привет!) С наступившим Новым годом 🌚 .
Решил наконец сделать первый розыгрыш в этом канале — разыграю вот такой подарок: https://t.me/nft/InputKey-117533
Передавать буду сам со своего аккаунта: @lesha_privet
Нюанс:
Чтобы участвовать, нужно:
Хотите — кидайте друзьям, пусть тоже поучаствуют, но это естественно по желанию.
Инвайт-ссылка:
https://t.me/+RNKHBw94FGEwZTNi
Если розыгрыш зайдёт — буду делать такие штуки почаще. Всем удачи🤝 🤝 .
😎 — участвую.
⌨️ — закинул другу.
🔮 — вот бы почаще так.
Решил наконец сделать первый розыгрыш в этом канале — разыграю вот такой подарок: https://t.me/nft/InputKey-117533
Передавать буду сам со своего аккаунта: @lesha_privet
Нюанс:
• Покупал подарок прямо в Telegram, поэтому передать победителю смогу только 24.01.2026 после 18:30.
• Значит, до этого момента розыгрыш и идёт😎 .
Чтобы участвовать, нужно:
• Быть подписанным на канал.
• Нажать кнопку «участвую» под постом.
Хотите — кидайте друзьям, пусть тоже поучаствуют, но это естественно по желанию.
Инвайт-ссылка:
https://t.me/+RNKHBw94FGEwZTNi
Если розыгрыш зайдёт — буду делать такие штуки почаще. Всем удачи
Please open Telegram to view this post
VIEW IN TELEGRAM
3 57 38 11
Привет 😎 ! Сегодня решил написать небольшую статью о том, что я понял за 2+ года работы в аналитике.
Самое базовое — это образ мышления🤯 . Для меня это фундамент работы аналитиком.
Есть один рабочий паттерн, который закрывает большую часть задач, с которыми я сталкиваюсь на работе😁 . Вот как он выглядит:
1. Максимально подробно выясняем задачу, которую будем решать😤 .
На первый взгляд звучит просто. Но это работает только если задача сформулирована идеально, а такое бывает редко.
На этом этапе важно задавать много вопросов и вытаскивать максимум контекста. Всё, что не выяснили здесь, почти гарантированно вылезет проблемами дальше.
2. Прикидываем возможные варианты решения😐 .
Когда задача стала понятнее, полезно остановиться и подумать: а какие вообще есть варианты решения?
Да, это муторно. Да, хочется сделать “побыстрее”. Но именно здесь закладывается качество будущего решения.
3. Выбираем целевой вариант😏 .
Если вариантов несколько — почти всегда стоит обсудить их с заказчиком или клиентом.
Да, ответственность — это некомфортно, но без нее рост медленный. Со временем начинаешь понимать, что такие моменты и есть реальный профессиональный апгрейд. Особенно если в итоге твой выбор оказывается успешным. А если нет — это всё равно полезный опыт.
4. Декомпозируем решение🥵 .
Когда целевой вариант выбран, его нужно разложить на мелкие задачи, которые можно быстро делать и проверять.
Поэтому важно много коммуницировать и объяснять общую логику решения, даже если конкретная задача кажется совсем мелкой.
5. Принимаем и тестируем😀 .
Под конец крайне важно не забивать на тестирование.
Большая часть багов, которые вылезают в проде, появляются именно потому, что этот этап проходится формально или “на глаз”.
6. Доводим результат до заказчика / клиента🧱 .
Когда ты хорошо понял задачу, нормально её декомпозировал и тщательно проверил результат — донести решение обычно уже не так сложно.
Задача закрыта💸 .
По такому паттерну можно пустить 80% типичных задач в аналитике⌨️ . Кстати, для меня это очень похоже на исследование функции:
Если пропустить хотя бы один шаг — функция начинает “ломаться”, и всё нужно переделывать😦 .
Отдельно стоит сказать про то, что такой подход хорошо качает базу, без которой далеко не уедешь🥵 :
В итоге, для меня это рабочая основа, которая реально помогает в повседневных задачах. Всё остальное — надстройки☺️ .
Интересно почитать, кем работаете вы и какие паттерны используете в своей работе✅ .
⌨️ — работаю аналитиком, базовый подход.
💡 — интересно почитать ещё что-то из этой области.
🔮 — напишу про свою работу в комментарии.
#статья 📚
Самое базовое — это образ мышления
Есть один рабочий паттерн, который закрывает большую часть задач, с которыми я сталкиваюсь на работе
1. Максимально подробно выясняем задачу, которую будем решать
На первый взгляд звучит просто. Но это работает только если задача сформулирована идеально, а такое бывает редко.
🤔 Очень часто заказчик или клиент сам до конца не понимает, что именно он хочет. Я не раз ловил себя на том, что начинаю “решать задачу”, которая на самом деле существует только в общих словах.
На этом этапе важно задавать много вопросов и вытаскивать максимум контекста. Всё, что не выяснили здесь, почти гарантированно вылезет проблемами дальше.
2. Прикидываем возможные варианты решения
Когда задача стала понятнее, полезно остановиться и подумать: а какие вообще есть варианты решения?
🤔 Здесь важно не хвататься за первую идею, которая пришла в голову, а хотя бы выявить и сравнить 2–3 варианта между собой. Также, часто есть типовые подходы, которые уже где-то применялись, их не нужно игнорировать.
Да, это муторно. Да, хочется сделать “побыстрее”. Но именно здесь закладывается качество будущего решения.
3. Выбираем целевой вариант
Если вариантов несколько — почти всегда стоит обсудить их с заказчиком или клиентом.
🤔 Это позволяет заранее отсечь слабые решения и зафиксировать одно целевое. Иногда бывает, что приходится брать ответственность на себя и выбирать решение самостоятельно.
Да, ответственность — это некомфортно, но без нее рост медленный. Со временем начинаешь понимать, что такие моменты и есть реальный профессиональный апгрейд. Особенно если в итоге твой выбор оказывается успешным. А если нет — это всё равно полезный опыт.
4. Декомпозируем решение
Когда целевой вариант выбран, его нужно разложить на мелкие задачи, которые можно быстро делать и проверять.
🤔 Декомпозиция почти всегда ускоряет работу, особенно если над задачей работает несколько человек. Но тут есть нюанс: исполнитель отдельной маленькой задачи может не видеть всей картины .
Поэтому важно много коммуницировать и объяснять общую логику решения, даже если конкретная задача кажется совсем мелкой.
5. Принимаем и тестируем
Под конец крайне важно не забивать на тестирование.
🤔 Тестирование — это попытка сломать уже готовое решение. Если более подробно:
• Сначала проверяем общее решение.
• Потом краевые случаи.
• Потом тестируем на ограничения.
Большая часть багов, которые вылезают в проде, появляются именно потому, что этот этап проходится формально или “на глаз”.
6. Доводим результат до заказчика / клиента
Когда ты хорошо понял задачу, нормально её декомпозировал и тщательно проверил результат — донести решение обычно уже не так сложно.
🤔 Этот этап тоже требует навыка: нужно уметь объяснять сложные вещи простыми словами и показывать ценность того, что сделано.
Задача закрыта
По такому паттерну можно пустить 80% типичных задач в аналитике
• Сначала смотрим область определения🥇 .
• Потом анализируем общее поведение и краевые значения🥇 .
• В итоге, проверяем результат, чтобы убедиться в корректности решения🔮 .
Если пропустить хотя бы один шаг — функция начинает “ломаться”, и всё нужно переделывать
Отдельно стоит сказать про то, что такой подход хорошо качает базу, без которой далеко не уедешь
• Hard skills — знания предметной области и инструментов. Это пункты: 2, 4, 5.
• Soft skills — коммуникация, умение договариваться и объяснять. Это пункты: 1, 3, 6.
В итоге, для меня это рабочая основа, которая реально помогает в повседневных задачах. Всё остальное — надстройки
Интересно почитать, кем работаете вы и какие паттерны используете в своей работе
#статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
2 46 19 11
Привет 😍 ! Сегодня решил написать про рефлексию. Я давно пользуюсь этим инструментом, поэтому пришло время поделиться тем, что понял для себя 😐 .
Рефлексия помогает оценить свои поступки и понять:
Мне нравится такая метафора: рефлексия — это долото. Есть «камень» — действие или ситуация. И если работать аккуратно, можно «высечь» из него статуэтку: увидеть причинно-следственные связи👍 .
А зачем она вообще нужна🥸 ?
1) Когда действия не приближают к цели🚨 :
2) Когда сложно разобраться в чувствах🚨 :
3) В итоге грамотная рефлексия может🚨 :
В чём тогда подвох🥵 ?
Если кратко, то я вынес для себя две максимально неприятные проблемы:
Короче, продолжая метафору: каменщик может так увлечься долотом, что просто расколет почти готовую статуэтку🛑 .
А при чём тут математика🤷♀️ ?
Вообще процесс рефлексии похож на метод последовательного приближения👈 :
Закрепим простым примером из жизни:
Дано: я третий вечер подряд залипаю в игры и сериалы вместо того, чтобы делать что-то важное🥵 .
Решение:
Вывод: подход «соберись тряпка» не сработает, нужно уменьшить затраты сил на старт важного дела: таймбокс 20 минут на самый простой первый шаг и базовое правило сна, например, лечь до 00:30. Если после 20 минут пошло — продолжаю. Если нет — значит, реально нужен отдых, и я закрываю день без чувства вины🤯 .
Вот такая история у меня с рефлексией. Интересно, как у вас💬 ?
🍾 — пользуюсь постоянно, уже на опыте.
🔮 — загоняюсь из-за рефлексии, не моё.
😎 — буду пробовать использовать.
💎 — похоже на аналитику, только вместо клиента — ты сам.
#хинт 😮💨
Рефлексия помогает оценить свои поступки и понять:
• Что сработало, что нет🤔
• Где ты был прав, где ошибся🤔
• И почему всё вообще произошло именно так🤔
Мне нравится такая метафора: рефлексия — это долото. Есть «камень» — действие или ситуация. И если работать аккуратно, можно «высечь» из него статуэтку: увидеть причинно-следственные связи
А зачем она вообще нужна
1) Когда действия не приближают к цели
• Берёшь то, что делаешь сейчас, и разбираешь: из какой причины это выросло. Тут важно докопаться до истинной мотивации.
• Когда причина ясна — корректируешь действия так, чтобы они реально вели к цели.
2) Когда сложно разобраться в чувствах
• Берёшь ситуацию и эмоцию, которую в ней испытывал, и ищешь первопричину: почему ты так отреагировал.
• Поняв причину, начинаешь иначе реагировать в похожих ситуациях, то есть меняешь «внутреннюю настройку».
3) В итоге грамотная рефлексия может
• Экономить твои деньги и время на тесте идей и гипотез.
• Экономить нервы, если дискомфортные ситуации повторяются, а ты не понимаешь почему.
В чём тогда подвох
Если кратко, то я вынес для себя две максимально неприятные проблемы:
• Нет «третьего лица», которое со стороны проверит твою логику на адекватность🫣 .
• Рефлексия легко превращается в самобичевание: «это я во всём виноват», и дальше по кругу😦 .
Короче, продолжая метафору: каменщик может так увлечься долотом, что просто расколет почти готовую статуэтку
А при чём тут математика
Вообще процесс рефлексии похож на метод последовательного приближения
• x₀ — первое объяснение: «почему я так сделал и что чувствовал?»😡
• Дальше итерации x₁, x₂,… по твоему «правилу рефлексии». Правило задаёшь ты сам: оно про то, насколько жёстко ты копаешься в своих мыслях и чувствах, где именно ставишь границы😐 .
• И в идеале ты сходишься к более честной причине, к которой ранее мысленно не приходил🌚 .
Закрепим простым примером из жизни:
Дано: я третий вечер подряд залипаю в игры и сериалы вместо того, чтобы делать что-то важное
Решение:
• Факт: уже 3 дня вечером я «сливаюсь» в дешёвый дофамин❌ .
• Что я чувствую: усталость, раздражение, лёгкая тревога из-за того, что я опять ничего полезного не сделал😩 .
• Зачем я это делаю на самом деле: мозг хочет быстрый отдых, потому что весь ресурс истощился🤬 .
• Истинная причина: либо я перегружен, либо на начало важного дела нужно потратить очень много сил за раз (страшно и непонятно, с чего начать )🏥 .
Вывод: подход «соберись тряпка» не сработает, нужно уменьшить затраты сил на старт важного дела: таймбокс 20 минут на самый простой первый шаг и базовое правило сна, например, лечь до 00:30. Если после 20 минут пошло — продолжаю. Если нет — значит, реально нужен отдых, и я закрываю день без чувства вины
Вот такая история у меня с рефлексией. Интересно, как у вас
#хинт 😮💨
Please open Telegram to view this post
VIEW IN TELEGRAM
3 23 22 17 12
Math and Code
Ребята, всем привет!) С наступившим Новым годом 🌚 . Решил наконец сделать первый розыгрыш в этом канале — разыграю вот такой подарок: https://t.me/nft/InputKey-117533 Передавать буду сам со своего аккаунта: @lesha_privet Нюанс: • Покупал подарок прямо…
Please open Telegram to view this post
VIEW IN TELEGRAM
2 18 16 10 1
Всем привет 😎 !
Время розыгрыша пролетело очень быстро. Я даже не заметил👍 .
Сейчас решил немного отдохнуть от своего приложения — ошибки с БД меня добили ещё в конце 2025 года, и в новогодние праздники был небольшой тильт😦 .
Но отдых от постоянной работы даёт плюсы — появились новые идеи. В итоге я почти 2 недели занимался ботом, у которого ИИ под капотом.
MVP-версию практически добил, и самое главное — разобрался с оплатами этого ИИ-сервиса🥵 . Это, кстати, сейчас реально сложный этап, местами даже сложнее, чем сама разработка 🤯 .
С ботом тянуть не буду, поэтому сейчас все силы бросил туда. Суть простая:
Про механику и кейсы распишу отдельным постом.
Чтобы этот лайф-пост навёл на мысли — закину несколько тейков, над которыми можно подумать:
Как вам такие тейки? Пока делал бота, они сами лезли в голову — и я решил собрать их в одном лайф-посте, вместо того чтобы растягивать на 3 отдельных☺️ .
И ещё: думаю разгребать список тем для постов и сделать хорошую навигацию по моему каналу, а то тут уже много всего накопилось💪 .
🍾 — тейки базовые, согласен с ними.
🔮 — тоже мучаюсь с оплатами ИИ-сервисов.
💡 — жду тест бота.
😎 — обновленная навигация в канале не помешала бы.
#лайф 🤝🏻
Время розыгрыша пролетело очень быстро. Я даже не заметил
Сейчас решил немного отдохнуть от своего приложения — ошибки с БД меня добили ещё в конце 2025 года, и в новогодние праздники был небольшой тильт
Но отдых от постоянной работы даёт плюсы — появились новые идеи. В итоге я почти 2 недели занимался ботом, у которого ИИ под капотом.
MVP-версию практически добил, и самое главное — разобрался с оплатами этого ИИ-сервиса
С ботом тянуть не буду, поэтому сейчас все силы бросил туда. Суть простая:
Он помогает переводить человеческий текст с кучей эмоций и брани в деловую, фактическую речь — без наездов и перехода на личности😁 .
Про механику и кейсы распишу отдельным постом.
Чтобы этот лайф-пост навёл на мысли — закину несколько тейков, над которыми можно подумать:
1. Стать кем-то — это не удачный момент и не стечение обстоятельств, а выбор и действия под этот выбор😤 .
2. Про деньги проще думать, если держать в голове, что их «отбирают» (рынок / конкуренты / реальность ), а не «выдают» просто за старания и хорошие качества👻 .
3. Если есть идея — лучше начинать сейчас, а не ставить дедлайны «на потом». Чем дальше срок, тем больше мозг рисует картинку, что всё получилось. А потом ты боишься проверить реальность. В общем, чем быстрее тестишь — тем выше шанс, что нащупаешь идею, которая реально выстрелит😐 .
Как вам такие тейки? Пока делал бота, они сами лезли в голову — и я решил собрать их в одном лайф-посте, вместо того чтобы растягивать на 3 отдельных
И ещё: думаю разгребать список тем для постов и сделать хорошую навигацию по моему каналу, а то тут уже много всего накопилось
#лайф 🤝🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
6 22 16 13 6 5
Всем привет 🤝 🤝 ! Пока делаю своего бота, решил написать про пару нюансов разработки, которые легко пропустить 👍 .
Вообще такие моменты могут сэкономить несколько часов отладки, если подумать о них заранее. Скажу честно — я время себе не сэкономил первоначально, но в следующий раз точно сэкономлю. Ниже поделюсь основами, которые вынес для себя — вдруг кому-то тоже пригодятся😍 .
1. Почему ответы бота могут «ломаться», если в ответах используется HTML-вёрстка🥵 ?
Суть:
Проблема:
Решение:
По-человечески:
Важный нюанс:
Вывод: чтобы бот не ломал ответы на ровном месте — можно один раз написать корректный обработчик текста с escape() и разбивкой на части, а дальше просто стандартно его использовать✅ .
2. Почему если в системном промте, который уходит из бота в ИИ-сервис, жёстко задан язык ответа — модель ИИ просто игнорирует эту настройку и становится непредсказуемой🥵 ?
Суть:
Проблема:
Решение:
Вывод: если хочешь стабильный язык ответа — лучше не пытаться «переломить» ИИ модель одной жёсткой строкой, просто дай ей системный промт на нужном языке✅ .
Вот такие два момента помогают сэкономить 1-2 дня разборов с кривыми ответами или с нестабильным поведением ИИ модели🤓 . Скажите, было полезно? Могу ещё рассказать про нюансы разработки ботов как-нибудь 👩💻 .
⌨️ — Было полезно.
☺️ — Просто лайк.
🔮 — Делаю ботов, жду еще разборы.
💡 — Еще не делаю ботов, но собираюсь.
#Статья 📚
Вообще такие моменты могут сэкономить несколько часов отладки, если подумать о них заранее. Скажу честно — я время себе не сэкономил первоначально, но в следующий раз точно сэкономлю. Ниже поделюсь основами, которые вынес для себя — вдруг кому-то тоже пригодятся
1. Почему ответы бота могут «ломаться», если в ответах используется HTML-вёрстка
Суть:
Для удобства копирования ответа бота, я оборачиваю его ответы в тэги <blockquote>...</blockquote>. В итоге бот присылает цитату, текст из которой копируется одним нажатием😐 .
Проблема:
ИИ-сервис, который отправляет ответ боту, иногда вставляет в текст символы: <, >, &. Telegram воспринимает такие символы, как HTML-разметку, когда сообщение отправляется с «parse_mode=HTML», и вот на этом моменте начинается лотерея:
• Разметка ломается🫣 .
• Куски текста могут пропасть🤬 .
• Иногда сообщение вообще не отправляется или отправляется криво🌚 .
Решение:
Перед тем как форматировать текст — нужно применить к нему встроенную функцию escape().
По-человечески:
escape() заменяет «опасные» символы на безопасные, чтобы Telegram не думал, что это теги🤯 . Например:
• < — превращается в <
• > — превращается в >
• & — превращается в &
Важный нюанс:
После escape() текст становится длиннее. Поэтому порядок работы с текстом ответа в коде должен быть такой:
• Сначала применяем к тексту escape()🤔 .
• Потом делим то, что получили на части, чтобы не упереться в лимит Telegram для одного сообщения (4096 символов )🤔 .
• В конце форматируем части, оборачивая их в цитату или выделяя жирным🤔 .
Вывод: чтобы бот не ломал ответы на ровном месте — можно один раз написать корректный обработчик текста с escape() и разбивкой на части, а дальше просто стандартно его использовать
2. Почему если в системном промте, который уходит из бота в ИИ-сервис, жёстко задан язык ответа — модель ИИ просто игнорирует эту настройку и становится непредсказуемой
Суть:
Классно, когда пользователь может писать текст на русском, но ему будет возвращаться обработанный ответ на английском или на русском языке, в зависимости от настроек пользователя в боте. Это интересная фича, особенно если взаимодействуешь с иностранными клиентами или коллегами😁 .
Проблема:
Модель ИИ видит в начале системного промта настройку «OUTPUT_LANGUAGE=en», которая означает, что ответ нужно выдавать на английском языке. Но весь остальной системный промт, а также текст пользователя на русском языке🥵 .
Решение:
Так как в момент отправки запроса, мы точно знаем язык, который установил себе пользователь бота — просто собираем системный промт из словаря, в котором есть версия промта на русском языке, а также версия точно такого же промта на английском языке👻 . То есть мы просто держим версии одного промта на разных языках. Кстати, такая история ещё и нормально масштабируется, если нужно будет добавить новые языки. Да и словари — это как будто база базовая😎 .
Вывод: если хочешь стабильный язык ответа — лучше не пытаться «переломить» ИИ модель одной жёсткой строкой, просто дай ей системный промт на нужном языке
Вот такие два момента помогают сэкономить 1-2 дня разборов с кривыми ответами или с нестабильным поведением ИИ модели
#Статья 📚
Please open Telegram to view this post
VIEW IN TELEGRAM
1 24 22 10 4 2