• Почему функция не импортируется?

    ./modules/export.js
    require("./modules/scene")

    А синтаксис нужен для ES модулей:
    import createScene from "./modules/scene";
    Ответ написан
  • Как собрать библиотеку .lib [muParser]?

    Nipheris
    @Nipheris Куратор тега C++
    Почему бы не посмотреть CI скрипты, например для AppVeyor?
    Версия с мастер-бранча :
    version: 1.0.{build}
    os: Visual Studio 2015
    clone_folder: C:\projects\muParser
    test: off
    branches:
      only:
        - master
    environment:
      matrix:
        - CMAKE_PLATFORM: Visual Studio 14 2015
    build_script:
      - cmake -LAH -G "%CMAKE_PLATFORM%" -DCMAKE_INSTALL_PREFIX="%CD:\=/%/install" .
      - cmake --build . --config Release --target install
      - ctest -C Release --output-on-failure

    Мне кажется вызовы cmake в конце (кроме ctest) будут вам полезны. Да, вместо CMAKE_PLATFORM можно указать другой генератор, например MinGW Makefiles.
    Ответ написан
    Комментировать
  • Как конкретизировать сложный тип?

    Вы какую-то странную задачу поставили. Если вам нужен более узкий тип - объявите его отдельно (и может быть даже объявите Some через этот более узкий тип) и пользуйтесь им, или даже вообще не указывайте тип в вашем примере.

    UPD

    объявленный объект должен всё ещё оставаться для ts вариантом типа Some, чтобы его можно было спокойно передавать в методы и функции ожидающие Some на вход.

    Нижеследующий код более чем корректный:
    interface Some {
      value: string | string[];
    }
    
    const foo = {
      value: ['a', 'b'] // здесь всегда будет массив
    };
    
    foo.value.map(() => { });
    
    function f(a: Some) {
        return a;
    }
    
    f(foo);


    при объявлении объекта он должен быть проверен на соответствие типу Some(чтоб ide мне сразу подсветила если я где-то ошибся и предложила автокомплит).

    Значит всё-таки вам нужен не тип Some в месте объявления объекта, а более узкий тип, где value - всегда массив. Например:
    interface Some {
      value: string | string[];
    }
    
    // Тут вам стоит придумать более подходящее по смыслу название
    interface WithArrayValue {
        value: string[];
    }
    
    const foo: Some & WithArrayValue = {
        value: ['a', 'b'] // здесь всегда будет массив
    };
    
    foo.value.map(() => { });
    
    function f(a: Some) {
        return a;
    }
    
    f(foo);
    Ответ написан
  • Что выбрать новичку: DirectX или OpenGL?

    OpenGL однозначно, вам и его хватит с головой.

    Изучая DirectX вы иссохнете от того, сколько сопутствующий вещей придётся узнать хотя бы поверхностно - COM например. Возможно кто-то скажет что это не обязательно - да, пока вам не понадобится более-менее серьёзно подебажиться.

    OpenGL выглядит сейчас как самое простое (проще Vulkan, т.к. более высокоуровневый), но при этом полноценное (т.е. достаточно близкое к железу) графическое API без всяких Windows-specific наворотов. DirectX это по сути для профессионалов которые работают в индустрии, получают за это хорошие деньги и для них не проблема разобраться с какой-то сопутствующей технологией.
    Ответ написан
    Комментировать
  • Как обратиться к элементу созданному программно в qt на с++?

    Создайте поле в том же классе, в котором храните поле ui, и сохраните туда указатель на созданный элемент.
    Ответ написан
    Комментировать
  • C# поиск русских слов в коде?

    Nipheris
    @Nipheris Куратор тега C#
    Попробуйте вот это для начала
    (@"(?:[^"]|"")*"|"(?:\\.|[^\\"])*")
    Поиск по регулярке поддерживается в Студии.

    Спасибо говорить сюда: https://stackoverflow.com/a/4953878/3927447 .
    Ответ написан
    Комментировать
  • Как найти библиотеки в c#?

    Nipheris
    @Nipheris Куратор тега C#
    А вы попробуйте собрать проект после первого открытия - и nuget restore отработает и выкачает вам библиотеки (если конечно в проекте с которым вы работаете всё корректно настроено).
    Ответ написан
  • Как WEB-страница может получить текущее имя пользователя Windows?

    существует ли способ идентификации пользователя на WEB-ресурсе по текущему логину Windows?

    Существует. Протокол называется Kerberos в сочетании с SPNEGO. Существует RFC по его использованию вместе с HTTP, http-схема аутентификации называется Negotiate. Читайте подробно тут: RFC4559. Если очень коротко, то веб-сервер должен прислать заголовок www-authenticate со значением negotiate если готов поддерживать такую схему аутентификации. Браузер, в свою очередь, отвечает токеном.

    В большинстве браузеров можно настроить поддержку этой схемы аутентификации. Со стороны сервера тоже разумеется нужна поддержка. Возможно вы захотите прибегнуть к помощи упомянутых Иван Шумов identity-серверов. Например Keycloak точно поддерживает Kerberos. На нём же можно и LDAP подцепить в качестве базы данных пользователей. Обычно так поступают, т.к. протоколы federated identity вроде OpenID Connect обычно гораздо проще реализовать со стороны веб-приложения, нежели все тонкости аутентификации вроде вашего случая или, например, двухфакторной авторизации через Google Authenticator.

    Надеюсь это отвечает на ваш ИЗНАЧАЛЬНЫЙ вопрос о ТЕКУЩЕМ логине в домене. Т.к. сам по себе LDAP подключенный к сервису это хорошо конечно, но это всё-таки не SSO.

    Вот доки по настройке этого в Keycloak: https://github.com/keycloak/keycloak-documentation...
    Ответ написан
    Комментировать
  • Как включить в статическую библиотеку все зависимости из других стат.библиотек в CMake проекте?

    Nipheris
    @Nipheris Куратор тега C++
    Господи, что ж тут за костыли насоветовали))

    Этого хотелось бы избежать, то есть нужно, чтобы все зависимости от boost были уже включены в mylib.

    Как верно отметил jcmvbkbc , обычно одна стат. библиотека не тащит в себе другую. Более того, такая возможность - включить одну стат. библиотеку в состав другой - мало где существует, я знаю про поддержку такой фичи только в Visual Studio. Ну т.е. это нечто из ряда вон выходящее, а не привычный workflow. По-нормальному вы должны указывать при линковке стат. библиотеки все её зависимости. Следовательно, вопрос в том, как эту информацию о транзитивных зависимостях статической библиотеки передавать и использовать при линковке с ней.

    pkg-config в общем вполне нормальное решение, но это уже не совсем "в рамках CMake".
    В рамках CMake всё делается с помощью target_link_libraries и экспорта симейк-конфига в паре с файлом симейковских таргетов. Например, вот такой незамысловатый скрипт:
    cmake_minimum_required(VERSION 3.5)
    find_package(Boost COMPONENTS system filesystem thread REQUIRED)
    add_library (mylib mysource.cpp)
    target_link_libraries(mylib
    	PRIVATE
    		Boost::system
    		Boost::filesystem
    		Boost::thread
    )
    
    install(TARGETS mylib EXPORT mylib_export)
    export(EXPORT mylib_export FILE cmake/mylib-targets.cmake)

    сгенерирует в поддиректории cmake в директории сборки файл mylib-targets.cmake, где помимо прочего будет следующая любопытная информация:
    # Create imported target mylib
    add_library(mylib STATIC IMPORTED)
    
    set_target_properties(mylib PROPERTIES
      INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:Boost::system>;\$<LINK_ONLY:Boost::filesystem>;\$<LINK_ONLY:Boost::thread>"
    )


    Таким образом, Симейк сообщает потребителям библиотеки mylib, что при линковке с ней нужно ещё добавить бустовские таргеты. Причём благодаря LINK_ONLY это коснётся только процесса линковки, в целом зависимость от библиотек буста будет приватной, как и указано в скрипте. Если поменять PRIVATE на PUBLIC и сделать тем самым зависимость от буста публичной, то LINK_ONLY уйдёт и будет обычное перечисление интерфейсных зависимостей таргета:
    # Create imported target mylib
    add_library(mylib STATIC IMPORTED)
    
    set_target_properties(mylib PROPERTIES
      INTERFACE_LINK_LIBRARIES "Boost::system;Boost::filesystem;Boost::thread"
    )


    Вам остаётся лишь добавить генерацию и установку тривиального конфига (где будет только find_package для буста и инклуд сгенерированного mylib-targets.cmake) и в потребителях делать find_package(mylib). Всё это кроссплатформенно и является стандартной практикой, не делайте лишних извращений со слиянием статических библиотек.
    Ответ написан
    Комментировать
  • Структура и зависимости кросс-платформерного проекта CMake?

    Nipheris
    @Nipheris Куратор тега C++

    Один из моих вариантов решения проблемы:
    Написать скрипт (скорее всего на python, ибо нужна возможность компилировать как из под Windows, так и из под Linux), который будет собирать все зависимости под конкретную платформу, раскидывать по папочкам и генерировать скрипт с путями ко всем нужным библиотекам.

    Поразительно, но вы в точности описали пакетный менеджер Conan (о котором упоминали).

    Написать скрипт (скорее всего на python, ибо нужна возможность компилировать как из под Windows, так и из под Linux)

    Конан написан на Питоне и распространяется как pip-пакет.

    который будет собирать все зависимости под конкретную платформу, раскидывать по папочкам

    https://docs.conan.io/en/latest/using_packages/con...
    Together, these folders are the local cache. This is where package recipes and binary packages are stored and cached, so they don’t have to be retrieved again.


    и генерировать скрипт с путями ко всем нужным библиотекам

    https://docs.conan.io/en/latest/reference/generato...
    Generators are specific components that provide the information of dependencies calculated by Conan in a suitable format for a build system. They normally provide Conan users with a conanbuildinfo.XXX file that can be included or injected to the specific build system.
    Ответ написан
    Комментировать
  • Как объединить общие зависимости для нескольких cpp файлов?

    Nipheris
    @Nipheris Куратор тега C++
    К ответу ittakir добавлю, что исключительно в целях снижения времени компиляции, пользуются такой штукой как precompiled headers, куда помещаются все те хедеры, которые РЕДКО меняются, но ЧАСТО используются (в большинстве cpp-шников). Например, хедеры стандартной библиотеки. В таких случаях common_types.h, о котором упомянул ittakir обычно и оформляется как прекомпилированный хедер.
    Ответ написан
  • Какой смысл использовать IEnumerable?

    Nipheris
    @Nipheris Куратор тега C#
    https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    The foreach statement executes a statement or a block of statements for each element in an instance of the type that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable interface. The foreach statement is not limited to those types and can be applied to an instance of any type that satisfies the following conditions:

    • has the public parameterless GetEnumerator method whose return type is either class, struct, or interface type,
    • the return type of the GetEnumerator method has the public Current property and the public parameterless MoveNext method whose return type is Boolean.


    Так что да, НАПРЯМУЮ вы очень редко будете пользоваться IEnumerable, НО если вы хотите чтобы ваш тип данных можно было использовать как коллекцию для foreach, удобно реализовать интерфейс IEnumerable чтобы убедиться что ваш тип реализует то, что будет использовано циклом foreach (хотя, строго говоря делать это не обязательно - в конечном счёте компилятору нужны лишь конкретные публичные методы, т.е. компилятор действует здесь по принципу структурной типизации).
    Ответ написан
    Комментировать
  • Как заставить tsc использовать типы проверяемых пакетов вместо типов места его вызова?

    В самом Vault библиотека dayjs и тип Dayjs нигде не используются!

    А что вы понимаете под использованием? Очевидно, для исполнения вам нужен dayjs, и он должен ставиться как рантайм-зависимость Utils. Чтобы избавиться от такой зависимости, вам тогда нужно положить dayjs внутрь Utils тем или иным способом, например собрать Utils тем же роллапом в бандл. Я правда не вижу в этом необходимости - бандлятся обычно только конечные приложения, а то что есть транзитивные зависимости у библиотеки -

    Другое дело если вы видите проблему в том что требуется информация о ТИПА Dayjs. Тогда уточните, как во что вы компилируете Utils и не протекат ли Dayjs через публичный интерфейс Utils.
    Ответ написан
    2 комментария
  • Как обновить офсеты?

    Nipheris
    @Nipheris Куратор тега C++
    Ну предположу что надо разреверсить свежий клиент вовки и найти адреса нужных переменных.
    Ответ написан
    1 комментарий
  • Работать с файлом word из программы?

    Nipheris
    @Nipheris Куратор тега C++
    Ну если прям из C++ кода, попробуйте библиотечки:
    - DuckX
    - DocxFactory
    Ответ написан
    Комментировать
  • Не могу понять что значит такая запись?

    Конкретно не понимаю что значит знак &

    Intersection Types
    Почему там typeof

    Потому что Model это объект, от которого мы получаем тип в контексте объявления типа, а typeof Model здесь - это type query expression. Если непонятно почему тут можно использовать typeof, вот великолепное объяснение, а вот ссылка на спецификацию языка.
    И что за екзампляр создается тут new (values?: object, options?: BuildOptions)

    https://stackoverflow.com/a/39623422/3927447 - это значит что если у вас есть объект типа MyModelStatic, вы можете сделать так: new MyModelStatic(values, options), это construct signature. Обратите внимание как именно используется в моём примере объект MyModelStatic.
    Ответ написан
    1 комментарий
  • Сборка проекта из рабочей копии и из архива - best practices?

    Передавать эту информацию через переменную окружения? И подставлять вручную/иными способами при сборке вне СКВ?

    Считаю, что номер ревизии (т.е. хэш коммита/имя тэга и пр.) должны извлекаться не сборочным скриптом, а передаваться через окружение. Большинство CI-серверов имеют хорошо документированные переменные окружения, которые задаются перед началом сборки. Эти же переменные окружения можно задать и вручную.
    Ответ написан
    Комментировать
  • SOLID.LSP + ООП.Полиморфизм = противоречиe?

    Появилось требование - изменить формат некоторых отчетов на CSV.

    А кто сказал, что может появиться такое требование? Вернее, что вы сможете его удовлетворить без изменения контракта?

    Ведь у вас какой контракт? Что метод MakeReport возвращает html-отчёт? Так как же вы вообще сможете реализовать возврат CSV, не поменяв контракт?

    А вот если вы таки поменяете контракт, например скажете что "MakeReport возвращает поток (текстовый или двоичный) конечного размера", то тогда генерация и возврат CSV вполне себе лягут в такой контракт. Конечно, такой контракт уже будет куда более общим - даже тестировать в нём будет особого нечего (кроме того что отчёт вообще сгенерировался и имеет ненулевую длину).

    С другой стороны, кто вам мешает написать тесты на конкретные реализации этого контракта? Ведь юнит-тестирование на то и модульное, что может знать больше конкретики об отдельном взятом модуле.

    Всё просто, не так ли?

    Принцип подстановки говорит - я поставлю рамки, ограничения (т.е. контракт), и все экземпляры подклассов должны ему удовлетворять. Полиморфизм говорит - отлично, значит у нас возможность определить СПЕЦИФИЧНОЕ поведение, которое может отличаться от других специфичных поведений, но при этом все они будут делать что-то вполне ожидаемое и ЗАРАНЕЕ ОГОВОРЕННОЕ.

    Сам факт того, что вы составляете СОГЛАШЕНИЯ, выполнения которых ожидают клиенты класса, даёт вам право ВО ВСЕХ ОСТАЛЬНЫХ аспектах вести себя КАК ВАМ ВЗДУМАЕТСЯ (ну я немного преувеличил, но суть такова) в каждом из подклассов.
    Ответ написан
    Комментировать