• Как сделать авторизацию через AD в веб-приложении?

    Советую прежде чем начать писать свои велосипеды, глянуть сюда:
    https://identityserver4.readthedocs.io/en/latest/
    https://github.com/Nordes/IdentityServer4.LdapExtension

    Ну и вообще, аутентификацию можно выставить и в виде ADFS (или например через Keycloak), но чтобы вам такое советовать, нужно знать ваши масштабы и бизнес-требования.
    Ответ написан
  • Стоит ли углубляться в изучение git и тп?

    Стоит ли изучить гит глубоко ?

    Да, стоит. Гит - это один из инструментов, который требует времени, чтобы с ним разобраться, и оно почти всегда окупается.
    Гит очень прост по своей архитектуре - намного проще чем может показаться со стороны. Но у гита очень сложный CLI - куча команд, многие вещи можно сделать несколькими способами, многие команды несвязаны друг с другом. Некоторые команды с более высокого уровня, некоторые - с более низкого.

    Большинство начинают изучать гит по всяким туториалам и "спискам команд для работы с гит на первое время", и это ОЧЕНЬ пагубно сказывается на качестве знаний. Из-за не очень логичного и прямолинейного командного интерфейса, у человека создаётся не очень хорошее впечатление о гит как об инструменте. Ну т.е. большинство судит о книге по её "обложке", машинально запоминая последовательности команд для работы, и в панике потом разгребают свою историю коммитов при малейшей ошибке в заученных командах.

    Однако нужно не команды запоминать, а понимать как что работает, и, самое главное, что ВЫ ХОТИТЕ от гита. Тогда вы будете подбирать команды под свои задачи и пожелания, а не наоборот.

    Я вот например довольно фигово знаю гитовский CLI, прямо скажу постоянно заглядываю в документацию. Но это не мешает мне заниматься довольно сложными задачами, связанными с ним (например, отвечать в данный момент за перенос истории из SVN), только потому, что я понимаю его базовую философию (которая, повторюсь, реально проще, чем кажется, ну если конечно вы не первый день видите компьютер).
    Ответ написан
    1 комментарий
  • Как перехватить I/O потоки стороннего .exe?

    Nipheris
    @Nipheris Куратор тега C++
    Комментировать
  • Обучение программированию, что делать если застрял?

    Ну там отвлечься от темы, в слаке кастануть хелпер, с колегами перетереть? Но ответ как подсказка вас не устраивает, вам охота самим докумекать... ???

    Можно книгу почитать, заодно в речи будет меньше "в слаке кастануть хелпер".

    Вы бы с мыслями своими наедине сначала остались на некоторое время, чтобы они успокоились, а потом вопрос задавали. Т.к. это не вопрос, а какое-то плохо написанное эссе. Отсеките лишние каналы поступления информации, чтобы вас не несло как бумажный кораблик.

    Хотите что-нибудь связанное с IT - ну почитайте что-то серьёзное, на чём, так сказать, свет стоит (это ведь не JS и PHP, не так ли?). Ну не знаю, про обработку звука или про графику что-ли. Если вы серьёзно этим занимаетесь - вам это пойдёт на пользу и уж точно никак не помешает. Ваш спринт обучения (ведь вы же наверняка изучаете это всего лишь несколько месяцев, не так ли?) нужно временно поставить на паузу.
    Ответ написан
    Комментировать
  • Что такое client_id, client_secret и где это взять?

    Начнём с того, что если у вас фронт, то вам нужно использовать Implicit Flow, а ещё лучше - PKCE для OAuth 2.0 (с картинками). Там не используется client secret по определению. Вы не можете его использовать на фронте, т.к. это публичный (т.е. недоверенный) клиент.

    Разумеется, если действительно стоит задача авторизоваться прям с фронта, а не через ваш бэкенд, как это делается в простых случаях вроде "связывания" учёток на других ресурсах..
    Ответ написан
    Комментировать
  • Как добавить директорию поиска DLL для проекта C++ в VIsual Studio?

    Nipheris
    @Nipheris Куратор тега C++
    Вам необходимо добавить директории в переменную среды PATH. Это основной способ заставить загрузчик находить их помимо расположения рядом с EXE.

    Как добавить эти директории - это другой вопрос. Конкретное решение зависит от того, в какой среде вам это нужно и какие у вас ограничения. Например, Конан умеет создавать т.н. "среду для запуска" (run environment) и создаёт специальные батники, где прописывает за вас пути к DLL-кам в пакетах. Эти батники могут "активировать" среду, прописав всё что нужно в PATH (пути к нужным DLL), в результате чего EXE-шник, использующий их, сможет их найти (точнее, системный загрузчик сможет найти), и "деактивировать" среду, чтобы вернуть PATH в исходное состояние. Это просто вам для примера решение, может быть вам понравится идея и вы сделаете такие же батники для запуска на машине разработчика или юзера.
    Ответ написан
    Комментировать
  • Правильная сборка проекта c#?

    Nipheris
    @Nipheris Куратор тега C#
    - strong name и электронная подпись - strong name давать не обязательно, а вот подписать было бы полезно;
    - нужно много чего ещё сделать, если планируете собирать краш-дампы;
    - установщик - тоже отдельная история
    Ответ написан
    6 комментариев
  • Почему функция не импортируется?

    ./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 (хотя, строго говоря делать это не обязательно - в конечном счёте компилятору нужны лишь конкретные публичные методы, т.е. компилятор действует здесь по принципу структурной типизации).
    Ответ написан
    Комментировать