дата инженеретта – Telegram
дата инженеретта
2.98K subscribers
242 photos
28 videos
4 files
102 links
мелкое — крупно,
в глубоком разговоре
мудрость приходит

по вопросам сюда: @aigul_sea
Download Telegram
Привет! o/

Меня зовут Айгуль, и я работаю дата инженером в крупной компании👩‍💻

Кратко о себе:
🐦 окончила вуз по направлениям "Бизнес-информатика" и "Программная инженерия"
🐦 посвятила время фронтенд- и бэкенд-разработке, но основную часть – работе с данными
🐦 сейчас использую технологический стек: Spark, Hadoop, Hive, Python, Scala, Airflow, dbt, ClickHouse, Superset

В этом канале я буду:
🐤 рассказывать о своем пути: с чего начинала, чего достигла и как я оказалась в этой точке
🐤 рассказывать о настоящем: чем занимаюсь сейчас, какие курсы прохожу, какие проекты поделываю для души
🐤 рекомендовать подборки материалов и полезных ресурсов
🐤 постить интересные задачки и лайфхаки на тему данных (и не только!)
🐤 помогать прокачиваться быстрее, чем это делала я

В общем, впереди много всего крутого😎

На вас смотрит серьезное личико, потому что мы будем серьезно говорить о несерьезных вещах. Ну, или наоборот)

Добро пожаловать!🤗
133👍11🔥7🤡1
Мой путь в сфере данных начался в 2019 году, когда я пошла на день открытых дверей в PwC - аудиторскую компанию из "большой четверки". Там я узнала про летние академии, зарегалась и прошла отбор. По результатам участия в этом двухнедельном мероприятии должны были выбрать особо активных студентов, чтобы потом пригласить на собес. Я не знаю, каким образом я туда попала, потому что вот эта аудиторская тематика, анализ деятельности компаний, проведение инвентаризаций - все было мимо меня))

Ну ладно, на собесе (вдруг!) спрашивали про sql и просили писать запросы. Я не готовилась, с базами данных перестала контактировать года 2 как до этого, предмет был, но я все равно не до конца его понимала и даже забыла, как правильно написать order by😂

Но меня взяли🥳 и спустя 4 месяца я пришла на предрабочие тренинги. Такие правила игры🤷‍♀️ больше рабочих рук требовалось в бизи сизон с января по март в пик отчетностей. Когда меня спросили: "В какую команду ты устраиваешься?", я вообще понятия не имела) Предположили, что буду сидеть на звонках, но фух, пронесло))

В общем, меня взяли в команду JET (Journal Entries Testing) - это когда аудиторы присылают транзакции компании, оборотно-сальдовую ведомость, свои критерии тестирования и требуют сделать, чтобы все разницы сошлись по нулям. Другой большой стрим - переоценка нереализованных курсовых разниц. Там своя тема с валютными балансами, и все пересчеты тоже должны были сходиться.

В этой команде я проработала почти 3 года, где через мои руки и голос прошли 14 коллег, которых я коучила и ревьюила, паралелльно сдавая экзы в маге👩‍💻 За это время я получила hands-on experience в sql (были те еще извращения) и научилась сохранять все рабочие файлики (потому что когда-нибудь оно всплывет). И, конечно, много всего другого.

По итогу получилось так, что я окончила магу и решила уходить. Параллельно работать было на 300% комфортно, но расти дальше тоже нужно. Потихонечку опрашивала покидавших нас коллег, куда они шли и куда могла бы стремиться я) Но по факту я чисто сходила на корпорат, получила повышение, забрала премию и ушла😂

Я и не предполагала, что уже через год поменяю еще одну работу и один город. Но об этом уже в следующей серии...
🔥174👍1🏆1
Спустя 5 дней я уже сидела в новеньком офисе в роли SQL-аналитика в Совкомбанке. Собес проходил в два этапа - решить тест на дому за полчаса и пообщаться с руководителями.

В тесте было 2 задания: написать запросы и технически объяснить, что выдаст уже написанный один большой запрос. Задания были основаны на использовании case when, between, in, like, having, подзапросов, оконок, встроенных функций типо current_timestamp, datediff, на понимании видов джойнов и кругов Эйлера. Тут есть очень удобная штука для визуализации этих кругов SQL Visualizer, но сейчас доступна только под впн(

Я попала в отдел фрода, и у меня был доступ ко всем транзакциям физических лиц😎 Еженедельно собиралась статистика по тому, сколько у кого украли и скольких беззащитных бабулек мы смогли вразумить. Цель - проанализировать поведение мошенников и обычных людей и сделать так, чтобы мы со 100% точностью ловили первых и не беспокоили вторых. Но реальность неидеальна😔 Цепочка транзакций могла сильно разрастаться:
• Петя берет у нас кредит, выводит
• Вася берет кредит в другом банке
• Вася переводит деньги из другого банка к нам на свой счет
• Вася переводит эти деньги Пете
• Петя снимает деньги в кассе
(если что, это все отлавливается, так что не пытайтесь!)

Почти с самого начала я подметила токсичненькую атмосферу, и мне захотелось поменять отдел или компанию. Тут начался необычный этап поиска, о котором я расскажу в следующий раз.

🐝Всего я проработала 5 месяцев, и, хотя после испыталки все вдруг наладилось и меня даже не хотели отпускать, осадочек засел очень глубоко. Видимо, как есть стресс-интервью, так есть и стресс-испыталка. Все равно я многому научилась: писать 200-строчные запросы, триггеры и процедуры, разбираться в логике проведения банковских транзакций. Еще узнала важную истину: многие магазины блефуют, когда предлагают оплатить через сбп. За него не списывается комиссия за пользование pos-терминалом (куда мы прикладываем карточку) и не начисляется кешбэк, потому что под капотом это обычный перевод🐦
7🔥7
Через пару месяцев (в декабре прошлого года) я начала искать работу. Так как уходить так быстро я не собиралась, то не могла осознать, чего же я хочу сейчас. В тот момент многие мои знакомые уехали за рубеж, и мне тоже захотелось попытать счастья🌝 Мне вкинули идею с линкедином, я создала страничку и начала откликаться на вакансии (добавиться можно тут).

Про свои поиски я рассказывала друзьям, и один из них предложил по рефералке закинуть меня в международную компанию и скинул список оф. вакансий на дата инженера (спасибо!). Я никогда не задумывалась о поиске на такую роль. И начала разбираться, чем отличается куча столь похожих профессий: Data Analyst, Analytics Engineer, Data Engineer, Data Scientist, ML Engineer. Позиции были технически скилловые и очень крутые, и в этот момент я задумалась: а может, я всегда хотела быть дата инженером?

Тогда я начала искать конкретно датаинженерные вакансии. Моей целью было получить хотя бы опыт собеседований на английском. Но я отправила около 100 откликов за пару месяцев и не получила ни одного приглашения☹️

Зато промониторила рынок.

И создала файлик "Things I Should Know" из тех требований, которые встречала чаще всего:
❄️ Snowflake
❄️ AWS
❄️ Azure
❄️ Spark
❄️ Hive
❄️ Hadoop
❄️ ETL/ELT
❄️ Kafka
❄️ Redshift
❄️ Kubernetes
❄️ Databricks

А потом я наткнулась на два очень полезных ресурса, которые круто изменили мою жизнь!
🔥16👍1
🪄Я не помню как, но в январе я наткнулась на чат Data Learn и их ютуб-канал. В программе 7 модулей (см. плейлисты): Overview, Databases, BI, ETL/ELT, Cloud, OLAP, Spark. Скажу честно, что меня хватило только на первые два, которые можно и так частично скипнуть( По желанию можно скидывать домашку, которую более прошаренные ребятки проверят. Очень ждала модуля по Spark, который к тому моменту еще не был записан, а теперь он есть!

💎И вот в том чатике кто-то упомянул zoomcamp. Конечно, мне надо было все про это разузнать)) И я запрыгнула в уже едущий поезд.

📌Кстати, у них в январе стартует новый поток🥳✏️

Что там было?
• всего шесть недель
• каждую неделю:
• пул видосов по теме (штук 10-15)
• онлайн Q&A сессия (в записи тоже)
• домашка, которую проверяют и оценивают
• чатик, где можно попросить помощи
• в конце нужно все применить и сделать проект

Что по инструментам?
Postgres, Spark, Prefect, Kafka, Docker, dbt, BigQuery, Terraform, Google Cloud (который я +- заменила на Yandex Cloud) - просто то, что нужно🔥
В предыдущих потоках вместо Prefect использовался Airflow, поэтому можно дополнительно поизучать по видосам.

В целом, программа заняла 1,5-2 месяца. К сожалению, во время зумкампа я нашла работу и не успела завершить проект🤭 Но об этом далее)
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥6👍2
🧑‍💻Пока я проходила бесплатные курсы из предыдущего поста, я добавила новые инструменты себе в резюме, сделала его красивым тут и параллельно продолжала искать работу. Нашла ее на линкедине, где моя будущая коллега выложила вакансию. Весь процесс занял три недели.

Что нужно было знать?
- разбираться в концепциях хранилищ данных
- знать питон или скалу
- уметь написать витринку на спарке
- разбираться в спарк конфигах
В доке есть огромная табличка. Естественно, не все параметры нужны для ежедневной настройки, так что, если вам интересно, я подготовлю список самых часто используемых.
В общем, это был мой первый собес на ДЕ, и я его прошла!

🧑‍🎓Помимо знаний с курсов, мне помогла моя магистерская и весь треш, через который я прошла при ее подготовке год назад. Я успела потрогать dbt, Airflow, Metabase (BI тулза), разобраться в форматах хранения биг даты (parquet, avro и т. д.), поразворачивать хадуп локально и в докере и покопаться с его настройкой.

💬Плюс мне начали попадаться всякие крутые датаинженерные чатики. Рекомендую вот эти, в них можно почерпнуть глубокую мудрость:
https://news.1rj.ru/str/rockyourdata
https://news.1rj.ru/str/dataengineering_chat_ru
https://news.1rj.ru/str/datalearn_community
https://news.1rj.ru/str/hadoopusers
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥93👍21💯1
🎚Вакансию я нашла в Москве, а жила в Казани. Параллельно был оффер на другую позицию (примерно такую, где можно было работать удаленно). Тут я встала перед выбором: жить спокойной жизнью, как и раньше, или воспользоваться крутыми перспективами развития.

👨‍💻Я начала ресерчить: нашла сотрудников обеих компаний (опять-таки в линкедине), посмотрела на их обязанности, пообщалась. Даже встретились люди, которые раньше работали там, где я была тогда☯️ Поспрашивала в тг чатиках, у друзей и знакомых отзывы о компаниях, должностях и о целесообразности переезда. Сила в нетворкинге😎

👋В итоге я решила отказаться от перспектив и приняла второй оффер. Потом оказалось, что на эту позицию уже взяли предыдущего кандидата (хотя прошел всего лишь день), и я вернулась такая "ой, а я случайно, а мы можем представить, что ничего не было?"☺️ Вывод: лучше раньше времени не отказываться)) Потому что все до последнего момента может поменяться.

🤔Но я снова долго думала и не решалась переезжать. В итоге дотянула до того, что я отработала две недели, тем же вечером села в поезд, а с утра пошла устраиваться на новую работу😁

Кстати, зарплатные вилки можно смотреть тут:
https://getmatch.ru/salaries - российский рынок ИТ-направлений
https://www.reddit.com/r/dataengineering/comments/188grde/quarterly_salary_discussion_dec_2023/ - а тут дискуссии на мировом рынке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥111❤‍🔥1
Сейчас я работаю мидл дата инженером в Сбере в команде очень крутых коллег, всем респект!🔥

🧑‍🎓Первые пару недель было реально тяжело влиться в процессы, т.к. казалось, что от меня ожидают гораздо большего, чем я могу дать. Каждый день я была в состоянии «ничего не понятно😩». Поэтому я после и до работы смотрела нужные видосики с karpov courses и подтягивала теоретическую базу. Видосами со мной поделился один хороший человек, поэтому старайтесь наращивать базу полезных контактов)

📺Что мы делаем?
У нас есть несколько уровней организации: команда -> кластер -> трайб. И вот наш трайб - про маркетинг. Мои коллеги придумывают рекламу, а мы потом смотрим, как она работает.

💠Что я делаю?
Кручу таблички, большие таблички на связке Hadoop+Spark в Jupyter Notebook👩‍💻
Делаю витринки с данными, которые потом мои коллеги-аналитики используют для бизнес-инсайтов
Строю пайплайны обработки на dbt+Airflow🐍
По ходу дела пришлось разобраться в Scala, Clickhouse и Superset, чтобы оптимизировать код, удобно складывать результаты расчетов и строить красивые чартики📊

А недавно я ходила на сходку питонистов, где со мной поделились полезной инфой по митапам (офлайн и онлайн):
https://news.1rj.ru/str/ict2go
https://news.1rj.ru/str/ITMeeting
https://news.1rj.ru/str/meetupochnaya
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥8❤‍🔥2💯1
👩‍💻Если вы думаете, что никому не нужен ваш личный гит-репозиторий, то на него точно смотрят.

Конечно, никто не будет копаться в каждом проекте, но уже за пару минут можно узнать, какие инструменты вы используете и как давно этим занимаетесь. А в пет-проектах можно потрогать новые тулзы, чтобы потом добавить эти скиллы в резюме и рассказывать про них на собесах😎

🎆В какой-то момент я сильно увлеклась онлайн-игрой «Ханаби», и мне захотелось собирать статистику по пользователям и анализировать разные показатели.

🤓Что я делала?
1. Начала с парсинга html-страниц с историей игр
2. Потом узнала, что есть апишка, и начала складывать данные в json-ы
3. Позже настроила загрузку сразу в бд
4. Потом захотелось искать игры по определенным критериям и даже создать свой язык запросов😁 Но меня вовремя отговорили и предложили поменять структуру бд, чтобы она чуть менее оптимально использовала ресурсы в пользу более удобного поиска.

🤔Зачем?
Чтобы делиться инсайтами с другими игроками. В сообществе были программисты и математики, которые предлагали разные алгоритмы расчета, от реализации которых я кайфовала.

Я настолько заинтересовалась в предметной области, что изучила новые штуки: SQLAlchemy (ORM для питона), Neo4j (графовая бд), как читать данные из api гитхаба или как деплоить сайты в GitHub Pages. Сверху можно докрутить еще Airflow, BI для полноты картины. Проект доступен тут.

🔗Так что попробуйте найти крутой датасет и поэкспериментировать. Список бесплатных ресурсов:
Kaggle
UK
EU
Azure
Bigquery
Тематические
Песни
Разное
Поиск по датасетам
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14💯5👻32
Работа дата инженером – одна из путевок в жизнь

🔍Когда я искала в первый раз, было супер сложно. Но как только я поставила в hh «Дата инженер | Data Engineer», сразу стали прилетать приглашения. Кстати, полезно переводить название позиции, т.к. hr могут искать на разных языках.

Я думала, вот поставлю новую должность, тыкну «не ищу работу», и все посмотрят: «Ага, только устроилась, писать не будем». Но резюме всплыло наверх, и меня начали хантить уже через 3 дня после трудоустройства😁 Естественно, я всем отказывала, какой смысл собеситься на первой неделе работы?🙂 Но все это говорит о востребованности профессии

📝Вот небольшой список компаний, которые набирают дата инженеров:
- Билайн
- X5 Group
- Центр финансовых технологий
- Лига цифровой экономики
- ITFB Group
- Иннотех
- Mediascope

На некоторые собесы я ходила, и из интересного спрашивали про having, lag/lead, внешние ключи, внешние таблицы, оптимизацию и план запросов, CDC (Change Data Capture), SSIS пакеты.

🍓А сегодня прилетела вакансия из Wildberries вот с такими требованиями:

Задачи:
• Поддержка CI/CD-пайплайнов
• Настройка/поддержка кластера Clickhouse
• Организация ETL-процессов: маршрутизация потоков данных, обеспечение их качества и доступности
• Оптимизация сложных аналитических запросов в Clickhouse
• Бизнес-логика на Golang или Python

Стек:
• Python/Go (на уровне конкретных практических задач)
• СУБД Clickhouse, Postgres
• Источники данных: Kafka, NATS, OLAP-кубы, API
• k8s

Кому дать контакты?😉

#собес
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥132💯1
Время задачек!🎉

Задача 1.


Эта задача на аналитика, она легкая, но мне понравилась.

Даны таблицы clients и documents.
В таблице с документами есть версионность, где '9999-12-31' означает, что версия действующая.
Нужно вывести id клиентов, у которых отсутствует актуальная версия.

Потестить можно тут.

Пишите свои решения в комментах!

create table clients (
client_id int,
client_fio varchar(255)
);

insert into clients values
(1, 'Иванов И.И.'),
(2, 'Петров П.П.'),
(3, 'Сидоров С.С.');

create table documents (
client_id int,
valid_from date,
valid_to date,
document_no varchar(9),
income int
);

insert into documents values
(1, '2020-01-01', '2020-12-31', '111111-11', 100000),
(1, '2021-01-01', '2022-06-01', '111111-11', 120000),
(1, '2022-06-01', '9999-12-31', '333333-33', 120000),
(2, '2001-01-01', '2023-01-01', '555555-55', 50000);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4
Задача 2.

Есть события, но часть из них доезжает позже других.
Нужно вывести такие события (5 и 6, которые вклинились).

create table logs (
id int,
dt date
);

insert into logs values
(1, '2023-12-01'),
(2, '2023-12-01'),
(5, '2023-12-02'),
(6, '2023-12-03'),
(3, '2023-12-06'),
(4, '2023-12-08');
🔥5
❄️Ответ на задачу 1❄️

😎Ребята в комментариях дали правильные ответы (круть!), тут предложу чуть оптимизированные вариации:

1) JOIN

Один подзапрос + один джойн

SELECT c.client_id
FROM clients c
LEFT JOIN (
SELECT DISTINCT client_id
FROM documents
WHERE valid_to = '9999-12-31'
) t1
ON c.client_id = t1.client_id
WHERE t1.client_id IS NULL


2) IN

Идём от обратного и исключаем

SELECT client_id
FROM clients
WHERE client_id NOT IN (
SELECT client_id
FROM documents
WHERE valid_to = '9999-12-31'
)


3) NOT EXISTS

Здесь можно оптимизировать, используя top/limit и константу.

Как это работает?
Если условие подзапроса соблюдается, мы берем просто цифру 1 вместо полей (не нужно лишний раз их вытаскивать) + одной строки нам достаточно, чтобы понять, что данные есть или их нет.

SELECT client_id
FROM clients c
WHERE NOT EXISTS (
SELECT 1
FROM documents d
WHERE c.client_id = d.client_id
AND valid_to = '9999-12-31'
LIMIT 1
)


Также важно внимательно читать задание и выводить то, что требуется (только id клиентов).

Решившим ребятам респект, остальные подключайтесь тоже!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102🔥2
❄️Ответ на задачу 2❄️

Один из вариантов был таким:

SELECT DISTINCT t1.*
FROM logs t1
JOIN logs t2
ON t1.id > t2.id AND t1.dt < t2.dt;


⚠️Но посмотрим на план запроса (читаем снизу вверх, смотрим на cost):

HashAggregate (cost=92291..92294) 
Group Key: t1.id, t1.dt
-> Nested Loop (cost=0..89454)
Join Filter
-> Seq Scan on logs t1 (cost=0..33)
-> Materialize
-> Seq Scan on logs t2


Здесь очень дорогой Nested Loop Join, который увеличил косты с 33 до 90к.

Что ожидалось увидеть?

Используем lag/lead и сравниваем разницу айдишников с предыдущим и последующим:

WITH diffs AS ( 
SELECT
*,
id - LAG(id) OVER(ORDER BY dt) prev_diff,
id - LEAD(id) OVER(ORDER BY dt) next_diff
FROM logs
)
SELECT id, dt
FROM diffs
WHERE prev_diff > 1 or next_diff > 1;


План запроса:

Subquery Scan on diffs (cost=159..249)
Filter
-> WindowAgg
-> Sort
Sort Key: logs.dt
-> Seq Scan on logs


В первом случае примерные косты были 90к, во втором 250 => в 370 раз меньше.

Также нам необязательно знать все id поздних записей, достаточно найти границы диапазонов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17
🤭Санте нужна твоя помощь!🤭

🛷У Санта Клауса есть кучка писем, в которых дети просят самую желанную игрушку. Некоторые из них заказали хрупкие подарки, которые могут сломаться, а Санта Клаус ну никак не хочет испортить праздник Он подумал, что электронной технике и музыкальным инструментам стоит уделить особое внимание.

👣Санта Клаус у нас современный и хочет учесть логистику. Он придумал, что эти подарки купит прямо в стране ребенка, а не привезет с собой.

Помогите Санта Клаусу составить список, какие игрушки и в каких странах нужно будет докупить до нового года!🙏

letters (id, date, child_id, toy_id)
children (id, name, country_id)
country (id, name)
toy (id, name, category)


И всех с наступающим!👋
Добра, вдохновения, мотивации, удачи, сил и прекрасного настроения!🥳
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🎉2👍11
🎉Все подарки доставлены, Санта благодарит за спасение нового года!

Итак, вариант от спасителя:

SELECT t.name, c.name, COUNT(*) AS count_toys
FROM country AS c
JOIN children AS ch
ON ch.country_id = c.id
JOIN letters as l
ON l.child_id = ch.id
JOIN toy as t
ON t.id = l.toy_id
WHERE l.date > '2023-01-01'
GROUP BY t.name, c.name


Обращаю внимание на один момент - фильтр на дату можно перенести повыше:

JOIN letters as l
ON l.child_id = ch.id
AND l.date > '2023-01-01'


При работе с базами данных может не быть разницы, какой из способов использовать.
Но при работе со спарком фильтр до джойнов уменьшит количество впустую обрабатываемых строк🔻
Please open Telegram to view this post
VIEW IN TELEGRAM
1041🌚1
Поговорим про Apache Spark - это движок/фреймворк для распределенной обработки больших данных.

Что значит распределенной?
Представь, что ты археолог и тебе нужно раскопать огромную территорию. Ты решил позвать n друзей, вы начали работать параллельно, и теперь вы закончите в n раз быстрее. Так и в спарке: каждая операция делится на маленькие таски, которые одновременно обрабатываются несколькими компьютерами, что ускоряет весь процесс.

Со спарком обычно работают на Python (через либу PySpark) и Scala.

Сначала нужно создать SparkSession:

from pyspark.sql import SparkSession

spark = (SparkSession.builder
.appName("SparkExample")
.master("yarn")
.config("spark.some.config.option", "config-value")
.enableHiveSupport()
.getOrCreate()
)


import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
.appName("SparkExample")
.master("yarn")
.config("spark.some.config.option", "config-value")
.enableHiveSupport()
.getOrCreate()


Пару слов про code style в питоне. Есть два варианта:

1) обратный слэш

spark = SparkSession.builder \
.appName("SparkExample") \
...


2) скобки

spark = (SparkSession.builder
.appName("SparkExample")
...
)


Я лично предпочитаю второй подход, потому что в первом нельзя закомментить строчки (только удалить, иначе синтаксическая ошибка) и нужно проставлять бэкслэши на каждой строке. Во втором - только один раз обрамить скобками, и все👌

#spark
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17🆒42💯2
📌Помимо #spark, также буду вести рубрики #sql_tips, #python_tips, возможно, что-то еще по мере появления идей. Там будут лайфхаки, о которых я узнала на рабочих задачах или во время чтения книжек📖

Например, про временные таблицы

Это один из способов оптимизации запросов. Если разбить один длинный запрос на несколько временных таблиц, то он будет работать быстрее за счет минимизации повторных вычислений. Например, если нужно переиспользовать результат или если из-за джойнов сильно разрастается количество строк.

В MS SQL Server есть два вида: локальные (#) и глобальные (##):

CREATE TABLE #localTempTable (...)

CREATE TABLE ##globalTempTable (...)


Локальные доступны только для вашего пользователя и удаляются при закрытии сессии. Глобальные доступны всем и живут, пока жива хотя бы одна использующая их сессия.

На временные таблицы также можно навешивать индексы🗂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥763