Если вдруг не знаешь, у меня есть пет-проект Занимательные истории 💡 🧸
Суть в том, что голосовые ассистенты (Алиса🙂 или Маруся , смотря кто у тебя есть) задают тебе вопросы, а ответы встают в случайные места в тексте, и получается история: смешная, абсурдная, нелепая (всё зависит от тебя), но в целом прикольная. Проект существует уже больше пяти лет, и его MAU (кол-во активных игроков каждый месяц) достигает 90+ тысяч! И это при том, что последние три года я не добавлял в него новый контент: там было 32 шаблона историй, которые ротируются по кругу, и люди с удовольствием сочиняют истории по этим текстам 🔄
Я ничего не добавлял, потому что сочинение и добавление одного текста у меня стало занимать около 8ми часов, то есть полноценный рабочий день, а то и больше! Сочинить, формализовать, разметить, залить в Dialogflow, протестировать, запустить в ротацию, сделать всякие визуальные материалы чтоб написать посты в соцсетях 😱 В общем, тяжело найти столько времени, чтобы полностью уделить его этой задаче ⏳
С появлением ИИ-агентов я смог ускорить этот процесс. Теперь #ИИшница помогает быстро формализовать сюжет, разметить, и залить в Dialogflow. Серьёзно, она это делает за считанные минуты, а у меня уходили часы! 🎉
Эти процессы я автоматизировал с помощью Claude😒 , или Клавдий, как я его называю, а картинки генерирует ChatGPT (его я никак не назвал) 😺
И ты посмотри, как он теперь генерирует комиксы! Ещё год назад он не мог такое сделать (а я пытался), а теперь это чёткий текст без артефактов, множество забавных деталей на фоне, и всё это по промпту "Создай комикс по этой истории"! Ну и дальше текст готовой истории. И всё! А когда мне понадобилось сделать сделать комикс для истории-продолжения, я попросил "Создай комикс по этой истории с теми же персонажами"! И он великолепно перенёс персонажей!
Только видосы я ещё не научился делать с помощью агентов, но чувствую, уже близок тот день, когда такие же простые видео смогу делать за несколько минут, а не часов☀️
Многие рассматривают ИИ-агентов как сущность, которая может встать на их место. Но это скорее инструменты, или напарники, которые берут на себя рутину и помогают делать дела намного быстрее✨
В общем, я это всё к чему: сегодня я добавил туда ещё один новый текст, так что приходи, сочиняй #занимательныеистории, и напиши в комментарии свои идеи для новых историй!👇
Суть в том, что голосовые ассистенты (Алиса
Я ничего не добавлял, потому что сочинение и добавление одного текста у меня стало занимать около 8ми часов, то есть полноценный рабочий день, а то и больше! Сочинить, формализовать, разметить, залить в Dialogflow, протестировать, запустить в ротацию, сделать всякие визуальные материалы чтоб написать посты в соцсетях 😱 В общем, тяжело найти столько времени, чтобы полностью уделить его этой задаче ⏳
С появлением ИИ-агентов я смог ускорить этот процесс. Теперь #ИИшница помогает быстро формализовать сюжет, разметить, и залить в Dialogflow. Серьёзно, она это делает за считанные минуты, а у меня уходили часы! 🎉
Эти процессы я автоматизировал с помощью Claude
И ты посмотри, как он теперь генерирует комиксы! Ещё год назад он не мог такое сделать (а я пытался), а теперь это чёткий текст без артефактов, множество забавных деталей на фоне, и всё это по промпту "Создай комикс по этой истории"! Ну и дальше текст готовой истории. И всё! А когда мне понадобилось сделать сделать комикс для истории-продолжения, я попросил "Создай комикс по этой истории с теми же персонажами"! И он великолепно перенёс персонажей!
Только видосы я ещё не научился делать с помощью агентов, но чувствую, уже близок тот день, когда такие же простые видео смогу делать за несколько минут, а не часов
Многие рассматривают ИИ-агентов как сущность, которая может встать на их место. Но это скорее инструменты, или напарники, которые берут на себя рутину и помогают делать дела намного быстрее✨
В общем, я это всё к чему: сегодня я добавил туда ещё один новый текст, так что приходи, сочиняй #занимательныеистории, и напиши в комментарии свои идеи для новых историй!👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Тусуюсь на конфе Backend talks Яндекс 360, и вот что я тебе скажу: пельмешки - гениальное решение для обеда на конфе. Они сытные, можно выдавать готовой порцией, и айтишникам не придётся подолгу стоять в очереди (а мы этот #движ очень любим)
❤4🔥2👍1
Я тут разбирался в терминах синхронно, асинхронно, конкурентно, и параллельно. Конечно же, #ИИшница помогала мне в этом, потому что это интерактивный инструмент, которому можно сразу задать уточняющий вопрос (в отличие от статей и видосов). В какой-то момент она привела прикольную, близкую для меня аналогию:
Забавно, что обычно при объяснении этих терминов приводят пример с поваром на кухне, потому что его поймёт более широкий круг лиц, а здесь вот для меня более персонализированный кейс👍
Пиши в комментарии, разбираешься ли в этих понятиях, и какие неточности есть на картинке👇
Представь барабанщика на репетиции.
Синхронно:
отправил сообщение;
сидит и смотрит в телефон, пока не ответят.
Асинхронно:
отправил сообщение;
пока ждёт ответ, продолжает репетировать.
Конкурентно:
одновременно ведёт переписку, репетирует и слушает указания звукорежиссёра.
Параллельно:
невозможно для одного человека, но возможно для группы музыкантов, где каждый делает свою работу одновременно.
Поэтому:
Асинхронность — это про то, как не ждать.
Конкурентность — это про то, как управлять несколькими задачами.
Параллелизм — это про реальное одновременное выполнение на нескольких вычислительных ресурсах.
Забавно, что обычно при объяснении этих терминов приводят пример с поваром на кухне, потому что его поймёт более широкий круг лиц, а здесь вот для меня более персонализированный кейс👍
Пиши в комментарии, разбираешься ли в этих понятиях, и какие неточности есть на картинке👇
🔥1
Forwarded from C# Short Posts 🔞
👈 В прошлый раз мы выяснили, что обычно данные в СУБД лежат в страницах фиксированного размера. А как по этим страницам что-то быстро найти?
🔍 Если искать в лоб
Представь, что ты хочешь найти в толстой книге по базам данных упоминание слова «дерево». Если в конце нет предметного указателя — придётся листать страницу за страницей и глазами выискивать нужное слово.
СУБД без индекса делает ровно то же самое: она прочитает все страницы таблицы подряд, проверит на каждой, есть ли подходящая строка, и оставит то, что нашла. Этот режим работы называется Sequential Scan, или просто Seq Scan — последовательное чтение.
Увидеть, что СУБД делает именно так, можно через
На таблице в 10 млн строк это будет довольно долго, потому что на каждый запрос будут выполняться сотни тысяч чтений страниц с диска ради одной нужной строки💽
📖 Предметный указатель
В книге это решается просто: там есть предметный указатель — отсортированный по алфавиту список слов с номерами страниц. Открываешь, ищешь слово, прыгаешь на нужную страницу.
В СУБД роль такого указателя играет индекс. Это отдельная структура на диске, в которой ключи (например, значения id) лежат отсортированно, а рядом с каждым — указатель на конкретную страницу таблицы🧿
Чаще всего первый индекс появляется в таблице автоматически: когда ты добавляешь, например, в свою таблицу users PRIMARY KEY на колонку id, Postgres под капотом создаёт уникальный индекс по этой колонке —
🌳 Что такое btree
В большинстве СУБД (PostgreSQL, MySQL/InnoDB, SQL Server, MongoDB через WiredTiger) индекс по умолчанию — не просто отсортированный список, а B-дерево (точнее, его вариант B+tree).
Почему не список? Главное — число чтений с диска. Бинарный поиск по отсортированному списку из миллиона страниц — это около 20 чтений. И если ключ не монотонный (email, uuid, имя автора), любая вставка в середину означает переписать целый хвост.
B-дерево — это обычное дерево из корня сверху, внутренних узлов в середине и листьев снизу. Оно устроено так:
🟢 В каждом узле много ключей — не один-два, а сотни.
🟢 Все листья на одной глубине. Любой путь от корня до листа одинаковой длины.
🟢 За счёт большого ветвления глубина дерева смешная. Для индекса по сотне миллионов записей это 3–4 уровня. Найти строку = 3–4 чтения. Не миллионы, не тысячи. Три-четыре🎉
🟢 Листья связаны в список. Поэтому Range-запросы (>, <, BETWEEN) тоже летают: спустился до начала диапазона и пробежал листья подряд.
Аналогия — толстая энциклопедия: тома → главы → разделы. Три шага, и ты на месте👍
📦 Как это лежит в Postgres (см. дикпик 3)
Структура B-tree один в один ложится на структуру страниц из прошлого поста:
⚪️ Один узел дерева = одна страница 8 KB.
⚪️ Внутренние узлы хранят пары (ключ, ссылка на дочернюю страницу). В одну страницу таких пар влезают сотни.
⚪️ Листья хранят пары (ключ,
⚪️ Индекс лежит отдельным файлом со своим
🔬 Пощупаем (см. дикпики 1 и 2)
Берём таблицу users из прошлого поста (6000 строк, без PRIMARY KEY) и ищем по id.
Добавляем первичный ключ. Тот же запрос — план сменился на
🅰️ Что с этим знанием делать
Индекс — это отдельные страницы на диске. Каждый⚡️
#бд #postgresql #инженерныештучки
🔍 Если искать в лоб
Представь, что ты хочешь найти в толстой книге по базам данных упоминание слова «дерево». Если в конце нет предметного указателя — придётся листать страницу за страницей и глазами выискивать нужное слово.
СУБД без индекса делает ровно то же самое: она прочитает все страницы таблицы подряд, проверит на каждой, есть ли подходящая строка, и оставит то, что нашла. Этот режим работы называется Sequential Scan, или просто Seq Scan — последовательное чтение.
Увидеть, что СУБД делает именно так, можно через
EXPLAIN — команду, которая покажет, как планируется выполнить запрос. Видишь в плане Seq Scan — значит СУБД проходит таблицу целиком.На таблице в 10 млн строк это будет довольно долго, потому что на каждый запрос будут выполняться сотни тысяч чтений страниц с диска ради одной нужной строки
📖 Предметный указатель
В книге это решается просто: там есть предметный указатель — отсортированный по алфавиту список слов с номерами страниц. Открываешь, ищешь слово, прыгаешь на нужную страницу.
В СУБД роль такого указателя играет индекс. Это отдельная структура на диске, в которой ключи (например, значения id) лежат отсортированно, а рядом с каждым — указатель на конкретную страницу таблицы
Чаще всего первый индекс появляется в таблице автоматически: когда ты добавляешь, например, в свою таблицу users PRIMARY KEY на колонку id, Postgres под капотом создаёт уникальный индекс по этой колонке —
users_pkey; в psql его видно через метакоманду \d users как btree (id).🌳 Что такое btree
В большинстве СУБД (PostgreSQL, MySQL/InnoDB, SQL Server, MongoDB через WiredTiger) индекс по умолчанию — не просто отсортированный список, а B-дерево (точнее, его вариант B+tree).
Почему не список? Главное — число чтений с диска. Бинарный поиск по отсортированному списку из миллиона страниц — это около 20 чтений. И если ключ не монотонный (email, uuid, имя автора), любая вставка в середину означает переписать целый хвост.
B-дерево — это обычное дерево из корня сверху, внутренних узлов в середине и листьев снизу. Оно устроено так:
🟢 В каждом узле много ключей — не один-два, а сотни.
🟢 Все листья на одной глубине. Любой путь от корня до листа одинаковой длины.
🟢 За счёт большого ветвления глубина дерева смешная. Для индекса по сотне миллионов записей это 3–4 уровня. Найти строку = 3–4 чтения. Не миллионы, не тысячи. Три-четыре
🟢 Листья связаны в список. Поэтому Range-запросы (>, <, BETWEEN) тоже летают: спустился до начала диапазона и пробежал листья подряд.
Аналогия — толстая энциклопедия: тома → главы → разделы. Три шага, и ты на месте
📦 Как это лежит в Postgres (см. дикпик 3)
Структура B-tree один в один ложится на структуру страниц из прошлого поста:
⚪️ Один узел дерева = одна страница 8 KB.
⚪️ Внутренние узлы хранят пары (ключ, ссылка на дочернюю страницу). В одну страницу таких пар влезают сотни.
⚪️ Листья хранят пары (ключ,
ctid). Помнишь ctid из прошлого поста? Это указатель «страница такая-то, позиция такая-то» — он ведёт прямо на нужную строку в куче.⚪️ Индекс лежит отдельным файлом со своим
pg_relation_filepath — это не часть таблицы, это самостоятельная сущность.🔬 Пощупаем (см. дикпики 1 и 2)
Берём таблицу users из прошлого поста (6000 строк, без PRIMARY KEY) и ищем по id.
Seq Scan ... Rows Removed by Filter: 5999: прочитали всё, отбросили 5999, оставили одну.Добавляем первичный ключ. Тот же запрос — план сменился на
Index Scan using users_pkey. Сначала Postgres прошёл по B-дереву от корня до листа, там нашёл ctid, по нему сходил в нужную страницу таблицы и достал строку.🅰️ Что с этим знанием делать
Индекс — это отдельные страницы на диске. Каждый
INSERT/UPDATE/DELETE правит и таблицу, и все её индексы. Поэтому вешать их «на всякий случай» на каждое поле — плохая идея: платишь местом на диске, замедлением записи, обслуживанием дерева. При хорошо выбранном индексе взамен этих накладных расходов получаешь быстрый поиск#бд #postgresql #инженерныештучки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Уже через несколько дней, 27 мая, выступаю с группой #пятый_угол! 🎉
В репертуаре знакомые каверы и неожиданные хиты 🤘
Москва, клуб Цеппелин, Слободской переулок, 6с4, начинаем #движ в 19:30
В репертуаре знакомые каверы и неожиданные хиты 🤘
Москва, клуб Цеппелин, Слободской переулок, 6с4, начинаем #движ в 19:30
❤🔥2🔥2
#ЗанимательныеИстории с самого начала был передовым проектом: в нём использовался ИИ, когда это ещё не было мейнстримом (хоть и под капотом у NLP Dialogflow , ну да какая разница)
А теперь #ИИшница помогает мне регулярно добавлять в него контент, взяв на себя всю рутинную работу🎉
Кстати, там появился новый текст, так что рекомендую вечерком сочинить историю-другую💡 Особенно, если в твоём окружении есть дети, сочини вместе с ними, надеюсь им понравится✨
Как это сделать? Скажи Алисе🙂 или Марусе "Запусти навык занимательные истории", а дальше разберёшься 😉
А теперь #ИИшница помогает мне регулярно добавлять в него контент, взяв на себя всю рутинную работу🎉
Кстати, там появился новый текст, так что рекомендую вечерком сочинить историю-другую
Как это сделать? Скажи Алисе
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
YouTube
THUNDERSTRUCK - AC/DC. Rocknmob Moscow #11, VDNKh, 18.08.2024, 700+ musicians
The official video for the song "Thunderstruck" by AC/DC, performed on Rocknmob Moscow #11
Moscow, Russia, VDNH Park. August 18th, 2024. 700+ musicians.
_
We are grateful to: Administration of the VDNH park, IGOR SANDLER, musicians, subscribers and all…
Moscow, Russia, VDNH Park. August 18th, 2024. 700+ musicians.
_
We are grateful to: Administration of the VDNH park, IGOR SANDLER, musicians, subscribers and all…
18 августа 2024 участвовал в #rocknmob, и видосики из него до сих пор потихоньку подъезжают, так что твоему вниманию:
⚡️AC/DC - THUNDERSTRUCK⚡️
Ищи среди барабанщиков того, кто играет стоя - это я😎
#движ
⚡️AC/DC - THUNDERSTRUCK⚡️
Ищи среди барабанщиков того, кто играет стоя - это я😎
#движ
🔥2
Telegraph
ИИшница - буст пет-проектов 🍳
Не знаю, как в других профессиях, а у разработчиков это распространённая тема: реализовать свой проект дома. И поскольку это домашний проект, о котором сам заботишься, отсюда и название - pet-project, эдакий питомец 🐱🐶 С пет-проектами в сфере разработки связано…
#ИИшница - буст пет-проектов
Чем ещё заняться прекрасным вечером выходного дня? Конечно, поделиться своим мнением про пет-проекты и ИИ! Именно этим я и занялся, и не заметил, как накатал огромную телегу, которая не помещалась в один телеграмный пост. Вспомнил про Telegraph, скопировал текст туда, заодно разбавил забавными мемасами по теме ✨
👉Наслаждайся👈
P.S. Текст полностью написан мной, моими руками, ни слова не сгенерировано ИИ, это всё полностью мой поток мыслей. А вот некоторые картинки да, сгенерированы. Причём я помню, что уже видел похожие в интернете, и после моих попыток(довольно слабых) вновь найти их, решил сгенерировать свои, потому что могу 💪
Напиши в комментарии, сколько у тебя заброшенных пет-проектов👇
Чем ещё заняться прекрасным вечером выходного дня? Конечно, поделиться своим мнением про пет-проекты и ИИ! Именно этим я и занялся, и не заметил, как накатал огромную телегу, которая не помещалась в один телеграмный пост. Вспомнил про Telegraph, скопировал текст туда, заодно разбавил забавными мемасами по теме ✨
👉Наслаждайся👈
P.S. Текст полностью написан мной, моими руками, ни слова не сгенерировано ИИ, это всё полностью мой поток мыслей. А вот некоторые картинки да, сгенерированы. Причём я помню, что уже видел похожие в интернете, и после моих попыток
Напиши в комментарии, сколько у тебя заброшенных пет-проектов👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1😭1
Forwarded from C# Short Posts 🔞
🌳 Индекс под капотом
Когда добавляешь к таблице индекс по id, физически на диске появляется файл этого индекса, рядом с файлом кучи, которая содержит данные в страницах (блоках по 8KB). В файле индекса тоже есть страницы, в которых и хранится то самое B-дерево.
В самом начале файла индекса (в блоке 0) находится служебная метастраница, просто «визитка», которая хранит указатель на корень дерева и пару параметров. Она не является частью дерева: у неё нет родителя/детей, она не участвует в навигации по уровням.
📏 Из чего состоит дерево (Дикпик 1)
Используем
С пониманием
Следующий запрос показывает содержимое дерева: 1 страница корня (
🧭 Что внутри корня (Дикпик 2)
Корень - это не данные, а «оглавление», которое содержит 17 записей вида разделитель (
Каждая запись в корне говорит: «вот сюда (downlink) идут ключи, начиная с такого-то значения». Самый верхний downlink должен ловить всё, что меньше первой реальной границы — а нижней границы у него нет.
Поэтому у первой записи корня нет разделителя (ключ усечён до нуля атрибутов), а её downlink ведёт в первый лист: он совпадает с любым ключом, каким бы маленьким тот ни был.
Разделители (
То есть 367 = наименьший
🍃 Что внутри листа (Дикпик 3)
А тут живут настоящие записи: пара ключ
🔗 Итоговая картина (Дикпик 4)
Как видно, индекс - это отдельный файл на диске, в котором метастраница и B-дерево - (корень + листья), итого 19 страниц. Куча
🏗 Любопытная деталь
Почему корень оказался в блоке 3?
🔎 Как в итоге ищется
1) Метастраница индекса → корень (блок 3);
2)
3) в листе берём
4) читаем одну heap-страницу.
⚡️ ~3 чтения вместо 50⚡️
🅰️ Что унести с собой
- PK-индекс - это отсортированный справочник «
- Индекс и таблица - это разные файлы
-
- Третий уровень (ветви между корнем и листьями) появляется лишь на сотнях тысяч строк - на 1 млн строк дерево уже трёхуровневое (корень → 10 ветвей → 2733 листа).
- Точечный поиск по PK - это 2–3 обращения к страницам, поэтому он «бесплатный» по ощущениям.
Команды, чтобы повторить и потыкать самому — в 👉гисте👉
#бд #postgresql #инженерныештучки
Когда добавляешь к таблице индекс по id, физически на диске появляется файл этого индекса, рядом с файлом кучи, которая содержит данные в страницах (блоках по 8KB). В файле индекса тоже есть страницы, в которых и хранится то самое B-дерево.
В самом начале файла индекса (в блоке 0) находится служебная метастраница, просто «визитка», которая хранит указатель на корень дерева и пару параметров. Она не является частью дерева: у неё нет родителя/детей, она не участвует в навигации по уровням.
📏 Из чего состоит дерево (Дикпик 1)
Используем
bt_metap - функцию из расширения pageinspect. Она читает метастраницу индекса и возвращает её содержимое: в каком блоке сейчас корень, на каком он уровне дерева, и пару служебных полей. У нас корень в блоке 3 внутри файла индекса users_pkey (по смещению 3 × 8 KB).С пониманием
level , то есть уровнем дерева, легко споткнуться: в PostgreSQL листья - это уровень 0, и нумерация растёт вверх, к корню. Поэтому level=1 означает «корень на один уровень выше листьев» → всего 2 уровня (листья на 0, корень на 1). Будь строк миллионы — стало бы level=2: корень → ветви → листья.Следующий запрос показывает содержимое дерева: 1 страница корня (
type: r) и 17 страниц листьев (type: l).🧭 Что внутри корня (Дикпик 2)
Корень - это не данные, а «оглавление», которое содержит 17 записей вида разделитель (
sep_id) → downlink (ссылка на дочерний лист (он же блок, он же страница)): «меньше 367 — блок 1; 367..732 — блок 2; …; от 5857 — блок 18». Числа 367, 733… - это границы маршрутизации. Каждая запись в корне говорит: «вот сюда (downlink) идут ключи, начиная с такого-то значения». Самый верхний downlink должен ловить всё, что меньше первой реальной границы — а нижней границы у него нет.
Поэтому у первой записи корня нет разделителя (ключ усечён до нуля атрибутов), а её downlink ведёт в первый лист: он совпадает с любым ключом, каким бы маленьким тот ни был.
Разделители (
sep_id) - это стыки между листьями, и их значения берутся из того, сколько ключей влезло в предыдущий лист. В один 8-килобайтный лист помещается 366 записей по int: лист 1 (блок 1) держит id 1…366. Когда он заполнился, 367-й ключ — первый, который туда уже не влез, — открывает следующий лист (блок 2). Вот это пограничное значение и поднимается в корень как разделитель: «ключи ≥ 367 → во второй лист, меньше → в первый». То есть 367 = наименьший
id второго листа.🍃 Что внутри листа (Дикпик 3)
А тут живут настоящие записи: пара ключ
id_key → heap_ctid, то есть указатель на строку в той самой куче. И смотри: id_key=1 → (0,1), id_key=121 → (0,121) — это ровно те же ctid, что мы видели в посте про страницы! То есть индекс хранит значения id по порядку и держит указатели на строки. Запись с itemoffset = 1 - это high key, то есть верхняя граница этой страницы.🔗 Итоговая картина (Дикпик 4)
Как видно, индекс - это отдельный файл на диске, в котором метастраница и B-дерево - (корень + листья), итого 19 страниц. Куча
users — другой файл, со своими 50 страницами. Связь односторонняя: листья держат ctid в кучу, но сама куча про индекс ничего не знает.🏗 Любопытная деталь
Почему корень оказался в блоке 3?
ADD PRIMARY KEY собирает дерево снизу вверх: блок 0 - мета, блок 1 - первый лист (пока без корня); он переполняется → создаётся второй лист (блок 2), и тут же рождается их общий родитель (корень) → ему достаётся блок 3.🔎 Как в итоге ищется
WHERE id = 59991) Метастраница индекса → корень (блок 3);
2)
5999 ≥ 5857 → последний лист (блок 18); 3) в листе берём
heap_ctid; 4) читаем одну heap-страницу.
🅰️ Что унести с собой
- PK-индекс - это отсортированный справочник «
id → ctid» - Индекс и таблица - это разные файлы
-
ctid на кучу живёт в листьях индекса - Третий уровень (ветви между корнем и листьями) появляется лишь на сотнях тысяч строк - на 1 млн строк дерево уже трёхуровневое (корень → 10 ветвей → 2733 листа).
- Точечный поиск по PK - это 2–3 обращения к страницам, поэтому он «бесплатный» по ощущениям.
Команды, чтобы повторить и потыкать самому — в 👉гисте
#бд #postgresql #инженерныештучки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Репетировал недавно, и осознал #мудрость:
Теперь живи с этим
опытный барабанщик всегда знает, когда надо закрыть свой хай-хет 🧘♂️
Теперь живи с этим
😁3🔥1