Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Насколько реально нужен консул девопсу?

Лучший ответ:
Никто не заставляет использовать docker, systemd, ansible и вообще какие угодно системы оркестрации и оптимизации. Необязательно делать шаблоны конфигов или кластерные конфигурации сервисов, необязательно использовать библиотеки настраиваемого логгирования, возиться с балансерами и реприцируемыми базами. Но люди это делают, значит, смысл всё-таки есть?

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

Консул - это тоже инструмент. Вряд ли хоть кто-то использует его возможности целиком и полностью, тем более что никто не заставляет. Кому-то достаточно того, что у него все сервисы зарегистрированы в одном месте и из коробки имеют автоматическое DNS-имя вида NAME.service.consul. Кто-то использует kv-хранилище для хранения параметров, а кто-то хранит в нём секреты и целые конфиги, настраивает токены с различными acl и скрещивает всё это с consul-template. Вообще, необязательно использовать именно консул, есть и другие инструменты для подобных задач. Например, zk/etcd.

Консул чаще используют совсем не с ансиблом, а с инструментами оркестрации, в которых сервисы могут расширяться и сворачиваться, перезагружаться и мигрировать. Скажем, пусть у нас есть условный сервис rabbitmq на три ноды. Тогда у нас может быть три контейнера rabbitm{1..3}, при запуске они регистрируются в консуле скриптом запуска вместе с проверками, а далее consul отдаёт их все три в виде имени rabbitmq.service.consul. Если какой-то из них вдруг упадёт, consul оперативно это обнаружит и исключит из DNS проблемный узел. Если вдруг управляющий всем этим администратор или автоматическая система оркестрации посчитает нужным добавить новые узлы или перенести их куда-то ещё в кластере, то consul также отразит все нужные изменения. При этом использующее rabbitmq приложение должно будет знать только адрес rabbitmq.

Конечно, любую задачу можно обвесить скриптами, костылями и даже самописными плейбуками без использования готовых инструментов, а потом повторно решать десятки задач, которые уже сто раз решены до тебя опытными людьми, но зачем?

Худший ответ:
Потому что вы сами можете забыть добавить
Например новый сервис или сервер его надо добавить в том места
А вы взяли и не добавили
Вопрос: Почему пишется new Vector2, а не просто Vector2?

Лучший ответ:
Потому что такой вот C#.
Чтобы поменять значение transform.position - тебе нужен новый экземпляр Vector2.
Чтобы создать новый экземпляр чего угодно в C# тебе нужно писать new.
Исключение - фабричные методы/свойства, которые сделают new вместо тебя.
Например, в случае Vector2 он мог бы выглядеть так: var newVector = Vector2.Create(x, y), но такого метода по понятным причинам нет, ибо он просто сразу будет вызывать конструктор

Худший ответ:
Потому что, перед тем как лезть в Unity нужно хотя бы учебник по основам C# полистать, в частности про ООП...
Вопрос: Новый тип жалобы — member GPT?

Лучший ответ:
Будучи языковой моделью ChatGPT не имеет личного мнения или чувства. Однако он может сказать, что использование генерируемых ИИ текстов, таких как текст, созданный GPT, становится все более распространенным в различных приложениях, таких как обслуживание клиентов, создание контента и т. д. Это может быть полезно для предоставления быстрой и точной информации, но важно использовать его ответственно и дать понять конечному пользователю, что текст сгенерирован ИИ. Кроме того, важно продолжать контролировать и улучшать производительность и точность модели ИИ, чтобы обеспечить высокое качество генерируемого текста.

Сгенерировно: https://chat.openai.com/chat
Переведено с помощью www.DeepL.com/Translator

Худший ответ:
А что делать с вопросами, на которые можно сразу получить готовый ответ в гугле или у нейросети?

Если ответ верный, то ответ как ответ. Главное чтобы юзер, который пользуется нейросетью сам понимал смысл ответа, а то бывает ответ вообще не в тему.
Вопрос: Что нужно сделать, чтобы данные телеграмм бота на Heroku не удалялись?

Лучший ответ:
Нужно почитать документацию Heroku. Или хотя бы другие ответы по тегу heroku на этом ресурсе. Например Как устранить ошибку 500 на Flask Heroku?

Худший ответ:
Документация Heroku
If you were to use SQLite on Heroku, you would lose your entire database at least once every 24 hours.
Решение:
Instead of using SQLite on Heroku you can configure your app to run on Postgres.

Источник
Вопрос: Можно ли писать Android приложения на c#?

Лучший ответ:
Посмотри в сторону Xamarin
Он на шарпе позволяет писать приложения не только под андроид но и другие ОС

Худший ответ:
да
да
Вопрос: Где можно сдать сервер в аренду?

Лучший ответ:
Это не сервер. Это безродный китаец, шитый поддержкой ксеонов (в общем заблуждении, что ксеоны использовать на геймерских тачках - это круто). Сеть 100Мб - это где? Дома, что ли? Кому он нафиг нужен?

Raid-контроллер есть? Аппаратный, не программный.
UPS есть?
Бэкапы есть?
Гарантия того, что ты не потыришь мою виртуалку, какова?

Нету ничего? Извини, чувак, я проще в DC тачку арендую...

Худший ответ:
Мат плата huananzhi X99  - это очень далеко от нормальных серверных платформ, в плане надёжности.
Сеть безлим в 100 мб - если это просто домашний провайдер и "сервер" стоит дома, то это совсем не серьёзно и мало кому может понадобиться.
Вопрос: Как убрать крашнутые картинки которые приходят через АПИ?

Лучший ответ:
Используй onerror у img элемента.

<img src="not-loading-image.jpg" onerror="this.remove();">
<img src="https://hsto.org/webt/62/a8/df/62a8df7d29053796257182.png" onload="console.log(this);">

Худший ответ:
Делаешь по каждой картинке get запрос, если не статус 200, то пропускаешь
Вопрос: Почему этот код работает ошибочно?

Лучший ответ:
Потому что %d трактует переданное значение как signed int.
Поставьте %u и получите беззнаковое значение UINT_MAX (0xFFFFFFFF).
Но ноль всё равно не получите, операции с беззнаковыми числами в C выполняются по модулю (UINT_MAX+1).

Худший ответ:
Всё работает правильно. Чтобы отобразить число как unsigned, вместо %d следует использовать %u.
Вопрос: Сложно ли создать свой блаблакар?

Лучший ответ:
Тут помимо создания есть юридические моменты...

Вы обязаны записывать всех участников,маршруты,переписки... и еще куча всего...

самый просто вариант - зафигачить бота в телегу... там и навыков поменьше и использовать проще...

Худший ответ:
Если нет опыта, то создать такое сложно.
Если опыт есть, то создать несложно.
Если с вёрсткой можно воспользоваться какими-нибудь конструкторами, то бэкенд писать без опыта очень сложно
Вопрос: Почему в firefox возвращает json вместо страницы?

Лучший ответ:
Это происходит из-за неправильной организации работы с HTTP.

Вы запрашиваете данные через XMLHttpRequest методом GET и по тому же url, что и сама страница. В результате получается, что у вас один и тот же HTTP метод и один и тот url отдают два разных ответа в зависимости от... непойми чего (видимо проверяется заголовок X-Requested-With), но это явно не то, что описано в спецификации HTTP.

Ключевым моментом, естественно, является то, что запрос идёт методом GET. Если вы читали спецификацию HTTP или хотя бы статьи о протоколе HTTP, то должны помнить, что метод GET является идемпотентным. Из этого следует что клиент (в данном случае - браузер), имеет полное право (если разрешают условия кэширования) ожидать, что он получит тот же ответ на этот запрос и может оптимизировать это, использовав уже имеющийся в кэше результат. Именно это и происходит.

Убедиться в том, что это так, можно очень просто: достаточно открыть dev.tools и на вкладке Network включить опцию "Disable cache". После этого вы увидите что проблема исчезла.

Правильным решением будет выделение API для XHR запросов фильтра в отдельный endpoint. Также логичнее будет использовать метод POST, а не GET.

Если же не хочется переделывать - хотя бы добавьте к XHR запросам ещё один query параметр, например xhr=1 и убедитесь что он никогда не появляется в url страниц. Это сделает ваши url для страниц и XHR запросов разными и уберёт проблему.

Также имеет смысл пересмотреть объём данных, передаваемых в ответ на каждый запрос, ведь вам нужны только значения, передавать постоянно почти 100кб текста описаний нет особого смысла, они у вас и так уже есть.

Худший ответ:
При выборе фильтров страница отправляет AJAX-запрос GET-ом по тому же адресу, который потом присваивается странице. FF просто берет из кэша результаты предыдущего запроса. Если отключить кэш - все работает.
Вопрос: Стоит ли писать рекрутеру за фидбеком после собеседования?

Лучший ответ:
И не быть навязчивым? 
завязывай с таким, всегда нужно трясти других. Конкретно тут нужно связаться как можно раньше пока тебя не забыли и помнят что было. Лично у меня вообще было что мне написали ответ, но почему то я его не получил и сидел ждал. Связался с ними, а они говорят мы же несколько дней назад ответили, не написал так и не узнал бы об этом

Худший ответ:
1. Звонить рекрутеру за техническим фидбеком не имеет смысла, он его не даст, и просить интервьювера еще раз пересмотреть и что-то написать не будет - это лишняя работа и время технического специалиста, причем нужно понимать, что если вам просто хочется узнать что не так, то другой с этим ответом пойдет судиться с компанией, а компании это не нужно, поэтому она просто не будет заморачиваться.

2. Если у компании и так есть политика фидбеков, то обычно это максимум неделя. Можете подождать.

3. Технический фидбек лучше всего просить в конце интервью, прямо у того кто вас собеседует. В устном виде его дать и проще и безопаснее и по горячим следам. Заодно можно будет понять личные причины или реально технически что-то не так.
Вопрос: Не могу найти ошибку в коде Python?

Лучший ответ:
Не надо ловить абстрактный Exception вообще никогда! Тем более игнорировать его и даже не выводить в консоль. Произошла ошибка, а какая, почему произошла - ваще непонятно.

Какие тут могут случиться ошибки? Ну, например, если в user_dict нет записи с ключом chat_id, то случится KeyError. Или если в getRegData возвращается невалидный markdown-текст, то случится ошибка ApiException.

А далее после обработки exception путём его игнорирования тут снова вызывается register_next_step_handler, который приводит к тому, что вводимые пользователем данные снова попадают в тот же обработчик и - вероятно - натыкаются на ту же самую ошибку. Например, KeyError: конечно, ведь как при прошлом запуске этого обработчика не было значения с таким ключом, так и при последующих не появится.

До кучи, не надо вызывать постоянно bot.get_me(). Это каждый раз будет вызов API. Неужели имя бота меняется каждую минуту? Достаточно запомнить при запуске бота - и достаточно.

Худший ответ:
Не надо ловить абстрактный Exception вообще никогда! Тем более игнорировать его и даже не выводить в консоль. Произошла ошибка, а какая, почему произошла - ваще непонятно.

Какие тут могут случиться ошибки? Ну, например, если в user_dict нет записи с ключом chat_id, то случится KeyError. Или если в getRegData возвращается невалидный markdown-текст, то случится ошибка ApiException.

А далее после обработки exception путём его игнорирования тут снова вызывается register_next_step_handler, который приводит к тому, что вводимые пользователем данные снова попадают в тот же обработчик и - вероятно - натыкаются на ту же самую ошибку. Например, KeyError: конечно, ведь как при прошлом запуске этого обработчика не было значения с таким ключом, так и при последующих не появится.

До кучи, не надо вызывать постоянно bot.get_me(). Это каждый раз будет вызов API. Неужели имя бота меняется каждую минуту? Достаточно запомнить при запуске бота - и достаточно.
Вопрос: Как сделать динамичный title?

Лучший ответ:
На js вам доступно document.title. Меняя его вы получите нужный эффект.

Худший ответ:
Тексту задать опасити
Разбить текст на буквы
Перебирать буквы и с задержкой добавлять им опасити 1
Вопрос: Доступное обучение по работе с сетевым оборудованием?

Лучший ответ:
Вот  честно, я не понял. Вы прикалываетесь? Или серьезно?
Ну первые же строчки в Google-выдаче:
https://edu-cisco.org/courses/
https://eitca.org/eitca-is-information-security-ac...
https://www.specialist.ru/vendor/cisco
https://training-microtest.ru/course/ccnax-v-30

https://training-microtest.ru/courses/hp?ThemeId=79
https://www.hp.com/ru-ru/pdf/310113_learningcentre...
https://education.hpe.com/ru/ru/training/index.html

https://muk.training/courses/course_vendor/emc/page/2/
https://www.dell.com/ru-ru
https://academy.ru/catalog/emc/
meliusgroup.ru/obuchenie-lenovo

Извините, ну судя по вопросу, вам не серверы и сетевуху настраивать надо учиться, а осваивать элементарную компьютерную грамотность. Элементарный  информационный поиск в Гуугл сегодня умеют делать шестиклассники. Без такого умения - причем очень уверенного -  никакое обучение,  а тем более дальнейшая работа в этом направлении будут НЕдоступными.

Худший ответ:
Подбор серверов и коммутаторов без знания того, как эти сервера и  коммутаторы работают и что они делают и зачем они это делают - это примерно как подбор автомобиля человеком, всю жизнь ездившим на лошади...
Вопрос: Должен ли WEB-разработчик уметь настраивать VPS/сервер?

Лучший ответ:
Вопрос "должен ли" - всегда идиотский. Никто никому ничего не должен. В частности, нанимать и платить.
Если вы такой крутой фронтендер, что вас ценят именно на этом фронте настолько, чтобы работодателю было жалко тратить ваше ценное время на настройки, он лучше наймет девопса - скорее всего, вам это все не понадобится.
Но как можно стать крутым специалистом, вообще не интересуясь настолько смежными областями? Я не знаю.
Вы такими сомнениями и прикидками сами себе ограничиваете рост статусом веб-макаки, которую можно только посадить в опенспейс на узкоспециализированную работу и до настройки серверов просто не допускать. Зато - "не должен", да...

Худший ответ:
Не обязательно, но желательно, умея настраивать сервак, можно его тонко допилить под свои проекты, что очень удобно. Всякие там лимиты выставить, ускорить выполнение скриптов и многое другое.
Вопрос: Как раздать локальную сеть на удалённый компьютер?

Лучший ответ:
Почитайте про WiFi мост - делается на раз-два
Какой бюджет? От него стоит отталкиваться при выборе оборудования (рекомендую пару MikroTik SXT Lite5 или если скромненько- пару TP-LINK CPE605, где одну делаете ТД, вторую клиентом )
Какое местоположение (город, промзона) В городе имеет смысл только 5 ГГц ибо 2.4 уже сильно засран.
Расстояние 40 м ни о чём - достаточно двух направленных антенн на точках доступа, где одна переведена в режим клиента. Окна навстречу есть? Если да, то можно не заморачиваться с внешними устройствами
Источник электроэнергии один? (Фаза, подключение к одному счетчику) Может имеет смысл почитать про PowerLine?

Худший ответ:
Если офис и склад в прямой видимости, то можно использовать два одинаковых wi-fi роутера- один в офисе, другой на складе в режиме моста (bridge/wds). Так вместо витой пары будет использоваться беспроводной канал.
Вопрос: Какая нужна теоретическая база на собеседовании джуна?

Лучший ответ:
Реальное понимание ООП и паттернов - это не уровень джуна. 
И да - как вы верно заметили - те кто говорят, на самом деле просто заучили пару расхожих заклинаний.
Как метко сказано в последней книжке Пелевина,
Маня была счастлива. Вот что значит быть дочкой банкира - папа не объяснял, папа инструктировал, как объяснять другим".
Вот людей, которые могут объяснить, но сами не понимают, в последнее время как-то очень много появилось.

В реальности от джуна требуется чисто механическая часть ООП: 
- уметь использовать готовые классы, уверенно обращаться к свойствам и методам
- знать что делают основные магические методы
- понимать неймспейсы и автолоад
- в целом уверенно читать исходный код классов - то есть не пугаться слов implements и use  (которое трейты а не неймспейсы)
- уметь использовать контрол-клик в Шторме

Худший ответ:
Ну в общем алгоритм действия такой:
1. Находишь компанию, которая ищет джунов.
2. Приходишь туда на собес.
3. Возможно выполняешь тестовое задание.
4. При неудаче повторить начиная с первого пункта.

9 месяцев самообучения и какие-то пет проекты достаточная база, чтобы начинать ходить по собеседованиям.

Основная проблема в ответах на вопросы типа твоего: у разных кампаний разные требования к уровню джуна в софт/хард скилах. Поэтому только через собесы ты сможешь познать уровень своей подготовки и подтянуть западающие области.
Вопрос: Как сделать экономического бота для дискорда?

Лучший ответ:
0.Бросаете писать ботов не зная языка, и не умея гулить (желательно).
1.Смотрите на ошибку в консоли.
2.Пытаетесь осознать ее.
3.Если не знаете английского - открываете переводчик и возвращаетесь к п.1.
4.Если не понимаете, в чем проблема - гуглите.
5.Если гугл не помогает - откладываете бота, ищите книгу Лутца, штудируете и возвращаетесь к боту.

Худший ответ:
0.Бросаете писать ботов не зная языка, и не умея гулить (желательно).
1.Смотрите на ошибку в консоли.
2.Пытаетесь осознать ее.
3.Если не знаете английского - открываете переводчик и возвращаетесь к п.1.
4.Если не понимаете, в чем проблема - гуглите.
5.Если гугл не помогает - откладываете бота, ищите книгу Лутца, штудируете и возвращаетесь к боту.
Вопрос: Какая ОС самая быстрая для работы торгового робота на С++?

Лучший ответ:
Мне кажется что ты не тем занят. Нужно очень сильно постараться чтобы ОС стала узким местом в бизнес логике.

Собери данные профилирования.

Худший ответ:
Почитайте о «операционных системах реального времени»
Вопрос: SQL запрос как создать 9999 записей с итерацией чисел?

Лучший ответ:
Что мешает на "клиентской" стороне(средствами самого приложения) сгенерировать SQL ?

INSERT INTO `table` (`DATE_CREATE`, `DATE_UPDATE`, `ACTIVE`, `USER_ID`, `VALUE`) VALUES
(NOW(), NOW(), 1, 1, 1),
(NOW(), NOW(), 1, 1, 2),
(NOW(), NOW(), 1, 1, 3),
/*...*/
(NOW(), NOW(), 1, 1, 9999);

P.S.: По скрину вижу, что Битрикс...можешь в текстовом файле даже составить запрос и выполнить через Админку Битрикса в разделе "SQL-запрос"...если это нужно всего на один раз...

Худший ответ:
1. Вот оно надо, каждый раз заботиться об установлении значений полей DATE_CREATE/DATE_UPDATE?

ALTER TABLE tablename
MODIFY COLUMN date_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
MODIFY COLUMN date_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Всё, теперь они сами будут заботиться о правильном значении. Точнее, сервер будет об этом заботиться. Если, конечно, коду не придёт в голову устанавливать значения этих полей явно (нафига бы только - лишняя же работа).

2. Для выполнения операции используем рекурсивный CTE (помним, что поля DATE_CREATE/DATE_UPDATE сами заботятся о правильном значении, как и автоинкрементный первичный ключ):

INSERT INTO tablename (active, user_id, value)
WITH RECURSIVE
cte AS ( SELECT 1 num
         UNION ALL
         SELECT num + 1 FROM cte WHERE num < 9999 )
SELECT 1, 1, num
FROM cte;

Возможно, предварительно надо установить достаточное значение для сессионной переменной:SET SESSION cte_max_recursion_depth = 10000;

Если версия MySQL старая и не понимает CTE, то 

INSERT INTO tablename (active, user_id, value)
SELECT 1, 1, 1 + t1.num + t2.num * 10 + t3.num * 100 + t4.num * 1000 AS value
FROM       (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1
CROSS JOIN (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2
CROSS JOIN (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3
CROSS JOIN (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4;
HAVING value <= 9999;
Вопрос: If и undefined как решить проблему?

Лучший ответ:
Ошибка указывает на тот объект из которого происходит попытка прочитать свойство postType.
Это значит, что context.attachments[0] - это undefined.
Решение: Добавить проверку для context.attachments[0]
if(context.attachments[0] != undefined && context.attachments[0].postType != undefined) {
    return context.send(`post`);
}

Худший ответ:
Используйте optional chaining
if(context?.attachments[0].postType) {
    return context.send(`post`);
}
Вопрос: Почему шлюз сбер эквайринга не отвечает?

Лучший ответ:
Подобные вопросы необходимо задавать поддержке сбера

Худший ответ:
сильно сомневаюсь что через Сбер нужно прогонять все физические айтемы
Вопрос: Как корректно использовать exec() в PHP?

Лучший ответ:
Утилита screen нужна только для терминала (чтобы процесс не убился когда закроете терминал)
Команда cd - команда шелла (изменить текущую директорию)

Так что вам, на самом деле, нужна единственная команда для запуска сервера: srv/start.sh

Если же все-таки нужно выполнить несколько команд, то для этого нужен запуск шелла: /bin/sh -c 'cmd1 && cmd2 && cmd3 && ... etc ...'

Еще можете посмотреть функцию PHP shell_exec

Худший ответ:
Screen — интерактивный мультиплексор терминала. Вводя эти команды последовательно, вы сначала запускаете screen, затем, пока он запущен, внутри него вводите другие две.
Запуская все три команды через "&&", две остальные команды выполнятся вне screen (на вашем настоящем tty/pty) после завершения screen.

Правильный вариант запуска — через инит-систему (systemd unit для подавляющего большинства современных линуксов).
Альтернативный вариант через screen:
screen -dmS srv -- sh -c 'cd /path/to/srv && ./start.sh'
Вопрос: Когда осваивать новые технологии?

Лучший ответ:
Во-первых, меня не могут отправить на другой проект с другой технологией, так как в должностной инструкции чётко зафиксирован техстек, который я должен знать и с которым обязан работать. Во-вторых, никакой вменяемый руководитель, очевидно, не бросит неподготовленного разработчика на задачу, которую он гарантировано запорет. Так что если такая надобность у компании есть, то в их интересах вас обучить при вашем согласии. Если же вы и сами заинтересованы в этих знаниях, то конечно стоит уделять обучению своё личное время.

Худший ответ:
Есть предложение перенаправлять такие вопросы сразу на https://8-ball.ru/
Вопрос: Как писать код на android?

Лучший ответ:
Нужна нормальная клавиатура. Купи себе недорогое устройство класса "нетбук". 
На телефоне писать не надо. Это просто неэффективно. Зря портить себе зрение и пальцы.

Худший ответ:
застрял в цикле сон-колледж-работа-сон
Не надо в этом состоянии ещё и на телефоне кодить. Голова отдыхать должна. Иначе совсем скоро ты ещё и во сне кодить начнёшь, а это не очень приятно. Просто поверь на слово.
Вопрос: Алгоритм Евклида?

Лучший ответ:
если a < b, то a%b всегда равно a

Худший ответ:
Def gcd(a, b) :
    return a If b==0 else gcd(b, a%b)
# эквивалентно
def gcd(a,b):
    if b == 0:
        return a
    else:
        #вызываем сами себя (рекурсия)
        gcd(b, a % b)