• Как правильно сохранять данные из микросервисов в единую БД?

    Если ваши микросервисы будут иметь общее состояние в одной БД, и работать с этим состоянием через СУБД, то это не микросервисы, а монолит. Вам лишь будет казаться, что это микросервисы. Тем более что вы сказали, что вам важно следить за схемой данных, видимо она не зафиксирована один раз на веки вечные (и это нормально).

    Либо разносите данные по разным БД для разных сервисов, либо обращайтесь к этим данным через один сервис (видимо это ваш 5-й вариант, только я не совсем понял что вы имеете в виду под "брокером").
    Ответ написан
    Комментировать
  • Как работает отказоустойчивая почта?

    Зависит от конкретных реализаций почтовых сервисов, хранящих (именно хранящих!) письма. Вот например инструкция по репликации для Голубятни, используется утилита dsync из комплекта. На других сервисах могут быть совершенно другие средства, например если для хранения используется какая-то СУБД, то могут использоваться её собственные средства репликации. Задача в общем-то неспецифичная для почтовых сервисов, гуглите про репликацию файлов и баз данных - это обширная область с кучей алгоритмов и матана.

    Ну и самое главное - MX-записи они же для пересылки почты, т.е. для работы протокола SMTP, когда письмо ещё перебрасывается между серверами, чтобы попасть на тот самый сервер, где оно уже "ляжет" на хранение (откуда вы потом заберёте его по IMAP). Это письмо ещё десять раз может быть передано с сервера на сервер.
    Ответ написан
    Комментировать
  • Правильно ли объединять WPF и WinForms проекты в одно решение (solution)?

    Nipheris
    @Nipheris Куратор тега C#
    В дотнете внешние и межпроектные зависимости (PackageReference, ProjectReference) прописываются и ставятся для каждого проекта отдельно. Более того, по умолчанию каждый library-проект также становится самостоятельным NuGet-пакетом, если в настройках включить сборку последнего.

    Солюшен - это лишь примочка для объединения нескольких проектов во что-то, что можно собрать одной командой в IDE или в консоли. Ну и открывать сразу всё в IDE тоже удобно.

    Лично я рекомендую в большинстве случаев пользоваться подходом "один Git-репозиторий - один солюшен - много проектов". Репозиторий - единица версионирования (т.е. ВСЕ проекты в репе всегда имеют одинаковую версию), проект/пакет - единица управления зависимостями.

    Итого имеем следующие выводы:
    • вы собираетесь притащить к себе довольно толстые библиотеки, "подружить" которые в рамках одного исполняемого бинарника будет непросто. Т.к. для шарповых MSBuild-проектов каждый проект (csproj) собирается в отдельную сборку (assembly), то логично иметь WPF и WinForms варианты в виде отдельных проектов (и в виде двух разных бинарей на выходе)
    • если вы планируете общий релиз для обоих приложений - т.е. когда не бывает так, что допустим WPF-приложение релизится, а WinForms - нет - тогда делайте один репозиторий и один солюшен с несколькими проектами;
    • если вы планируете независимый релиз для каждого приложения - тогда другая история, но надеюсь вам это не нужно
    Ответ написан
    2 комментария
  • Какую сетевую библиотеку выбрать?

    Nipheris
    @Nipheris Куратор тега C++
    WinSock2 - это не библиотека, а прикладное API на Винде. Т.е. вы выбираете не между двумя библиотеками, а между апихой самой ОС, и ей же, обёрнутой в кроссплатформенный boost.asio.

    Если задача учебная, и нужно прям поработать с сокетами на низком уровне - возьмите WinSock2, это почти что ванильный Berkley Sockets. Если не нужно работать с сокетами на низком уровне - я бы взял asio. Но тогда вам придётся познакомиться с абстракциями этой библиотеки. В целом, ничего неподъёмного там нет.
    Ответ написан
    Комментировать
  • Почему создание временного объекта c помощью конструктора копирования оценивается как redeclaration?

    Nipheris
    @Nipheris Куратор тега C++
    А с чего вы решили, что парсер это разобрал как конструкцию вызова конструктора копирвания? Я думаю он считает это декларацией. Вот если Object { o1 }; напишите, то другое дело.
    Ответ написан
    4 комментария
  • Что важно в процессоре больше для программирования, тактовая частота или количество ядер?

    1. Практически на любом современном десктопном CPU достаточно ядер для тестирования и отладки разного рода параллельных алгоритмов. Поэтому предлагать взять "побольше" смысла не вижу. Меньше двух вы не найдёте, больше восьми не так уж и нужно.
    2. Тактовой частоты любого из современных CPU дороже 15 тыщ достаточно для комфортной разработки, если речь идёт об IDE, редакторе, отладке.
    3. Обе указанные характеристики в целом имеют очень небольшое значение. Архитектура, рыночный сегмент и поколение процессора (или проще - год выпуска) куда важнее, чем тактовая частота или количество ядер.
    4. Production-железо - совсем другое дело. Есть задачи которые плохо параллелятся, есть - которые хорошо. Сервера последние лет 10 идут на повышение количества ядер и повышение плотности. Но вам-то зачем об этом беспокоиться?
    5. Мне кажется, вы ещё не уверены, чем вообще будете заниматься, но железо хотите купить сейчас под какие-то непонятные "сферы разработки". Лучше купите чего-нибудь послабее - чтобы не забывать о производительности того, что вы пишете.

    А вот оперативной памяти много не бывает, эт да. Пихайте сколько влезет. Диск тоже можно побыстрее - нередко у разработчика различные процессы (сборка, установка зависимостей и т.д.) именно в диск и упираются.
    Ответ написан с предположением что речь идёт о персональной ЭВМ для разработчика.
    Ответ написан
    5 комментариев
  • Как реализовать историю API?

    Включив телепатию, предположу, что правильное решение для вашего случая - хронологическая база данных и стандарт SQL:2011 (ну или что-то аналогичное в вашей СУБД - не все вендоры стремятся реализовать этот стандарт буква в букву).

    Конкретнее можно будет поговорить, если объясните, что вы понимаете под "историей" и какая у вас СУБД.

    Ещё: 1, 2, 3, 4.
    Ответ написан
    Комментировать
  • Как можно сделать код, что-бы он был красивее?

    • на функции побейте, с вменяемыми названиями
    • литералам регулярок можно тоже дать нормальные имена, сейчас не разберёшь что собственно тестится регуляркой - приходится её читать и думать
    • непонятно зачем тут стрелочная функция вместо обычной, ради чего весь этот синтаксический шум
    • непонятно зачем это присваивание: newText = newText.substring(1);, чтобы что? Почему не завести отдельную переменную tailText или перенести это во второе выражение?
    • лично я запутался в использовании text и newText - непонятно почему в последнем условии тестируется text[0], а хвост берём у newText. Выглядит так, что это сделано специально, но не пойму почему. А если НЕ специально - то вот вам пример как вы усложнили код на ровном месте.

    Чем меньше вы пользуетесь сменой состояния, иными словами, чем больше у вас констант, а не переменных, и чем меньше присваиваний - тем код лучше читается. Я надеюсь вы не ради экономии чего-то там это делаете.
    Ответ написан
  • Как выбрать нужный ClaimIdentity из ClaimPrincipal, если их несколько штук?

    Ну так а мы откуда знаем, какие claims вам нужны? Всё зависит от вашей модели безопасности в приложении - каким образом вы авторизуете ваших пользователей (или что там у вас) на соответствующие действия.

    Например в простом случае, если у вас модель, основанная на ролях, то вам вероятно хватит клэима "роль", для которого даже helper-метод сделан: IsInRole.

    Сейчас вы задали вопрос в духе "у меня есть запись в базе данных, какие поля мне из неё нужно взять?". ClaimsPrincipal в общем-то похож на такую "запись в базе" - набор фактов о каком-то принципале (например, о пользователе), с бонусом в виде того, что мы тем или иным способом убедились в подлинности этих фактов, а сами факты более-менее стандартизированы для многих практических задач.
    Ответ написан
    1 комментарий
  • Как отправить готовую написанную игру на другой компьютер?

    Nipheris
    @Nipheris Куратор тега C++
    Всё как и должно быть. Потому что не всегда C++ приложение можно просто так запустить на другой машине.
    На тулчейне от Microsoft (очевидно, вы используете Visual Studio для разработки, т.к. недостающие библиотеки из текста ваших ошибок - это студийный C++ рантайм) при использовании динамической линковки рантайма нужно приложить некоторые дополнительные усилия, чтобы этот рантайм появился на другой машине (т.к. его там ещё может не быть - ведь рантайм для каждой мажорной версии студийного компилятора свой). Вы можете как установить рантайм централизованно, так и положить его рядом с вашим приложением. Ну или вы можете слинковать рантайм статически.

    Задача, которую вам сейчас нужно решить, называется развёртыванием (deployment). Это абсолютно нормально, что вы столкнулись с необходимостью разобраться с этим, раз вы пользуетесь C++.

    Нет лучшего источника информации по этой задаче в рамках тулчейна Visual C++, чем вот эта страница: en/ru. Разбирайтесь, и у вас точно всё получится - абсолютно в каждом C++ проекте production-уровня эта задача решается тем или иным способом. Возможно вам потребуется дополнительно разобраться, что это вообще такое за "рантайм" и почему он требуется для работы вашего приложения.
    Ответ написан
    1 комментарий
  • Как перевести переменную на русский язык?

    i18next например?
    Ответ написан
    Комментировать
  • Как анализировать crash dumpы программы для Windows?

    Ставишь Студию с ворклоадом C++ Desktop, берёшь дамп, открываешь в Студии. Если есть файлы символов - настраиваешь пути к ним, чтобы они подтянулись при просмотра дампа.

    Чтобы символа были - нужно и релизные билды (т.е. те, которые отдаются пользователям) тоже собирать с отладочной информацией (к слову, в терминологии CMake такой тип сборки называют RelWithDebInfo) и складывать её на долговременное хранение (пока поддерживается конкретная релизая версия), см. технологии Symbol Server и SSQP.

    Чтобы было вообще круто, желательно ещё настроить автоматическое подтягивание исходников. Раньше это делалось кастомными CMD-командами, вшитыми прямо в PDB, теперь есть технология Source Link, которая с недавнего времени поддерживается и C++ным тулчейном, теперь лучше использовать её.

    А, ну и конечно же дампы нужно собирать и отправлять на сервер (если конечно стоит такая задача). В этом вам поможет либо dbghelp, либо более комплексные решения вроде CrashFix и CrashRpt.

    Это если в крупном масштабе и только про Windows + Visual Studio (ну т.е. это всё в основном Microsoft-specific). Задавайте вопросы, я расскажу детальнее если что-то непонятно.
    Ответ написан
    4 комментария
  • Как работает зеркальный массив из 2х дисков в proxmox?

    Ничего не понятно. У вас boot уже на ZFS-зеркале? Где вы смотрите диски? Это страница Disks? Ну так там всегда физические диски. Что у вас на подстранице ZFS? Там есть уже созданные пулы или ещё нет ничего?
    Ответ написан
    Комментировать
  • Как задавать длину линии в сантиметрах и рисовать такую линию (C# в WPF на Canvas)?

    Nipheris
    @Nipheris Куратор тега C#
    В ваших расчётах вы не учли реальную плотность пикселей вашего монитора (physical PPI). Тот DPI, который вы вычислили, описывает некий эталонный монитор с 96 PPI, а реальный монитор может значительно отличаться. Иными словами, вы скорее получили информацию об установленном у вас масштабе экрана, и пока не соотнесли это с реальным физическим устройством, которое установлено конкретно у вас.

    Если вы сейчас подключите себе проектор, то очевидно, что длина линии будет зависеть от расстояния от проектора до доски - тут уже проще померять длину некоторой эталонной линии (допустим, 500 пикселей), и по ней определить, сколько пикселей картинки приходится на сантиметр какой-либо поверхности (экран монитора, доска проектора). Соотв-но эту длину должен померять пользователь и ввести в вашу программу. С монитором чуть проще - возможно есть способ запросить у некоторых устройств отображения физический размер или физический PPI.
    Ответ написан
  • Как поставить нужную версию Python на VS code(если Vs code эту версию не видит)?

    Самый простой вариант - взять нормальный менеджер окружений (и пакетов заодно), например Poetry, ну или pipenv, если очень хочется, развернуть где-нибудь в подпапке .venv вирт. окружение для вашего проекта, и натравить на него VS Code (вероятно, он сам даже предложит вам в списке этот вариант). Это если вы собираетесь делать что-то сложнее Hello world.

    Ну а вообще почему бы вам не ввести путь /usr/bin/python3.10? Ну мало ли почему vscode его не нашёл.
    Ответ написан
  • Почему при введении команды пишет Python?

    У вас не установлен Python. Вместо этого вы вызываете заглушку, которая с некоторых пор поставляется с Windows 10/11. Эта заглушка, когда вызывается без параметров, должна открывать вам страницу в Microsoft Store, с которой можно быстро поставить Python. Она сделана для новичков, чтобы им было проще поставить Python. Если у вас Стор удалён или как-то заблокирован (не удивлюсь, т.к. многие его почему-то боятся), то возможно поэтому у вас ничего не открывается.

    Если вы поставите Python из Стора, то команда python автоматически отвяжется от этой заглушки и привяжется к реальному интерпретатору Питона. Если поставите иным способом, возможно нужно будет выключить эту заглушку вручную, чтобы ваши шеллы не находили её в PATH раньше настоящего Питона. Это быстро делается через Manage app execution aliases на странице Apps & Features.

    Лично меня Питон из Магазина почти во всём устраивает (особенно если им правильно пользоваться и использовать виртуальные окружения), но народ любит подискутировать на эту тему, поэтому не буду навязывать вам свою точку зрения на этот счёт.
    Ответ написан
    Комментировать
  • Можно ли использовать разные версии node для разных пользователей Windows?

    Попробуйте Вольту, он ставит тулы (ноду, NPM, Yarn) в %LocalAppData%\Volta, не должно быть проблем с разными версиями у разных пользователей.
    Ответ написан
    1 комментарий
  • Как правильно определить опциональный тип?

    let object: Record<string, string | boolean | undefined> & { field?: boolean } = {
      s: 's',
      field: true,
    };

    Но вообще код попахивает. Что-то вы делаете не так.
    Ответ написан
    Комментировать