Задать вопрос
  • Какие дистрибутивы с xfce очень похожи на mac os?

    shurshur
    @shurshur
    Adamos, не знаю, у меня дефолтная тема и меня это не парит. Обои я долго не менял, так как экран всё равно закрыт окнами.
  • Какие дистрибутивы с xfce очень похожи на mac os?

    shurshur
    @shurshur
    Ну современная крыса в современной убунте выглядит очень даже неплохо. Гарантирую как пользователь с 15-летним стажем. Когда-то у ней даже при минорных обновлениях конфиг слетал в дефолт на любом дистрибутиве...
  • Как реализовать self-hosted чат на основе libsignal или другого E2EE протокола?

    shurshur
    @shurshur
    Владимир, зато этот сервер уже готовый есть, его не нужно будет писать. Мне кажется, тут больше проблем с клиентской стороны, если нужно именно своё приложение, а не готовое.
  • Как реализовать self-hosted чат на основе libsignal или другого E2EE протокола?

    shurshur
    @shurshur
    Может, просто использовать Matrix? Свой сервер ставится, открытый протокол с E2E, правда, наиболее развитый клиент по сути один - Element.
  • Как работает Wins и DNS?

    shurshur
    @shurshur
    Это немного неправда, так как в реальности эти компьютеры регулярно проводят выборы и выбирают среди master browser. Причём на выборы влияет os level, который у любой серверной версии винды выше, поэтому выборы выигрывают сервера, если они в сети есть. Но если использовать samba, можно поставить в конфиге os level в 255 и тогда этот samba-сервер будет всегда победителем по жизни...
  • С чего начать изучение Linux?

    shurshur
    @shurshur
    Вроде ж VirtualBox научили использовать Hyper-V?
  • Замена Windows, что посоветуете?

    shurshur
    @shurshur
    Впаять штраф - легко. Причём даже жалобы MS не нужно. Захотелось проверяющим органам палки в план заработать - они оштрафуют за абсолютно любой нелицензионный софт. Ведь уход поставщика с рынка не отменяет его авторских прав в силу участия России в Бернской конвенции и других международных соглашений по защите авторских прав.

    Да, конечно, в текущих условиях шансы на подобное снижены, но нарушение от пустых рассуждений общего характера не перестало быть нарушением, а разговоры в духе "все же нарушают" не подошьёшь к делу. Что будет дальше никто не знает.

    Если госсектор, то можно огрести проблем из-за того, что некоторые дистрибутивы Linux на своих сайтах выразили поддержку Украине.

    До кучи, госов сейчас могут по поводу и без повода трясти на тему того, чтобы софт числился в "реестре отечественного ПО", особенно при закупках в конкурсных процедурах. Даже если купленный софт реально отечественный от отечественного производителя.
  • Что ему не нравится с моим буффером?

    shurshur
    @shurshur
    mayton2019, MPI - это не протокол. Это абстрактный интерфейс функций, который имеет много реализаций. В частности, в нулевых популярно было использовать LAM MPI, сценарий использования которого предполагал заранее раскопировать файлы на все узлы кластера или использование nfs, а затем программа вызывалась через mpirun, что приводило к запуску экземпляров программы с помощью rsh/ssh на нужных узлах с правильными параметрами. Но были и другие реализации, в том числе под специализированные контроллеры типа SCI.
  • Как скопировать сайт требующий авторизацию?

    shurshur
    @shurshur
    В своё время были проги типа offline explorer или teleport, которые позволяли ходить руками по сайту и при этом сохраняли все его страницы. Но это, условно, работает на "классических" сайтах, где контент представляет из себя генерируемые на сервере страницы, если же там front-back, то уже не поможет.

    Обычная практика для сохранения данных сайтов в наше время - это написание парсера. Но это требует навыков программирования. Либо можно обратиться на фриланс, чтобы кто-нибудь за денюжку взялся...
  • Как получить доступ к данным, отправленным через URL с помощью метода POST(Python)?

    shurshur
    @shurshur
    Евгений, я его прочитал. Вижу вопрос как сделать POST-запрос. Это есть в документации. В частности, в документации к популярным библиотекам requests и aiohttp.
  • Что ему не нравится с моим буффером?

    shurshur
    @shurshur
    Что должна делать эта программа?
  • Есть ли годный браузер с поддержкой Flash?

    shurshur
    @shurshur
    Есть ли годный гроб для мёртвой стюардессы?
  • Как вспомнить\восстановить пароль Veracrypt?

    shurshur
    @shurshur
    rav_pr, люди легко забывают пароль, придуманный всего пять минут назад, а тут год прошёл...
  • Как добавлять пользователя в телеграмм канал по номеру телефона?

    shurshur
    @shurshur
    В общем случае - никак. У многих юзеров стоит в настройках приватности запрет на их поиск по номеру телефона.

    Кроме того, Телеграм банит за активный поиск пользователей по номеру телефона.
  • Как добавить чат боту webhook?

    shurshur
    @shurshur
    Можно взять flask и с его помощью написать тривиальный сервис.
  • Как остановить handler?

    shurshur
    @shurshur
    xx_RuBiCoN_xx,
    telebot (как и вообще большинство библиотек для написания чат-ботов) работает как обработчик поступающих событий. Приходит событие - вызывается его обработчик. И это очень хорошо работает, пока всё осмысленное взаимодействие с ботом локализовано одним сообщением, а предыдущие знать вообще не обязательно. Ну, например, бот-переводчик: мы кидаем ему фразу на одном языке, он вовзращает на другом языке.

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

    На самом деле хранить состояния своими силами тоже можно, и я бы посоветовал в учебных целях хотя бы один раз это попробовать. Заводим глобальную переменную-словарь user_statses = dict(), куда будем записывать состояния пользователей.

    user_state = user_states.get(message.chat.id, None)
    if user_state:
        if user_state["action"] = "button1": функция_обработчик_кнопки1(message)
        elif user_state["action"] = "button2": функция_обработчик_кнопк2(message)
        else: функция_которая_покажет_ошибку(message)
    else:
        поведение по умолчанию, например, обработка нажатых кнопок
        в нужном месте выставляем состояние:
        user_state[message.chat.id] = {"action": "button1", "дополнительные": "данные"}


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

    В состояние можно даже класть ссылку на функцию, которая будет вызвана:

    user_state[message.chat.id]["func"] = функция_обработки_сообщения
    #или даже так:
    user_state[message.chat.id]["func"] = lambda msg: функция_обработки_сообщения(msg, "дополнительные", "параметры")


    Тогда в нужном месте можно вызвать эту функцию:

    if "func" in user_states.get(message.chat.id, {}):
        user_states[message.chat.id]["func"](message)


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

    Так что любой многошаговый бот просто содержит в каждом обработчике вызов register_next_step_handler, который приводит к изменению обработчика следующего сообщения от этого пользователя. Можно даже с ветвлениями: в зависимости от условий можно зарегистрировать в одной функции разные обработчики.

    Если же надо, чтобы бот вернулся "в главное меню" (на самый первый обработчик), то делаем clear.
  • Как остановить handler?

    shurshur
    @shurshur
    xx_RuBiCoN_xx, ну вот в handle_number_input надо сделать clear. И в handle_number_input2 надо сделать clear. После того, как операция сделана, нужно сброситься до изначального состояния. Чтобы сделующее действие не вызывало handle_number_input или handle_number_input2, а вызывало основной обработчик.

    А вообще, конечно, названия типа handle_number_input2 это плохо. Должно быть сразу понятно, что это обработчик, который удаляет. Типа handle_number_delete_from_table.

    Ну а вообще код привести бы в приличное состояние. Сам подумай: через год ты вдруг захочешь поменять что-то в боте, и сколько ты будешь разбираться в глубоком смысле таких конструкций?

    elif message.text == text42:
            handle_adm_btn1(bot, message)
  • Как остановить handler?

    shurshur
    @shurshur
    xx_RuBiCoN_xx, не надо сразу, надо в следующем обработчике.