Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как правильно интегрировать несколько систем в компании?

Лучший ответ:
Привет,
Проблема существует практически на всех предприятиях, но обычно это разные системы, типа 1с на кадры, самописная c# по документам и какая-нибудь готовая опен-сорц система поддержки на php. Ваш вариант, что всё написано на одной технологии благо, используйте это, заворачивайте в нугет библиотеки.
Про esb - все очереди используются для синхронизации данных. То есть, у вас изменился некий сотрудник в кадрах, сохраняется не напрямую в бд, а через очередь. Другие системы так же подписаны на эту очередь и обновление сущности сотрудника идёт во всех системах, которые хранят дубли необходимых им данных. Как вы понимаете, тут куча накладных расходов и нештатных ситуаций. За этим нужно следить и как-то восстанавливать/докачивать данные. Тем не менее, это самый правильный вариант, ибо в противном случае синхронизацию данных делают кастылями через вьюхи/джобы/хранимки и как только отвратительно не делают. В общем, если хватает скиллов - делайте так, будут независимые рабочие приложения.
По общению через апи - там нет проблем с какими-то маленькими и атомарными операциями. Проблемы начинаются когда необходимы _распределённые транзакции_ погуглите про это, как реализовывают и оцените насколько тяжелее будет разработка. Вторая тут проблема - это отчёты, тупо джоины. Вам нужно выгрузить какую-то консолидированную инфу из одной системы, вы делаете, но в ней у вас только айдишники пользователей. Либо вы эти айдишники отправляете в сервис кадров и получаете развёрную инфу по каждому, либо на каждый такой запрос вообще грузите полный список пользователей. А потом ещё говорят, нужно исключить данные по пользователям на время их отсутствия. Опять же эти данные в сервисе кадров и, в общем, нужно лепить какой-то большой снежный ком не из снега. Окей, если прям вопрос с отчётами, можно будет заводить какие-то консолидированные хранилища и все системы будут туда сливать данные, но вот при обычном использовании вам всё равно потребуется делать большие джоины, какие с этим косяки я примерно описал.
По варианту общих сервисов, я за него из-за простоты:
Хранить строки подключений нужно в каждом проекте - это не проблема
Дублировать бизнес-логику не нужно, выносите её так же в общие сервисы
Обновлять будет нужно оба сервера, если в общем сервисе баг. Тут разговор, очевидно, про "баг на проде" - из-за общего кода будет баг на обоих продакшенах. Окей, как часто у вас возникают такие ситуации и насколько долго обновить два прода вместо одного?

Худший ответ:
Только одна система, и больше никак! Во всяком случае со стороны пользователя. Если говорить про реализацию, то лучше исходить из особенностей компании и систем. Обычно в качестве переносчиков данных между системами являются менеджеры, которые только этим и занимаются и получают за это деньги.
Если по-умному, то нужно расслоить системы на компоненты, затем объединить одинаковые компоненты (например, бд) в один+продумать грамотное API, удобное для всех систем.
Вопрос: Как использовать базу MAC адресов для рекламы в Facebook?

Лучший ответ:
еще вам огорчение айфоны меняют маки рэндомно, насчет андроидов не уверен но тоже что то подобное слышал. 
ну и куча китайфонов с одинаковым маком до кучи

Худший ответ:
по макам низя делать таргетинг... разве что изначально выцеплять еще и другую инфу...
Вопрос: Есть ли в figma плагин, который выводит из макета в удобном для чтения/копирования виде все цвета используемые в макете, в виде scss/sass переменных?

Лучший ответ:
Если цвета представлены в виде стилей, то плагин Style Station позволяет их заэкспортить в less или scss переменные.



Худший ответ:
Точно есть плагин который автоматом формирует страницу в проекте с используемыми стилями цветов Color styleguide а вот по вашему запросу не знаю..
Вопрос: Как с помощью цикла while, команды dig вывести в файл ips.txt A-записи домена, после чего на следующей строке PTR-запись IP?

Лучший ответ:
1. Выгрепываете из вывода dig`а айпишники, пишете их в файл (не обязательно, можно просто в массив сохранить).
2. В цикле для каждого айпишника резолвите PTR-запись, записывая поочерёдно сначала айпишник, потом имя в файл.

Не вижу, если честно, тут особой сложности.

Худший ответ:
#!/bin/bash

dig vk.com +short> ips.txt
IPLIST="[ПИШЕМ ПУТЬ К ips.txt]"
RESULTS="results.txt"
touch "$RESULTS"

while read IP;
do
    dig -x "$IP" +short
    echo $IP
done < "$IPLIST" > $RESULTS
Вопрос: Почему при умножении появляется большой «хвост»?

Лучший ответ:
По какой причине JS результатом к выражению 1.4 + 0.2 возвращает 1.5999999999999999?
Js как то странно считает числа, почему?
Откуда значения?
Почему в JS 0.1+0.2 не равно 0.3?
Почему JS складывает с разной точностью?
При складывании в js от куда-то берется 0.00000000000000001?
Откуда берутся сотые доли при умножении на дробное число?
Почему js так считает числа в данном примере?
Почему при сложении чисел с двумя знаками после запятой, получается число с многими знаками после запятой?
Почему JS добавляет левые цифры?

Худший ответ:
Перед умножением дробей, нужно всегда приводить их к целому числу, тогда таких проблем не будет.
Вопрос: Замыкания. Почему в этом случае удаляется lexical environment родительской функции?

Лучший ответ:
В переменную g у вас записывается ссылка на функцию, которая вернулась из f(). Пока эта ссылка доступна из глобального контекста (через g), функция сохраняется в памяти. Весь контекст, связанный с функцией, также сохраняется, поскольку тоже доступен из глобального контекста (через g и функцию).
Присваивая переменной null вы, тем самым, делаете функцию и связанный с ней контекст недоступными из глобального контекста. Значит при следующем проходе сборщик мусора удалит их как неиспользуемые.

Худший ответ:
В переменную g у вас записывается ссылка на функцию, которая вернулась из f(). Пока эта ссылка доступна из глобального контекста (через g), функция сохраняется в памяти. Весь контекст, связанный с функцией, также сохраняется, поскольку тоже доступен из глобального контекста (через g и функцию).
Присваивая переменной null вы, тем самым, делаете функцию и связанный с ней контекст недоступными из глобального контекста. Значит при следующем проходе сборщик мусора удалит их как неиспользуемые.
Вопрос: Текст накладывается сам на себя?

Лучший ответ:
Открываете файл в режиме для записи - весь предыдущий контент удаляется. Вам подойдет режим "a"

Худший ответ:
Добавлю, что 
F.close
Не делает ровным счётом ничего, так как вы не вызываете метод close.
Должно быть 
F.close()
А ещё лучше заменить вот это:
F = open("txt","w")
  for i in password:
    F.write(str(n)+ password + '\n')
    F.close
На вот это
with open("txt","w") as F:
    for i in password:
      F.write(str(n)+ password + '\n')
Вопрос: Какой дистрибутив java выбрать для обучения?

Лучший ответ:
Берите любую lts.

Худший ответ:
Не ниже 8 версии - норм.
Вопрос: Где ошибка и где можно рациональнее написать код, чтобы сократить время обработки?

Лучший ответ:
тут долгая и «дорогая» задача — нахождение суммы делителей числа. У вас в решении для одного (любого) числа она вычисляется по многу раз. Этого нужно избежать.

Составьте словарь: объект или Map, где ключ – сумма делителей. А значение – массив чисел, у которых оказалась такая сумма делителей.

Один раз пройдитесь по диапазону 1 ... 3000 и заполните словарь, посчитав сумму делителей для каждого по одному разу.

Затем остаётся пройти по словарю и набрать из каждого из массивов значений, пары.  Например, все простые числа свалятся в массив под ключом 1 (все делятся только на 1 и на себя). {1: [1, 2, 3, 5, 7, 11, 13, ... ], ... } Из этого массива нужно все возможные пары повытаскивать: [1, 2], [1, 3], [1, 5], ..., [2, 3], [2, 5], ...

Ещё оптимизация: при поиске делителей числа есть смысл проверять не до самого числа, а только до его половины. Например, 21:  проверить, делится, ли на 2, 3, 4, ... 10 <= (21 / 2 = 10.5) и дальше проверять не нужно.

Худший ответ:
Зачем внутри getDivisors создавать массив, а потом писать отдельную ф-ю для складывания массива? Можно было сразу складывать в результат и возвращать сумму.
По поводу использования i - вы не объявляли её внутри for, поэтому в нестрогом режиме она стала глобальной. Если объявлять внутри
for (let i = 0; i < arr.length; i ++)
то она будет локализована внутри цикла и проблем в других местах не будет.
Для продвинутой работы с массивами, рекомендую ознакомиться с функциями reduce и map
Вопрос: Какие существуют способы подключения к заблокированному VPN?

Лучший ответ:
Подними собственный впн за 300р в месяц и не парься

Худший ответ:
Если блокировка осуществляется по домену средствами DPI, а не по IP-адресам, то помогут программы вроде GoodbyeDPI: https://github.com/ValdikSS/GoodbyeDPI
Вопрос: Какой можно применить алгоритм для хранение индекса для 50 миллиардов записей в golang?

Лучший ответ:
Немного бухгалтерии. Если взять по максимуму.

Размер одной записи должен быть порядка 60 + 32 +8 = 100 символов (байт для простоты)

При 50 млрд записей объем хранимых данных должен быть порядка

50 000 000 000 * 100 = 5 000 000 000 000 = 5 триллионов байт.

В дисковом хранении это будет примерно 4.5 терабайта. Задачка для in-memory неподъемная. Нужен диск + мемори.

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

Вобщем нужна дисковая БД которая встраивается в приложение. На требование менеджеров которые запретили использовать БД забейте. Они ничего не понимают. Делайте БД встраиваемую в приложение. В качестве таких (встраиваемых систем можно поробовать) LevelDb, BerkeleyDb, RocksDb. Они поддерживают индекс класса B+Tree и это даст возможность искать группы записей по одному ID. Для этого класса систем любую запись можно найти за 4-5 дисковых IOPS. Если какдый IOPS стоит 15 мс (это я так мерял свой собственный магнитный HDD) то любой поиск группы ключей для TTFB будет порядка 15 * 5 = 75 милисекунд. Ну если вы поставите SSD - то быстрее. 

По поводу предложений хранить в файлах. До того как обсуждать это - надо уяснить требования по времени отклика. Сколько секунд вы согласны ждать - насколько можно и партицировать (или шардировать ваш файл).
В простейшем случае мы делим большой CSV файл на 512 partitions по хешу от ID и получаем соотв время фулл-скана всего файла поделенное на 512. Дальше - играйтесь с этим параметром партишенинга выводя его на доступный уровень отклика. Из недостатков - будет россыпь файлов. Надо почиать документацию на вашу файловую систему (ext4?) и тюнить ее так чтоб она не сдохла от такого числа inodes. 

Я поддержу оба сценария. И с встраиваемой БД и с файлами. Но с БД надежнее т.к. есть транзакции а файлы у вас могут быть в крешнутом состоянии долго. И вы об этом ничего знать не будете.

По поводу Parquet. Не взлетит. Скорее всего индекс по данному типу файла - это совсем не то что вкладывают туда релационные системы. Обычно Parquet/Orc/Delta вкладывают в индекс смысл - отбрасывания тех полосок данных (stripes) которые бесполезны при чтении всего файла. Такой индес - обычно просто либо range-признак либо карта Блума. И в случае с range - дает эффект на сортированных данных. Для прочих - будет бесполезно т.к. фулл-скан все равно обеспечен. А если фулл-скан то зачем тогда вообще индекс. 

Вобщем для дизайна архитектуры нам нужны цифры. Средние длины по колонкам. И я-бы еще запросил кардинальность по полю ID.

Худший ответ:
Можно индексировать индекс. А именно, хранить, например, в 10 файлах: в первом все id % 10 == 1, во втором id % 10 == 2 и т.д. Если id - строки, то по первой букве, например. По сути это хеширование. Если потом перестраивать, то не всё и сразу, а тоже по 10% от всего индекса за раз. Это как пример.
Вопрос: Можно ли заменить в ноутбуке экран на другой, с более высоким разрешением?

Лучший ответ:
Нужно сначала узнать диагональ (напр. 15.6), потом количество пинов (40 или 30pin), далее расположение разъема когда дисплей лежит экраном вниз (обычно справа внизу), потом где распложены крепления/они же ушки (сверху снизу или их нет, если матрица клеится на двустороннюю ленту). Это все можно посмотреть в характеристиках старого дисплея в AIDA64, например. Еще одна характеристика - дисплей может быть slim или обычный, нужно ставить соответствующий.
Потом при установке нужно обязательно отключить питание (выдернуть разъем аккумулятора), что-бы не спалить разъем дисплея при подключении. Дисплеи поддерживает видеокарта или она же на встроенная на процессоре, 1920 почти все поддерживают.

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

Можно поискать аналоги ноута, где такой же корпус, но лучше матрица, там вероятность того, что она подойдет выше. Лучше сходить на какой-то более узконаправленный форум или обратиться в какой-то качественный СЦ. Например поискать что-то в АСЦ.
Вопрос: Как обойти блок интернета/ограничение скорости VPN?

Лучший ответ:
м - маршрутизация. 
через ВПН должен гоняться только нужный трафик, а не весь.

если это не общий ВПН, а служебный, он должен при старте автоматом прописывать нужные маршруты. 
если, конечно, его не содержат олени.

Худший ответ:
Как обойти блок интернета на основном ПК?
Если это Linux и Network Manager, достаточно одной галочки, использовать vpn подключение, только для локальных ресурсов этого vpn.
Если нет, почему мы должны гадать, что у тебя там.
Вопрос: Как перебрать все суммы массива?

Лучший ответ:
Можно не рекурсивно.

Перебирите все битовые маски (числа) от 0 до 2^n -1 (mask = 0; mask < (1 << n); ++mask).

А внутри при подсчете суммы пройдитесь по всем позициям массива и, если i-ый бит установлен, прибавляйте текущее число. Проверить, что бит установлен можно сделав побитовое и (&) c 1 << i.

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

Худший ответ:
Действительно, битовые операции я и не думал использовать, спасибо. Прикреплю простенький пример для следующих искателей: 
#include <iostream>

using namespace std;

int main()
{
	int const n = 3;
	int intArray[n];
	int sum;

	for (int i = 0; i < n; i++)
	{
		cin >> intArray[i];
	}

	for (int mask = 0; mask < (1 << n); ++mask)
	{
		sum = 0;
		for (int i = 0; i < n; i++)
		{
			if (mask & (1 << i))
			{
				sum = sum + intArray[i];
			}
		}
		cout << sum <<" ";
	}

	return 0;
}
Вопрос: Какие данные может получить провайдер VPN при анализе HTTPS трафика?

Лучший ответ:
Адрес он не увидит. он увидит обращение к серверам, их DNS и IP

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

Лучший ответ:
Покупаете свой роутер, цепляете его в промежутке между первым роутером и ноутбуком (к первому роутеру свой подключаете кабелем, для ноута раздать Wi-Fi или даже наоборот, ловить своим роутером Wi-Fi, а ноуту отдавать по кабелю), настраиваете VPN на своём роутере.

Худший ответ:
Как вариант - поставить расширение для браузера. По идее - их можно установить даже с запретом на установку программ. Из минусов, собственно - подмена местоположения только из браузера.
Вопрос: Правильно в enum писать капсом?

Лучший ответ:
Пиши так, как принято в конкретном проекте, чтоб код был однообразным. Если проект целиком и полностью под твоим контролем, что пиши так, как нравится.

Имхо, но CamelCase подходит лучше, особенно когда фразы составные.

Худший ответ:
Пиши так, как принято в конкретном проекте, чтоб код был однообразным. Если проект целиком и полностью под твоим контролем, что пиши так, как нравится.

Имхо, но CamelCase подходит лучше, особенно когда фразы составные.
Вопрос: Как отделить и использовать большое количество слайдеров swiper на одной странице?

Лучший ответ:
Например так:
snippet

Худший ответ:
Смотри - форичем проходиться по всем кнопкам (класс на влево вправо у всех слайдером одинаковый) далее при клике обращаешься к родительскому блоку и делаешь те действия которые тебе хочется
Вопрос: Как реализовать опциональные колбэки?

Лучший ответ:
Раз Unit - интерфейс, то заведи метод OnPlace, но у базового класса Unit он просто будет пустым. Т.е. вызывай его всегда. А конкретный Unit реализует то, что ему надо. 
Дженерик тут вообще не нужен. Просто внутри метода Unit проверяй, какой объект вызывал метод

Пример на Delphitype
  IUnit = interface;

  ILane = interface
    ['{494F502B-7659-4C5F-B72A-B6BFBF67F9B7}']
    procedure Place(Item: IUnit);
  end;

  IGroundLane = interface(ILane)
    ['{02D598FF-2AA9-4752-B808-44F8FE909B7B}']
  end;

  IUnit = interface
    ['{4EB084E7-9F79-40B6-92C0-A1A8C794F025}']
    procedure OnPlace(Sender: ILane);
  end;

  TUnit = class(TInterfacedObject, IUnit)
    procedure OnPlace(Sender: ILane); virtual;
  end;

  TMyUnit = class(TUnit)
    procedure OnPlace(Sender: ILane); override;
  end;

  TLane = class(TInterfacedObject, ILane)
    procedure Place(Item: IUnit);
  end;

impl

{ TUnit }

procedure TUnit.OnPlace(Sender: ILane);
begin
  // do nothing
end;

{ TLane }

procedure TLane.Place(Item: IUnit);
begin
  //add item
  Item.OnPlace(Self);
end;

{ TMyUnit }

procedure TMyUnit.OnPlace(Sender: ILane);
var
  Lane: IGroundLane;
begin
  if Supports(Sender, IGroundLane, Lane) then
    // it's IGroundLane
end;

Худший ответ:
Тут похоже ошибка в архитектуре. Логичнее было бы сделать чтобы Lane::Place(Unit *) вызывало какие-то методы у Unit, если это надо для конкретной реализации Lane (Эта логика будет в виртуальном методе, переопределенном в конкретных реализациях интерфейса).

Или Unit::OnPlaced(Lane*) всегда вызвает какие-то методы у Lane и вот они могут сказать, что Unit-у не надо ничего делать.

Ну, или раз вам вот так хочется сделать, то пишите шаблонный метод Unit::OnPlaced(T*), И ручками прописывайне инстанциировки с кокретными SkyLane, GroundLane и т.д. Ну и "дефолтную" реализацию пропишите пустую - вообще ничего не делающую для типа T*
Вопрос: Начало работы на Upwork в марте 2022 года — какие нюансы?

Лучший ответ:
1. Данные из румынии
2. Румынский номер, хз что у них.
3. Фактически да, практически нет.
У вас нет в России ИП, попадёте на НДС, но никто даже не будет смотреть в вашу сторону.

НЕ указывайте ничего из России, забанят.
Всё только румынское! и апворк запросит подтверждение, что вы в румынии, но думаю проблем не будет с этим. Выписку из банка и т.п. хватит.

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

Лучший ответ:
Напишите скрипт, который все это будет делать по расписанию.

Худший ответ:
https://github.com/Roman2K/scat
Или Dar (резервирование данных) + rclone.
И, конечно, в связке с планировщиком задач.
Вопрос: Мотор включается от 5V но не включается от пинов Ардуино?

Лучший ответ:
Абалдеть!!! Может вам стоит отложить ардуину и моторчик в сторону и заняться изучением теории. В частности узнать что такое напряжение и ток.

Моторчик игрушки потребляет ток без нагрузки 50-100мА, а с нагрузкой до 1А. Про стартовый ток я вообще молчу. В то же время максимальный ток с выхода максимум 40мА.

Худший ответ:
Пин ардуино (контроллера) допускает максимальный ток до 40 мА,  но желательно в 20мА укладываться. 
Хороший материал на тему электромоторов.
Вопрос: Какой SMD-компонент находится в центральной части?

Лучший ответ:
https://www.cytron.io/p-base-board-for-nodemcu-v3
Вот здесь про эту плату видео есть. Якобы это IF8DD. Который вроде как родственник MP2359DJ. Вместе с остальной обвязкой это dc-dc понижайка.
Вопрос, а с чего бы ей сгорать? Если не что-то запредельное подали, то возможно на плате коротыш есть.

Худший ответ:
https://www.cytron.io/p-base-board-for-nodemcu-v3
Вот здесь про эту плату видео есть. Якобы это IF8DD. Который вроде как родственник MP2359DJ. Вместе с остальной обвязкой это dc-dc понижайка.
Вопрос, а с чего бы ей сгорать? Если не что-то запредельное подали, то возможно на плате коротыш есть.
Вопрос: Каким хостом пользоваться для работы с БД?

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

Худший ответ:
Если бакэнд будет запускаться так же на этом хостинге, где развернута база данных, то localhost можно оставить, стандартное обозначение машины для доступа по сети локально

Нет нужды искать сервер с установленным mysql, так как для его установки требуется ровно одна команда и пара телодвижений по настройке пользователей, бери любой vps с ssh доступом, при необходимости хостинг предоставит администратора за дополнительную палату
Вопрос: Почему может быть ошибка во время компиляции?

Лучший ответ:
Проблема вот тут:
parent.resize(++n);
glub.resize(n);
for (int i = 1; i <= n; i++) {

Выход за границу массива. Неопределенное поведение.
Вы выделяете массивы длины n (увеличенного на 1) и потом проходитесь от 1 до n (увеличенного на 1). Но ведь индексы в массиве только до n-1. 

Правильно так:
parent.resize(n+1);
glub.resize(n+1);
for (int i = 1; i <= n; i++) {

Худший ответ:
Вы не инициализировали glub (вектор высоты дерева).

Просто добавьте glub[i] = 0; в цикл инициализации. Это должно исправить ошибку

Здесь исправленный код:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Edge {
    int x, y, cost;
};

vector<int> parent, glub;

int findMN(int num){ //Ищем множество в котором находится вершина
    if (num == parent[num]) {
        return num;
    }
    return parent[num] = findMN(parent[num]);
}

int ob(int x, int y) {
    x = findMN(x);
    y = findMN(y);
    if (x == y) {
        return 0;
    }
    if (glub[x] < glub[y]) {
        swap(x, y);
    }
    parent[y] = x;
    if (glub[x] == glub[y]) {
        glub[x]++;
    }
    return 1;
}

int comp(Edge a, Edge b) {
    return a.cost < b.cost;
}

int main() {
    int n, m;
    cin >> n >> m;
    parent.resize(++n);
    glub.resize(n);
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
        glub[i] = 0;
    }
    vector<Edge> g(m);
    for (int i = 0; i < m; i++) {
        cin >> g[i].x >> g[i].y >> g[i].cost;
    }

    sort(g.begin(), g.end(), comp);

    int ans = 0;
    for (int i = 0; i < m; i++) {
        if (ob(g[i].x, g[i].y)) {
            ans += g[i].cost;
        }
    }

    cout << ans;
    return 0;
}
Вопрос: Что будет если я подключу видеокарту которая не поддерживается моей материнской платой?

Лучший ответ:
Материнка не поддерживает видеокарту, если некуда вставить и интерфейс не совместим.
А где у вас указано, что видеокарта не поддерживается?

Худший ответ:
Ваша материнка поддерживается. Просто карта будет работать на предыдущей версии PCI-e

Вот если Вы вставите AGP карту, тогда будет шоу ))
Вопрос: Возможно ли иметь на одном сервере Flask и PHP?

Лучший ответ:
Лучше всего, пожалуй, для этого использовать Docker. Flask в одном контейнере, PHP - в другом, база данных - в третьем. Запустить все через Docker compose, и пусть общаются между собой по внутренней сети.
Можно и прямо как есть, в одном пространстве, но тогда задолбитесь настраивать порты и веб-серверы.

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

Худший ответ:
Конечно можно. 
Для этого ничего не надо дополнительно настраивать даже, просто не проксировать на веб сервере запросы к flask. По умолчанию flask запускается на 127.0.0.1:5000, и пока рядом не поднят веб сервер, который будет проксировать к нему запросы, или не изменена конфигурация, чтобы он был доступен на внешнем интерфейсе, он и не будет доступен извне, но будет доступен вашему php приложению.