• Как исправить кодировку на кирилице в телеграм-боте на Google Cloud?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Проблема в кривой работе с кодировкой в исходниках бота.
    Всё из-за программирования методом тыка. Не разобрались, сделали лишь бы работало на домашнем компе, а дома, наверно винда, где в терминале 866 в файловой системе где-то 1251 где-то utf-32. Когда не вполне понимаешь что делаешь, то делаешь как-то копипастой не весть как и оно работает... до поры до времени, пока локаль не поменяется, или умолчания, или файловая система с другой кодировкой не подвернётся, либо в терминале локаль будет указана другая. И ВСЁ ПРОПАЛО! ПАМАГИТИ! Вот вам кофейная гуща, гадайте что я там накалякал в исходниках и где через одно место кодировку преобразую.

    Судя по крякозябликам ваш "опытный" программст где-то захардкодил неправильное преобразование utf-8 в виндовую 1251. Вот можно по определителю понять:
    https://habr.com/ru/post/147843/

    Проблема явно в говнокоде.
    Ответ написан
    4 комментария
  • С чем связанна проблема кодировки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ответ.
    Это может быть связано с неправильной работой с кодировками.
    А именно перекодирование происходит:
    - не в ту кодировку
    - не из той кодировки.
    Обычно неопытные программисты не хотят разбираться с тем как правильно работать с кодировками и что такое юникод, а все проблемы решают методом тыка меняя код пока проблема не исчезнет. Из-за этого у них часто присходят преобразования по умолчанию, которые ломаются при смене операционной системы, при запуске другим спообом (из терминала, от имени другого пользователя, через крон...), при смене умолчаний (локали, настроек терминала, настроек БД).
    А ещё такие неопытные программисты до жути боятся сообщений об ошибках, но решать настоящие пролемы не хотят и гасят их в бесшумном режиме, отчего реальные проблемы маскируются под глобальныйми молчаливыми пустыми обработчиками ошибок. Это приводит к усложнению внутреннего поведения программы и вот таки вот случаям, как у вас.
    Когда у таких программистов возникают проблемы (а за ними дело не встанет), то эти программисты не описывают проблему детально, не показывают исходный код, не обрисовывают архитектуру своей системы, а просто спрашивают в чем может быть проблема.
    Исчерпывающий ответ на такой вопрос дать несложно. Вот он.
    Ответ написан
    Комментировать
  • Почему дублируются логи при использовании библиотеки logging?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так вы, судя по конфигу, именно этого и хотите. У вас по факту один логгер, который жрёт всё подряд и передает без разбора трем хендлерам.
    Вы запутались в именах. Имя хендлера не фильтрует логи. Вы создаете именованные логгеры в коде, но по этим именам нигде не фильтруете.
    Для сности и прозрачности рекомендую именовать хендлеры в конфиге с префиксом "handler_" или как-то так. Чтобы не было соблазно ошибиться в именах. Явное лучше неявного
    Вам в конфиге нужно сделать три логера, каждый из которых будет фильтровать свои логи и отдавать своему хендлеру.

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

    LOGGING_CONFIG = {
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': {
            'standard': {
                'format': '[%(asctime)s] %(levelname)s | %(name)s: %(message)s',
                'datefmt': '%Y-%m-%d %H:%M:%S',
            },
        },
        'handlers': {
            'std': {
                # 'level': 'INFO',
                'formatter': 'standard',
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout',
            },
        },
        'loggers': {
            'init': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
            'parse': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
            'getmail': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
        },
    }
    Ответ написан
    3 комментария
  • Почему запрос SQL возвращает пустоту?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    У вас максимальная модель выбирается среди всех продуктов: select max(model) from product
    и это может оказаться не принтер. А потом вы ищете принтер с именно такой моделью. Видимо такого нет.
    Ответ написан
    2 комментария
  • Как часть имени файла записать в тот же файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете вытащить дату из имени файла: fname[3:].rsplit('.', 1)[0]
    И добавить эту строку в начало каждой при записи.
    Осторожнее, ваш метод равнения интервалов будет работать корректно только в случае такого формата даты в имени файла, у которого сначала идет год потом месяц, потом день, а месяц и день выравнены нулями до двух знаков.
    Ответ написан
    Комментировать
  • Какие есть ошибки в коде?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В одном месте скобки поставил, а востальных таких же местах? Смотри внимательно.
    А ещё у тебя дискриминант в нижнем регистре употреблен в формулах, а присвоен в верхнем. В питоне это две разные переменные, он различает большие и малые буквы.
    Ещё имеет смысл приводить входные параметры не к int а к float, мало ли, коэффициенты захочется дробными задать. Универсальнее выйдет, хотя если по условию задачи это целые числа, то подкопаться к этому не получится.
    Ответ написан
    2 комментария
  • Как лучше разделить диски для Mint?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А что там думать? Удвоенный объём ОЗУ выделяете под своп раздел, гигов 50 под систему, остальное под хомяка. Жесткий диск примонтируйте в /hdd единым куском.
    Если не [ватит, сольёте временно хрмяка на hdd, переставите быстренько систему с переразбивкой как хотите и вернете хомяка. Минутное дело.
    Однако я последнее время вообще не разношу систему и хомяка па разные разделы. Фактически все разбито на своп и остальное.

    UPD.
    Вынужден внести поправочку.
    При наличии SSD думаю уже нет смысла в отдельном swap-разделе. Можно обойтись файлом.
    При наличии постоянно подключенного HDD нет смысла (ИМХО) даже разделять /home от системы. Меньше мороки.
    Делаем на SSD всё одним разделом, HDD монтируем в /hdd и живём - горя не знаем.
    Своп выделяем по размеру оперативы в файле/tmp/swap. Если не будет хватать, можно повысить квоты.
    Ответ написан
    7 комментариев
  • Чем заклеить светодиод?

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я делаю так, если уж приспичит, но нужно стараться делать выражения проще и читабельнее:
    print(*[
        str(int(i) ** 2) 
        for i in input().split(' ') 
        if int(i) % 2 == 1 and str(int(i) ** 2)[-1] != '9'
    ])

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что именно у вас вызывает вопросы?
    Вы реализовываете функцию, которая принимает текущий контекст, строку команды, и поток для вывода выхлопа.
    Если нужно REPL в терминале, то в цикле функцией input запрашиваете команду, передаёте её в выше упомянутую функцию.
    Можно сделать не функцию, а класс, тогда он может ъанить в себе контекст текущего состояния вашей командной оболочки и поток для вывода, а функция обработки команды может быть не одна, а много методов, помеченных префиксами или декораторами. так для каждой команды можно свой метод описать, а декораторами можно указывать права доступа к соответствующей команде, какую-то еще специфику.
    Если нужны команды с аргументами, ключами, параметрами, с автодокументацией, то можно воспользоваться встроенными библиотеками парсинга командной строки, например optparse, или сторонней развесистой библиотекой, например, click.

    Если командная стрроука нужна не в терминале, а, скажем, в браузере, то интерфейс обработки тот же, но в цикле приёма команд вы можете брать их не из stdin, а из веб-сокета или API на flask. Можно создать окно с помощью Tkinter или PySide\PyQt и запрашивать текст команд там. Можно поискать библиотеки реализации расширенных термиальных воможностей, где будет автодополнение, подсказки и прочее.

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

    Успехов.
    Кстати, я не искал, возможно (и даже наверняка) есть готовые продвинутые библиотеки для реализации кастомных REPL питоне. Наверно кто-то подкинет такие варианты в альтернативных ответах.
    Ответ написан
    Комментировать
  • Почему не совпадают результаты sha1?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Первое, что напрашивается проверить - это не обрезает ли сервис по длине. Сделайте иксы той же длины, что и игреки и проверьте повторно
    Ответ написан
  • Как удалить вредоносное ПО с Linux?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Универсальный ответ - переустанови систему. Если ты поимел глупость под суперъюзером запустить левый код, значит невозможно наверняка убедиться, что полностью выпилил все вредоносные артефакты.
    Проще и быстрее полностью переустановить систему.
    Домашний каталог можно забэкапить полностью (если нет привыки с него что-то запускать под рутом), иначе нужно взять только документы и настройки.
    Можно склонировать всю файловую систему в примонтированный файл, чтобы потом достать то, что забыл забэкапить.
    Ответ написан
    1 комментарий
  • Как брать точки на polyline через равные отрезки?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    в postgis есть спецмальная функция. Но если вам надо без бд в брузере, то придется искать готовые аналоги или реализовать самостоятельно.
    Вообще задача не сложная. Каждый отрезок полилайна имеет определенную длину.
    Ваша задача сводится к тому, чтобы отмерять определенное расстояние от начала полилайна и найти точку на этом расстоянии на нужном отрезке.
    Вычитаете из расстояния поочередно целые отрезки полилайна, пока есть такая возможность. Так вы найдёте отрезок, на котором будет искомая точка. Дальше этот отрезок нужно разбить в пропорции:
    (x2-x)/(x2-x1)=(y2-y)/(y2-y1)
    d^2=x^2+y^2

    Вот система уравнений, где
    x1, x2, y1, y2 - ординаты концов сегмента полилайна.
    d - остаток от расстояния, из которого вычли все целые сегменты,
    x, y - координаты искомой точки
    Ответ написан
    Комментировать
  • В какой программе создать JSON для анимации?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Сделайте в любом текстовом редакторе.
    Ответ написан
  • Python+Mysql возникает ошибка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Смотрите внимательнее:
    """inser into log
        (phrase, letters, ip, browser_string, results)
        values
        ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firfox', "{'e', 'i'})"""

    Используются тройные кавычки. СПрячем их для ясности:
    inser into log
        (phrase, letters, ip, browser_string, results)
        values
        ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firfox', "{'e', 'i'})

    что видим? у вас непарная двойная кавычка перед фигурной скобкой.
    Именно об этом вам "намекал" парсер SQL выдавая исключение и указывая на конкртеное место проблемы. Внимательно смотрите и увидите.
    Ответ написан
    Комментировать
  • Как изменить уже работающий сайт Wordpress?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Через админку, хотя смотря что менять на страницах собираетесь
    Ответ написан
  • Как реализовать валидацию добавления товаров в корзину?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from collections import Counter
    [k for k, v in Counter(items).items() if v > 1]
    Ответ написан
    3 комментария
  • Как реализовать "таймер неактивности функции" после использования функции?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Из вашего вопроса не ясно многопользовательский у вас планируется бот или однопользовательский. То есть будут ли одним инстансом бота пользоваться больше одного человека?
    Также не понятно в случае нескольких пользователей, у каждого своё ограничение раз в час, или на всех одно сообщение в час.
    В любом случае ваш бот должен хранить некоторую информацию - это называется хранить состояние.
    Вам нужно звранить дату последнего сообщения для каждого пользователя или для всех, в зависимости от постановки задачи. В общем случае для этого лучше всего использовать какую-то БД вроде монги или sqlite. В случае SQLite ничего ставить не нужно, всё. что требуется, уже есть в комплекте с питоном.
    Я бы рекомендовал сделать при запуске создать в ней, если еще не создана, таблицу с идентификатором пользователя и датой последнего сообщения. В последствии можно будет реализовать оба варианта функциональности.

    В итоге дату последнего сообщения достаете из таблицы, прибавляете к ней час, если получилось более позднее время, чем текущее, значит постить нельзя. В случае поста просто обновляем время в БД.
    Ответ написан