Задать вопрос
  • Как сделать работника микросервиса?

    Viji
    @Viji
    DevOps Engineer
    без брокера сообщений микросервисы делать не имеет. Смотри RabbitMQ и Kafka. В этом весь смысл микросервисов - избегать сильной связанности

    вот хорошее видео:
    https://www.youtube.com/watch?v=XtOJZ1T3qw4&ab_cha...
    Ответ написан
    Комментировать
  • Как сделать работника микросервиса?

    fenrir1121
    @fenrir1121
    Начни с документации
    Не ясно при чем тут микро- или не микросервисы, но вероятно вам нужен Celery. Статей по его использованию очень много.
    Хорошая книга по проектированию компонентов системы - Fundamentals of software architecture
    Ответ написан
    3 комментария
  • Почему VS Code не распознает, что функция вернет tuple?

    Vindicar
    @Vindicar
    RTFM!
    Потому что оба оверлоада неразличимы - они ОБА показывают один аргумент типа bool.
    И да, а если аргумент не указан, что вернёт функция? Из твоего кода это неясно вообще, так как у тебя два противоречащих варианта.
    Тебе надо что-то типа...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[False] = False) -> str:
        ...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[True]) -> tuple[str, str]:
        ...
    @classmethod
    def get_mac_address(cls, with_gateway: bool = False) -> typing.Union[str, tuple[str, str]]:
        ...
    Ответ написан
    3 комментария
  • Как вы боритесь с циклическими импортами в Python?

    Vindicar
    @Vindicar
    RTFM!
    Если речь идёт об импорте только ради type hinting, то typing.TYPE_CHEKING в помощь.
    Ответ написан
    Комментировать
  • Как правильно посылать и получать данные у WebSocket?

    Fragster
    @Fragster
    помогло? отметь решением!
    Я сделал так: протокол взял json rpc:

    let requestCounter = 0
    let jsonRpcPromises = {}
    function jsonrpc (method, params) {
      const dataToSend = { jsonrpc: '2.0', method, params, id: ++requestCounter }
      socket.send(JSON.stringify(dataToSend))
      return new Promise((resolve, reject) => {
        jsonRpcPromises[requestCounter] = { resolve, reject }
      })
    }
    
    function completeJsonrpc (message) {
      const { id, error, result } = message
      if (error !== undefined) {
        jsonRpcPromises[id]?.reject(error)
      } else {
        jsonRpcPromises[id]?.resolve(result)
      }
      delete (jsonRpcPromises[id])
    }
    
    //
        socket.onmessage = function (event) {
          const message = JSON.parse(event.data)
    ///
          if (message.jsonrpc) {
            completeJsonrpc(message)
          } else if (...) {
    /// 
        }


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

    сам протокол упрощен, нет пакетного режима, передача идет по одному сообщению, а не массивами (потому что с сокетом это не нужно)
    Ответ написан
    4 комментария
  • QSS. Как изменить верхнюю панель?

    xzripper
    @xzripper
    0xC0000005
    Это невозможно, либо отказаться от такой идеи, либо сделать окно вообще без границ и верхней панели (QtCore.Qt.FramelessWindowHint), и сделать свою верхнюю панель.
    Ответ написан
    Комментировать
  • Какие видеопроигрыватели для Web есть под заданные критерии?

    @rPman
    С гарантией можно все это делать только если стримить видео с сервера, и соответственно управлять тем что проигрывается на серверной стороне. Самый простой стриминг можно реализовать с помощью ffmpeg или vlc, готовые комбайны. Недостаток подхода - высокая нагрузка на сервер (стриминг не кешируется в обычном смысле).

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

    Если тебе хватит пользовательского интерфейса (т.е. не защитит от продвинутых пользователей и продвинутых блокировщиков рекламы) то пользуйся штатным video (не понимаю почему все пилят какие то плееры, html5 video тег отличный вариант).

    достаточно удалить control атрибут, чтобы не было интерфейса управления в т.ч. с клавиатуры, а чтобы исключить управление из меню (правая кнопка мыши) добавь к стилям pointer-events: none;
    Ответ написан
    4 комментария
  • Как работает @property.getter?

    shabelski89
    @shabelski89
    engineer
    Так делать нельзя, но можно переопределять значение атрибута и в зависимости от его типа вернуть с постобработкой для указанного типа.
    class TestClass:
        def __init__(self, number: (int, str)):
            self._number = number
    
        @property
        def number(self):
            if isinstance(self._number, int):
                return self.__int_number()
            elif isinstance(self._number, str):
                return self.__str_number()
            else:
                return self._number
    
        @number.setter
        def number(self, value):
            self._number = value
    
        def __int_number(self):
            return self._number * 100
    
        def __str_number(self):
            return f'Hello world - {self._number}'
    
    
    value_int = 150
    testInstance = TestClass(value_int)
    print(testInstance.number)
    
    value_str = '0MG'
    testInstance.number = value_str
    print(testInstance.number)
    
    value_another_type = ['one', 'two']
    testInstance.number = value_another_type
    print(testInstance.number)
    Ответ написан
    Комментировать
  • OpenCV. Почему отдельные кадры из видео весят больше чем видео?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Потому что кадры в массивах хранятся в несжатом виде, а исходный видео-ролик сжат кодеком.
    Кодеки сейчас довольно сложные, у них много параметров сжатия и нетривиальные алгоритмы. Вы один и тот же ролик можете расжать и сжать по новой, а в результате получите совсем другой объём и даже немного отличающийся контент, ведь сжатие происходит обычно с потерей качества.
    Ответ написан
    Комментировать
  • Как правильно прописать путь к файлу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Пути могут быть абсолютные и относительные. В вашем случае указан относительный путь. Относительный путь, если его не присоединять к абсолютному, указывает на файл или каталог относительно текущего пути. В каждом процессе операционной системы есть внутреннее состояние того текущего пути. Если текущий путь н еменять, то он обычно наследуется от родительского процесса, или равен пути, по которому запустили скрипт.
    Указывайте путь либо абсолютно, либо относительно текущего пути в вашем приложении.
    Используйте pathlib - это сейчас самый современный и правильный способ работать с путями.
    Абсолютные пути начинаются со слеша (ну или с указания диска, если речь о винде), а относительные нет.
    Надо учить матчасть и азы прежде чем программировать ботов
    Ответ написан
    Комментировать
  • Как скрыть код на питоне на мини-компьютере от пользвователя?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Решение, которое позволит поднять стоимость реверса Вашего приложения до неприличного значения:
    1. Обфусцируем код через https://github.com/dashingsoft/pyarmor .
    2. Перегоняем п1. через https://github.com/Nuitka/Nuitka в сишный код.
    3. Компилим п2. в машинный код.
    4. Запускаем п3. exe-шник на клиенте.

    Получаем:
    1. Увеличение производительности.
    2. Exe-шник из машинного кода.
    Ответ написан
    3 комментария
  • Как запустить скрипт используя subprocess и venv из которого запущен главный скрипт?

    Vindicar
    @Vindicar
    RTFM!
    Найди бинарник python, который лежит в этом venv, и укажи его полный путь вместо просто python.
    Но так как ты дожидаешься завевршения скрипта, может иметь смысл такой хак:
    # my_script.py
    import sys
    
    def main(args: list[str]):
        """Тело скрипта здесь..."""
    
    if __name__ == '__main__':
        # скрипт запущен независимо
        main(sys.argv[1:])

    А в главном скрипте будет просто
    import my_script
    
    my_script.main(['--work-dir', work_dir, '--result-dir', result_dir])


    В этом случае тебе не придётся сильно переделывать my_script. Но зато теряешь в удобстве вызова кода, например, если нужно получить значение из этого скрипта.
    Чем больше ты вынесешь из main() в отдельные подпрограммы - тем больше контроля будет у главного скрипта, но и тем больше работы.
    Ответ написан
    Комментировать
  • Почему не получается расширить модель Django?

    Mi11er
    @Mi11er
    A human...
    Потому что уже создали User и django Хочет ему подпихнуть Profile
    Варианта 2
    1) Для модели Profile , сделать в атрибуте User - Null = True
    2) При таком вопросе, нажать 1 , потом снова 1
    Проставит первого юзера для профайла
    Ответ написан
    3 комментария
  • Почему не получается расширить модель Django?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Значит, что в базе уже есть таблица с таким же именем, но без поля user. И в ней есть какие то данные. А сейчас вы пытаетесь создавать/обновить таблицу, но с этим полем. И, поскольку, данные user не могут быть пустыми, база требует, чтобы вы что-то указали,.
    Ответ написан
    Комментировать
  • Как декодировать символы?

    @humoured
    Вы всё на свете найдёте в коробке с карандашами
    что делать с этим: "" символом, который в виде байта выглядит: "\x08"?
    Нужно обрабатывать, как оно и задумывалось. Символ 0x08Backspace, с помощью него консольные приложения обновляют данные, которые сами же в консоль и отправили.

    В конкретно этом примере мы видим, что процесс работы приложения отображается четырьмя символами: _25% — пробел, две цифры, символ процента. Затем идет четыре символа Backspace ("стирание" предыдущего символа) и четыре символа обновлённого статуса (_26%).
    Ответ написан
    Комментировать
  • Как импортировать класс из файла в той же папке?

    @great_cat
    может быть: from DataBasePythonPickle import Название класса?
    ну если я правильно понял суть проблемы)
    Ответ написан
    5 комментариев
  • Из-за чего возникла ошибка 'TypeError: Bot.send_message() missing 1 required positional argument: 'text''?

    Vindicar
    @Vindicar
    RTFM!
    await Bot.send_message(message.from_user.id, message.text)

    Ты пытаешься вызвать метод класса Bot, а не экземпляра bot.

    Поясню. В питоне методы устроены довольно прямолинейно:
    class Test:
        def test(self, x):
            print(f"Я {self} и я получил {x}")
    
    t = Test()  # создаём экземпляр
    t.test(42)  # Я <__main__.Test object at 0x000001BB195CBC70> и я получил 42
    # это тоже сработает, и это практически эквивалентно вызову выше
    Test.test(t, 42)  # Я <__main__.Test object at 0x000001BB195CBC70> и я получил 42
    # а это - то, что попытался сделать ты:
    Test.test(42)  # TypeError: Test.test() missing 1 required positional argument: 'x'
    # потому что вызван метод класса, а не объекта, и его первый параметр (42) интерпретирован как self
    Ответ написан
    4 комментария
  • Как представить шахматную партию в виде математики/массива чисел?

    LaRN
    @LaRN
    Senior Developer
    Можно так попробовать:
    Пусть нейронная сеть выполняет роль оценочной функции.
    Т.е. на вход сети подается состояние доски, а на выходе получается числовая оценка позиции.
    Дерево возможных ходов формируется не сетью, а внешней функцией.
    По факту строиться дерево ходов из текущей позиции и для каждого хода получается оценка с помощью нейронной сети, а дальше отбирается ход с наилучшей оценкой.
    По такая реализация шахмат с нейронной сетью должна работать быстрее, чем поиск в глубину.

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

    Похожий вопрос вот тут разбирается:
    qaru.site/questions/6525/how-to-program-a-neural-network-for-chess
    Ответ написан
    4 комментария
  • Как вытащить из ссылки присваемое значение?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    from urllib.parse import urlparse, parse_qs
    
    s = 'https://www.google.com/recaptcha/api2/bframe?hl=ru&amp;v=v1555968629716&amp;k=6Lfs-08UAAAAAHYLb31I3BeXJX7KcB8nKWrqWivY&amp;cb=2n6f0pedwhli'
    url = urlparse(s)
    params = parse_qs(url.query)
    value = params['k'][0]
    Ответ написан
    1 комментарий