• Авторизация на папку в батнике, как реализовать?

    @kalapanga
    Скорее всего, доступ к папке должен иметь пользователь, от имени которого запущена служба SQL сервера, так как делает бэкап в файл именно SQL сервер.
    Альтернативный вариант - формировать бэкап локально, потом копировать в сетевую папку.
    Ответ написан
    1 комментарий
  • Как обойти ошибку Error: Forbidden: bot was blocked by the user в телеграм боте? C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Сдается мне, что вникак. Если вас забанили, то никакой код это не исправит.
    Ответ написан
    Комментировать
  • Почему время выполнения программы так сильно различается?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас там работа с диском. Да еще многопоточная. Что там в кеше у SSD окажется, выполняется ли какой-нибудь TRIM в контроллере SSD, индексирует ли что-то какой-нибудь системный процесс, на какое ядро планировщик закинет какие потоки - куча факторов.
    Ответ написан
    Комментировать
  • Почему питоновский скрипт сам по себе рабочий, а в виде службы - нет?

    Vindicar
    @Vindicar
    RTFM!
    Виртуальное окружение в проекте есть? Если да, то запускать скрипт надо не системным питоном, а питоном из этого окружения.
    EDIT1:
    Если из командной строки дать pyhon3 /home/lxm213/script.py, то скрипт работает штатно и без ошибок

    Т.е. скрипт запускаешь в системном окружении, а не в виртуальном. ОК, тогда по идее он должен работать...
    Но встаёт вопрос: как ты ставил schedule? Просто pip install schedule? Из-под рута ставил или с правами просто пользователя?
    Если ставил из-под рута, то библиотека будет установлена в системный интерпретатор и будет доступна всем пользователям.
    Если ставил не из-под рута, то, возможно, pip поставил её куда-то в твой домашний каталог - я знаю, что под виндой он так делает. Тогда библиотека доступна только если запускать скрипт из-под твоего пользователя.

    Отсюда три возможных решения:
    1. Создать виртуальное окружение для проекта, поставить библиотеку в это виртуальное окружение (используя местный pip), запускать скрипт через python3 из этого окружения.
    2. Если библиотека была поставлена без рут-прав, указать в .service-файле, что скрипт надо запускать от имени твоего пользователя, а не от имени root.
    3. Убедиться, что библиотека поставлена в системный интерпретатор. При необходимости поставить её с рут-правами. Тогда скрипт будет работать из-под любого пользователя.
    Ответ написан
    9 комментариев
  • Нету структуры file_operation, в хедере fs.h, как исправить? как установить полные хедеры ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    изучаю разработку модулей ядра,попытался скомпилировать модуль использующий структуру file_operation - ошибка,как оказалось в моих хедерах ядра(/usr/include/linux/) нету данной структуры

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вот как вы себе представляете: вызов одной и той же функции должен вернуть разные типы для разных индексов?

    Нет, в C++ статическая типизация, одна функция может вернуть только один тип. Из List'а вы только Base вернуть и можете. А уже как-то опросив экземпляр класса с помощью виртуальных методов, вы сможете узнать, какого же он на самом деле типа и скастовать к нему.

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

    Или хранте и возвращайте std::Variant, а не указатели на базовый класс.
    Ответ написан
    4 комментария
  • Есть ли обучающие источнике математике, которые переводят математические выражения в строки кода?

    @alexalexes
    Ничего компактней и наглядней математической записи человечество не придумало. Учитесь растолковывать это как базовый язык логики. Он важней чем любой другой язык программирования, и даже того языка, на котором написана документация (английский), ибо все прочее это приходящие и уходящие вещи.
    Ответ написан
    Комментировать
  • Что возвращает присваивание пробела целочисленной переменной?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Во-первых, это не строка, а символ - char. Грубо говоря - байт. Байт - это число.
    У каждого символа есть свой код. В данном случае используется ASCII кодировка и в ней пробел имеет код 32 (десятичный).
    Ты присваиваешь char переменной int - тут неявный каст (приведение типов). Потерь данных нет, т.к. int принимает больше значений (он 4 байтный).
    Таким образом, в этой строке переменной integer присваивается значение 32.
    Прочитай про типы данных
    Ответ написан
    1 комментарий
  • Возможно ли задать приоритет использования файла подкачки на разных дисках?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Использовать оперативную память, что бы туда сбрасывалась невостребованная информация из оперативной памяти? Серьёзно? А следом будет добавление виртуальных CPU, что бы помогали физическим, да?
    Ответ написан
    Комментировать
  • Ошибка в коде C++.?

    GavriKos
    @GavriKos
    Ну в целом ошибка сама за себя говорит. Нельзя в указатель записать символ.
    Ответ написан
    Комментировать
  • Ubuntu закрывает приложения без ошибок, в чем может быть проблема?

    @AlexVWill
    В момент вылета посмотри syslog, возможно там будет указана ошибка, по которой можно определить причины вылета. А причины могут быть разные, от проблем чисто софтовых (драйра например), до железных с памятью, процессором, питанием и пр.
    Ответ написан
    Комментировать
  • Что не так с попыткой прописать выполнение cmd в автозагрузку?

    @rPman
    поднять галку "Запуск от имени Администратора"
    во первых в этом случае запрос превышения прав будет всплывать каждый раз при запуске

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

    Для запуска уже настроенной задачи без условия запуска можно использовать консольную команду schtasks /run
    Ответ написан
    1 комментарий
  • Какие есть оптимальные способы хранения и передачи изображений из MongoDB?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да, есть: хранить сами изображения не БД, а в отдельном файловом хранилище с внешним доступом по ссылке-идентификатору. В самой же БД хранить только идентификаторы изображений в хранилище. Это стандартная практика работы с файлами и БД.
    Ответ написан
    Комментировать
  • Адрес сайта с нормальными гайдами по алгоритмам?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Есть русский сайт e-maxx.ru/algo
    Есть сборник кучи алгоритмов, но там мало объяснений: https://rosettacode.org/wiki/Rosetta_Code
    Ответ написан
    2 комментария
  • Насколько хорошая практика использовать обертки над операторами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В библиотечных функциях - можно так сделать. В смысле, ваши функции используют непубличную функцию, передавая ей оператор.

    Но вы этот оператор передаете всего в нескольких местах на всю кодовую базу и все. Писать так функции, которые вы используете кучу раз - очень плохая идея.

    И вообще, довольно редко есть смысл так заморачиваться. Код становиться хуже поддерживаемый. Экономите вы совсем чуть чуть повторяемого кода. А потом придется всякие заморочки делать, вроде, в делении надо проверять на 0, а в умножении проверять на переполнение и т.д. Этот общий код становиться уже чуть ли не длиннее если все по отдельности делать. И уж точно хуже читаемый.
    Ответ написан
    Комментировать
  • Какой линукс выбрать дата инженеру?

    Adamos
    @Adamos
    Поиграться в виртуалке, побеситься на тормоза.
    Поставить в дуалбут Убунту, побеситься на экспериментальный десктоп.
    Сменить ее на Минт и успокоиться в нормальном рабочем окружении.
    Скорее всего, так.
    Я предпочитаю Xubuntu, но ее все-таки надо под себя подпиливать.
    Собственно, разницы-то в дистрибутивах для "инженера", который не собирается в них копаться, практически никакой. Берешь то, чем пользуется побольше народу, вот и весь выбор.
    Ответ написан
    Комментировать
  • Почему код не работает?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вам надо не получить последовательность, а только определить значение элемента этой последовательности.
    Запишем последовательность и пронумеруем её элементы с нуля. После этого переведём номера в двоичную систему и запишем их над элементами
    Номера в десятичной системе:
    00000000001111111111222222222233
    01234567890123456789012345678901
    Номера в двоичной системе:
    00000000000000001111111111111111
    00000000111111110000000011111111
    00001111000011110000111100001111
    00110011001100110011001100110011
    01010101010101010101010101010101
    Последовательность:
    10010110011010010110100110010110

    Можно заметить, что там, где двоичное представление содержит чётное количество битов, элемент последовательности равен 1, нечётное - 0.
    Остаётся преобразовать номер в двоичную систему и посчитать количество битов. Надо учесть, какая нумерация используется в задании и, при необходимости, переводить её в нумерацию с нуля.
    Ответ написан
    1 комментарий
  • Почему GCC не видит встроенную атомарную операцию?

    AshBlade
    @AshBlade Автор вопроса
    Просто хочу быть счастливым
    Разобрался.
    Есть 2 замечания:
    1. Поближе посмотрел на сигнатуру

    bool __atomic_compare_exchange (type *ptr, type *expected, type *desired, bool weak, int success_memorder, int failure_memorder)


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

    if (__atomic_compare_exchange(&l.head->next,  (struct entry**)NULL, &new_next, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))


    Но потом начал ловить SEGFAULT. И тут пришел к 2 замечанию

    2. Не заметил следующего в документации:

    This built-in function implements an atomic compare and exchange operation. This compares the contents of *ptr with the contents of *expected. If equal, the operation is a read-modify-write operation that writes desired into *ptr. If they are not equal, the operation is a read and the current contents of *ptr are written into *expected. weak is true for weak compare_exchange, which may fail spuriously, and false for the strong variation, which never fails spuriously. Many targets only offer the strong variation and ignore the parameter. When in doubt, use the strong variation.


    Т.е. если значение во 2 аргументе не равно значению из 1, то (!!!) по месту указателя 2 записывается полученное из указателя 1 значение. А у меня там был NULL (конец списка обозначается NULL). Заменил на корректно выделенный элемент списка и все заработало

    int main(int argc, char const *argv[])
    {
        struct list l;
    
        l.head = (struct entry *)malloc(sizeof(struct entry));
        l.head->next = NULL;
        l.head->value = 123;
        struct entry *old_next = (struct entry *)malloc(sizeof(struct entry));
        old_next->next = NULL;
        old_next->value = 555;
        l.head->next = old_next;
    
        struct entry *new_next = (struct entry *)malloc(sizeof(struct entry));
        new_next->value = 444;
        new_next->next = NULL;
        if (__atomic_compare_exchange(&l.head->next, &old_next, &new_next, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
        {
            printf("ok\n");
            printf("success: next = %d\n", l.head->next->value);
        }
        else
        {
            printf("failed\n");
        }
    
        return 0;
    }


    Не хочу возиться со всякими dummy узлами, поэтому буду использовать __sync_bool_compare_and_swap. Вот такой код сработает:
    int main(int argc, char const *argv[])
    {
        struct list l;
    
        l.head = (struct entry *)malloc(sizeof(struct entry));
        l.head->next = NULL;
        l.head->value = 123;
    
        struct entry *new_next = (struct entry *)malloc(sizeof(struct entry));
        new_next->value = 444;
        new_next->next = NULL;
    
        if (__sync_bool_compare_and_swap(&l.head->next, (struct entry *)NULL, new_next))
        {
            printf("ok\n");
            printf("success: next = %d\n", l.head->next->value);
        }
        else
        {
            printf("failed\n");
        }
    
        return 0;
    }


    UPD: спасибо res2001, разобрался лучше. итоговый вариант

    #include <stdatomic.h>
    
    int main(int argc, char const *argv[])
    {
        struct list l;
    
        l.head = (struct entry *)malloc(sizeof(struct entry));
        l.head->next = NULL;
        l.head->value = 123;
    
        struct entry *new_next = (struct entry *)malloc(sizeof(struct entry));
        new_next->value = 444;
        new_next->next = NULL;
        struct entry *tmp = NULL;
        if (atomic_compare_exchange_strong(&l.head->next, &tmp, new_next))
        {
            printf("ok\n");
            printf("success: next = %d\n", l.head->next->value);
        }
        else
        {
            printf("failed\n");
        }
    
        return 0;
    }


    Просто надо создать переменную указатель, которой присвоить NULL. Также использовал atomic_compare_exchange_strong из stdatomic вместо расширения GCC - он под капотом использует __atomic_* вместо устаревшего __sync_*
    Ответ написан
    1 комментарий
  • Как в C++ создать массив с неизвестным числом элементов?

    @dima20155
    you don't choose c++. It chooses you
    Вектор лишь класс, который предоставляет удобный способ работать с базовой структурой данных типа массив, только динамический (количество элементов можно изменить в момент исполнения программы)
    Невозможно создать массив переменного числа элементов на этапе компиляции

    Так что есть два выхода:
    1. Создать массив со статически определенным количеством элементов (например, 100), но заведомо большим, чем введет пользователь (но опять же, это важно проверять)
    2. Создать динамический массив, хранящий данные в куче (используя std::vector или просто new/malloc)

    https://stackoverflow.com/questions/68073934/how-t...
    Ответ написан
    1 комментарий
  • Почему в наутилусе папка распаковывается за 1 секунду, а в Windows 1 минуту?

    Потому что в винде zip очень древний и неоптимизированный.
    Лучше использовать winrar или 7zip для распаковки - тогда тоже будет быстро.
    Ответ написан