Telegram-бот, который работает, пока ты отдыхаешь
Сегодня покажу, как за пару минут настроить простого Telegram-бота на Python, который будет слать вам уведомления с указанным вами текстом:
Что сделаем:
1️⃣Создадим бота через @BotFather и заберём токен.
2️⃣ Узнаем свой chat_id.
3️⃣Напишем мини-скрипт на Python → бот пришлёт сообщение с вашим текстом.
Зачем это нужно?
🔔 Бот сам сообщит, когда отчёт готов — не нужно постоянно проверять.
⚠️ Если скрипт сломается, сразу получите предупреждение.
⏰ Меньше рутины → больше времени на важные задачи.
Приятного чтения
Сегодня покажу, как за пару минут настроить простого Telegram-бота на Python, который будет слать вам уведомления с указанным вами текстом:
Что сделаем:
1️⃣Создадим бота через @BotFather и заберём токен.
2️⃣ Узнаем свой chat_id.
3️⃣Напишем мини-скрипт на Python → бот пришлёт сообщение с вашим текстом.
Зачем это нужно?
🔔 Бот сам сообщит, когда отчёт готов — не нужно постоянно проверять.
⚠️ Если скрипт сломается, сразу получите предупреждение.
⏰ Меньше рутины → больше времени на важные задачи.
Приятного чтения
Teletype
Telegram-бот, который работает, пока ты отдыхаешь
Как аналитик, я часто запускаю тяжёлые SQL-скрипты. Некоторые из них выполняются долго, могут упасть, а иногда — наоборот, неожиданно...
❤6
Эффективная база знаний для обучения и работы: мой опыт с Obsidian
Сегодня покажу, как я веду личную базу знаний в Obsidian:
Что узнаешь:
1️⃣ Почему идеи, «на потом» и важные ссылки часто теряются — и как это решить.
2️⃣ Как я собираю всё важное в одном месте — от мыслей до курсов.
3️⃣ Как структурирую обучение с Markdown, оглавлением и модульным подходом.
4️⃣ Что такое граф знаний и нужен ли он тебе.
💡 Внутри — помимо самой статьи есть видео (от Автора - "Диджитализируй!"), которое поможет стартовать в Obsidian быстро и без сложностей.
🧠 Уменьши хаос. Начни с одной заметки.
Приятного чтения
Сегодня покажу, как я веду личную базу знаний в Obsidian:
Что узнаешь:
1️⃣ Почему идеи, «на потом» и важные ссылки часто теряются — и как это решить.
2️⃣ Как я собираю всё важное в одном месте — от мыслей до курсов.
3️⃣ Как структурирую обучение с Markdown, оглавлением и модульным подходом.
4️⃣ Что такое граф знаний и нужен ли он тебе.
💡 Внутри — помимо самой статьи есть видео (от Автора - "Диджитализируй!"), которое поможет стартовать в Obsidian быстро и без сложностей.
🧠 Уменьши хаос. Начни с одной заметки.
Приятного чтения
Teletype
Эффективная база знаний для обучения и работы: мой опыт с Obsidian
Ты нашёл классный материал, статью, видео или у тебя возникла идея — и ты говоришь себе: «Запомню», «Вернусь потом», «Потом запишу»...
❤7
10 идей для повышения эффективности, которые я усвоил из книги Максима Дорофеева (Джедайские Техники)🚀
1️⃣ Выгружайте задачи из головы
Не держите все дела в голове: Записывайте их в блокнот или приложение, чтобы освободить место для концентрации. Это уменьшит стресс и улучшит фокус.
2️⃣ Не отвечайте на сообщения сразу:
Когда отвечаете на сообщения мгновенно, теряете фокус. Планируйте время для общения, а в остальное время сосредотачивайтесь на задачах. Так будет проще работать.
3️⃣ Бэклог должен быть реальным:
Не перегружайте список дел. Добавляйте в него только те задачи, которые реально будете делать, и очищайте от устаревших задач. Чистый бэклог — залог продуктивности.
4️⃣ Исследуйте задачу заранее:
Перед тем как начать работать над задачей -
обязательно потратьте время на её предварительное изучение. Это поможет избежать непредвиденных проблем в процессе работы:
- Проверьте доступы
- Предвидьте возможные сложности
- И т.д.
Исследование задачи до её начала позволяет снизить вероятность возникновения трудностей в процессе работы и сэкономить время.
5️⃣ Оставляйте буфер времени на выполнение задач:
Задачи часто оказываются сложнее, чем кажутся. Добавляйте запас времени на непредвиденные моменты, чтобы не попасть в дедлайн с проблемами. Это поможет избежать стресса.
6️⃣ Формулируйте задачи так, чтобы легко начать:
Чем понятнее задача, тем легче её начать. Четко определите, что нужно сделать, зачем и как понять, что задача завершена. Так будет меньше сомнений и трудностей.
7️⃣ Используйте «обезьянку» для разгона:
Есть два типа мышления - рациональное и «обезьянка». «Обезьянка» — это наше желание начать что-то делать без лишних раздумий. Ставьте маленькие задачи на 10-15 минут («посмотреть таблицу», «создать черновик»). Так вы легче включитесь в работу, и дальше начнёт подключаться рациональное мышление.
8️⃣ Пингуйте, если долго нет ответа:
Если коллега долго не отвечает, возможно, ваше сообщение просто «утонуло» в ленте. Напоминайте о себе, чтобы сообщение поднялось наверх.
9️⃣ Закрывайте незавершённые дела:
Незаконченные задачи беспокоят. Завершайте мелкие задачи сразу, а большие разбивайте на шаги. Если проект завис, принимайте это спокойно и двигайтесь дальше.
🔟 Не тратьте освободившееся время на работу:
Когда вы применяете эти техники и освобождаете время, не стремитесь заполнять его новыми задачами. Не нужно думать, что коллеги подумают, что вы мало работаете. Не оправдывайтесь за своё свободное время и не рассказывайте всем, что вы освободили время с помощью техник. Используйте его для себя — для отдыха, хобби или личных дел. Вы заслуживаете этого времени и не обязаны использовать его для работы, если у вас есть возможность расслабиться.
💡 Итог:
Берегите своё время и внимание. Чем меньше переключений и лишних задач, тем продуктивнее вы будете работать. Попробуйте внедрить хотя бы несколько идей — и вы заметите результат!
1️⃣ Выгружайте задачи из головы
Не держите все дела в голове: Записывайте их в блокнот или приложение, чтобы освободить место для концентрации. Это уменьшит стресс и улучшит фокус.
2️⃣ Не отвечайте на сообщения сразу:
Когда отвечаете на сообщения мгновенно, теряете фокус. Планируйте время для общения, а в остальное время сосредотачивайтесь на задачах. Так будет проще работать.
3️⃣ Бэклог должен быть реальным:
Не перегружайте список дел. Добавляйте в него только те задачи, которые реально будете делать, и очищайте от устаревших задач. Чистый бэклог — залог продуктивности.
4️⃣ Исследуйте задачу заранее:
Перед тем как начать работать над задачей -
обязательно потратьте время на её предварительное изучение. Это поможет избежать непредвиденных проблем в процессе работы:
- Проверьте доступы
- Предвидьте возможные сложности
- И т.д.
Исследование задачи до её начала позволяет снизить вероятность возникновения трудностей в процессе работы и сэкономить время.
5️⃣ Оставляйте буфер времени на выполнение задач:
Задачи часто оказываются сложнее, чем кажутся. Добавляйте запас времени на непредвиденные моменты, чтобы не попасть в дедлайн с проблемами. Это поможет избежать стресса.
6️⃣ Формулируйте задачи так, чтобы легко начать:
Чем понятнее задача, тем легче её начать. Четко определите, что нужно сделать, зачем и как понять, что задача завершена. Так будет меньше сомнений и трудностей.
7️⃣ Используйте «обезьянку» для разгона:
Есть два типа мышления - рациональное и «обезьянка». «Обезьянка» — это наше желание начать что-то делать без лишних раздумий. Ставьте маленькие задачи на 10-15 минут («посмотреть таблицу», «создать черновик»). Так вы легче включитесь в работу, и дальше начнёт подключаться рациональное мышление.
8️⃣ Пингуйте, если долго нет ответа:
Если коллега долго не отвечает, возможно, ваше сообщение просто «утонуло» в ленте. Напоминайте о себе, чтобы сообщение поднялось наверх.
9️⃣ Закрывайте незавершённые дела:
Незаконченные задачи беспокоят. Завершайте мелкие задачи сразу, а большие разбивайте на шаги. Если проект завис, принимайте это спокойно и двигайтесь дальше.
🔟 Не тратьте освободившееся время на работу:
Когда вы применяете эти техники и освобождаете время, не стремитесь заполнять его новыми задачами. Не нужно думать, что коллеги подумают, что вы мало работаете. Не оправдывайтесь за своё свободное время и не рассказывайте всем, что вы освободили время с помощью техник. Используйте его для себя — для отдыха, хобби или личных дел. Вы заслуживаете этого времени и не обязаны использовать его для работы, если у вас есть возможность расслабиться.
💡 Итог:
Берегите своё время и внимание. Чем меньше переключений и лишних задач, тем продуктивнее вы будете работать. Попробуйте внедрить хотя бы несколько идей — и вы заметите результат!
❤7🔥5
Кто такой аналитик? Спойлер: каждый из нас 🥶
Представьте будний день. Вы встаёте, выглядываете в окно, сверяетесь с прогнозом погоды — видите по прогнозу дождь. Ваше решение: взять с собой зонт. Чуть позже листаете меню доставок, сравниваете цену, время ожидания, рейтинг ресторана — и выбираете ужин. Это и есть бытовой анализ данных: мы собираем цифры и факты, чтобы получить максимальный личный “выигрыш” — комфорт, вкус, экономию времени.
В продуктовой компании принцип тот же, меняются только:
🌎 Масштаб — тысячи или миллионы пользователей
💶 Ставки — вместо личного удобства — деньги и рост бизнеса
↗️ Инструменты — вместо «посмотреть в окно» — логи, BI‑дашборды, A/B‑тесты, ML‑модели.
1️⃣ Аналитика в быту:
Представьте, что проект — это ваше тело. Цель: весить 70 кг. Мы выбрали одну-единственную метрику массу тела — и каждый день сверяемся только с ней.
Проблема одной единственной метрики в том, что она не учитывает всей картины и часто люди привязываются к метрике и ставят себе цель во чтобы то ни стало увеличить (или уменьшить) именно ее. Представим, что цель в 70 кг была достигнута, ценой жесткой диеты, ограничений, нарушений сна и т.п. Кажется, что мы достигли цели, но глобально мы запустили проект и проиграли в долгосроке. При такой диете и ограничениях высокая вероятность ухудшить качество кожи, сна, волос и т.п.
Как исправить? Продумать систему метрик - например, теперь будем измерять:
• вес;
• процент жира;
• качество сна;
• состояние кожи и волос;
• уровень энергии;
• и т.п.
Теперь мы видим, что цель «70 кг» ценой проваленного сна и ухудшения кожи — плохая стратегия. Мы ищем баланс и корректируем план действия.
Поздравляю, вы нашли проблему, решили ее и не ухудшили другие показатели в этом и суть работы аналитика)
2️⃣ А как узнать за какими метриками нужно наблюдать?
Здесь все зависит от продукта, вы можете придумать и свои метрики, как в примере выше, но это будет приходить с опытом и насмотренностью. В бизнесе есть уже большое количество стандартных метрик, которые, как правило стоит отслеживать. Вот часть из них:
• GMV (общий оборот денег);
• MAU / DAU / WAU (количество уникальных пользователей в месяц/день/неделю);
• Retention (процент удержания пользователей на n-ый день);
• и т.д.
Статья про метрики клик
© Вывод:
Аналитика — это не про сложные формулы, а про привычку осознанно ставить цель и проверять её разными показателями. Мы делаем это ежедневно:
• выбираем одежду по прогнозу погоды;
• еду — по цене и рейтингу;
• интернет тариф — по количеству ГБ и Минут.
Так что, если вы уже проверяете два-три показателя перед решением, поздравляю — вы аналитик. Осталось лишь выбрать верные метрики и держать их в балансе.
Представьте будний день. Вы встаёте, выглядываете в окно, сверяетесь с прогнозом погоды — видите по прогнозу дождь. Ваше решение: взять с собой зонт. Чуть позже листаете меню доставок, сравниваете цену, время ожидания, рейтинг ресторана — и выбираете ужин. Это и есть бытовой анализ данных: мы собираем цифры и факты, чтобы получить максимальный личный “выигрыш” — комфорт, вкус, экономию времени.
В продуктовой компании принцип тот же, меняются только:
Представьте, что проект — это ваше тело. Цель: весить 70 кг. Мы выбрали одну-единственную метрику массу тела — и каждый день сверяемся только с ней.
Проблема одной единственной метрики в том, что она не учитывает всей картины и часто люди привязываются к метрике и ставят себе цель во чтобы то ни стало увеличить (или уменьшить) именно ее. Представим, что цель в 70 кг была достигнута, ценой жесткой диеты, ограничений, нарушений сна и т.п. Кажется, что мы достигли цели, но глобально мы запустили проект и проиграли в долгосроке. При такой диете и ограничениях высокая вероятность ухудшить качество кожи, сна, волос и т.п.
Как исправить? Продумать систему метрик - например, теперь будем измерять:
• вес;
• процент жира;
• качество сна;
• состояние кожи и волос;
• уровень энергии;
• и т.п.
Теперь мы видим, что цель «70 кг» ценой проваленного сна и ухудшения кожи — плохая стратегия. Мы ищем баланс и корректируем план действия.
Поздравляю, вы нашли проблему, решили ее и не ухудшили другие показатели в этом и суть работы аналитика)
Здесь все зависит от продукта, вы можете придумать и свои метрики, как в примере выше, но это будет приходить с опытом и насмотренностью. В бизнесе есть уже большое количество стандартных метрик, которые, как правило стоит отслеживать. Вот часть из них:
• GMV (общий оборот денег);
• MAU / DAU / WAU (количество уникальных пользователей в месяц/день/неделю);
• Retention (процент удержания пользователей на n-ый день);
• и т.д.
Статья про метрики клик
Аналитика — это не про сложные формулы, а про привычку осознанно ставить цель и проверять её разными показателями. Мы делаем это ежедневно:
• выбираем одежду по прогнозу погоды;
• еду — по цене и рейтингу;
• интернет тариф — по количеству ГБ и Минут.
Так что, если вы уже проверяете два-три показателя перед решением, поздравляю — вы аналитик. Осталось лишь выбрать верные метрики и держать их в балансе.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.jivo.ru
Продуктовые метрики — что это? Как выбрать и измерять продуктовые метрики | Jivo
Как измерять успех продукта? Разбираем основные продуктовые метрики: вовлеченность, удержание, монетизацию и рост на примерах.
❤4🔥3
Дима SQL-ит 🧑💻 (Аналитика данных) pinned «Telegram-бот, который работает, пока ты отдыхаешь Сегодня покажу, как за пару минут настроить простого Telegram-бота на Python, который будет слать вам уведомления с указанным вами текстом: Что сделаем: 1️⃣Создадим бота через @BotFather и заберём токен.…»
Как за 400 рублей в год получить доступ к Claude, ChatGPT, Gemini и Grok через Perplexity и без использования VPN
💎 Сейчас нейронки повсеместно упрощают жизнь.
Примеры использования:
• помогают с написанием текстов
• помогают с написанием кода
• помогают с генерацией идей
• и т.д.
🤑 И вот простая возможность: за 400 рублей в год получить доступ ко всем этим моделям — Claude, ChatGPT, Gemini, Grok и все это — без использования VPN, всё работает напрямую из России.
Это сервис Perplexity. Он собирает эти нейронки в одном месте, и с подпиской Pro вы можете ими пользоваться без лишних заморочек.
Инструкция короткая и простая, займёт пару минут:
1️⃣ Зарегистрируйтесь на Perplexity: Перейдите по ссылке https://www.perplexity.ai/ и создайте аккаунт. Используйте почту, на которую будете покупать подписку — это важно, чтобы всё активировалось правильно.
2️⃣ Купите подписку: Я это делал на Plati.market. Ищем лот с покупкой Perplexity Pro на 1 год я выбирал по отзывам и купил в итоге за 400 рублей. Везде указывайте ту же почту из первого пункта — так подписка привяжется к вашему аккаунту.
3️⃣ Кайфуем: После оплаты всё заработает автоматически. Заходите в Perplexity, выбирай модель и пробуйте — генерируйте, анализируйте, что угодно. Если что-то не получилось, пишете продавцу и он вам поможет разобраться)
😎 Если эта инструкция вам помогла, то кидайте 🔥 или ❤️!
Расскажите, пробовали ли вы Perplexity?
Примеры использования:
• помогают с написанием текстов
• помогают с написанием кода
• помогают с генерацией идей
• и т.д.
Это сервис Perplexity. Он собирает эти нейронки в одном месте, и с подпиской Pro вы можете ими пользоваться без лишних заморочек.
Инструкция короткая и простая, займёт пару минут:
Расскажите, пробовали ли вы Perplexity?
Please open Telegram to view this post
VIEW IN TELEGRAM
Perplexity AI
Perplexity is a free AI-powered answer engine that provides accurate, trusted, and real-time answers to any question.
❤12🔥4 1
Ускоряем написание кода - горячие клавиши, которые работают в DBeaver, Jupyter Notebook, VS Code и других IDE 🚀
🔥 Горячих клавиш в IDE существует огромное количество — буквально на каждое действие. Но сегодня я поделюсь с вами семью самыми полезными комбинациями, которыми пользуюсь практически ежедневно. Эти шорткаты работают универсально и сэкономят вам кучу времени.
1️⃣ Alt + ↑ / ↓ - Перемещает текущую строку или выделенный блок вверх/вниз. Никакого вырезать-вставить — блок кода «прыгает» сразу туда, куда нужно.
2️⃣ Alt + Shift + ↑ / ↓ - Клонирует выделенную строку (или блок) выше/ниже. Идеально, когда нужно быстро дублировать похожие куски кода.
3️⃣ Ctrl + D - Поиск следующего вхождения выделенного текста. Нажимайте подряд, чтобы мгновенно выделить все однотипные переменные и заменить их разом.
4️⃣ Alt + Shift + A - Множественные курсоры. Печатаете одновременно в нескольких местах. Удобно для однотипных изменений.
5️⃣ Ctrl + / - Комментировать/раскомментировать выбранный код. Без ручного добавления # перед каждой строкой.
6️⃣ Tab - Табуляция [Быстрый отступ вправо (4 пробела по умолчанию)]. Работает и для одной строки, и для выделенного блока.
7️⃣ Shift + Tab - Обратная табуляция — возвращает строку или блок на 4 пробела влево.
Мой совет:
🎯 Советую попробовать прямо сейчас! Сначала будет непривычно — пальцы сами потянутся к мышке. Но через неделю-две вы заметите, насколько быстрее стали редактировать код. Особенно это чувствуется при работе с большими скриптами.
⚙️ Важная деталь для DBeaver: некоторые из этих комбинаций могут не работать по умолчанию. Но их легко настроить через параметры.
Итог:
😎 Если эта инструкция вам помогла, то кидайте 🔥 или ❤️!
А какие горячие клавиши вы используете пишите в комментариях?
Мой совет:
🎯 Советую попробовать прямо сейчас! Сначала будет непривычно — пальцы сами потянутся к мышке. Но через неделю-две вы заметите, насколько быстрее стали редактировать код. Особенно это чувствуется при работе с большими скриптами.
⚙️ Важная деталь для DBeaver: некоторые из этих комбинаций могут не работать по умолчанию. Но их легко настроить через параметры.
Итог:
А какие горячие клавиши вы используете пишите в комментариях?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15
Дима SQL-ит 🧑💻 (Аналитика данных) pinned «Как за 400 рублей в год получить доступ к Claude, ChatGPT, Gemini и Grok через Perplexity и без использования VPN 💎 Сейчас нейронки повсеместно упрощают жизнь. Примеры использования: • помогают с написанием текстов • помогают с написанием кода • помогают…»
Бесплатная нейросеть от Google для работы с любыми материалами — NotebookLM 🚬
😱 Бесплатных нейросетей сейчас полно, но почти все они ограничены по функциям. А вот NotebookLM от Google реально удивляет — это не просто чат, а мощный инструмент для изучения всего, что вы загрузите!
Вот чем она крута: 👇
1️⃣ Бесплатно для всех — Просто заходите на https://notebooklm.google/ — и пользуетесь без платы и без ограничений.
2️⃣ Работает с вашими файлами — можно загружать pdf-файлы, статьи, книги, любые тексты — и даже видео с YouTube. Модель будет отвечать на вопросы именно на основе этих материалов и всегда укажет, из какого источника берёт ответ. Это суперудобно, если нужно изучить сразу несколько книг или видео и не потеряться в источниках.
3️⃣ Всё, что нужно для учёбы и работы:
• Обычный чат — задаёте вопросы, получаете детальные ответы с ссылкой на источник.
• Roadmap — нейросеть сама разбивает здоровенный материал на структурированный план: видите, из чего всё состоит и что изучать по частям.
• Преобразование в подкаст — загруженные материалы можно конвертировать в подкаст (!) и спокойно слушать на прогулке или тренировке. Материалы будут персонализированы именно под вас.
4️⃣ Русский язык без проблем — все функции поддерживают русские тексты. Можно загружать статьи, свои записи, любые материалы — и получать ответы, планы, подкасты на русском.
5️⃣ Есть мобильное приложение — для тех, кто любит максимальное удобство. Можно пользоваться всеми возможностями прямо с телефона.
Итог:
🍸 Сочетаете изучение нужных материалов и отдых — идёте гулять и слушаете свой личный подкаст по книгам, статьям, лекциям. Всё бесплатно и невероятно просто. Советую попробовать и рассказать, как зашло в комментариях!
😎 Если эта инструкция вам помогла, то кидайте 🔥 или ❤️!
В одном из следующих постов планирую рассказать о бесплатных нейросетях, что думаете — нужен такой пост?
Вот чем она крута: 👇
• Обычный чат — задаёте вопросы, получаете детальные ответы с ссылкой на источник.
• Roadmap — нейросеть сама разбивает здоровенный материал на структурированный план: видите, из чего всё состоит и что изучать по частям.
• Преобразование в подкаст — загруженные материалы можно конвертировать в подкаст (!) и спокойно слушать на прогулке или тренировке. Материалы будут персонализированы именно под вас.
Итог:
В одном из следующих постов планирую рассказать о бесплатных нейросетях, что думаете — нужен такой пост?
Please open Telegram to view this post
VIEW IN TELEGRAM
Google NotebookLM
Google NotebookLM | AI Research Tool & Thinking Partner
Meet NotebookLM, the AI research tool and thinking partner that can analyze your sources, turn complexity into clarity and transform your content.
🔥12❤6
Две простые "магические" команды в Jupyter Notebook (Hub), которые стоит использовать каждый день 🤔
👍 Сегодня поговорим о двух простых, но невероятно мощных "магических" командах в Jupyter Notebook (Hub), которые сэкономят вам кучу времени и нервов.
1️⃣ %autoreload — Забудьте о перезапуске ядра!
Проблема: Вы пишете код в Jupyter, а часть ваших функций лежит в отдельном .py файле (например, my_utils.py). Вы импортируете функцию, используете ее, а потом замечаете в ней ошибку. Вы исправляете ошибку в .py файле, сохраняете его, заново пытаетесь импортировать... и ничего не меняется! Jupyter продолжает использовать старую версию функции, которая уже загружена в память. Приходится перезапускать ядро и выполнять все ячейки заново. Знакомо?
Решение: Магия %autoreload
Эта команда заставляет Jupyter автоматически перезагружать ваши модули перед выполнением кода в любой ячейке.
Как использовать:
Просто выполните эти две строки в самом начале вашего ноутбука:
И всё! Теперь вы можете спокойно редактировать свои .py файлы. Как только вы сохраните изменения, Jupyter при следующем запуске ячейки сам подхватит новую версию ваших функций. Никаких больше перезапусков ядра.
2️⃣ %whos — Что у меня в памяти?
Проблема: В процессе анализа вы создаете множество переменных: датафреймы, списки, словари, модели. Легко запутаться: как называется тот самый большой датафрейм? Сколько памяти он занимает? Какой у него тип данных?
Решение: Магия %whos
Эта команда выводит аккуратную таблицу всех переменных, которые существуют в вашей текущей сессии, с указанием их имени, типа, и самое главное — информации о размере или значении.
Как использовать:
Просто напишите в ячейке:
Мой совет:
🎯 Советую попробовать прямо сейчас! Поначалу это может показаться мелочью, но именно такие детали убирают из работы мелкие раздражающие паузы. Вы заметите, как рабочий процесс станет более плавным, когда не придётся постоянно перезапускать ядро или вспоминать, как именно вы назвали тот самый датафрейм.
Итог:
😐 Если эта инструкция вам помогла, то кидайте 🔥 или ❤️!
Как вам команды? Какими магическими командами пользуетесь вы? Делитесь своим мнением и находками в комментариях🍴
Проблема: Вы пишете код в Jupyter, а часть ваших функций лежит в отдельном .py файле (например, my_utils.py). Вы импортируете функцию, используете ее, а потом замечаете в ней ошибку. Вы исправляете ошибку в .py файле, сохраняете его, заново пытаетесь импортировать... и ничего не меняется! Jupyter продолжает использовать старую версию функции, которая уже загружена в память. Приходится перезапускать ядро и выполнять все ячейки заново. Знакомо?
Решение: Магия %autoreload
Эта команда заставляет Jupyter автоматически перезагружать ваши модули перед выполнением кода в любой ячейке.
Как использовать:
Просто выполните эти две строки в самом начале вашего ноутбука:
%load_ext autoreload
%autoreload 2
И всё! Теперь вы можете спокойно редактировать свои .py файлы. Как только вы сохраните изменения, Jupyter при следующем запуске ячейки сам подхватит новую версию ваших функций. Никаких больше перезапусков ядра.
Проблема: В процессе анализа вы создаете множество переменных: датафреймы, списки, словари, модели. Легко запутаться: как называется тот самый большой датафрейм? Сколько памяти он занимает? Какой у него тип данных?
Решение: Магия %whos
Эта команда выводит аккуратную таблицу всех переменных, которые существуют в вашей текущей сессии, с указанием их имени, типа, и самое главное — информации о размере или значении.
Как использовать:
Просто напишите в ячейке:
%whos
Мой совет:
🎯 Советую попробовать прямо сейчас! Поначалу это может показаться мелочью, но именно такие детали убирают из работы мелкие раздражающие паузы. Вы заметите, как рабочий процесс станет более плавным, когда не придётся постоянно перезапускать ядро или вспоминать, как именно вы назвали тот самый датафрейм.
Итог:
Как вам команды? Какими магическими командами пользуетесь вы? Делитесь своим мнением и находками в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤5
Дима SQL-ит 🧑💻 (Аналитика данных) pinned «Бесплатная нейросеть от Google для работы с любыми материалами — NotebookLM 🚬 😱 Бесплатных нейросетей сейчас полно, но почти все они ограничены по функциям. А вот NotebookLM от Google реально удивляет — это не просто чат, а мощный инструмент для изучения…»
⚡️ Как за год стать в 37 раз лучше: конспект "Атомных привычек" - Джеймса Клира. Часть 1
😱 Большинство людей верят в мотивацию, цели и грандиозные планы. А потом бросают все через неделю. Джеймс Клир в книге "Атомные привычки" разрушил этот миф и показал, что реально работает — системы крошечных изменений!
1️⃣ Магия 1% в день:
1,01^365 = 37,78. Это означает, что улучшение всего на 1% каждый день даёт рост в 37 раз за год! Не на 37%, а в 37 раз. Это математика, которую невозможно игнорировать.
2️⃣ Четыре закона изменения поведения:
• Сделать очевидным (триггер) - [например, если вы хотите чаще читать, то кладите книгу на видное место.]
• Сделать привлекательным (тяга) - [например, если вы любите кофе, налейте себе кофе и возьмите книгу, так у вас процесс чтения будет ассоциироваться с приятным действием]
• Сделать простым (реакция) - [начните с просто действия, не старайтесь прочесть сразу всю книгу, прочтите пару страниц и дальше сами вовлечетесь в процесс]
• Сделать приносящим удовлетворение (вознаграждение) - [поблагодарите себя, купите себе шоколад или посмотрите серию любимого сериала и т.п.]
3️⃣ Наслоение привычек:
• После [текущей привычки] я буду [новая привычка] - Привязка новой привычки к уже существующей. То есть так мы создаем дополнительный триггер для новой привычки.
4️⃣ Дизайн окружения:
• Изменение среды для поддержки нужных привычек - порой среда заставляет нас делать, то или иное действие. Библиотека заставляет учиться. Кафе для некоторых, как место для работы. Ищите новые места для новых привычек.
5️⃣ Отслеживание привычек:
• Создайте систему отслеживания прогресса по привычкам. Например, все же замечали прогресс у курсов на Stepik (это сделано специально, что вы больше вовлекались и закрепляли свою привычку учиться) ?
Самым простым примером для своих привычек и отслеживания их прогресса является ручка и листок, как выполнили действие вычеркнули из списка.
6️⃣ Использование социального окружения:
• Окружение влияет на поведение больше, чем мотивация - в каком-то социальном кругу поощряется обучение и саморазвитие, а в каком-то наоборот. Именно по этому очень сложно развиваться в среде, которая это не одобряет и по этой причине вам придется изменить окружение если вы захотите формировать новые привычки.
7️⃣ Изменение идентичности через действия:
• Вы должны понять для себя, а зачем вам нужна та или иная привычка. Каждое действие - это голос за тот тип человека, которым вы хотите стать. Например, примите для себя зачем вам нужно обучаться каждый день (получить хорошую работу, поддерживать мозг в тонусе, повысить качество жизни и т.п.)? Решите, кем хотите быть и действуйте. Человеческий мозг не любит не известность - проще делать действия, когда он понимает зачем ему это нужно делать.
8️⃣ Преодоление плато:
• Изменения это не линейный процесс - в какой-то момент вы можете подумать, что ничего не меняется и вы начнете задаваться вопросами, а зачем вы это делаете и будет соблазн все бросить. Но вы должны помнить, что жизнь не линейна и на освоение навыков и заметных результатов нужно время. Здесь помогает провести ретроспективу и посмотреть, чего вы смогли добиться за это время. Например, вы прошли курс по python, но видите другие примеры людей, которые на нем пишут серьезные проекты, а вы "лишь" работаете с табличками и думаете, что это все бесполезно, но вспомните, что перед этим для вас и print() было написать чем-то невообразимым, а сейчас вы уже можете автоматизировать работу с таблицами.
9️⃣ Роль скуки в поддержании привычек:
• Скука - главный враг долгосрочного успеха. Бывают дни, когда нет желания и просто скучно что-то делать по своим привычкам. Необходимо продолжать даже когда не интересно. Здесь важно отчеркнуть границу, когда лень, а когда вы чувствуете, что можете выгореть.
😱 Большинство людей верят в мотивацию, цели и грандиозные планы. А потом бросают все через неделю. Джеймс Клир в книге "Атомные привычки" разрушил этот миф и показал, что реально работает — системы крошечных изменений!
1,01^365 = 37,78. Это означает, что улучшение всего на 1% каждый день даёт рост в 37 раз за год! Не на 37%, а в 37 раз. Это математика, которую невозможно игнорировать.
• Сделать очевидным (триггер) - [например, если вы хотите чаще читать, то кладите книгу на видное место.]
• Сделать привлекательным (тяга) - [например, если вы любите кофе, налейте себе кофе и возьмите книгу, так у вас процесс чтения будет ассоциироваться с приятным действием]
• Сделать простым (реакция) - [начните с просто действия, не старайтесь прочесть сразу всю книгу, прочтите пару страниц и дальше сами вовлечетесь в процесс]
• Сделать приносящим удовлетворение (вознаграждение) - [поблагодарите себя, купите себе шоколад или посмотрите серию любимого сериала и т.п.]
• После [текущей привычки] я буду [новая привычка] - Привязка новой привычки к уже существующей. То есть так мы создаем дополнительный триггер для новой привычки.
• Изменение среды для поддержки нужных привычек - порой среда заставляет нас делать, то или иное действие. Библиотека заставляет учиться. Кафе для некоторых, как место для работы. Ищите новые места для новых привычек.
• Создайте систему отслеживания прогресса по привычкам. Например, все же замечали прогресс у курсов на Stepik (это сделано специально, что вы больше вовлекались и закрепляли свою привычку учиться) ?
Самым простым примером для своих привычек и отслеживания их прогресса является ручка и листок, как выполнили действие вычеркнули из списка.
• Окружение влияет на поведение больше, чем мотивация - в каком-то социальном кругу поощряется обучение и саморазвитие, а в каком-то наоборот. Именно по этому очень сложно развиваться в среде, которая это не одобряет и по этой причине вам придется изменить окружение если вы захотите формировать новые привычки.
• Вы должны понять для себя, а зачем вам нужна та или иная привычка. Каждое действие - это голос за тот тип человека, которым вы хотите стать. Например, примите для себя зачем вам нужно обучаться каждый день (получить хорошую работу, поддерживать мозг в тонусе, повысить качество жизни и т.п.)? Решите, кем хотите быть и действуйте. Человеческий мозг не любит не известность - проще делать действия, когда он понимает зачем ему это нужно делать.
• Изменения это не линейный процесс - в какой-то момент вы можете подумать, что ничего не меняется и вы начнете задаваться вопросами, а зачем вы это делаете и будет соблазн все бросить. Но вы должны помнить, что жизнь не линейна и на освоение навыков и заметных результатов нужно время. Здесь помогает провести ретроспективу и посмотреть, чего вы смогли добиться за это время. Например, вы прошли курс по python, но видите другие примеры людей, которые на нем пишут серьезные проекты, а вы "лишь" работаете с табличками и думаете, что это все бесполезно, но вспомните, что перед этим для вас и print() было написать чем-то невообразимым, а сейчас вы уже можете автоматизировать работу с таблицами.
• Скука - главный враг долгосрочного успеха. Бывают дни, когда нет желания и просто скучно что-то делать по своим привычкам. Необходимо продолжать даже когда не интересно. Здесь важно отчеркнуть границу, когда лень, а когда вы чувствуете, что можете выгореть.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥9👏2
Это вторая часть конспекта по книге "Атомные привычки" Джеймса Клира.
Первая часть находиться здесь
Задачи должны быть в "золотой середине" - не слишком легкие, не слишком сложные. В ходе экспериментов было замечено, что поддерживать интерес и формировать новые полезные привычки удается эффективнее, когда уровень сложности оптимальный. Например, обучение python становится интересным процессом, когда мы начинаем с посильных нам задач, написания print, узнаем, как работают циклы for и while и т.д., а не сразу лезем писать сложный проект.
Чтобы избавиться от вредных привычек требуется следующее.
• Сделать невидимым - уберите излишние триггеры. Хотите похудеть - покупайте меньше еды, так при очередном подходе к холодильнику вы увидите, что у вас не большой выбор и вы уменьшите или вовсе откажитесь от приема пищи.
• Сделать непривлекательным - плохая привычка должна ассоциироваться с чем-то не приятным. Хотите бросить курить - подумайте об отрицательных сторонах курения (желтые зубы, отдышка, большая трата денег).
• Сделать сложным - возьмем тот же пример с курением. Если у вас есть пачка сигарет, то кладите ее каждый раз подальше, чтобы каждый раз, когда вы хотите покурить вы понимали, что вам далеко идти.
• Сделать неудовлетворительным - наказывайте себя за плохие привычки. Пример наказания - поспорьте с другом или близкими вам людьми, что если вы выполняете плохую привычку, то за этим будет следовать наказание, например, вы будете отдавать 500 рублей за это действие.
• Хорошие привычки лучше приобретаются если они являются частью вашей предрасположенности. То есть вы должны найти то дело, которое у вас получается и которое вам нравится. Доказано, что в таких делах хорошие привычки формируются быстрее. Как понять, какое направление является вашей предрасположенностью? Под это можно выделить отдельный пост.
• Нужно проводить ретроспективу по имеющимся привычкам. Сложно отказаться от устоявшихся привычек, нам кажутся, что и не требуют доработок. Например, вы привыкли быстро работать в какой либо ide мышкой и не хотите учить горячие клавиши, хотя они ускорят вашу работу в разы, это привычка, которую следует пересмотреть. Кстати, у меня есть отдельный пост про горячие клавиши, которые вас ускорят - пост здесь.
• У всех бывают не удачные дни - заболели, просто лень, чувствуете грань выгорания, нет времени и т.п. Здесь важно быстро вернуться в поток после перерыва. Допустим позволили себе 1 или 2 пропуска по вашей привычки, но после этого нужно срочно возвращать практику этой привычки.
Итог:
Расскажите, вы, читали эту книгу? Что думаете по поводу этих идей - может вы их уже применяете не осознано?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥8
Рассмотрим классическую проблему с которой встречались многие.
📊 Пример данных:
Таблица orders:
order_id
--------
1
2
3
4
И таблица delivered_orders:
order_id
--------
1
2
NULL ← вот эта засада!
❌ Почему оператор NOT IN в данном случае выдаст не верный результат:
Пишем запрос:
SELECT *
FROM orders
WHERE order_id NOT IN (SELECT order_id FROM delivered_orders);
Подзапрос вернет: (1, 2, NULL)
Итоговый результат - ПУСТАЯ ВЫБОРКА!
Почему сломалось? Давайте посмотрим на логику работы оператора not in для строки 3 в таблице orders:
Переведем эти условия на булевую логику:
То есть для любой строки условие не будет выполнено из-за NULL
SELECT *
FROM orders
WHERE order_id NOT IN (SELECT order_id FROM delivered_orders where order_id is not null);
Пишем запрос:
SELECT *
FROM orders o
WHERE NOT EXISTS (
SELECT 1
FROM delivered_orders d
WHERE d.order_id = o.order_id
);
Сравнение выполняется построчно; запись с NULL не совпадает ни с одним order_id, поэтому итог снова 3 и 4 — без риска забыть фильтр IS NOT NULL.
Итог:
Встречались с такой проблемой и поняли как ее решить?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤9
Давайте разберем классическую задачку, которая встречается очень часть: "Кубик бросают три раза. После каждого раза можно остановиться. Как следует поступить, что бы последнее значение было наибольшим?"
• Честный кубик - кубик у которого вероятность выпадения каждой грани равновероятно и равна 1/6
• Закон больших чисел - если проделывать один и тот же случайный эксперимент очень-очень много раз (например, бесконечно часто подбрасывать монетку), то средний результат этих попыток неизбежно приближается к настоящему «правильному» среднему — к математическому ожиданию.
• Математическое ожидание - Это то самое «настоящее среднее»: число, к которому в идеале стремилось бы ваше среднее, если бы вы смогли делать опыт бесконечно долго. Считается оно, как сумма возможных значений на их вероятность появления. Для честного кубика это (1/6*1 + 1/6*2 + 1/6*3 + 1/6*4 + 1/6*5 + 1/6*6) = 3.5 то есть в среднем мы ожидаем, что при большом количестве бросков кубика среднее всех этих бросков будет равняться 3.5 .Например, подбрасываем кубик 1000 раз (первое значение 6, второе значение 1, третье значение 3 и так 1000 раз). Суммируем все эти значения и делим на количество бросков и получаем примерно 3.5.
Давайте введем следующую подмену, представьте, что значения на кубике равным деньгам, например, вот так:
1 -> 100 рублей
2 -> 200 рублей
3 -> 300 рублей
4 -> 400 рублей
5 -> 500 рублей
6 -> 600 рублей
Отлично, теперь я предлагаю пойти от последнего броска (3-ий бросок). Давайте поймем почему третий бросок имеет мат.ожидание 3.5 или 350 рублей. Представляем себе, что мы играем в игру 1000 раз и доходим до 3-его броска также 1000 раз, тогда мы понимаем, что в среднем из 1000 возможных значений в среднем мы будем получать 3.5 (или 350 рублей) - посмотрите еще раз закон больших чисел. Хорошо, держим это в голове, что последний бросок в среднем нам дает 3.5 (350 рублей).
Теперь возвращаемся на второй бросок, предположим мы получили 2 (200 рублей) мы можем взять эти 200 рублей или пойти дальше (а мы знаем, что в среднем дальше мы можем получить 350 рублей), ну логично пойти дальше. То есть если мы на втором броске получаем меньше 350 рублей, а это 100, 200, 300 имеет смысл сделать 3-ий бросок.
Теперь самое интересно, а как себя вести на первом броске ? Здесь нужно учесть математическое ожидание 3-его броска. Давайте поясню. Представляете это себе так - мы знаем, что на втором броске мы будем идти на третий бросок, если нам выпадет 100, 200 или 300 рублей, так как третий бросок в среднем нам дает 350 рублей. Тогда на первом броске мы учтем вот этот запас и теперь мат.ожидание второго броска будет считаться вот так (350 + 350 + 350 + 400 + 500 + 600) и получим 425 рублей, чувствуете, что я сделал ?
Я заменил 100, 200 и 300 рублей на 350, то есть на мат.ожидание третьего броска, так как подразумеваю, что у меня сейчас первый бросок и мне нужно учесть третий бросок, так как в совокупности (1-ый и 2-ой бросок дают больше шансов) они могут дать больше из-за количества попыток. В таком случае на второй бросок стоит идти, если только при первом броске у меня выпадет меньше 425 рублей, то есть 500 рублей или 600 рублей, а это значения 5 и 6 на кубике соответственно.
Такая же логика, когда количество бросков больше, нужно идти от последнего броска и каждый раз пересчитывать математическое ожидание.
Итог:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤4👍2
• Скорее всего многие — хранят пароли прямо в коде. Это плохая идея: однажды файл улетит в репозиторий, дальше — скриншоты, форки, кеши, истории коммитов… вернуть секрет назад почти невозможно.
• Чуть лучше — держать секреты в отдельном .py и импортировать. Но это всё ещё код, который легко случайно закоммитить и потянуть на прод.
• Давайте разберёмся, как делают это правильно и почему.
🔐 Золотое правило: секреты — вне кода:
Идея простая: код — отдельно, значения — отдельно. На практике это делается через переменные среды окружения (environment variables). Про переменные среды окружения можно написать отдельную статью, сейчас это не так важно, просто имейте это ввиду.
Удобный локальный способ работать с ними — файл .env. Это просто текстовый файл формата ИМЯ=ЗНАЧЕНИЕ, из которого значения подгружаются в окружение при старте.
Пример файла .env:
NAME='Dima SQL-ит'
PROFESSION=analyst
HEIGHT=174
Заметим:
• Слева — название переменной, чаще пишут ЗАГЛАВНЫМИ (так принято называть константы для читабельности кода).
• В .env всё является — строками; значение 174 тоже будет текстом.
• Если в значении есть пробелы — берём в кавычки. Например, NAME='Dima SQL-ит'.
⚙️ Как это подключить в Python
Устанавливаем библиотеку:
pip install python-dotenv
Загружаем .env и читаем переменные:
import os
import dotenv
dotenv.load_dotenv(".env") #Загружаем переменные окружения из файла .env
Читаем значения:
NAME = os.getenv("NAME") # 'Dima SQL-ит'
HEIGHT = os.getenv("HEIGHT") # '174' (строка)
DEBUG = os.getenv("DEBUG", "0") # дефолт, если переменной нетПояснение:
По умолчанию load_dotenv ищет файл .env рядом со скриптом; путь можно указать свой.
Все значения — строки; при необходимости приводим типы вручную:
height = int(os.getenv("HEIGHT", "0"))
✅ Почему это лучше, чем держать секреты в .py:
1) Не светишь секреты по ошибке - файла .env добавляют в .gitignore, реальные пароли/токены не улетают в репозиторий.
2) Простое разделение dev/test/prod - держим .env.dev, .env.stage, .env.prod и подсовываем нужный при запуске — код один, меняются значения. (актуально больше для разработчиков, но вы тоже можете придумать свои .env файлы под каждый случай)
3) И т.д.
Итог:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤7👍3
🔥 Как за 5 минут превратить CSV файлы в полноценную базу данных через SQLite в DBeaver:
💎 Представьте:
У вас куча CSV файлов с данными, и вы хотите быстро выполнить анализ - выполнить между ними JOIN'ы или провести агрегацию GROUP BY. Давайте превратим эти CSV файлы в полноценную базу!
Что сделаем:
1️⃣ Создадим подключение к SQLite прямо в DBeaver — никаких дополнительных установок.
2️⃣ Импортируем CSV файл в отдельную таблицу.
3️⃣ Проверим работоспособность.
Приятного чтения - статья здесь
Зачем это нужно?
• Для проведения быстрой аналитики
• Для учебных проектов
• Одна база данных вместо кучи разрозненных CSV.
Итог:
😎 Если этот пост был вам полезен, то кидайте 🔥 или ❤️!
❓ А вы используете SQLite для аналитики? Пишите в комментариях, как вам такой способ?
💎 Представьте:
У вас куча CSV файлов с данными, и вы хотите быстро выполнить анализ - выполнить между ними JOIN'ы или провести агрегацию GROUP BY. Давайте превратим эти CSV файлы в полноценную базу!
Что сделаем:
Приятного чтения - статья здесь
Зачем это нужно?
• Для проведения быстрой аналитики
• Для учебных проектов
• Одна база данных вместо кучи разрозненных CSV.
Итог:
Please open Telegram to view this post
VIEW IN TELEGRAM
Teletype
Как за 5 минут превратить CSV файл в полноценную базу данных через SQLite в DBeaver 🔥
💎 Представьте: у вас куча CSV файлов с данными, и вы хотите быстро выполнить анализ - выполнить между ними JOIN\'ы или провести...
🔥13👍4❤1
Я люблю читать книги и стараюсь сразу по ходу чтения конспектировать информацию в виде нумерованных пунктов (тезисов). Но недавно посмотрел видео от одного из моих любимых авторов, и это заставило пересмотреть мой подход. Сделал для себя выводы и хочу поделиться ими с вами:
Итог:
🔗 ссылка на видео здесь
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
Дзен | Видео
Как читаю книги, бумага/iPad/eink, скорочтение, надо ли дочитывать книги и что происходит в Ботаним | Диджитализируй! | Дзен
Видео автора «Диджитализируй!» в Дзене 🎦: 00:00 О чём пойдёт речь
00:25 Любовь к книгам
02:58 А смысл?
00:25 Любовь к книгам
02:58 А смысл?
🔥13❤3
Если вы знаете только SQL и задумываетесь, а нужно ли учить Pandas, то я могу вам предложить, отличную альтернативу, которая позволяет работать с Pandas DataFrames на языке SQL. Для этого нам понадобиться библиотека duckdb.
pip install pandas duckdb
import pandas as pd
import duckdb
# DataFrame 1: Заказы (orders_df)
orders_data = {
'order_id': [1, 2, 3, 4],
'customer': ['Alice', 'Bob', 'Charlie', 'David'],
'amount': [100, 200, 150, 300]
}
orders_df = pd.DataFrame(orders_data)
# DataFrame 2: Доставки (deliveries_df)
deliveries_data = {
'order_id': [1, 2, 4],
'status': ['Delivered', 'Delivered', 'Pending'],
'delivery_date': ['2025-08-10', '2025-08-12', None]
}
deliveries_df = pd.DataFrame(deliveries_data)
Теперь эти DataFrames хранятся в переменных orders_df и deliveries_df. Они имеют общее поле order_id — идеально для join'а!
DuckDB видит ваши DataFrames как "таблицы":
# Простой пример: SELECT из одного DataFrame
base_df = duckdb.query("""
SELECT * FROM orders_df -- orders_df как таблица!
""").to_df()
А теперь пример с join'ом нескольких DataFrames и оконной функцией. Мы сделаем LEFT JOIN по order_id, обработаем NULL в статусе с COALESCE, и добавим ранжирование по сумме заказов с ROW_NUMBER():
result_df = duckdb.query("""
SELECT
o.order_id,
o.customer,
o.amount,
COALESCE(d.status, 'Not Delivered') AS delivery_status, -- Обработка NULL
ROW_NUMBER() OVER (ORDER BY o.amount DESC) AS rank_by_amount -- Оконная функция!
FROM orders_df AS o -- Первый DataFrame как таблица 'o'
LEFT JOIN deliveries_df AS d -- Второй DataFrame как таблица 'd'
ON o.order_id = d.order_id
""").to_df()
# Выводим результат (для примера)
print(result_df)Красота! Мы объединили два DataFrames, применили оконную функцию — всё в одном SQL-запросе и без знаний синтаксиса Pandas.
Итог:
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤7
Всем привет! Хочу порекомендовать канал @ds_memes с большим количеством мемов про IT / DS.
Мемы публикуются 4+ раза в день, можете найти для себя интересные и делиться с коллегами👉
Советую подписаться и следить за мемасами🤪
Мемы публикуются 4+ раза в день, можете найти для себя интересные и делиться с коллегами
Советую подписаться и следить за мемасами
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥7👍3