• Почему при вызове return вызывается конструктор копирования, а не перегрузка оператора =?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    coffeeMachine mix = device + machine;
    вызывает перегрузку конструктора копирования, а не перегрузку оператор =, почему?

    Потому что ты создаёшь здесь экземпляр класса, это делается конструктором. Поскольку ты хочешь его инициализировать другим экземпляром, используется конструктор копирования. Дело в том, что оператор = ожидает слева сконструированный объект, а в данной записи его нет.

    А если написать вот так:
    coffeeMachine mix; mix = device + machine;
    то ты сначала создаёшь экземпляр со значением по умолчанию, а потом вызываешь оператор =.
    Ответ написан
    Комментировать
  • Делается ли merge при rebase?

    toxa82
    @toxa82
    Итоговый результат слияния кода при merge и rebase одинаковый. Разница будет только в порядке коммитов в истории. Merge сверху применяет новые коммиты, rebase находит общего предка, убирает ваши новые коммиты в ветке, обновляет ветку, применяет ваши новые коммиты сверху.
    Ответ написан
    Комментировать
  • Как управлять мышью в играх через Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну я вижу целую пачку проблем с mouse_event().
    Note This function has been superseded. Use SendInput instead.

    Она устарела.
    Absolute data is specified as the mouse's actual x-coordinate; relative data is specified as the number of mickeys moved. A mickey is the amount that a mouse has to move for it to report that it has moved.

    При относительном движении координаты не в пикселях, а в каких-то других единицах.
    Relative mouse motion is subject to the settings for mouse speed and acceleration level. An end user sets these values using the Mouse application in Control Panel. An application obtains and sets these values with the SystemParametersInfo function.

    Результат зависит от настроек чувствительности и ускорения курсора.

    Так что разбирайся с SendInput(). Там нужно использовать структуру данных, что посложнее, но зато координаты в пикселях.
    Ответ написан
    Комментировать
  • Как управлять приложением windows средствами python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как работает EXPOSE?

    @q2digger
    никого не трогаю, починяю примус
    Идем в документацию https://docs.docker.com/engine/reference/builder/ и читаем.

    The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports.

    я очень часто вижу, что в контейнерах вообще не используют EXPOSE , просто описывают в docker-compose какие порты как должны пробрасываться и так далее. Но когда-то считалось хорошим правилом описывать в Dockerfile с помощью EXPOSE что и как должно в контейнере торчать наружу. Не отменяя при этом необходимости сделать docker -p 80:80 ну или что там вам надо.
    Ответ написан
    Комментировать
  • Как ускорить работу Python в разы?

    Vindicar
    @Vindicar
    RTFM!
    Ты документацию читал?
    get_symbol_ticker(**params)[source]
    Latest price for a symbol or symbols.

    Выделение моё. Судя по докам, get_symbol_ticker() позволяет за один запрос получать инфу сразу о нескольких символах. Готов спорить, что это будет быстрее.

    Так как в заголовке функции **params вместо нормального описания параметров, я подозреваю, что переданные параметры пробрасываются прямиком в API binance. Открываем доки на это API, благо ссылка есть прямо в первых доках. Видимо, что можно в параметрах передать строку symbol, или строку-список symbols вида
    ["BTCUSDT","BNBUSDT"]. Как я понял, это именно строка такого вида, а не список.

    Вот скажи мне, что тебе помешало найти эту информацию самостоятельно? Две минуты гуглежа, и это при том что я с бинансом не работал вообще.

    Ну и да, серьёзно? f'{str(ticker1)}', притом что ticker1 - это уже заведомо строка? Больше строк богу строк...
    Ответ написан
    Комментировать
  • Почему у практически идентичных условий разная скорость проверки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Могу предположить, что интерпретатор питона не пересчитывает во внутреннем цикле значение target - nums[i], поскольку оно во внутреннем цикле не меняется.
    А значение nums[i] + nums[j] надо пересчитывать каждый раз.
    Ответ написан
    1 комментарий
  • Как понять работу следующего кода по перегрузке операторов?

    Vindicar
    @Vindicar
    RTFM!
    Потому что питон пытается "извернуться", если описаны не все операторы.
    Если выполняется a < b, но не описан оператор a.__lt__(), питон попробует вызвать b.__gt__().
    Аналогично, если не описан __ne__() а только __eq__(), и выполняется a != b, питон сделает not (a == b)
    Кое что есть тут
    Также советую глянуть в сторону functools.total_ordering.
    Ответ написан
    3 комментария
  • Какая система потребляет больше ресурсов всех компонентов ПК?

    saboteur_kiev
    @saboteur_kiev Куратор тега Windows
    software engineer
    Это зависит от того, для чего нужна ОС.
    Сама по себе ОС потребляет почти ничего, вопрос что на ней запускать. Это следует уточнить.
    Ответ написан
    3 комментария
  • Какая система потребляет больше ресурсов всех компонентов ПК?

    @rPman
    почему бы не пойти дальше и не сравнить os2 с win32 и win nt4? (сарказм)

    зачем тебе это?

    на win xp sp0 не пойдет практически ни одно приложение, написаное последние лет 20, и потребует доустановки тонны компонент (типа vcredist), которые как раз входят в состав сервис паков.

    p.s. по теме вопроса - скорее всего обе ос будут потреблять одинаковое количество ресурсов, так как основаны они на одной и той же кодовой базе (за исключением различия сервиспаков)
    Ответ написан
    Комментировать
  • Что делать, не знаю чо писать?

    В данном случае, так как кода нет и экстрасенсы в отпуске - гуглить по запросу
    ModuleNotFoundError: No module named 'typing_extensions'
    Ответ написан
    Комментировать
  • Как писать программы, если отключат от лицензированного софта?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Будем писать код в блокноте и компилировать с помощью gcj. Да, конечно, будет непросто, а кому сейчас легко?
    Ответ написан
    Комментировать
  • Как быстро делать конспекты?

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

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Мне нравится актуализировать свои форки через rebase. Так история выглядит прозрачнее.

    ЗЫ
    В русском языке нет приставки «саб». Надо говорить подпроекты и подмодули. Но они тут не нужны. Обновление прекрасно работает через слияние либо перебазирование.
    Ответ написан
    4 комментария
  • Как пустить часть трафика через 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 клиента, без привязки к роутеру. Можно хоть на ноуте настроить, как я сделал.
    Ответ написан
    Комментировать
  • Как авторизовываться с помощью python requests?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Если вы ищете хоть какую-то информацию, то поищите в строке поиска вверху по тексту «requests авторизация». Множество ответов с примерами.
    Ответ написан
    2 комментария
  • Как распаковать многомерный список?

    @deliro
    Если глубина заранее неизвестна или варьируется, то проще всего сделать рекурсией. А чтобы не тратить лишнюю память, генераторами:
    def flatten(x):
        if isinstance(x, list):
            for q in x:
                yield from flatten(q)
        else:
            yield x


    >>> list(flatten([1,2,3, [1,2, [3, [[[[4]]]]]]]))
    [1, 2, 3, 1, 2, 3, 4]
    Ответ написан
    Комментировать
  • Подойдет ли Docker для следующих задач?

    vabka
    @vabka
    Токсичный шарпист
    https://www.docker.com/blog/containers-are-not-vms/
    Докер предназначен для развёртывания приложений, а не предоставления доступа к виртуальным машинам.

    1) Возможность подключаться по ssh, ftp с любого ПК в одной локальной сети.

    Просто любой гипервизор. Хоть hyper-v, хоть vmware
    2) Возможность сделать копию текущего состояния и развернуть на другом ПК со всеми файлами БД и.т.д. (Не в текущей локальной сети)

    Как в п1. С докером такое сложно будет организовать.
    3) Возможность работать с nginx, apache, npm, php, python, mysql (это если выбрать докер, то чтобы все это было в одном контейнере)

    Запихнуть всё в один докер контейнер - это достаточно серьёзные пляски с шелл-скриптами будут.
    А на виртуалке элементарно.
    4) Быстрое обновление до последних версий вышеуказанных модулей. (Как у докера. Указал в конфиге версии и собрал контейнер по новой)

    sudo apt update && sudo apt upgrade

    В общем тебе нужна либо нормальная виртуалка, либо менять подход, который ты будешь использовать.
    Например под твои задачи вполне должен подходить k8s, но тогда придётся менять подход, ибо никакого подключения по ssh и разделения одной "машины" между несколькими пользователями там не будет.
    Ответ написан
    2 комментария
  • В чем ошибка моего кода?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самое время познакомиться с темной стороной программирования.
    Начинающие вайтишники искренне думают, что программист - это типа такой художник. Берет мольберт, поллитру, кисти и начинает ВАЯТЬ. Потом отходит на шаг, любуется делом рук своих, и снова. Ваять. А потом сразу заказчику, за большие деньги.

    Так вот, в реальности это всё не так.
    Большую часть времени программист не пишет код.
    А пытается разобраться, почему он не работает.

    Так что мы будем сейчас учиться это делать.
    Тем более, что это в принципе несложно.
    Главное не думать, что чем-то поможет сидеть и тупить в свой кодик. И приглашать других людей потупить в него тоже бессмысленно. Потому что причина может быть совсем не в нем. но даже если проблема и в коде, то искать её всё равно надо по-другому.
    В код не надо тупить. Его надо ЗАПУСКАТЬ.
    И выводить промежуточные результаты. Проверять его работу.
    Заранее выяснить, какие должны быть значения у переменных, и проверять их на каждом этапе.
    Где не совпадут - там и проблема.
    В идеале IDE сама покажет содержание всех переменных при трассировке, но если пишешь код в блокнотике, то даже тупо писать var_dump($bar1,$var2,$var3...); и смотреть что там лежит.
    Условия проверять еще проще, тупо echo 'зашли в условие if (!empty($user))';
    И если лежит не то, или эхо не выводится - вот тогда уже смотреть в код и думать, почему так получилось.

    В частности, при авторизации надо проверить две вещи:
    1. Находится ли юзер по логину
    2. если находится, то проверить корректность хэша. Для этого при регистрации надо вывести полученный через password_hash пароль и записать на бумажке
    потом запросить сохраненный из БД и сравнить

    Кроме того
    Разумеется, отладка невозможна без сообщений об ошибках.
    В половине случаев РНР человеческим голосом сообщает в чем проблема.
    Поэтому всегда, в любом окружении должно стоять error_reporting(E_ALL);
    плюс на домашнем компике полезно прописать ini_set('display_errors', 1); чтобы сразу видеть ошибки на экране.
    На боевом сервере разумеется поставить 0 вместо 1, и добавить ini_set('log_errors', 1);

    У меня только один вопрос.
    Какой смысл вообще делать парольную защиту, если любой придурок сможет спокойно авторизоваться через SQL инъекцию?
    Ответ написан
    9 комментариев
  • Целесообразно ли хранить изображения как BLOB в БД?

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

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

    Достоинство выбора архивного формата - универсальность, наличие готового инструментария, возможность восстановления из коробки и главное, с архивом можно работать типовыми инструментами а не пилить свое.

    Но и свой формат тоже где то оправдан, например уменьшение накладных расходов на хранение (например убрав имена файлов, оставив их идентификатор, можно сильно сократить размеры каталога/индекса). Совет, индекс хранить в конце файла, чтобы при изменении размеров при обновлении, не пришлось перекачивать весь файл, только потому что из-за одного изменившегося файла все остальные сдвинулись на несколько байт.

    p.s. использовать sqlite для хранения файлов - плохая практика, даже если чтение будет быстрым (за счет того что sqlite это не сетевое подключение к базе данных, нет сериализации передаваемых данных и прочее), с записью все будет гораздо хуже. Попробуй гигабайтовой sqlite базой поманипулируй, тебе сильно не понравится (очень медленно), когда как обычный архиватор с опцией нулевого сжатия, работает на максимальной скорости работы диска.
    Ответ написан
    Комментировать