• Как изменить приоритет действующего процесса из списка диспетчера задач?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Любой подобный вопрос нужно решать, начиная с того, как это нативный API делается:
    https://docs.microsoft.com/en-us/windows/win32/api...
    А вот как вызывать подобные нативные функции:
    https://docs.microsoft.com/en-us/dotnet/standard/n...
    Таким образом, можно сделать вот так:
    [DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    public static extern bool SetPriorityClass(IntPtr handle, PriorityClass priorityClass);
    public enum PriorityClass : uint
    {
           ABOVE_NORMAL_PRIORITY_CLASS = 0x8000,
           BELOW_NORMAL_PRIORITY_CLASS = 0x4000,
           HIGH_PRIORITY_CLASS = 0x80,
           IDLE_PRIORITY_CLASS = 0x40,
           NORMAL_PRIORITY_CLASS = 0x20,
           PROCESS_MODE_BACKGROUND_BEGIN = 0x100000,// 'Windows Vista/2008 and higher
           PROCESS_MODE_BACKGROUND_END = 0x200000,//   'Windows Vista/2008 and higher
           REALTIME_PRIORITY_CLASS = 0x100
    }
    
    
    public static bool SetProcessPriority(Process process, PriorityClass priorityClass) =>
      SetPriorityClass(process.Handle, priorityClass);

    Но так делать не нужно, тк есть свойство Process.PriorityClass
    Через него можно так:
    public static void SetProcessPriority(Process process, ProcessPriorityClass priorityClass) =>
      process.PriorityClass = priorityClass;
    Ответ написан
    Комментировать
  • Как привести набор Task с разными возвращаемыми результатами к набору Task с результатами в виде общего интерфейса?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Можно закостылить примерно так:
    serversStatisticRequests.Add(service.GetBasicStatus(server).ContinueWith(x => (IResponse) x.Result));
    serversStatisticRequests.Add(service.GetFullStatus(server).ContinueWith(x => (IResponse) x.Result));
    Ответ написан
    3 комментария
  • CMake. Как подключить библиотеку из файла?

    @klirichek
    Так у вас либа из двух частей - собственно, архив .a, и хедер (или хедеры).

    install(TARGETS approx_lib LIBRARY DESTINATION lib) - ставит только собранный target (т.е. непосредственно файл статик либы), но не хедер!

    Если не производить установку - можно либу подключить как add_subdirectory с путём к исходникам. Тогда она будет частью основного проекта, будет собираться вместе с ним и всё нужное найдётся (покуда target_include_directories прописан и знает, где искать).

    Если устанавливать - то, очевидно, надо установить и хедеры тоже. И ещё как-то сообщить проекту, где что лежит.

    Вот кусочек из нашей кастомной сборки icu (пусть имя пакета будет foo, а не icu. А namespace - baz. Так интереснее!)
    add_library(icu .....)
    target_include_directories(icu PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/source/common>$<INSTALL_INTERFACE:include/icu>)
    install ( TARGETS icu EXPORT icuExport RUNTIME DESTINATION lib LIBRARY DESTINATION lib  )
    install ( DIRECTORY source/common/unicode DESTINATION include/icu FILES_MATCHING PATTERN "*.h")
    
    # install exports
    set ( CMAKE_CMAKE_DIR "lib/cmake/foo" )
    install ( EXPORT icuExport FILE foo-targets.cmake DESTINATION "${CMAKE_CMAKE_DIR}" NAMESPACE baz:: )
    
    file ( WRITE foo-config.cmake 
    "if(NOT TARGET baz::icu)
        include(\"\${CMAKE_CURRENT_LIST_DIR}/foo-targets.cmake\")
    endif()")
    install ( FILES foo-config.cmake DESTINATION "${CMAKE_CMAKE_DIR}" )


    Здесь несколько моментов.
    Во-первых, обратите внимание на target_include_directories. Там два пути. Один будет работать при сборке, второй - при инсталляции. Т.е. когда собирается либа, либо подключается через add_subdirectory - найдётся нужное по первому пути. После установки - по второму, и этот второй - относительный.

    Во-вторых, при установке задано имя export. Это что-то вроде именованного набора разных свойств, которые cmake накапливает из добавленных с этим именем целей и потом может оформить в файл экспорта. В данном случае туда попадает явно прописанная библиотека, и неявно - include-path от неё, последний потому что он изначально включён как public.

    В-третьих, собственно, ставим помимо таргета и сами хедеры!

    И в-последних, ставим то, что "накопил" экспорт. Первый файл foo-targets.cmake. Второй - который будет работать при поиске пакета (я его осознанно упростил, на самом деле он длиннее) foo-config.cmake.

    Всё это куда-то ставится. Например, в /root/bar (для определённости) - как `cmake --install . --prefix /root/bar`. У вас оно прямо в систему, но тут спецом левый путь, чтобы глазами было видно, как он в конфиге пробрасывается и используется.

    Потом в самом проекте - не надо никаких find_library, всё же известно, где!
    LIST (APPEND CMAKE_PREFIX_PATH "/root/bar")
    find_package(foo)
    
    add_executable(my_prog main.cpp)
    target_link_libraries(my_prog PRIVATE baz::icu)


    Собственно, всё.

    find_package сперва пытается найти модуль FindFoo.cmake. Такого нет. Потом пытается найти конфиг FooConfig.cmake или foo-config.cmake. Он разыскивается по указанному префиксу (там весьма развесистый алгоритм, который умеет заглядывать в разные папки, в доках всё есть) и включается. Он, в свою очередь, включает. foo-targets.cmake, сгенерированный из экспорта. И вот там и находится вся магия.

    ... # это сгенерированный код!
    # Create imported target baz::icu
    add_library(baz::icu STATIC IMPORTED)
    
    set_target_properties(baz::icu PROPERTIES
      INTERFACE_COMPILE_DEFINITIONS "U_STATIC_IMPLEMENTATION;U_CHARSET_IS_UTF8=1;U_NO_DEFAULT_INCLUDE_UTF_HEADERS=1"
      INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/icu"
    )
    ...
    # Load information for each installed configuration.
    get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
    file(GLOB CONFIG_FILES "${_DIR}/foo-targets-*.cmake")
    foreach(f ${CONFIG_FILES})
      include(${f})
    endforeach()
    ...
    ... а это файл foo-targets-relwithdebinfo.cmake
    # Import target "baz::icu" for configuration "RelWithDebInfo"
    set_property(TARGET baz::icu APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
    set_target_properties(baz::icu PROPERTIES
      IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "CXX"
      IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/libicu.a"
      )


    а вообще в доках cmake (не надо никаких левых вики/SO!) этой теме посвящён большой и подробный раздел.
    Ответ написан
    Комментировать
  • Как правильно построить структуру проекта используя cmake?

    @klirichek
    либа - это обычно файл (.a, .lib, .so, .dll, .dylib - зависит от статики/динамики) + хедеры, которые должно включить приложение, использующее либу.

    При разработке одновременно либы и приложения add_subdirectory достаточно очевидный вариант, покуда объединяет их оба в один проект. Желательно позаботиться о модульности (раз уж вы поделили проект на две части - значит, это зачем-то было нужно!).

    В папке с либой должен быть свой собственный CMakeLists.txt, собирающий либу; он должен быть самодостаточным для сборки. Т.е. если ей нужны какие-то зависимости - чтобы они искались именно для проекта либы, а не "где-то выше". Т.е какие-то исходники, какие-то find(), потом add_library(name). И нужно определить, что из либы должно увидеть использующее её приложение. Это делается через задание свойств target_XXX(). Например, чтобы показать консумеру путь к нужным хедерам - target_include_directories, чтобы добавить ключи компиляции - target_compile_definitions(). В современном cmake это можно настроить как в настоящем ООП - свойства, нужные для сборки самой либы (например, зависимости, с которыми она статически линкуется. Ей нужны, но как слинковались - консумеру они уже невидимы и ненужны); свойства, нужные консумеру, но не нужные для сборки либы (например, хедеры, специфичные для включения либы, но не нужные для её сборки), и общие свойства, нужные как для либы, так и для её пользователей. Смысл в том, что все эти "настройки для внешних пользователей" не кладутся в некие глобальные переменные cmake (так делали многие годы, но это далеко не best practices), а определяются как свойства самой библиотеки. И вишенкой на торте, в конце проекта либы можно дописать для неё экспорт и алиас (зачем это нужно - чуть ниже).

    export(TARGETS mylib FILE "mylib-targets.cmake" NAMESPACE mylib::)
    add_library(mylib::mylib ALIAS mylib)

    Приложение, использующее либу, должно, во-первых, найти её. И во-вторых, слинковать. Про add_subdirectory - понятно. Добавляете папку и либа доступна. Другой вариант - если либа уже устоялась и НЕ хочется каждый раз её пересобирать. Тогда вместо add_subdirectory включаете (через include) файлик 'mylib-targets.cmake', который будет в сборочной папке либы. На машине разработчика это вполне рабочий вариант! Ну и крайний вариант - это делать полноценный экспорт, тогда пользователи смогут находить либу через штатный find_package().
    После нахождения либа добавляется единственной строчкой:

    target_link_libraries(myprog PUBLIC mylib::mylib)

    Благодаря прописанным свойствам либы эта строчка автоматически добавляет всё необходимое - пути к хедерам, либу для линковки, дополнительные параметры компиляции и т.д. (раньше во время глобальных переменных подразумевалось, что после нахождения либы с помощью find_package у вас появлялось несколько переменных, вида mylib_FOUND - что оно нашлось, mylib_INCLUDE_DIRECTORIES - путь к хедерам, mylib_LIBRARIES - что линковать. А если либа появлялась через add_subdirectory, там вообще фантазия на тему "как сообщить о себе" ничем не ограничивалась, что, в свою очередь, приводило к лапшевидному коду, который использовал библиотеку. Со свойствами целей это всё уже не нужно!). Ну а имя mylib::mylib - оно работает как для импортированной либы (через включение mylib-targets.cmake), так и для add_subdirectory(), именно для этого оно было добавлено там как алиас.

    Итого, в основном проекте у вас будет что-то вроде

    add_subdirectory(mylib)
    target_link_libraries(myprog PUBLIC mylib::mylib)

    или

    include (mylib/build/mylib-targets.cmake)
    target_link_libraries(myprog PUBLIC mylib::mylib)

    или

    find_package(mylib REQUIRED)
    target_link_libraries(myprog PUBLIC mylib::mylib)

    Первый вариант - для одновременной разработки. В IDE будут исходники и основного проекта, и либы сразу. Тёмная сторона - когда сделаете clean all, либа тоже сотрётся :) (что очевидно)
    Второй - для приложения. Либа будет всегда под рукой, но уже как бинарь. Линковаться можно сколько угодно, при очистке ничего не сотрётся, путь привязан к папке (двинуть в другую папку нельзя, потому что в файле прописаны абсолютные пути).
    Третий - для широкой разработки. Когда либа уже отдельно, и ставится отдельно, и кто-то с ней что-то разрабатывает. Это самый цивилизованный вариант, папку можно двигать куда угодно, главное сообщить cmake, где её искать. Но настраивать это чуть сложнее и не всегда оправдано.

    И да - если ещё поизучать cmake, то либа - это не обязательно библиотека для линковки "в общепринятом смысле". Но это просто набор свойств (include-папки, опции компилятора, опции линковки и т.д.), инкапсулированные в нечто под названием "библиотека". Например, можно определить либу для задания варнингов компилятора -wall, где не будет ни исходников, ни библиотек, а только один параметр компилятора. И это вполне нормальный и рабочий способ! Помимо статических либ для чуть-чуть ускорения сборки можно использовать либу типа object. Это просто набор скомпилированных объектников, которые не пакуются в отдельный файл .a или .lib. а прямо так передаются в зависимые проекты. На одну операцию упаковки/распаковки меньше ).
    Ответ написан
    2 комментария
  • На сколько плохо иметь статический список внутри класса, в добавляются новые экземпляры этого класса через конструктор?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    А можно поинтересоваться смыслом данной конструкции? Это не рекурсивность, это вполне можно назвать циклической ссылкой, хотя и неявной. Сборщик мусора вполне собирает такие вещи.
    Ответ написан
    2 комментария
  • Как вытащить все значения некоторого поля из json на C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Десериализуешь json, потом делаешь data.Select(x=>x.Name).ToArray()
    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
        public class Hotel    {
            public int id { get; set; } 
            public int countryId { get; set; } 
            public string country { get; set; } 
            public string countryUrl { get; set; } 
            public int regionId { get; set; } 
            public string region { get; set; } 
            public string regionUrl { get; set; } 
            public string hotelType { get; set; } 
            public string name { get; set; } 
            public string comment { get; set; } 
            public string imageFolder { get; set; } 
            public string imageHotel { get; set; } 
            public string minPrice { get; set; } 
            public bool showHalfPrice { get; set; } 
            public string minPriceCurrency { get; set; } 
            public List<object> restTypes { get; set; } 
            public bool tour3D { get; set; } 
            public string video { get; set; } 
            public bool tezRecommend { get; set; } 
            public bool tezPriority { get; set; } 
            public bool tezOnly { get; set; } 
            public string price { get; set; } 
        }
    
        public class Root    {
            public Hotel[] hotels { get; set; } 
        }


    var data = JsonConvert.DeserializeObject<Root>(jsonText);
    var names = data.hotels.Select(x=>x.name).ToArray();

    Используйте Newtonsoft.Json или System.Text.Json
    Ответ написан
    1 комментарий
  • Каким образом можно в один exe всунуть музыку вне зависимости от наличия той на пк?

    FutureAnge1
    @FutureAnge1
    Педалирую потихоньку...
    Выбираешь нужный файл в Solution Explorer и устанавливаешь значение "Build Action" в "Resource". Теперь к файлу можно обратиться по относительному пути.
    602ec501d2735629735897.jpeg
    Ответ написан
    Комментировать
  • Каким образом можно в один exe всунуть музыку вне зависимости от наличия той на пк?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Вопрос простой. Добавить файл в ресурсы и читать его из ресурсов.
    Ответ написан
    1 комментарий
  • Перевод из любой системы счисления в десятичную?

    0xD34F
    @0xD34F
    string value

    long index = value[l];

    То есть, вы ждёте, что '1' ('2', '3', ...) будет неявно преобразовано в 1 (2, 3, ...). Зря. Так не будет. Вы получите код соответствующего символа. Ваше счастье, коды цифровых символов расположены один за другим, в порядке возрастания соответствующих им цифр, так что достаточно вычесть код нуля, чтобы получить нужное число:

    long index = value[l] - '0';
    Ответ написан
    1 комментарий
  • Перевод из любой системы счисления в десятичную?

    @OwDafuq
    Чем вам не угодил стандартный Convert.ToString?
    Пример:
    Console.WriteLine(Convert.ToString(5000, 2)); // -> Вывод: 1001110001000
    Ответ написан
    1 комментарий
  • Асинхронный UDP-клиент на C#. Где происходит получение данных?

    @none7
    Там ниже код
    Task.Run(() =>
                {
                    IPEndPoint ipEndPoint = null;
    
                    while (true)
                    {
                        try
                        {
                            var receivedBytes = _client.Receive(ref ipEndPoint);
                            TaskCompletionSource<byte[]> tcs;
                            if (_tcsDictionary.TryGetValue(ipEndPoint, out tcs)) tcs.SetResult(receivedBytes);
                        }
                        catch (SocketException)
                        {
                            ;//при невозможности соединения продолжаем работать
                        }
    
                    }
                });

    Здесь при помощи tcs.SetResult данные передаются в первый кусок кода.
    Ответ написан
    1 комментарий
  • Как заставить работать CentOS 8 через два сетевых интерфейса?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё верно, потому что пакет приходит в один интерфейс, а потом по default route пытается уйти через другой с неверным для этого интерфейса адресом. В принципе, это даже может работать, если выключить rp_filter. Но вообще правильно говорят: не надо два шлюза, ничего из этого хорошего не выйдет.

    В общем случае задача "ответить на запрос через тот же интерфейс в обход default route" решается с помощью policy routing. Нужно сделать ещё две разных таблицы маршрутизации с нужными роутами и затем выбирать их через ip rule.

    Что касается тормозов при логине, то это сервер пытается проверить в DNS PTR-запись подключающегося. Соответственно, если на сервере с DNS сделать всё хорошо, то и тормозов не будет.
    Ответ написан
    8 комментариев
  • Можно ли сохранить промежуточный образ в контейнер и использовать его для других проектов?

    @zohan1993
    devops
    для минимизации образа с приложением
    multistage-build

    этап 1
    устанавливаете все необходимые инструменты и зависимости для компиляции приложения
    выполняете компиляцию приложения

    этап 2
    устанавливаете все зависимости необходимые для работы приложения
    копируете готовое приложение в новый образ
    Ответ написан
    1 комментарий
  • Как сохранить фото отправленное юзером в телеграм?

    @ReeTeeC Автор вопроса
    Недокодер
    Нашел решение c:

    @bot.message_handler(content_types=["document"])
    def handle_docs_audio(message):
        document_id = message.document.file_id
        file_info = bot.get_file(document_id)
        urllib.request.urlretrieve(f'https://api.telegram.org/file/bot{const.token}/{file_info.file_path}', file_info.file_path)


    В директории с ботом, надо создать папку documents, туда бот и будет сохранять файлы в виде фото
    Ответ написан
    3 комментария
  • Какой функционал еще можно добавить(Кроме интерфейса)?

    Перестать хранить пароль в БД в открытом виде. Сохранять только хеш
    Ответ написан
    Комментировать
  • Как можно модернизировать?

    @anerev
    Собрав самых известных хакеров континента все пришли к выводу что ваш код совершенен. Не хотели бы вы устроится в google ?
    Ответ написан
    1 комментарий
  • Почему не так? (while)?

    adugin
    @adugin Куратор тега Python
    from functools import reduce
    from operator import mul
    
    def persistence(n):
        i = 0
        while n > 9:
            n = reduce(mul, map(int, str(n)), 1)
            i += 1
        return i

    Вариант без дополнительных импортов:
    def persistence(n):
        i = 0
        while n > 9:
            n = eval('*'.join(f'{n}'))
            i += 1
        return i

    Вариант без while:
    from functools import reduce
    from operator import mul
    from itertools import count
    
    def persistence(n):
        for i in count(0):
            if n > 9:
                n = reduce(mul, map(int, str(n)), 1)
            else:
                return i

    Проверки корректности результата:
    assert persistence(39) == 3
    assert persistence(999) == 4
    assert persistence(4) == 0
    Ответ написан
    Комментировать
  • Можно ли одной функцией 'распаковать' все вложенные списки?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    def flatten(li):
        return sum(([x] if not isinstance(x, list) else flatten(x) for x in li), [])


    >>> flatten([[[2]], [4, [5, 6, [6], 6, 6, 6], 7]])
    [2, 4, 5, 6, 6, 6, 6, 6, 7]
    Ответ написан
  • Как запустить телеграм бота из-за прокси?

    Danya_Violet
    @Danya_Violet
    CTO/CIO
    https://github.com/eternnoir/pyTelegramBotAPI#proxy

    документация:
    apihelper.proxy = {'https':'socks5://userproxy:password@proxy_address:port'}

    но если не работает, попробуйте:
    apihelper.proxy = {'https':'socks5h://userproxy:password@proxy_address:port'}


    Найдено тут
    Ответ написан
    1 комментарий
  • Что послушать про программирование?

    Слушать подкасты это и весело и полезно. Но выбрать для себя подходящий это та еще задача.

    Порекомендую несколько, которые мне нравятся:
    1) Разбор Полетов - о технологиях, гаджетах и программировании
    2) Радио-Т - о технологиях и программировании + болтология :)
    3) РадиоJS - о JS и фронтенде
    4) Откровенно про IT карьеризм - разговорное шоу с интересными собеседниками, о программировании, карьере и всем-всем
    5) RWpod - о рельсах, руби и пр.
    6) RubyNoName - о рельсах, руби и пр. сейчас чуть заглохло
    7) ruby5 - о рельсах, руби и пр. на английском

    + Бинарное Радио
    Ответ написан
    1 комментарий