Задать вопрос
  • Как определять движение в движущейся камере python?

    Vindicar
    @Vindicar
    RTFM!
    В общем и целом решения нет, так как отличить движение объекта от эффекта параллакса затруднительно, да и опираться на координаты тоже будет проблематично.
    Ты можешь поэкспериментировать с оптическим потоком, чтобы попытаться понять, в каком направлении сместилась камера, и пытаться либо произвести контр-смещение кадра перед использованием mean of gaussians, либо отсеивать объекты, у которых величина собственного смещения слишком близка к найденному движению камеры (со знаком минус). Первое реально работает только при съёмке с рук стоящего человека, т.е. когда смещения сравнительно малы. Если нужно ловить движение, когда камера тоже движется в одном направлении, шансов очень мало.
    Так или иначе, тебе наверняка придётся самому реализовывать тот или иной алгоритм background subtraction, чтобы иметь возможность вмешаться в его работу для компенсации движения.
    Ответ написан
    1 комментарий
  • Как лучше запускать программу на сервере: crontab или systemd?

    Vindicar
    @Vindicar
    RTFM!
    Встречные вопросы:
    1. Велика ли инициализация при запуске? Если нужно выполнять много стартовых операций, причём дорогих, то может иметь смысл запустить и спать.
    2. Срабатывание строго по времени или может требоваться мониторить другие события? Если абсолютно точно первое, то можно крон. Если возможно второе (и речь не о "пользователь сам вызвал программу"), то лучше демон.
    3. Есть ли зависимости, т.е. другое ПО которое должно быть запущено к моменту срабатывания? Если да, systemd может их разрулить, ЕМНИП.
    Ответ написан
    Комментировать
  • Как печатать текст перед input() в Python?

    Vindicar
    @Vindicar
    RTFM!
    Либо очищать терминал и перевыводить содержимое, либо использовать ncurses (но это только под линукс, под винду нужно искать тот или иной порт).
    Ответ написан
    Комментировать
  • Как сделать поиск картинок в боте?

    Vindicar
    @Vindicar
    RTFM!
    [сарказм]Всего-то делов, нужно иметь базу картинок со всего интернета.[/сарказм]
    А если серьёзно, ты можешь попробовать потыркать поиск гугла/яндекса, но они подобное очень не любят, и посылают ботов куда подальше.
    Ответ написан
    2 комментария
  • Как полученную переменную конвертировать в числовую?

    Vindicar
    @Vindicar
    RTFM!
    Приведённый код должен работать, по идее. Приведи пример входных данных, вызывающих ошибку, и полный текст этой ошибки.

    Исходя из преобразования во float, могу разве что предположить что ты вводишь число с десятичной запятой ("2,3") а не с десятичной точкой ("2.3").
    Ответ написан
    9 комментариев
  • Как поставить приложение "на паузу"?

    Vindicar
    @Vindicar
    RTFM!
    Ни разу не писал на Go, но могу задать умный вопрос насчёт архитектуры. =)
    Как только ответ от сервера приходит 200 - снова все продолжает работать.

    То есть приложение должно продолжать работать, как минимум в плане отправки запросов к серверу! Иначе как оно узнает, что можно работать дальше?

    Далее, если я правильно понимаю, что ты в цикле крутишь примерно следующий псевдокод?
    while (true) {
        data = query_server();
        result = process_data(data);
        send_result(result);
    }

    Тогда почему не заставить query_server() сообщать об успешности запроса так или иначе?
    А далее, если запрос был успешен, выполнять следующие два шага.
    Ответ написан
    Комментировать
  • Как оптимизировать работу приложения?

    Vindicar
    @Vindicar
    RTFM!
    Вместо цикла и win.update() научись использовать win.after().
    Ответ написан
    2 комментария
  • Как спарсить сайт, чтобы парсер работал под моим аккаунтом?

    Vindicar
    @Vindicar
    RTFM!
    Почти наверняка сайт использует cookies для хранения сессии, т.е. чтобы понять, что два или более запроса пришли от одного и того же пользователя.
    Большинство библиотек для работы с HTTP предоставляют механизм хранения cookies. Та же requests, например.
    Тогда выясняешь, какой запрос нужно сделать к сайту, чтобы залогиниться, и делаешь этот запрос. Потом в рамках той же сессии (читай документацию на используемую библиотеку!) выполняешь нужные тебе запросы к страницам.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы без выполнения @dp.message_handler(commands='Висельница') - start_game() не выполнялась @dp.message_handler()-game?

    Vindicar
    @Vindicar
    RTFM!
    Это называется машина состояний. Упрощённо, тебе нужно хранить для каждого участника сведения о том, играет он или нет. Например, словарь, где ключ - ID участника а значение - состояние игры. Если ID нет в словаре, то участник не играет.
    Решение Kvason плохо тем, что оно работает только для одного собеседника, т.е. либо все играют, либо никто не играет.
    Ответ написан
    1 комментарий
  • Как обрабатывть ошибки из командной строки python?

    Vindicar
    @Vindicar
    RTFM!
    Смотри стандартный модуль subprocess, там есть такие механизмы. Причем есть как типовой вариант "запустить процесс и уснуть, пока не выполнится" (subprocess.run), так и более гибкий "запустить процесс, и опрашивать его состояние когда мне это удобно" (subprocess.POpen). Учитывая, что у тебя GUI-приложения, я бы посоветовал второй вариант.
    Ответ написан
    Комментировать
  • Как создать многомерный список в Python?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. тебе нужно N уровней вложенности, но что насчёт размера? Он всегда 2, по каждой оси - т.е. 2х2 для двухмерного списка, 2х2х2 для трёхмерного и т.д.?
    Если да, то могу подсказать. Первое измерение ты генерируешь правильно через [0] * k (где k - размер списка по последней оси).
    А вот дальше можно легко добавить ещё одно измерение такой конструкцией:
    a = [a.copy() for i in range(k)]
    Так как мы делаем copy(), каждый вложенный список будет отдельным объектом, а не ссылками на один и тот же объект.
    Это добавление одного измерения. Как добавить столько, сколько нужно, догадаешься сам, я думаю.
    Ответ написан
    4 комментария
  • Почему не работает proxy?

    Vindicar
    @Vindicar
    RTFM!
    Я у себя для этих целей поднял privoxy, он не запредельно сложен в конфигурации. Хотя доки почитать пришлось. Зато сразу умеет как обычный HTTP, так и SOCKS прокси. Главное, чтобы он смотрел строго внутрь OpenVPN-сети! Многие хостеры не любят, когда у них поднимают публично-доступные прокси, да и некоторые ресурсы проверяют, открыты ли типичные прокси-порты у подключённого клиента.

    Опция в конфиге Openvpn имеет смысл только для клиента, и означает, что подключение к VPN-серверу нужно выполнять через указанный прокси, а не напрямую. У тебя, как я понял, задача обратная - раздавать прокси внутрь VPN.
    Ответ написан
    Комментировать
  • Как пустить часть трафика через VPN?

    Vindicar
    @Vindicar
    RTFM!
    Есть два подхода. В обоих случаях тебе нужен список заблокированных IP, его можно взять на антизапрете, например.
    Дальше вопрос, как пускать трафик.
    1. На хабре был материал про динамическую подгрузку маршрутов через BGP. Плюс - работает с любыми протоколами, и не требует дополнительной настройки со стороны проксируемого ПО. Минусы - ощутимо сложнее в понимании, на мой взгляд, да и с кроссплатформенностью могут быть проблемы. В статье приведена реализация на роутере Mikrotik.
    2. Использовать файл proxy.pac. Его можно сгенерировать скриптом типа такого:
    #!/bin/bash
    #!/bin/bash
    DNS_SERVER=8.8.8.8
    BLACKLIST_URL="http://antizapret.prostovpn.org/iplist.txt"
    #куда класть файл proxy.pac
    PACDIR=/var/www/html
    TMPLIST=/tmp/iplist.txt
    #домены, которые нужно пускать через прокси независимо от содержимого iplist.txt
    DOMAINS=(\
    rutracker.org \
    facebook.com \
    facebook.net \
    fbcdn.net \
    twitter.com \
    twitter.co \
    t.co \
    twimg.com \
    twitpic.com \
    periscope.tv \
    pscp.tv \
    )
    #качаем чёрный список
    wget -q --tries=10 -O "$TMPLIST" "$BLACKLIST_URL"
    # вытаскиваем IP наших прописанных доменов
    declare -a EXTRAIPS=()
    for domain in "${DOMAINS[@]}"
    do
            dig A "$domain" +short @$DNS_SERVER | grep -v '\.$' >>"$TMPLIST"
    done
    #в чёрном списке есть отдельные IP и есть подсети
    #также чёрный список очень длинный, поэтому кодируем его более компактно.
    IPLIST=`grep -Ex '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' "$TMPLIST" | awk '/^[0-9]+/ {split($1,b,/\./); printf("0x%02x%02x%02x%02x,", b[1],b[2],b[3],b[4]);}'`
    SUBNETLIST=`awk '/[0-9.]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+/ {split($1,p,/\//); printf("[\"%s\", %s], ", p[1], p[2]);}' <"$TMPLIST"`
    #генерируем proxy.pac по шаблону
    #он проверяет домен на вхождение в фиксированные домены, а потом IP по списку.
    function templatePAC {
            NAME=$1
            shift
            DMNLIST=("$@")
            cat >"$PACDIR/$NAME" <<EOF
    function FindProxyForURL(url, host) {
      var domainblacklist = [
    EOF
            for d in "${DMNLIST[@]}"
            do
                    echo "  '$d'," >>"$PACDIR/$NAME"
            done
            cat >>"$PACDIR/$NAME" <<EOF
      ];
      var ipblacklist = [ $IPLIST ];
      var subnetblacklist = [ $SUBNETLIST ];
    
      function endsWith(str, suffix) {
        return str.indexOf(suffix, str.length - suffix.length) !== -1;
      }
      function numberToMask(n) {
        var m=[0,128,192,224,240,248,252,254,255];
        var r=[];
        for (var i=0; i<4; i++) {
          var p = (n > 8) ? 8 : n;
          r[i] = m[p];
          n -= p;
        }
        return r.join(".");
      }
      function maskMatch(ip, mask) {
        var m = numberToMask(mask[1]);
        return isInNet(ip, mask[0], m);
      }
    
      var blocked = false;
      for (var i=0; !blocked && (i<domainblacklist.length); i++)
        blocked = blocked || ((host == domainblacklist[i]) || endsWith(host, '.'+domainblacklist[i]));
      if (!blocked) {
        var ip = dnsResolve(host);
        for (var i=0; !blocked && (i<subnetblacklist.length); i++)
          blocked = blocked || maskMatch(ip, subnetblacklist[i]);
        blocked = blocked || (ipblacklist.indexOf(convert_addr(ip)) != -1);
      }
      if (blocked)
        return "PROXY ТУТ_ТВОЙ_ПРОКСИ:ПОРТ";
      else
        return "DIRECT";
    }
    EOF
    }
    # генерируем файл
    templatePAC proxy.pac "${DOMAINS[@]}"
    
    rm -f "$TMPLIST"

    Тогда можно отдавать этот proxy.pac любым веб-сервером (но лучше внутри VPN - если VPN не работает, то смысл в файле?), и настроить браузер на его использование.
    Минусы: работает только с браузерами, требует наличия вебсервера и полноценного прокси-сервера внутри VPN-сети (т.е. просто арендованный VPN не подойдёт, нужен VPS). Но мне показалось это проще в понимании, чем возня с BGP, да и требуется только наличие современного браузера и VPN клиента, без привязки к роутеру. Можно хоть на ноуте настроить, как я сделал.
    Ответ написан
    Комментировать
  • Как сделать чтобы при вводе команды писались все участники роли. discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ты документацию читал? Там нужная информация есть.
    А что касается задания роли - указываешь тип параметра команды discord.Role, и 90% дела сделано.
    Ответ написан
  • Нужно извлечь из этого res.Как это реализовать?

    Vindicar
    @Vindicar
    RTFM!
    В документации это опущено, но если взглянуть в исходник, то у экземпляров класса Stream есть свойство resolution.
    Ответ написан
  • Как сделать сообщение бота ответом на команду?

    Vindicar
    @Vindicar
    RTFM!
    Может и слепой.
    Берешь свойство message у контекста, получаешь объект сообщения. У него есть метод reply().
    Ответ написан
    Комментировать
  • Как получить данные из postgresql в python?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, да, ваш цикл не имеет смысла именно по указанной причине.
    Последовательность должна быть сначала execute(), потом цикл for.
    Во-вторых...
    "SELECT * from rawdata where deveui = '" + str(dev[0]) + "'

    Не делайте так. Освойте подстановку параметров.
    Ответ написан
    2 комментария
  • Каким образом изменяется id объектов внутри изменяемых типов данных?

    Vindicar
    @Vindicar
    RTFM!
    Первый сценарий: элемент списка хранил ссылку на одно число (экземпляр типа int), потом стал хранить ссылку на другое. Сам список при этом располагается по тому же адресу, что и раньше.
    Второй сценарий: то же самое, но с элементом словаря.
    Ответ написан
    Комментировать
  • Как перенести код с консольного питона на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    1. Поучи, как работают асинхронная программа, и почему цикл вида
    while True:
        schedule.run_pending()

    парализует её работу.
    2. Портируй код с использованием асинхронного aioschedule.
    Ответ написан
    8 комментариев
  • Как ускорить функцию на пайтоне?

    Vindicar
    @Vindicar
    RTFM!
    while Adj[x,rand] != 1:
        rand = np.random.randint(0,nodes_length)


    Ну проблема вот в этом, ты скакать по массиву так можешь очень долго. Почему бы не составить список индексов r для который Adj[x, r] != r, а потом сделать random.choice() из него?
    Ну и далее, numpy массивы не предназначены для изменения своей длины, вот это твое chrom = np.append(chrom,rand) чётко показывает, что тебе нужен список. Если очень надо, преврати его в массив перед возвратом.
    Ответ написан
    Комментировать