• В чем разница между ядром ОС и драйвером?

    Операционная система, в том числе её ядро, предоставляет виртуальные ресурсы (файлы на файловой системе, адресное пространство, TCP/IP-подключения и т.д.), выставляет их в виде API/ABI, а для реализации функций этих ресурсов пользуется в том числе драйверами устройств, помимо логики в самом ядре. Упрощённо говоря, драйвера работают как бы между ядром ОС и аппаратными интерфейсами. Драйвера реализуют различные программные интерфейсы, которые требует от них ядро.

    Если говорить о драйвере в широком смысле, например о современных графических драйверах, то они как правило содержат много логики, исполняющейся в user space, а не только в ядре (см. например UMDF). Например, драйвера видеокарт на Windows реализуют интерфейсы OpenGL и Vulkan в user-space, а в ядре работает лишь небольшой фрагмент кода драйвера.
    Ответ написан
    1 комментарий
  • Как из MVP сделать библиотеку?

    Nipheris
    @Nipheris Куратор тега C++
    Вот подводные.
    Если коротко, то вам надо:
    • решить, как доставлять пользователю ВАШИ зависимости (в целом варианта три: на уровне исходного кода, на уровне инструкции для пользователя, или использовать пакетный менеджер);
    • решить, как пользователь будет собирать библиотеку и получать себе необходимые настройки сборки (например, многие проекты, которые сами используют CMake, автоматически генерят так называемые CMake-конфиги, чтобы потом библиотеку можно было легко подключить с помощью find_package);
    • настроить правильный API для своей библиотеки, в частности аккуратно выставить публичные хедеры, чтобы был свой так называемый "header namespace" и прочие штуки;

    Т.к. я кинул вам уже целых две книги (неплохие, хорошо пригождаются в работе), то вы понимаете, что в C++ с этим немного геморройно, в частности из-за адского зоопарка сборочных систем и целевых платформ.
    С другой стороны, наиболее популярны сейчас CMake и Meson (симейк считай билд-система по-умолчанию для C++), а также появились ультимативные решения задачи упаковки, такие как Conan (который унифицирует различную сборочную информацию и пропускает её через себя, чтобы можно было использовать в разных пакетах разные сборочные системы). Но всё-таки разобраться придётся, чудо в такой разнородной экосистеме сотворить сложно. Кстати, именно по этой причине многие плюют на грамотную упаковку, и предлагают подключать библиотеку путём импорта в проект исходников (например, через git-сабмодули).

    Вы можете задавать более конкретные вопросы, постараюсь помочь.
    Ответ написан
    Комментировать
  • TypeScript, можно ли создавать экземпляры класса по имени?

    что-то-такое

    И что мешает сюда положить конструктор? В expression-контексте имя класса это функция-конструктор

    class Thing {}
    
    class Foo extends Thing {
        public readonly f: number;
    
        public constructor() {
            super();
            this.f = 10;
        }
    }
    
    class Bar extends Thing {
        public readonly b: string;
    
        public constructor() {
            super();
            this.b = "nope";
        }
    }
    
    type ThingName = "foo" | "bar"
    
    const things = new Map<ThingName, typeof Thing>([
        ["foo", Foo],
        ["bar", Bar],
    ]);
    
    const ctor = things.get("foo")!;
    const t = new ctor();
    Ответ написан
    5 комментариев
  • Почему компилятор не может прочитать значения из appsettings?

    Nipheris
    @Nipheris Куратор тега C#
    Видимо нужно вот так:
    var asd = config.VendorConfigs.Where(x => x.IntegrationServiceId == vendorId).First();
    Ответ написан
    Комментировать
  • Как расшарить Vite конфиг в монорепо (Turborepo)?

    Уверен, что менять type на module в данном случае абсолютно не обязательно и должен быть какой-то простой осуществить задуманное.

    Не обязательно, можно просто пользоваться соответствующими расширениями файлов - cjs/mjs (соответственно cts/mts для TS-файлов).

    Instead change the require of vite.config.base.js

    У вас tsconfig есть? Судя по всему ваш конфиг компилится в CommonJS, а не в ES-модуль.

    nodejs, который, в свою очередь, ничего знать не знает про ESM синтаксис

    Да всё он знает, просто ему по умолчанию CommonJS использует, чтобы не сломать существующий мир.

    Проблема, полагаю. на уровне vite

    Очевидно, index.ts не проходит автоматическую компиляцию через TypeScript, как это делается для файлов с именем vite.config.ts.
    Ответ написан
    1 комментарий
  • Как вывести тип используя union и switch?

    Самый сердитый вариант:
    type TUnion = "foo"|"bar"|"qux"
    
    function fn(value: "foo"): boolean;
    function fn(value: "bar"): string;
    function fn(value: "qux"): number;
    function fn(value: TUnion): string | boolean | number {
        switch(value){
            case "bar": return '';
            case "foo": return true;
            case "qux": return 1;
            default: throw Error('invalid value')
        }
    }
    
    let f = fn("foo"); // f: boolean
    let b = fn("bar"); // b: string
    let q = fn("qux"); // q: number
    Ответ написан
    3 комментария
  • Где можно безопасно хранить токены в десктопе?

    Мы в своём Electron-приложении для хранения паролей используем keytar. Он хранит пароли в наиболее подходящем для каждой ОС месте:
    A native Node module to get, add, replace, and delete passwords in system's keychain. On macOS the passwords are managed by the Keychain, on Linux they are managed by the Secret Service API/libsecret, and on Windows they are managed by Credential Vault.

    Пользователи счастливы, мы особых проблем не имеем с этим.

    Т.к. вы пишете на Расте, я бы предложил вам keytar-rs, но этот крейт выглядит не очень популярным (пока), поэтому используйте осторожно.
    Ответ написан
    2 комментария
  • JSON в базе данных это норма для реляционных баз данных?

    Насколько плохой практикой является использование JSON в реляционных базах данных (это строго запрещено, иногда разрешается или это хороший тон)?

    Настолько же, насколько и хранение картинок, а также текстов. Ну двухгиговое JSON-полотно наверное не стоит хранить, ну в остальном требования такие же, как ко всему остальному что хранится в реляционной БД:

    Значение атрибута должно быть атомарным с точки зрения запросов к БД. И то это касается таких СУБД, которые JSON не поддерживают. Если СУБД поддерживает JSON - тогда только документация к СУБД ответит тебе, что там можно, а что - нет. Если значение неатомарно с точки зрения запросов - тогда нужно будет постоянно его собирать-разбирать, да и индексы нужные не факт что получится построить.

    Но в реляционных всё странно — сам принцип реляционных баз данных говорит, что для одного поля строго одно значение

    А тут я задам вам каверзный вопрос - строка это одно значение или нет? Почему это мы решили, что можно сохранить в атрибут строку? Я требую посимвольного разбития! Вам не приходило в голову, что сначала нужно крепко подумать над понятием "одно значение"? Что это вообще значит? А если хранится число с плавающей точкой - это одно значение или два?
    Ответ написан
    Комментировать
  • Как импортировать классы и его методы из DLL?

    Nipheris
    @Nipheris Куратор тега C++
    Никаких классов и методов непосредственно в DLL нет, для того чтобы такая информация была в распоряжении у компилятора, с С++ библиотеками поставляется заголовочные файлы (это если очень упрощённо рассуждать).

    Правда у тебя вроде как всё уже должно быть подключено, раз твой код компилируется. Что ты вообще хочешь сделать? GetRuntime - это метод у объекта, реализующего интерфейс ICLRMetaHost, нафига ты его пытаешься получить через GetProcAddress? Его нужно вызывать через pMetaHost, в который тебе функция CLRCreateInstance любезно записала указатель на созданный объект.
    Ответ написан
    1 комментарий
  • Как ответить на POST запрос?

    Nipheris
    @Nipheris Куратор тега C#
    вероятнее всего я даже не путаю, а просто неверно понимаю принцип работы. Я полагаю, что PostAsync действует как для запроса, так и для ответа, верно? Если нет, то что служит для отправки ответа, а самое главное, как в этот ответ положить свою информацию?

    У объектов класса HttpListenerContext есть не только свойство Request, и но Response. Оно возвращает объект HttpListenerResponse, у которого, в свою очередь, есть свойство OutputStream и много чего ещё интересного (ContentType, Headers и так далее). Вот с этим и работайте.
    Ответ написан
    Комментировать
  • Какой формат (с изменениями) эффективнее хранится в Git?

    Хочется, чтобы при небольших изменениях контента в Git-репозитории тоже были небольшие (по размеру) изменения.

    Атомарная единица версионирования в Git - это файл. Изменения в разных файлах никогда не приводят к конфликту на уровне Git (это может быть конфликт на уровне структуры самого приложения, но Гита это вообще никак не касается). Изменения в одном и том же файле в разных ветках приводят к конфликту в момент слияния, который Гит может иногда разрулить сам, например если файл текстовый и изменения далеко друг от друга, а может и не разрулить.

    Если вы хотите какие-то элементы данных рассматривать независимо (например страницы Вики), кладите их в разные файлы, желательно текстовые.

    Посмотрите как Wiki реализована на Гитхабе - это ж тоже просто гитовая репа, где каждая статья - отдельный файл.
    Ответ написан
  • Как подключить нового пользователя к одному сокету?

    Хорошо, допустим, я подключил один пк к порту 3000, а что если пк 2, 4, 100, 500 000?

    А кто вам вообще сказал, что для нового подключения нужен новый порт?
    Поучите матчасть, ну хотя бы тут.
    Вот выдержка - ответ на ваш вопрос:
    Connections are uniquely identified by the OS by the following 5-tuple: (local-IP, local-port, remote-IP, remote-port, protocol). If any element in the tuple is different, then this is a completely independent connection.

    When a client connects to a server, it picks a random, unused high-order source port. This way, a single client can have up to ~64k connections to the server for the same destination port.


    Переводя на русский, за счёт того что КЛИЕНТ при подключении выбирает рандомный порт-источник, каждый клиент может поднять около 64к соединений (по количеству свободных портов на КЛИЕНТЕ) на ОДНУ И ТУ ЖЕ пару ip:порт.

    Проблемы, которую вы выдумали, не существует.
    Ответ написан
  • Как осуществить ленивую загрузку js файлов?

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

    Ответ на ваше уточнение.
    а соединять куски программ или целеком в зависимости от ТЗ уже кем то написаные?

    На сегодняшний день это и есть основная работа большинства разработчиков. Они берут "куски программ", т.е. сложные, отлично написанные библиотеки, и соединяют их в зависимости от ТЗ. Если задача типовая - под неё уже наверняка кто-то написал или пишет библиотеку (вот такие программисты ленивые и изобретательные), если задача НЕтиповая, т.е. её решение нужно и ценно только ВАМ - ну тогда логично, что за вас её никто ещё не успел написать. Огромное количество задач в разработке ПО уже решено с помощью библиотек. По сути в каждом новом проекте вы пишете лишь небольшой кусочек кода, который решает именно вашу задачу. ОСОБЕННО это касается всяких стартапов и PoC, которые по сути и есть склеивание библиотек плюс небольшой кусочек бизнес-логики для демонстрации идеи.

    я думаю должно быть достаточно много хорошего кода... в открытом доступе.

    Ну да, его много. Это всё - библиотеки.

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

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

    Существует много готовых кодов, частей программ или целиком

    Вам нужно понять, что фрагмент готового кода, особенно если он достаточно крупный (не 10 строк, а, допустим, 10 тысяч строк) ценен тогда, когда у него есть хорошо описанный интерфейс (API) и хорошо поставленные требования к нему, который этот код выполняет. Это всё и есть часть определения понятия "библиотека".
    А если у вас в распоряжении трёхстраничный gist на гитхабе, то фиг вы его куда прикрутите, пока не разберётесь, что там написано. А с учётом того, что идеально этот кусок кода всё равно вам не подойдёт, то ещё и выяснится, что проще с нуля написать.
    Ответ написан
    1 комментарий
  • Почему npm i устанавливает ненужные пакеты?

    Вы про транзитивные зависимости что-нибудь слышали?
    А конкретно у вас транзитивно устанавливается node-sass, который написан на C++ , и мало ли что там ему нужно для сборки.

    При установке через npm install нативные пакеты автоматически компилируются. Многие для этого используют node-gyp, хотя в этой роли можно использовать в общем-то любую сборочную систему.

    Вам бы сначала выяснить с помощью npm list --depth=10, кто к вам притащил node-sass, т.к. он вроде задиприкейчен уже.
    Ответ написан
    2 комментария
  • Почему при выводе массива в консоль пишется что-то странное?

    Nipheris
    @Nipheris Куратор тега C++
    Array-to-pointer decay.
    There is an implicit conversion from lvalues and rvalues of array type to rvalues of pointer type: it constructs a pointer to the first element of an array. This conversion is used whenever arrays appear in context where arrays are not expected, but pointers are:
    ...

    Ваш массив неявно сконвертился к указателю на int, т.к. оператор << класса std::ostream массивы выводить не умеет, а вот указатели - вполне себе.
    Ответ написан
    Комментировать
  • Как исправить проблему с неоднозначностью?

    Nipheris
    @Nipheris Куратор тега C++
    Virtual inheritance
    struct IInitSystem : virtual IEcsSystem {
      virtual void Init(void) { std::cout << "Init" << std::endl; }
    };
    
    struct IRunSystem : virtual IEcsSystem {
      virtual void Run(void) { std::cout << "Run" << std::endl; }
    };
    Ответ написан
    Комментировать
  • Зачем мне универсальный класс, если в методе я могу указать родительский класс?

    Nipheris
    @Nipheris Куратор тега C#
    Если под "универсальным классом" вы имеете в виду класс-дженерик, то почитайте про параметрический полиморфизм и полиморфизм через подтипы. Параметрический полиморфизм в контексте C# это про дженерики, полиморфизм через подтипы - это о вашем "указать родительский класс".

    Это сильно разные механизмы, и чтобы понять разницу, попробуйте реализовать какой-нибудь List или Dictionary без использования дженериков, как предлагает вам Василий Банников , и как было в .NET 1.1 (о боги, это было как будто позавчера), до появления обобщённых типов. И увидите, как теряется типобезопасность и сколько нужно кастить туда-сюда.
    Ответ написан
    Комментировать