Собеседование C++. Разработчик из Яндекс

  Рет қаралды 25,034

Ambushed Raccoon

Ambushed Raccoon

Жыл бұрын

Всем привет!
Провели тренировочное собеседование с Фаритом.
на позицию Middle C++ Developer.
Темы, которые рассмотрели на собеседовании:
Многопоточность, задачи, рекурсия, шаблоны, constexpr и т.д.
Приятного просмотра!
telegram: t.me/AmbushedRaccoon
twitch: / ambushedraccoontv
Не забудьте поддержать видео :)

Пікірлер: 92
@user-zi5xu5ik7e
@user-zi5xu5ik7e Жыл бұрын
0:28 - Фарит рассказывает о себе 1:31 - задача: развернуть односвязный список 16:48 - задача: найти уникальный элемент 24:47 - опыт работы в Яндексе 27:01 - статические и динамические библиотеки 30:44 - constexpr 35:22 - метапрограммирование 38:52 - static_assert 41:10 - бесконечная рекурсия 42:38 - работа с потоками 51:12 - фидбек
@user-uw4bj2uz5l
@user-uw4bj2uz5l Жыл бұрын
Спасибо большое
@vasiliypupkin6311
@vasiliypupkin6311 Жыл бұрын
Надо было ему дать задачу из контеста, где условие на лист а4, как Яндекс даёт на стажировку.
@user-ow2ks3zy8u
@user-ow2ks3zy8u Жыл бұрын
Большое спасибо за Ваши труды, смотрю Ваш канал уже более года, от старта изучения языка до трудоустройства. Видео очень полезные, продолжаю узнавать много нового и интересного для себя. Желаю успеха Вам и Вашему каналу!
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
Спасибо)
@vasiliypupkin6311
@vasiliypupkin6311 Жыл бұрын
И куда ты устроился за год изучения языка ?
@TheALEXMOTO
@TheALEXMOTO 2 ай бұрын
​@@vasiliypupkin6311на базар
@alex-peretz
@alex-peretz Жыл бұрын
решение задачи про парные элементы, это очень красиво - прям кайфанул❤
@HelloWorld-fy8cd
@HelloWorld-fy8cd Жыл бұрын
жаль что парных элементов должно быть четное число, а иначе не прокатит
@Pa36ouHuK
@Pa36ouHuK Жыл бұрын
1) Желательно всё же компилировать написанное 2) Терминейтить потоки функциями ос плохая идея - могут зависнуть ресурсы. Тут лучше делать дамп процесса и отправлять разработчикам на анализ, а сам процесс просто перезапустить.
@0xsadcat92
@0xsadcat92 11 ай бұрын
constexpr функция при передаче в cout: std::cout
@nikitaminakov42
@nikitaminakov42 Жыл бұрын
C XORом очень круто, действительно все гениальное просто.
@nmg_prm
@nmg_prm Жыл бұрын
Спасибо за интервью, с каждым видео все интереснее!
@robban3465
@robban3465 Жыл бұрын
Лайк однозначно
@faritavtakhov5115
@faritavtakhov5115 Жыл бұрын
как нашел
@robban3465
@robban3465 Жыл бұрын
@@faritavtakhov5115 давно подписан, и смотрел некоторые видосы
@VladimirKirienko
@VladimirKirienko 11 ай бұрын
Спасибо за отличный контент и вашу работу. Есть ли в планах сделать тестовый собес на уровень Senior C++?
@ambushedraccoon6408
@ambushedraccoon6408 11 ай бұрын
И Вам спасибо! Да, сегодня записали. Посмотрим как видео себя покажет.
@mormeoi
@mormeoi 2 ай бұрын
Как все переусложнено в первой задаче. Надо хранить cur и prev, prev сначала равен nullptr, тогда не нужна будет проверка на "краевые условия" да и сам цикл будет более естественный. Возвращать надо будет prev.
@user-fm6jm8op1g
@user-fm6jm8op1g Жыл бұрын
Божественный Яндекс. Годами не могут пофиксить хваленый Ямаркет и музыку, в маркете - RecycleView падает в exeption, Fragments не сохраняют данные при переключении в Activity. В музыке песни не переключаются. Видимо Listener отвалился. Или играет одна и та же песня. какую бы не включил, видимо Map поплыла с ключами. И все бы ничего, но на собеседовании ты должен быть БОГОМ, решать УМНЫЕ ЛОГИЧСКИЕ ЗАДАЧКИ и вообще знать наизусть как и что устроено внутри STD. У меня всё.
@nullptr_or_null8301
@nullptr_or_null8301 Жыл бұрын
Проблема в том что многие не понимают по каким принципам работают такие крупные компании независимо от названия и страны (также работает и Apple, Google, Amazon и т.д.), и ломятся туда толпами, думая что это же яндекс там мне заплатят много денег, прокачаюсь в знаниях, опыте и т.д., нет это не так работает во главу угла там ставятся деньги, то есть нужен работник пускай криво косо, но будет справляться со своими обязанностями, но платить ему придется минимум на 50% ниже чем по рынку, на качество продукта такой крупной компании насрать, они уже монополист и альтернатив или нет, или конкуренты могут отнять несущественную долю рынку, отсюда в таких крупных компаниях работают в основном люди в лучшем случае середнячки, а то и новички, как только новичок (или глупый середнячок) под обещания повышения поработает в такой компании 1-3 года, обычно такой срок проходит когда до людей доходит что никто не собирается повышать, они сваливают оттуда через этот срок или их просят на выход, если начнут возникать почему не повышают, не платят больше и т.д., потом набираются следующие дурачки клюющие на бренд, и так продолжается до бесконечности, потому что народа немерянно хотящего работать в таких брендовых крупных компаниях, отсюда и кривое качество продуктов.
@maksimgorohov504
@maksimgorohov504 Жыл бұрын
@@nullptr_or_null8301 но каким образом ваш рассказ вяжется с жестким отбором людей в эти компании
@nullptr_or_null8301
@nullptr_or_null8301 Жыл бұрын
@@maksimgorohov504 "но каким образом ваш рассказ вяжется с жестким отбором людей в эти компании" - суть в том что отбираются лучшие прошедшие жесткий отбор, но с оплатой ниже рынка и обещаниями что в будущем эту оплату повысят (естественно никто и не собирается повышать), разводка на дурачка который на это поведется, то есть условно если бы так человек пошел бы в не брендовую компанию ему заплатили больше, потому что не стоит очередь из желающих в такую, а в брендовую стоит очередь, ведь большинство, как рассуждает, что если крупная компания то зп у них будет выше рынка, только вот в чем загвоздка выше рынка в таких компаниях только у приблатненных, а у того кого наймут с улицы будет зп ниже рынка, и тянуть он будет к тому же работу и за себя и за приблатненных, причем этот человек вполне может заменить отдел этих приблатненных в одиночку (знаю такой пример), вот так это работает, суть в том что в крупных брендовых компаниях знаний опыта зачастую для обычного человека требуют столько что в других не брендовых, более мелких, он раза в 2 больше будет получать за те же самые знания и опыт, рассуждать правильно надо вставая на место руководства таких компаний, и рассуждения там просты донельзя хочу чтобы работник был гений и за копейки, в крупных это осуществимо, потому что есть очередь из желающих дурачков (до людей выше написал это доходит через 1-3 года и разводка в основном на джунов и слабеньких мидлов), в средне-мелких такого нет, потому что такой очередь там нет, надеюсь теперь понятно, если нет, то уже не знаю как объяснять. P.S. Причем для заманухи естественно в вакансии и пишут зп якобы по рынку или выше, а уже на собесе естественно озвучивается другая сумма существенно ниже рынка и тут либо человек соглашается (ведется) или на выход.
@maksimgorohov504
@maksimgorohov504 Жыл бұрын
@@nullptr_or_null8301 "в том что отбираются лучшие прошедшие жесткий отбор" тогда почему у них так плохо написаны приложения, о чем говорил Андрей выше
@nullptr_or_null8301
@nullptr_or_null8301 Жыл бұрын
@@maksimgorohov504 Аааа, джун или слабый мидл, не может априори писать код, выстраивать архитектуру и т.д. как это делают крепкие мидлы и уж тем более сеньоры, потому что последние (мидлы и сеньоры) знают различные варианты решения одной и той же задачи, а также плюсы и минусы этих решений, и знают где и как применять эти решения, начинающий джун (даже если он гений), слабый мидл этого всего не знают им не хватает знаний и опыта, даже если они мега талантливые пройдет 1-3 года как раз чтобы из них вышел хотя бы мидл и то если они будут развиваться на разных типах и сложностях задач (в таких крупных компаниях обычно такого не дают особо) отсюда так как выше писал смена таких работников обычно происходит раз в 1-3 года и отсюда получаются плохо написанные приложения (потому как новый приходящий городит свой велосипед на другие велосипеды, которые писали до него такие же как он новички), а крупной компании на это пох, потому что они монополист и они могут класть большой и толстый на рядовых пользователей, потому как они уже в основном уже аффилированы тесно с государством и основные деньги пилят с госзаказов и госраспилов (суммы там вам и не снились) плять объяснять это долго, я бы дал ссылку на видео где человек в теме все это разжевывает (я и без него это знаю, потому как сам наблюдал это со стороны работая инженером в одной можно сказать госконторе).
@user-xv6gu6ze6c
@user-xv6gu6ze6c Жыл бұрын
Видео вышло. Так что теперь ждем стрим
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
О чем речь? Какой стрим?
@user-ph7se5md1h
@user-ph7se5md1h Жыл бұрын
крутые обои
@bequiet141
@bequiet141 Жыл бұрын
Битовые операции - вынос мозга, но решение мощное. Впечатляющий кейс
@shadowfiend8794
@shadowfiend8794 Жыл бұрын
что там выносящего? Дефолтная опреация в компьютере. Почти все зануления компилятор как раз с помощью xor делает.
@hustrik4805
@hustrik4805 Жыл бұрын
Хочу чтобы начали появляться код ревью)) на канале
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
Чуть подробнее, пожалуйста. Как вы думаете это должно выглядеть?
@strongful7120
@strongful7120 Жыл бұрын
@@ambushedraccoon6408 Что-то по типу такого было бы очень полезно, такого нет по С++ на русском ютубе kzbin.info/www/bejne/o4C2mqWMmrVootE
@user-io7id3cc5j
@user-io7id3cc5j Жыл бұрын
Здравствуйте! Интересное интервью, благодарю! Данное собеседование на позицию middle, верно?
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
Да, на middle, все верно.
@vp_arth
@vp_arth 2 ай бұрын
Во второй задаче решение очевидно, но я бы задал вопрос: найти элемент - это индекс в векторе или достаточно значения?
@dmanikhine
@dmanikhine Ай бұрын
Классическое решение reverseList и к нему функция печати List, всё это есть в первой главе SICP. На Lisp или Scala это пишется гораздо проще. : ListNode* reverselist(ListNode* list){ auto aux=[](ListNode* curNode, ListNode* prevNode, auto& aux_ref) { if (curNode->next==nullptr) { curNode->next=prevNode; return curNode; } ListNode* nextNode=curNode->next; curNode->next=prevNode; return aux_ref(nextNode, curNode, aux_ref); }; return aux(list,nullptr,aux); } void printList(ListNode* list){ if (list->next==nullptr) { std::cout
@user-io7id3cc5j
@user-io7id3cc5j Жыл бұрын
И ещё один вопрос. На какую позицию must have паттерны проектирования?
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
После года опыта, если не набираетесь на работе то рекомендую начать с Солида, а потом плавно перейти на паттерны. Это важно просто для того, чтобы расти как специалист, не только для собеседований.
@arthurlouiskarl
@arthurlouiskarl Жыл бұрын
полотёр
@skynowa2626
@skynowa2626 Жыл бұрын
Т.е. constexpr - это не гарантия вычисления на этапе компиляции?
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
Нет. Правильнее сказать, что оно может вычислиться на этапе компиляции, но не факт. Как я и приводил пример в одном случае считалось на этапе компиляции, в другом - в рантайме. Рекомендую почитать стандарт en.cppreference.com/w/cpp/language/constexpr и закрепить на практике.
@NoNo-fl6oq
@NoNo-fl6oq Жыл бұрын
привет! подскажите, что нужно знать для первой джуниорской работы с++ программистом не в геймдев? что кроме самого язык нужно?
@user-yk7li6ni4o
@user-yk7li6ni4o Жыл бұрын
Тут на самом деле очень всё сложно и все требуют разное. Но основное что могу порекомендовать это естественно понимание и знания Git и работа с GitHub(или другие). Стоит изучить Cmake и Conan (или их альтернативы). С их помочью собирать программы и подключать сторонние библиотеки. Стоит после этого начать знакомство с boost. Для начала например парсинг аргументов с помощью boost. Стоит подключить библиотеки для БД и немного их потыкать, полезно немного знать SQL. Если интересно то потыкать QT. Работа с Linux и хоть пару уроков связанных с GDB.
@broken_beyond_belief
@broken_beyond_belief Жыл бұрын
Коммент для продвижения
@alex-peretz
@alex-peretz Жыл бұрын
Решение на 14:13 тоже работало
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
Да, работает. Но читается хуже.
@pavel_trpn
@pavel_trpn 11 ай бұрын
32:40 - собеседующий не слышал про consteval???
@sakost
@sakost 9 ай бұрын
с C++20 ещё не все знакомы и работали
@pavel_trpn
@pavel_trpn 9 ай бұрын
@@sakost в 23-м году? А драфт ещё раньше был известен. Вся суть C++ разработки)
@janedoe6182
@janedoe6182 9 ай бұрын
Решение первой задачи: ListNode* reverse (ListNode* head) { ListNode* prev = nullptr; while(head->next) { ListNode* next = head->next; head->next = prev; prev = head; head = next; } head->next = prev; return head; }
@IExSet
@IExSet 9 ай бұрын
Тоже зациклится на циклическом списке. У сишников с такими структурами бяда 🙂
@janedoe6182
@janedoe6182 9 ай бұрын
@@IExSet Почему это беда? В условиях задачи не было упоминания цикличности. И там одной проверки всего достаточно, чтобы ее обойти. Нет никакой беды
@prank_ttime
@prank_ttime 6 күн бұрын
в перуом можно было типо стека все сделать и все.
@wolfwood1010
@wolfwood1010 Жыл бұрын
Про бинарки это задачка на закопать за почти 15 лет практики приходилось использовать раза 2
@shadowfiend8794
@shadowfiend8794 Жыл бұрын
Не понятно почему он их бинарные назвал конечно, если это битовые. От специфики работы зависит я вот очень много сталкивался когда работал с bunch сериализацией в UE
@wolfwood1010
@wolfwood1010 Жыл бұрын
@@shadowfiend8794 все правильно назвал xor это бинарный оператор он на вход принимает 2 значения а возвращает 1
@shadowfiend8794
@shadowfiend8794 Жыл бұрын
@@wolfwood1010 да это понятно что правильно, но как подсказка это не очень, явно он имел ввиду именно битовые.
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
Да, я допустил ошибку. Но собеседуемый так или иначе все понял.
@user-wi4gp9kq2x
@user-wi4gp9kq2x Жыл бұрын
Is it real 24:14 , return integer in void function ???
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
it's just a mistake. It happens. In such case scenario we don't have a compiler to show us obvious errors.
@ambushedraccoon6408
@ambushedraccoon6408 Жыл бұрын
And generally speaking, it's acceptable to make such mistakes in most interviews.
@IExSet
@IExSet 9 ай бұрын
Вот что значит не уважать Лисп, сей алгоритм зациклится на циклическом списке, у которого последний элемент ссылается на первый!!!
@aleksanderaksenov1363
@aleksanderaksenov1363 9 ай бұрын
У меня вопрос-а разработчик ничего кроме синтаксиса и типовых задач литкода знать не должен?))
@pandalove6795
@pandalove6795 9 ай бұрын
Боже, решение с ксором в задаче о нахождение уникального элемента, просто шикарно. Я кстати когда думал сам над решением, пришел к использованию битовых операций, но только с целью хранения информации о том, что элемент уже есть. (1 есть, 0 нет). Но вот до использования ксора не додумался.
@dinrash7613
@dinrash7613 2 ай бұрын
Решение 1 Задачи, используя рекурсию, которая не возможна по мнению автора: #include struct ListNode { int val; ListNode* next; ListNode(int x): val(x){} ListNode(int x, ListNode* next): val(x), next(next){} }; ListNode* RevertList(ListNode* head, bool first = true){ if(head == nullptr || head->next == nullptr){ return head; } else{ ListNode* result = RevertList(head->next, false); head->next->next = head; if(first){ head->next = nullptr; } return result; } } int main() { ListNode* prev = nullptr; for(int x = 0; x
@ambushedraccoon6408
@ambushedraccoon6408 2 ай бұрын
Упадет при RevertList(nullptr, true);
@dinrash7613
@dinrash7613 2 ай бұрын
@@ambushedraccoon6408 Updated
@dethomorphin
@dethomorphin 10 ай бұрын
Зачем задаешь вопросы, на которые сам не знаешь ответ?) Про статические библиотеки например
@ambushedraccoon6408
@ambushedraccoon6408 10 ай бұрын
Задаю, потому что знаю. И в принципе я могу просто задать вопрос, чтобы послушать рассуждения интервьюера на данную тему.
@dethomorphin
@dethomorphin 10 ай бұрын
@@ambushedraccoon6408статическая библиотека это не исполняемый файл, и динамическая тоже. Разница в какой момент символы будут разрешены: при компоновке либо при исполнении
@user-lc6yf8rz6k
@user-lc6yf8rz6k Жыл бұрын
Насчёт RevertList что то сомнения закрались.. Хоть я инженер, не программист не судите строго.. А на стеке хватит памяти если список очень большой.. Если 10 миллионов? Я думал надо что то типа выделяем памяти с запасом, проходимся до конца, записывая всë в массив в этой памяти.. По мере надобности выделяем ещё.. А дойдя до конца, проходимся обратно.. Ну и память удаляем
@user-lc6yf8rz6k
@user-lc6yf8rz6k Жыл бұрын
И почему это всё не андефайнд бихевиор? Мы возвращаем указатель на то, что создали на стеке? Если ошибаюсь расскажите пожалуйста в чем.
@damirsob6176
@damirsob6176 Жыл бұрын
В решении, на стеке хранятся только 3 указателя(cur, prev, temp), независимо от размера списка. А значит, stackoverflow не будет.
@damirsob6176
@damirsob6176 Жыл бұрын
@@user-lc6yf8rz6k нет, возвращается копия указателя prev, который указывает на первый узел реверснутого списка.
@user-lc6yf8rz6k
@user-lc6yf8rz6k Жыл бұрын
Спасибо. Буду разбираться
@sakost
@sakost 9 ай бұрын
есть два типа людей: 0. Которые хейтят яндекс 1. Те, которые в нем работают Я скоро переметнусь из одной касты в другую, пхехе.
@user-tq3zn1wm1k
@user-tq3zn1wm1k 6 ай бұрын
ну такое, 80% вопросов не релевантны на позицию middle, и в реальных проектах о них вспомнят в последний момент, особенно по constexpr и проверка статического результата. Не реалистичная бредятина
@raijinhasarrived
@raijinhasarrived Жыл бұрын
10:12 интервьюер, ты ойкаешь, вздыхаешь, сбиваешь своими вставками с мысли, задал вопрос подожди пока решит задачу и потом покажи какой ты nevyebeniy. Нахера ты лезешь, отбил всё желание смотреть
@user-ln2ft2mo3c
@user-ln2ft2mo3c Жыл бұрын
А это точно разработчик из Яндыкса? Есть большие на эту тему сомнения. Обычно яндекс проводит 3-4 технических собеса на алгоритмы и знание языка. Мне кажется на собесе был самозванец :) Теперь к автору видоса. Автор!, а похоже ты и сам не понимаешь (судя по твоему ответу) разницы между динамическими и статическими библиотеками - подучи-ка, дружок, мат-часть а уже потом вопросы задавай.
@faritavtakhov5115
@faritavtakhov5115 Жыл бұрын
Я алгоритмы хорошо знаю
@faritavtakhov5115
@faritavtakhov5115 Жыл бұрын
Поошибался, бывает, че за духота
@sakost
@sakost 9 ай бұрын
​@@faritavtakhov5115а ты на какой позиции? Junior? Middle? Просто если junior, то все наезды в комментариях абсолютно нерелевантны. В любом случае ты большой молодец)
@yashkevich8164
@yashkevich8164 11 ай бұрын
Совершенно бесполезная первая часть собеса с решениями задач. Так как проверяется тупо навык задрачивания решения задач на ЛитКод и тому подобных, которые в реальной разработке редко когда понадобятся. Я бы уже после это части распрощался с таким работодателем
@sakost
@sakost 9 ай бұрын
ну вообще нет. будь там задача уровня hard с литкода, то да. А это medium с натяжкой. Тут проверяется возможность кандидата мыслить логически. И во многих компаниях(если не во всех. Я прошел больше 50 собесов и только 1-2 раза встречал, когда таких вопросов не было) такое применяют постоянно
@user-ei6lr9vn8u
@user-ei6lr9vn8u 2 ай бұрын
Более 50 прошёл, задачи на логику, меня терзают смутные сомнения... А ты вообще дееспособен писать каменты😂
@eewwwqqwee
@eewwwqqwee 2 ай бұрын
Был бы рад вашей оценки моей жалкой попытки. еще только учусь. Тоже первое что пришло в голову это рекурсивная функция, реализовал так - using namespace std; struct ListNode { int value; ListNode* next; ListNode() : value(0), next(nullptr) {} ListNode(int x) : value(x), next(nullptr) {} ListNode(int x, ListNode* next) : value(x), next(next) {} }; void ReverseList(ListNode *header, ListNode* &finalHeader) { if ((*header).next != nullptr) { if ((*header).next->next != nullptr) { ListNode* buffer = (*header).next->next; (*header).next->next = header; ListNode* bufferForNext = buffer->next; buffer->next = (*header).next; (*header).next = nullptr; ReverseList(bufferForNext,finalHeader); bufferForNext->next = buffer; } else { (*header).next->next = header; finalHeader = header->next; } } } int main() { ListNode a1(1); ListNode a2(2); a1.next = &a2; ListNode a3(3); a2.next = &a3; ListNode a4(4); a3.next = &a4; ListNode a5(5); a4.next = &a5; ListNode a6(6); a5.next = &a6; ListNode a7(7); a6.next = &a7; ListNode a8(8); a7.next = &a8; ListNode* finalHeader = nullptr; ReverseList(&a1, finalHeader); }; вершина перевернутого листа находится в указателе finalHeader
@eewwwqqwee
@eewwwqqwee 2 ай бұрын
p.s. первая задача
@sashabroslavskiy7904
@sashabroslavskiy7904 11 ай бұрын
Это пи.здец какой-то)) какой-то там симэйк)) абалдеть просто. в яндексе кто вообще работает?) статика и шарэд либа это же очевидная вещь. какой кошмар
Собеседование C++
47:00
Ambushed Raccoon
Рет қаралды 23 М.
Nonomen funny video😂😂😂 #magic
00:29
Nonomen ノノメン
Рет қаралды 59 МЛН
WWE is real💔
00:16
IShowSpeed
Рет қаралды 83 МЛН
skibidi toilet 73 (part 1)
04:46
DaFuq!?Boom!
Рет қаралды 30 МЛН
Собеседование Junior C++
54:00
Ambushed Raccoon
Рет қаралды 37 М.
Что делает С++ разработчик и как им стать
1:09:33
Яндекс Практикум
Рет қаралды 4,2 М.
Собеседование Middle C++
1:01:50
Ambushed Raccoon
Рет қаралды 25 М.
Разработка игр. Зарплаты. Проблемы
1:18:41
Ambushed Raccoon
Рет қаралды 6 М.
ВСЕ ПРО СТАЖИРОВКУ В ЯНДЕКСЕ!!
43:22
Поступашки - ШАД, Стажировки и Магистратура
Рет қаралды 40 М.
Собеседование Middle C++
52:34
Ambushed Raccoon
Рет қаралды 19 М.
Собеседование Middle C++
58:19
Ambushed Raccoon
Рет қаралды 136 М.
«Алгоритмическое собеседование разработчика C++»
1:33:46
Nonomen funny video😂😂😂 #magic
00:29
Nonomen ノノメン
Рет қаралды 59 МЛН