• Как это сверстать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Так а в чем проблема-то? Вы как-то попробовали и у вас не получилось? PNG-картинку с прозрачностью не вариант поставить?
    Ответ написан
  • Как нормально установить python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    При установке питона обычным инсталлятором там должна быть галочка, которая заставит инсталлятор прописать пути к питону в path. Давно не имел дело с виндой, так что не ручаюсь.
    Однако, даже если без этой галочки, вы можете найти установленны йитон в файловой системе (посмотреть куда ведут ярлыки, например) и прописать в настройках путь, указав его в path.
    Ответ написан
    Комментировать
  • Полиморфизм - это обратное наследование?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Это ваше собственное определение про обратное наследование?
    Родительский класс ничего не знает о методах потомков.
    Полиморфизм нужен для организации уровня абстракции.
    У автомобиля есть абстрактный интерфейс: разгоняться, тормозить, поворачивать. Вы применяете соответствующие методы, а под капотом происходит полиморфизм в зависимости от того, на какой машине вы едете: на ДВС при ускорении отодвигается заслонка, обогащается сместь, поступает в форсунки, увеличиваются обороты; у электромобиля частотник увеличивает частоту, синусоиды, идущей на двигатели, он начинает крутиться быстрее... Потом кто-то придумал гибрид и там всё гораздо сложнее, но на уровне "предка" обо всём этом не нужно думать, благодаря полиморфизму мы имеем простые понятные методы, которые у потомков реализованы по-своему.
    Ответ написан
    Комментировать
  • Как подключить python скрипт в автозапуск ubuntu 20.04?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Например прописать в crontab через директиву `@reboot`. Только пути надо даже для бинарников абсолютные указать.
    Ответ написан
    Комментировать
  • Почему configparser иногда не может правильно обработать русские символы в названии секции?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ух каша у вас какая-то тут из гипотез, суеверий, заблуждений и кусков кода, которые, как вам кажется, полностью обрисовывают проблему. А проблема у вас в том, что вы неправильно работаете с кодировками.

    Общие правила работы с кодировками в питоне я уже много раз рассказывал на этом ресурсе.
    На входе в программу мы всё переводим в юникод, а на выходе всё кодируем в байты.
    Для ясности: юникод - это не кодировка, это абстрактный способ однозначной нумерации символов. Кодировка - это способ представить символ (а символ имеет свой однозначный код в таблице Юникода) в виде набора байт.
    Итак, текст в юникоде - - это, образно говоря, последовтаельность номеров символов из таблицы юникода.
    Текст в любой кодировке - это последовательность байтов.
    Важно отметить, что так или инае номера юникода тоже внутри компа хранятся как байты, а питон с ними работает не как с массивом чисел, а как с объектом "строка", значит внутри он всё же хранит юникод в какой-то специальной кодировке, но тут есть важная деталь.

    Есть кодировки, способные представить ВСЕ возможные символы Юникода, а есть кодировки, которые могут представить только некоторое подмножество этих символов. К первым относятся UTF-8, UTF-16, UTF-32 - они по-разному представляют номер символа таблицы Юникод в виде байтов, но способны представить любой символ.
    Ко вторым, к примеру, однобайтовые кодировки cp1862, cp866, koi8 прочие. Такие кодировки - пережиток прошлого, когда в угоду простоте люди жертвовали универсальностью. Однако со временем, когда требоания к ПО и набору поддерживаемых символов изменилось, появилась необходимость как-то между этими кодировками переключаться, преобразовывать тексты, учитывать, что какойто текст без потери данных вовсе нельзя перевести из одной в другую кодировку, потому что каких то букв просто нет в целевой кодировке. Так простота накопилась техническим долгом и обернулась многократно возросшей сложностью учета всех этих нюансов.

    В питоне внутри для хранения юникод-строк (а в 3 питоне это основной вид строк) используется не помню какая и utf-кодировок, но она точно может представить любой символ таблицы Юникода. И нам не нужно даже знать что это за кодировка, нам нужно знать какая кодировка на входе и на выходе программы.
    У нас на входе и на выходе всегда байты. А именно:
    - стандартные потоки ввода, вывода и ошибок, а также другие пайпы - это обычные байтовые потоки, которые работают ка коткрытые файлы, но являются пайпами на уровне системы и могут быть пернеправлены в реальные файлы в файловой сисеме.
    - файлы - в файловой системе данные лежат в виде батов, и, в любом случае, нам нужно их как-то интерпретировать, если это текст.

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

    У вас, очевидно, self.task_name хранится в закодированном виде или некорректно преоразовывается.

    Магии не бывает. Ничего там случайным образом с разу на раз не переключается. Если вы видете разные поведения в рахных ситуациях, то просто упускаете какой-то фактор. К примеру в винде запуск из bat-файла, запуск из консоли и запуск кликом мышкой в проводнике могут повлечь за собой запуск процесса с передачей ему пайпов стандартных потоков ввода вывода в разных кодировках. Если в программе мы этого не учитываем, то можем столкнуться с таким поведением как у вас.

    Прологируйте значение вашего repr(self.task_name) перед взятием по ключу когда происходит ошибка и когда не происходит.
    Вы увидите что меняется.
    Ответ написан
  • Как организовать масштабирование/отказоустойчивость интернет-магазина?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    smilingcheater всё правильно написал. Дабвлю лишь, что нужно анализировать бутылочные горлышки и исправлять узкие места в первую очередь.
    Разбирайтесь с проблемами детально. Что значит "nginx твалится"? Годами работает и ничего с ним не происходит. Выясняйте что произошло, если такое поторяется, то нужно разбираться, а не надеяться, что кто-то даст универасльный простой, но концептуальный совет, который победит все возможные проблемы наперед.
    Правила тут простые: находим узкое место и расширяем его пока общая производительность в часы пик не будет удовлетворительной.
    Надальте сохранение логов, протоколируйте нагрузки, помониторьте базу. Если проблема извне, то попробуйте подобрать хостинг понадёжнее, сменить OVZ на KVM, разнести БД и бэк на разные инстансы, прикрутите балансировщик,
    Если где-то скорость не принципиальна и можно что-то отложить, добавляйте очередь.
    Ответ написан
    3 комментария
  • Как преобразовать аудио в массив в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Мало данных. Если ваш аудиофайл в WAV формате, то это уже фактически массив данных, который вам нужен. Достаточно отрезать от него "шапку", посмотреть в шапке битрейт и число каналов и соответственно интерпретировать как массив сэмплов нужной битности.
    Если файл закодирован кодеком (mp3, ogg, и т.д.), то сперва надо декодировать файл, а потом уже смотри, как говорится, первый пункт.
    Как именно это будет выгядеть в коде зависит от того, какой формат, какие библиотеки для работы с массивами анных используете. Конкретизируйте, пожалуйста.

    Ищется, кстати, элементарно:
    https://stackoverflow.com/questions/3049572/how-to...
    https://pythonbasics.org/convert-mp3-to-wav/
    https://www.geeksforgeeks.org/convert-mp3-to-wav-u...

    UPD:
    https://google.gik-team.com/?q=wav+python

    В итоге имеем:
    https://habr.com/ru/post/113239/
    https://docs.python.org/3/library/wave.html
    https://coderoad.ru/2060628/Чтение-wav-файлов-в-Python

    Это три перые ссылки в гугле. Если вы это найти не смогли, то прочь из профессии.
    Ответ написан
    2 комментария
  • Можно ли отправлять все ошибки из компилятора в какой то канал?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нужно делать это отдельным ботом, а лучше даже не ботом, а просто курлом дёргать API и засылать туда сообщения логов.
    Из самого бота это лучше не делать, особенно если речь о неожиданных ошибках.
    Ожидаемые (штатные) ошибки вполне можно слать из того же инстанса, где бот крутится.
    Итак, подключаете стандартный logging, настраиваете отдельный хендлер, фильтрующий нужный уровень сообщений, настраиваете форматтер. чтобы полноценный отчет об ошибке сформатировать.
    Можно поискать готовую либу такого хендлера, наверняка есть в pipy, а можно и самостоятельно заморочиться.

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

    UPD/
    Как я и говорил, полно готовых хендлеров:
    https://pypi.org/project/python-telegram-handler/
    https://pypi.org/project/python-telegram-logger/
    https://pypi.org/project/logging2telegram/
    https://pypi.org/project/tglogger/
    Ответ написан
    Комментировать
  • Как слить массивы объединив дубликаты пар ключ-значение?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Делайте group by по нужным полям, а остальные агрегируйте с помощью group_concat.
    Ответ написан
    Комментировать
  • Не могу понять для чего нужна эта строка в коде?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Таким неэлегантным способом автор получает номер очередной бутылки, чтобы отреагировать особым обраом на предпоследнюю бутылку, то есть сказать, что после нее осталась одна бутылка (именно в единственном числе).
    Ответ написан
    1 комментарий
  • Как сделать проверку действий в минуту?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Для этого используют структуру данных очередь (FIFO - First In First Out).
    Туда будут добавляться таймштампы сообщений, а очередь должна хранить "минутное окно" этих таймштампов.
    То есть последнее сообщение (в хвосте очереди) - это самое старое сообщение, а первое (в голове) - самое новое. Ко времени последнего сообщения на текущий момент прибавляем минуту и получаем время, когда нужно вытащить из очереди хвостовой элемент. Текущая длина очереди - это и есть количество сообщений за текущую минуту.
    Это если вам надо без выравнивания.
    Если нужно знать сколько сообщений было каждую минуту дискретно, то да, накапливаете счётчик и обнуляете его каждую целую минуту. Всё зависит от задачи.
    Ответ написан
    Комментировать
  • Выскакивает такая ошибка IndentationError: unindent does not match any outer indentation level, решить в моём коде и в чом вообще проблема?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас там то табуляции в отступах то пробелы. Для питона это критично. Читайте в любой книге для чайников. Тем более ответ на ваш вопрос можно нагуглить с первой попытки на любом утюге.
    Формтируйте код, перед публикацией соответствующими тегами. При этом у вас бы сразу отпали все вопросы.
    Ответ написан
    Комментировать
  • Как проверить международный номер телефона на валидность?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    По идее стандарт номера телефона, по которому отовсюду можно позвонить такой: "\+\d{11}".
    Проблемы могут возникнуть с местными городскими соращенными номерами, там может быть и 5 цифр и 6 и 7 без кода города. Но если вы собираете номера телефонов по всему миру. то код города и страны вам все равно нужен,а значит 11-значный номер в любом случае будет правильным.
    В разных местах по-разному ринято группировать цифры скобочками и дефисами. Но это к формату самого номера не относится, номер начинается с плюса и имеет 11 цифр. всё.
    Из него взяв первую одну или больше цифр можно получить код страны, потом. для местных номеров, код региона, потом местный номер, но это лишнее, мне кажется. Берите одиннадцать цифр и всё.
    Для разных стран можно предлагать пользователю разные форматы отображения и группировки цифр номера, но это уже прям можно сказать лишнее. Просто при вводе гнорируйте все кроме цифр, а плюс оставьте зафиксированным, чтобы люди догадались, что номер нужен в полном международном одиннадцатизначном формате.
    Ответ написан
    4 комментария
  • Как объединить два словаря по id?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну сначала следует один из списков превратить в словарь с ключом по идентификатору:

    d1 = {item['user_id']:item for item in list1}
    Потом превращаете в такой же словарь второй список, но по пути можно заодно и данные проапдейтить:
    d2 = {
        item['user_id']:{
            **item, 
            **d1.get(item['user_id'], {})
        } 
        for item in list2
    }

    Теперь, если вам нужен-таки список обратно, то делаете из словаря список его значений:
    list(d2.values())

    Во втором питоне нужно будет по-другому делать, это для третьего вариант.
    Ответ написан
    Комментировать
  • Как получить EXIF с JPG без использования библиотек?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Читайте документацию по встроенной библиотеке ctypes.
    Читайте спецификацию JPEG в целом и его блока EXIF данных в частности.
    Правда это не будет каким-то упражнением в работе с бинарными файлами. Весь интерфейс работы бинарными файлами сводится к установке курсора (seek) и чтения нужного количества байт от курсора. Остальное - это работа с бинарными структурами и данными.
    Ответ написан
    1 комментарий
  • Датчик нахождения устройства в воде?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Резистивный датчик - самое простое. Воизбежании корозии можно использовать два винта из нержавейки, шляпками торчащие наружу и герметично проходящие сквозь корпус. Если разместить их достаточно далеко или вообще диаметрально на корпусе, то смачивание не поможет. Хотя... О какой толщине плёнки воды идёт речь? Можно же и в ведро с водой положить девайс.
    Чтобы коррозии не было, можно, как предложили выше использовать переменный ток или просто меандр от средней точки через делитель напряжения.

    Конечно можно сделать и емкостной датчик. Изнутри на корпусе приклеить две отдельные фольгированные пластины. Если снаружи нет воды, то ёмкость такого конденсатора будет очень маленькой, но при добавлении воды она станет как бы еще двумя пластинами и в совокупности сформируется, как бы, два последовательных конденсатора. Включаете его в резонансный контур и подбираете его параметры так, чтобы резонанс наблюдался при наличии большого количества воды в качестве внешних обкладок.
    По наличию резонанса определяете погружение.
    Можно попробовать микроволновый датчик. Вот такой, например:
    https://aliexpress.ru/item/32880755669.html?spm=a2...
    Наверняка на воду он тоже будет реагировать. Вопрос как подобрать и настроить чувствительность на стабильное срабатывание и игнор стенок ёмкости.

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

    Если прибор будут старатьс яобмануть и для этого у злоумышленников будет много безнаказанных или нерегистрируемых попыток, то ничто вам не поможет. Всё равно обманут. Народ. когда ему это интересно, осваивает ТРИЗ на инстинктивном уровне. К примеру в бак с водой можно подвесить ведёрко на уровне вашего устройства, когда в баке есть вода - всё штатно, когда нет - в ведре останется вода и будет имитировать уровень для вашего прибора.
    В таких враждебных условиях можно бороться так:
    - Собирайте больше факторов контроля, держите их в секрете.
    - Не давайте злоумышленникам четкого и однозначного сигнала о срабатывании защиты, сигнализируйте тайно, либо вносите рандомайзер. Лучше проигнорировать часть атак, но зарепортить остальные, чем реагировать на каждую и дать тем самым возможность злоумышленникам легко и быстро подобрать параметры обхода.
    - Вносите задержку срабатывания сигнализации, лучше рандомизированную, ещё лучше, стобы сигнализация срабатывала не каждый раз. Это усложнит подбор параметров обхода, сделает его долгим и нерентабельным, позволит поймать с поличным злодеев.
    Ответ написан
    2 комментария
  • Проект - замок с уникальным id, который открывается и закрывается удаленно после оплаты. Как лучше реализовать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем проблема? Проплатите самую дешевую VDS, купите домен, настройте бесплатный SSL-сертификат, чтобы https был и безопасненько было. На VDS, чтобы не завязываться на одного единственного провайдера и легче было переносить сервер в случае чего, докер поставьте, сконфигурируйте докер-компоуз с контейнерами:
    - nginx для статики и заворачивания SSL,
    - БД (postgres или что вам там привычнее? Можно монгу)
    - напишите на питончике или любом языке который знаете простейший веб-сервис с API, который будет отвечать коробочкам кому когда открываться и закрваться, статусы с них собирать, уровень заряда там и прочую телеметрию. Можно под это дела фрилансера нанять, если сами не умеете.
    - можно отдельно поднять сайтик на этой же VDS и, если надо, какую-нибудь CMS готовую. Благодаря докеру все он у вас не будут толкатьс локтями и мешать друг другу своими зависимостями.

    Не забыть по крону прописать обновление сертификата (у letsencrypt есть certbot специальный).

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

    Коробочки ваши будут с заданным интервалом слать телеметрию на API, забирать инфу о необходимости открыться/закрыться. Если момент открытия и закрытия нужно соблюдать до секунд или точнее, то можно поднимать веб-сокет соединение, но лучше синкануть время и говорить коробочке во сколько открываться и закрываться.
    Ответ написан
    2 комментария
  • Как прикрепить файл из папки в сообщение вк?

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

    F = open(os.path.join(DIR, random.choice(os.listdir(DIR))))

    В переменной F у вас созраняется не картинка, не файл, и не его содержимое, а специальный объект, который позволяет получить содержимое файла с диска.
    У этого объекта есть техническое строковое представление, но оно никак не связано с содержимым файла.
    И вы это техническое название объекта, предназначенного для доступа к файлу подставляете в текст сообщения для отправки. Соответствующий результат и получаете.
    Даже если бы вы подставили в текст сообщения не техническое название объекта для доступа к файлу, а само содержимое файла, вам бы это все равно не помогло. Файл картинки - это бинарный файл. Там байты, которые не прочитать глазами. Вы неправильно пользуетесь библиотекой, не понимаете различия между файлом, его содержимым, его форматом и представлением.
    В комментариях к вашему вопросу вам сказали как загружать картинки чреез API контакта.
    Видимо содержимое файла нужно отправить http post-запросом на специальный сервис для ее хранения, а уж ее идентификатор прикрепить специальным образом в состав сообщения.

    Вы не указали какой библиотекой пользуетесь для работы с VK, не читаете документацию, пытаетесь наивно угадать как отправить кратинку на основе какого-то примера из сети.

    Ввиду всего вышесказанного могу вам сказать, что вам рано решать такие задачи. Поучитесь немного базовым вещам. Найдите документацию и примеры, разберите их.
    Сейчас, с учетом формулировки задачи, ответ как отправить картинку вам не поможет.
    Представьте, что "начинающий хирург" будет спрашивать в интернете почему пациенты, у которых он вырезает аппендицит не выздоравливают. На предоставленном фото он делает это не на том месте и кухонным ножиком.
    Ответ написан
    Комментировать
  • Рекурсивная функция F(n) и G(n). В чем ошибка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что ваши функции возвращают по отрицательным веткам своих условий? Как вы ЭТО прибавляете?
    Там же четко в сообщении сказано что присходит и в чем ошибка. Читайте же.
    Ответ написан
    Комментировать