Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как лучше сделать парсер данных с разных источников?

Лучший ответ:
В вашей схеме еще не хватает подсистемы scheduler - планировщик заданий.
Его нужно чаще всего запускать по крону (а может он у вас будет вертеться в бесконечном цикле, а может спать в потоковом режиме выполнения).
Планировщик, на основе результатов проходов паука, парсера, ограничений на проходимых сайтах, нагрузки собственной системы, будет регулировать частоту запуска перезапуска заданий.
Желательно, чтобы задания паука и парсера были достаточно атомарны.
Паук в одну страницу постучал, записал статус получения ответа, каков контент в ответе (html или текстовое сообщение, или JSON и тд.), удалось ли ему распознать структуру, метаданные и тд.
Если, например, вернулась 404 стр, то возможно, с помощью планировщика установить правило, что можно натравить паука на url чуть позже, через час, день, неделю и тд.
По аналогии, можно фиксировать статусы работы других подсистем checker-а, парсера.
Если один из модулей застревает на 5 разе на каком-то задании, то сыпать критическую ошибку в лог и тд.
В общем, каков бы состав модулей не был, но планировщик нужен.

Худший ответ:
Наткнулся на пост где человек делал подобное, ссылка:  тык 
ну я бы ещё к этому функционалу подключил мультикурл + поддержку прокси (есть отличная штука под это дело AngryCurl) на его базе я и делал свой парсер, только вместо crawler использовал DiDom. 
И ещё в своём парсере настройку для разных сайтов я закидывал в отдельный php файл, при запуске парсера я задаю параметры. Например ставлю на крон задание запускать скрипт каждую минуту такой командой: /parser.php https://toster.ru/ 
первым делом проверяем в скрипте работает ли сейчас скрипт с этими параметрами, если работает то ничего не делаем. Контроль работы скрипта осуществляю лочкой файла, таким способом:
$site=$argv[1]; 
if(!$argv[1]) { 
$site = $_GET['site']; 
} 
flock($lock = fopen(__DIR__.'/parser/lock_files/'.md5($site),"w"),LOCK_EX|LOCK_NB) or die('ERROR: SCRIPT RUNNING...');
Если если скрипт не работает, передаю параметр с которым запускается скрипт в инициализацию парсера, если сайт переданный в параметре есть в базе данных делаю инклуд файла с уникальными настройками парсинга данных для него, далее по сценарию. 
Получается что парсер вполне универсальный, можно настроить под любые задачи, создавать сколько угодно экземпляров, регулировать нагрузку (регулированием в кроне частоту запуска скрипта того или иного экземпляра или в конфиге самого скрипта увеличить интервал переобхода страниц с момента последнего посещения её парсером).
В скрипте стоит неограниченное время выполнения, даже если скрипт упадёт, крон его практически сразу же и поднимет.  Так же удобно что под каждый сайт можно в кроне задать разную частоту запуска парсера.
Не знаю на сколько эффективно я сделал контроль работы скрипта отдельного экземпляра (через лочку файла) т.к. доступа к процессам например у меня нету на шаред хостинге, нашёл решение такое, попробовал = работает = меня устраивает.. может и всплывут какие то подводные камни хз, на данный момент полёт нормальный. 
Как вообще такая логика, может что то надо пересмотреть ?
Вопрос: Как рекурсивно изменить расширения «файлов» в корзине S3?

Лучший ответ:
Рекурсивно нельзя ибо файлов и структуры там нет. Вы можете использовать операции LIST. Придется получать все не верные объекты и перещаливать по новому адресу. Можете ещё поиграться с AWS s3 sync, если операция разовая

Худший ответ:
Смотрите cюда, выбираете язык программирования и вперед.
Вопрос: Можно ли установить Windows 7 на UEFI? И будет ли система так же быстро загружаться?

Лучший ответ:
Мне не известны проблемы с установкой Widows 7 на UEFI.
Работать будет одинаково быстро - на скорость это в любом случае никак не влияет.
Главное SSD смотрите чтобы в режиме AHCI был.И обратите внимание - на официальном сайте нет драйверов под Windows 7

Худший ответ:
У меня вин 7 на eufi удалось поставить только используя правильное форматирование флешки и после запись образа.
Мучался 4 дня (не знал о eufi вообще), дошло до разбора ноутбука, переключения местами жестких дисков и других нечеловеческих экспериментов .. :)
Вопрос: Ошибка: Fatal error: Call to a member function query() on a non-object in C:\OSPanel\domains\localhost\rabotnik\passengers\search.php on line 12?

Лучший ответ:
mysqli_query $pdo
Ничего странного не находите?

Худший ответ:
$query = 'SELECT id_passengers, psurname, pname, patrongmic, date_of_birth, passport, issued_by, date_of_issue, login, passwors, phone FROM passengers';
Вангую passwors != password
Вопрос: Как проверить состояние SSD диска в Debian?

Лучший ответ:
Если рейд хардварный, то воспользуйтесь его средствами для диагностики:
https://wiki.debian.org/LinuxRaidForAdmins 
hwraid.le-vert.net
Если программный и оригинальные файлы устройств доступны - то smartctl -a /dev/sdN
Но для начала проверьте файловую систему посредством fsck из read-only, через liveCD или single-user mode

Худший ответ:
Есть программа fsck - она проверяет файловые системы на наличие проблем и устраняет их. Для устранения fs не должна быть смонтированан на запись, то есть проверить на штатно загруженном linux так корневые разделы не выйдет.  То есть надо загрузится не в эту ОС (с CD/DVD, флешки) и уже с неё смонтировать и проверить. Умеет так же искать битые блоки.
Есть программа badblocks - она проверяет именно диск на наличие сбойных блоков.
Есть программа smartmontools - она использует технологию самотестирования дисков (SMART) и показывает ее результаты.
Вопрос: Как пробросить порт с хоста внутрь docker контейнера?

Лучший ответ:
В общем решение оказалось простым:docker run --name 10.1.23-mariadb --net=host -v /opt/test/mariadb:/var/lib/mysql -v /opt/test/mariacnf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=password -d mariadb:10.1.23
Т.е. как я и предполагал через --net=host - таким образом контейнер работает в сети хоста и нет нужды что-то редиректить. /etc/mysql действительно не пробрвсывается для изменения my.cnf, зато спокойно пробрасывается /etc/mysql/conf.d, а в нем файл mariadb.cnf, в котором и прописывается изменение порта на 3308.
Проблема решена.

Худший ответ:
А что если указать ip адрес сетевушки в который проброшен ssh туннель?
Вопрос: Распостраняется ли ssl сертификат на домены типа example.test.ru?

Лучший ответ:
По умолчанию нет. Вам нужен wildcard сертификат, который работает на любых поддоменах.

Худший ответ:
Можно вручную дополнительно указать в сертификате основного домена несколько его поддоменов.
Например, см. сертификат этого сайта:
DNS-имя=toster.ru
DNS-имя=www.toster.ru
Вопрос: Как в angular не скомпрометировать ключ для google map?

Лучший ответ:
Тут есть рекомендации от Google: https://support.google.com/cloud/answer/6310037?hl=en

Худший ответ:
Тут есть рекомендации от Google: https://support.google.com/cloud/answer/6310037?hl=en
Вопрос: Пробуждение пк в нужное время, реально ли?

Лучший ответ:
В BIOS есть для этого целый раздел со всякими способами Wake-Up.
Там и по часам можно, и по клавиатуры/мыши и от включения в сеть (хорошо помогает, когда нужно загрузить компьютер автоматически, когда свет отключили, а потом включили обратно) и от шины расширения (так реализуют просыпание всего компьютера через сетевую карту на основании "магического пакета" пришедшего из сети)

Худший ответ:
Да
Вопрос: Как написать CreateView для модели с ForeignKey?

Лучший ответ:
Во-первых, соблюдайте, пожалуйста PEP-8 и Django Coding Style. Это уважение к тем, кому приходится читать ваш код. Также, обратите внимание, что обычно модели называются в единственном числе: City, а не Cities. Country, а не Countries.
Во-вторых, при данном использовании CreateView форма создается автоматически. Вам же нужна своя форма, которая будет назначать страну. Создайте форму для City, в конструкторе которой будет сохраняться Country из запроса. А в CreateView вместо атрибута fields используйте form_class для использования вашей формы.

Худший ответ:
В общем вот код, который работает (другие подходы не помогли):class CityCreate(CreateView):
    model = Cities
    fields = ['city_name', 'tags']
    template_name = 'countries/new_city.html'

    def get_success_url(self):
        return reverse('countries:cities', args=[self.country.id])

    def get_context_data(self, **kwargs):
        self.country = get_object_or_404(Countries, id=self.kwargs['country_id'])
        kwargs['country'] = self.country
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        self.country = get_object_or_404(Countries, id=self.kwargs['country_id'])
        form.instance.country = self.country
        messages.success(self.request, 'The city has been added to the list of visited places, thank you') 
        return super().form_valid(form)
Вопрос: Где можно найти веб-верстальщиков из Индии?

Лучший ответ:
Это конечно чуть наоборот — индус заказчик, но все же... 
Взял первый заказ на UpWORK от индуса. Как разрулить проблемы?
В догонку: Индусский кодВ Индии с некоторых времен существует практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили, как обманывать неквалифицированных заказчиков.

Худший ответ:
Разумнее всего брать договариваться с фрилансером из РФ (В замкадье куча профессионалов, которые лучше индусов).
 Это проще в плане перевода денег и отчетности для налоговой (на всякий случай).
Это проще в плане контроля: один язык, примерно понятное мировоззрение.
Это дешевле или так же. Многие работают за цену в 5-6 $ в час. На апворке ценник больше
Вопрос: Можно ли выполнять lock на list?

Лучший ответ:
Допустим, _inner используется у вас во многих местах, и есть некий публичный метод, который его возвращает. Тогда внешний код сможет вызвать этот метод, получить тот же экземпляр объекта _inner и поставить на него свой lock. Так можно случайно словить взаимоблокировку и повесить приложение.
Подобные моменты бывает очень сложно отследить, потому объект может быть возвращен косвенно, по интерфейсу, или как-либо еще. Отдельное поле _lock - это просто правило хорошего тона, его создают для безопасности: очень маловероятно, что кому-то придет в голову использовать его за пределами инструкции lock и тем более вернуть из метода.
Если у вас небольшой код и вы уверены, что знаете, что делаете - разницы нет.

Худший ответ:
Почему бы не использовать ConcurrentBag ?
Вопрос: Как писать удаленно в БД? TCP/FTP?

Лучший ответ:
Я бы сначала локально лил в файл, чтобы на случай пропадания связи проблем не было.
Потом можно локально уже распарсить поток до структурного состояния, а дальше уже интереснее.
Вариант 1: прямое соединение по ssh с пробросом портов (тогда БД наружу не торчит) и лить запросами в БД
Вариант 2: небольшой веб REST сервис поднять на получателе, куда скидывать хоть через wget пакеты, которые будут обрабатываться и литься в БД.
выбор варианта сильно зависит от компа, на который приходит ком-порт. Если там достаточно ресурсов, парсить локально и лить на удаленный сервер. В этом случае больше контроля. Если будет пропадание сети, то просто будет локально копиться и ждать отправки.
Вариант с веб-сервисом - профдеформация, всю черновую работу в этом случае отдаём стороннему софту, на плечи серверного приложения остаётся только обработать пришедшие данные. Можно и TCP реализовать, не проблема.

Худший ответ:
Зависит ТОЛЬКО от задачи:как критично не потерять данные или можно пропустить часть данных (нужен ли надежный промежуточный буфер)как оперативно данные должны поступать в БД (можно ли повешать на крон отсылку накопленных в буфере данных)и сколько времени/человеческих ресурсов можно выделить для решения задачисекьюрности проекта (если это не внутренний сервер, в небольшой конторе где не может быть атак - то еще можно использовать FTP, иначе - категорически нет).
И это будет очень большой разбег. Буквально  от 10 минут до 10 дней работы
Ваш вопрос состоит в том, что вы просите нас оценить ваши особенности задачи, которые мы оценить не можем, не зная о требованиях к задаче.
Вопрос: Как привязать IP адрес к домену?

Лучший ответ:
Ох и насоветовали вам, домен в listen...
Должно быть так (условно у вас ip=1.1.1.1)listen	1.1.1.1:80;
server_name domain.com www.domain.com;
Или же, без привязки к ip адресу
Должно быть так (условно у вас ip=1.1.1.1)listen	80;
server_name domain.com www.domain.com;
Так же, может быть несколько портов, например для ssl.listen	80;
listen	443 ssl;
server_name domain.com www.domain.com;
Небольшая ремарка. Когда вы переходите по доменному имени в браузере, ваш браузер делает DNS запрос на NS сервер домена, спрашивает IP адрес из А записи указанного домена, после этого обращается на этот IP адрес по 80 порту и просит сервер отдать ему содержимое domain.com, если таковой имеется в конфигурации. Если домен все же сконфигурирован - веб сервер отдает содержимое document_root или того, что настроено, если нет - отдает клиенту содержимое первого сконфигурированного хоста в цепочке конфигов (его обычно конфигурируют без доменов, в document_root кладут пустой index.html).
Ремарка2. А учитывая то, что у вас за nginx работает apache, нужно не забыть сказать nginx'у откуда отдавать контент для данного домена.
В вашем случае, в "location /" должно быть как-то так.location / {
        proxy_pass	http://127.0.0.1:81;
}

Худший ответ:
IP надо назначить контролируемому сетевому интерфейсу, к которому пристыкован nginx и все такое
потом сменить А запись ( или добавить, будет по двум открываться)
Вопрос: Как указывать почту на сайте, чтобы на нее не сыпался спам?

Лучший ответ:
Использовать почтовый сервис с адекватным спам-фильтром. Все, что вы сможете закодить в html/js, можно будеть раскодить. Поэтому адрес все равно сграбят, как бы вы его не обфусцировали. Либо не указывайте вообще (используйте форму обратной связи), либо указывайте и не заморачивайтесь.

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

Лучший ответ:
Вообще, есть и достаточно мощные конструкторы. Только не на базе карт Яндекса, естественно.
https://storymaps.arcgis.com/en/app-list/
https://maphub.net/
https://mapme.com/

Худший ответ:
Попробуйте https://livegpstracks.com глянуть.
Меню "Инструменты" - "Раздел работы с точками".
Вопрос: Как реализовать моргающую лампу?

Лучший ответ:
Главная ошибка у вас в первой строке.
Выражение Math.floor(Math.random(1, 3)) * 1000 вычисляется один раз при запуске, и потом только с этим интервалом и работает.
Я бы делал немножко по другому: несколько флагов, которые переключаются независимыми таймерами, через 300, 500, 700 миллисекунд, например (основано на ряде простых чисел). 
Когда все три флага совпали - моргаем лампочкой. Такие таймеры дадут довольно длинную псевдослучайную последовательность без очевидных шаблонных повторений.(function(){
	var a = b = c = true, lamp = document.querySelector('.lamp')
  setInterval(function(){
    if (a && b && c) {
      lamp.classList.add('off')
      setTimeout(function(){
        lamp.classList.remove('off')
      }, 40) // это три кадра при 60 fps
    }
  }, 200)
  
  setInterval(function(){ a = !a }, 300)
  setInterval(function(){ b = !b }, 500)
  setInterval(function(){ c = !c }, 700)
})() числа в таймерах можно подправить на свой вкус
https://jsfiddle.net/wo78t98z/UPD: Вариант на css
У враппера желтый фон, поверх два прозрачных псевдоэлемента и пнг-шка с лампочкой.
У псевдоэлементов и пнг-шки независимые таймеры, которые кратковременно моргают черным..lamp::before,
.lamp::after {
  background: transparent;
  animation: blink 7.5s step-start infinite;
}
.lamp::after {
  animation-duration: 13s;
}
.lamp img {
  animation: blink 3s step-start infinite;
}

@keyframes blink {
  0%, 1% { background: #000; }
  100% { background: transparent; }
}https://jsfiddle.net/wo78t98z/1/

Худший ответ:
как вариант рекурсию сделать в вашей же функции lampSwitch
Вопрос: Что делать Junior'ом?

Лучший ответ:
Это вам только кажется что вы выполняете работу Middle или Senior'a(по своему опыту говорю=))
По теме: подписываешься на все возможные блоги по андройду, изучаешь старые статьи и читаешь новые, создаешь проект песочницу, где все это юзаешь и впахиваешь как лошадь(опять же по своему опыту). И прогресс не заставит себя ждать)
Если уж ты точно уверен, что тебя не ценят, то никто не мешает свинтить с конторки=)

Худший ответ:
Это вам только кажется что вы выполняете работу Middle или Senior'a(по своему опыту говорю=))
По теме: подписываешься на все возможные блоги по андройду, изучаешь старые статьи и читаешь новые, создаешь проект песочницу, где все это юзаешь и впахиваешь как лошадь(опять же по своему опыту). И прогресс не заставит себя ждать)
Если уж ты точно уверен, что тебя не ценят, то никто не мешает свинтить с конторки=)
Вопрос: На чем написать CRM?

Лучший ответ:
CRM - это Customer Relationship Management, взаимоотношения с заказчиками.
При чем здесь "управление учебным процессом"???
CRM, это, например, ведете вы сделку, к которой нужно 100 согласований на разных уровнях - вот CRM и позволяет вам не забыть.
Или, к примеру, не забыть поздравить любимого крупного заказчика с днем рождением; прочитать в CRM, что он любит Спартак и подарить ему билеты на "Спартак - Челси" - это тоже можно назвать функцией CRM. 
Прямого отношения к управлению собственным учебным процессом это не имеет.
Только косвенное.
=========================
Делается серверное API.
К которому потом запросто подключается веб-клиент, мобильный клиент и десктопный клиент.

Худший ответ:
Мой вариант:  
Фронтенд Angular2 (если хочется то при помощи Electron можно и десктоп приложение забацать http://electron.atom.io) + Materialize (http://materializecss.com)
Бекенд соответственно NodeJS с обычным REST API на Express + Sequelize+ PostgreSQL, но еще лучше, сначала на бекенд вообще забить и пользоваться готовым, например Firebase. Потом переедете на свое решение, а сначала сконцентрируйтесь на одной задаче.
Итого, учите только JavaScript, точнее сразу TypeScript
Вопрос: Нужно ли покупать новый жесткий диск?

Лучший ответ:
Смарт вам показывает не только ошибки передачи по интерфейсу, но и проблемы с поверхностью. Данные быстренько вытащить, диск выкинуть.

Худший ответ:
Попробуйте сперва заменить шлейф.
Вопрос: Как учитывать рабочее время фрилансера?

Лучший ответ:
Трекер - слабо помогает.
Хотя, если желаете - трекеры делают снимки экрана. Можете посмотреть чем именно занимался исполнитель
Только вот одно "но": я могу прямо при вас заниматься работой на другого заказчика,  в промежутках между работой для вас.
Вы просто не поймете.
Так на самом деле и происходит, а вовсе не ю-туб. т.е. он может сделать работу за 1 час, не остановить трекер, а смотреть 3 часа видосики на ютюбе и только потом нажать стоп. 
Поэтому это просто вопрос доверия.
И конкуренции между исполнителями.
P.S.:
По сути - вам какая разница, что исполнитель за 20 баксов час выставил вам за 2 часа, а работал фактически полчаса;
при этом исполнитель за 10 баксов в час выставил вам за 6 часов, а фактически работал 5,5 часов??????
Вас же интересует только итоговая сумма за выполнение работы, за результат, а не за время. Время для вас - ничто. Значение имеет только результат.

Худший ответ:
Никак не оценивать. Вы либо доверяете, либо нет.
Вопрос: Объясните простым языком, что делает эта строчка?

Лучший ответ:
Это условие, если переменная successful что то содержит, значит msg равно successful, иначе unsuccessful
В обще это тоже самое что иvar msg = 'unsuccessful'
if(successful) msg = 'successful'
Еще можно писать такvar msg = successful && 'successful' || 'unsuccessful';

Худший ответ:
Если successful == true, то возвращает 'successful', иначе возвращает 'unsuccessful'.Условные операторы: if, '?'
Вопрос: Как нарисовать такое в иллюстратор?

Лучший ответ:
Рисуешь кушу вытянутых прямоугольников, обрезаешь их по форме волны, заливаешь вертикальным линейным градиентом.spoiler
https://we.tl/t-sMiaCTXFPp

Худший ответ:
Сделать несколько вертикальных узких прямоугольников, залитых градиентом, со слегка различающейся прозрачностью.
Размножить их вдоль горизонтальной оси.
Нарисовать две огибающие графика.
Дергая за верх и низ узких прямоугольников, используя snapping, вписать их по высоте в огибающие.
По вкусу, поиграть прозрачностью у получившегося.
Вопрос: Медленная прокрутка колесиком мыши chrome/chromium в linux?

Лучший ответ:
Может быть не актуально уже, но, возможно, кому-то пригодится. Начиная с 48-49 версии chromium добавили режим плавной прокрутки. Для того что-бы её отключить, необходимо перейти по ссылке chrome://flags/#smooth-scrolling и напротив Smooth Scrolling - выставить значение Disabled (Отключить)

Худший ответ:
Николай решилась как то проблема с медленным скролом, есть решение?
Вопрос: Со знанием какого MVC фреймворка больше шансов найти работу в русскоязычном сегменте?

Лучший ответ:
Всегда есть возможность посмотреть сайты с вакансиями! Вам нужно поанализировать hh.ru и moikrug.ru
По моим наблюдениям, годных вакансий на удаленку, на Моем круге всегда было больше.
p.s. фильтры по удаленке настраиваются на обоих сайтах.

Худший ответ:
Если PHP то Laravel будет однозначным плюсом, если фронт-енд то Angular 2 или React (с Redux и прочим хламом который требуется для него)
Вопрос: Как отключить преобразование числа в строку при отправке объекта методом POST через jQuery?

Лучший ответ:
Никак, http - текстовый протокол, все что через него проходит - т екст. Если вам нужны числа, явно преобразуйте при получении.

Худший ответ:
Если будете отправлять application/json, а не x-form-www-urlencoded - будет все как надо.
Разумеется, надо удостовериться, что сервер умеет принимать JSON.
Вопрос: Как проверить существует ли таблица в mysql базе?

Лучший ответ:
$wpdb->get_var("tableName")
if ( $wpdb->get_var("show tables like '".$table."'") != $table ) {
            Создаем таблицу;
}

Худший ответ:
Таблица создается читсым sql или оберткой wp?
Если sql то можно без всяких проверок сразу в базу sql слать
create table if not exist
Вопрос: Какой процент сайтов используют javascript?

Лучший ответ:
99.9%
У гугл-почты была чисто HTML версия.

Худший ответ:
Предыдущий комментатор не особо ошибся. Вот, держите отчёт.
Вопрос: Можно ли на знаниях С++ ориентироваться и кодить в Unity пока не изучу С#?

Лучший ответ:
Так-с. Дайте-ка подумать. Гравитация, сильное взаимодействие, слабое взаимодействие, третий закон Ньютона, преобразования Лоренца, квантовая неопределённость, стандартная модель... Эм, не знаю в общем никаких физических законов, которые не позволили бы изучать какую-либо технологию в процессе работы с ней. Даже более того, это единственный эффективный способ начать её изучать.
Си++, C#, Java, Python, JavaScript... Да как вы надоели с этой хренью, честно. Никто не удивится, если ты понятия не имеешь, что такое рефлексия, зачем нужны лямбда-функции, почему так много споров о сборщике мусора. И тем более такие мелочи, как порядок инициализации или особенности области видимости в VC++98. Вопрос не то, чтобы плохой. Он глупый и неправильный. Unity это про иерархию объектов на сцене, их менеджемент, операции с матрицами, работа с графикой в реальном времени, однако, в основном - это про то, как перетащить объект из ассетов на сцену и поколдовать над его свойствами. Unity это про стейт-машины и формальную логику (например, предикаты), UI/UX и оптимальное программирование, но в большей степени это артисты рисующие модельки, текстуры и спрайты, озвучивающие и анимирующие их. Наконец, надо разбираться в предметной области в сфере, по которой создаётся игра, но для хэлоу ворлдов хватит и восьмого класса.
Так что хватит загрязнять тостер с этой фигнёй. Тут очень слабое ранжирование хороших вопросов в отличии от stackoverflow, таких вопросов уже тьма задавали. Хватит!

Худший ответ:
C++ можно назвать геймдев-языком. Если начали с C++ - продолжайте. Из движков C++ (насколько знаю) использует Unreal Engine.