Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (62)

Лучшие ответы пользователя

Все ответы (165)
  • Как работает цикл for в питоне?

    @Vindicar
    Метод list.remove() удаляет элемент с указанным значением из списка.
    Проблема в том, что ты одновременно итерируешься по списку циклом for, и модифицируешь этот список через remove().
    Многие языки такую операцию вообще запрещают, питон, видимо, нет, но суть остаётся - когда ты удалил 1 (элемент с индексом 0), элементы списка сдвигаются к началу. И for видит, что элемент с индексом 0 удалили, а с элемента индексом 1 уже нет (из-за сдвига). Ну и решает что цикл кончился. Поэтому лучше таких ситуаций избегать!

    Решение:
    1. Если позарез нужно итерироваться и модифицировать список в одном цикле, сделай копию, например с помощью среза:
    for i in towers[:]:
    2. Если нужно просто очистить содержимое списка, не удаляя сам список, towers.clear() тебе в помощь.
    3. Если нужно оставить элементы, соответствующие условию, то подойдёт функция filter() или list comprehensions.
    Ответ написан
  • Почему 2 раза используется команда "push ax"?

    @Vindicar
    Обрати внимание, что двум вызовам push ax соответствуют два вызова pop ax.
    Push сохраняет регистр на стеке, смещая вершину стека. Pop выталкивает значение с вершины стека в регистр и смещает вершину назад. Поэтому паттерн push-use-pop встречается довольно часто, если нам нужен регистр, но мы не хотим терять его предыдущее значение.
    В твоем случае этот паттерн встретился дважды, один внутри другого. Внешний сохраняет регистр при входе в подпрограмму, и восстанавливает при выходе (чтобы поменьше мешать вызывающей подпрограмме). Внутренний - сохраняет регистр AX перед пересылкой, так как мы не можем напрямую писать в ES, только через другой регистр.
    Ответ написан
  • Непонятная дичь на сайтах с одного хостинга. wp-signups.php что происходит?

    @Vindicar
    Обычный заобфусцированный шеллкод.
    В конце кода видно обращение к curl, а потом fopen()+fwrite() - т.е. шелл умеет скачивать содержимое с указанного URL и записывать его в указанный файл на заражённом хостинге, предположительно для дальнейшего исполнения.

    delphinpro в комментариях правильно написал: проверяйте дату изменения файлов (если хакер ленивый, он её не подправил и заражённые файлы будут новее), удаляйте шелл код отовсюду.
    Я ещё добавлю: читайте логи вебсервера на предмет запросов к заражённым файлам, ищите хосты, которые обращались (наверняка китайские прокси). Потом ищите все запросы с этих хостов - если повезёт, поймёте как вас поломали. И в любом случае обновляйте вордпресс на последнюю версию, если это ещё не так.
    Ответ написан
  • Как это работает?

    @Vindicar
    Вложенная функция _fib_dict() работает рекурсивно, и ссылается на переменную fib_d в содержащей её функции.
    Ответ написан
  • Как прибавить +1 к значению в sqlite?

    @Vindicar
    > Сама ошибка - star = cursor.fetchone()[0]
    > TypeError: 'NoneType' object is not subscriptable

    not subscriptable означает что ты пытаешься взять индекс у объекта, который это не поддерживает. В твоем случае объект типа NoneType - т.е. None.
    Иными словами, cursor.fetchone() вернул None, и конечно у None нельзя взять индекс.
    Почему fetchone() вернул None? Потому что запрос SELECT не нашёл ни одной строки с подходящим значением photo!

    Как это решить?
    Вставить в таблицу строку с photo, а если не получится (так как такое photo уже есть), то обновить. Есть два способа.
    1. Кодом. Проверить, что вернул fetchone(). Если None, то делаем INSERT. Если не None, то UPDATE.
    2. Средствами БД, что обычно называется UPDATE/INSERT, или коротко UPSERT. Для sqlite это потребует примерно такого запроса:
    INSERT INTO stars (photo, star) VALUES (ид фото, 1) ON CONFLICT (photo) DO UPDATE SET star = star + 1

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

    ВАЖНО
    f'SELECT star FROM stars WHERE photo = "{photo}"' - никогда так не делайте! Особенно если входные данные получены от пользователя. Это хороший способ заполучить SQL-инъекцию.
    Используйте placeholders, по порядку:
    cursor.execute('SELECT star FROM stars WHERE photo = ?', (photo, ) )
    или по именам
    cursor.execute('SELECT star FROM stars WHERE photo = :photo', {'photo' : photo} )
    И удобнее и безопаснее.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (5)