• Почему Питон скрипт не записывает вывод в .txt файл (сервер c ubuntu 20.04)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну и как мы должны гадать что у вас там в этом скрипте? Вы могли накосячить с правами на заись в каталог или накосячить с путями. Без исходников такое не определить.
    Ещёнужно знать какие права на каталог, куда вы пытаетесь писать файл и под каким юзером зпускается скрипт.

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

    То, что вы не видите никаких ошибок в логах, свидетельствует о том, что скрипт написан плохо. То, что владелец скрипта - рут, тоже свидетельствует об отсутствии понимания как работает система прав в линуксе.
    Ответ написан
  • Ошибка 'latin-1' кодек не может обработать символы. Что мне делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Для более точного ответа нужно болше кода и полный стектрейс.
    Но уже здесь видно, что вы неправильно кодируете строку. Зачем-то еще и приводите байтовый литерал к строке... Мне кажется у вас там не china в случае ошибки.
    Ответ написан
    Комментировать
  • Как в Python перевести string в bytes, не меняя string?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если вы хотите сохранить в БД бинарные данные. то у вас есть три варианта:
    1) Хранить в БД данные в поле типа binary blob. В таком поле может храниться произвольный набор байтов, он не птается преобраховаться в строку при работе.
    2) Хранить в БД экранированную строку в поле обычного строкового типа. При этом все непечатные и спец-символы должны быть экранированны специальной последовательностью, которая состоит из печатных обычных символов. Тогда нужно перед испольованием полученных из БД данных разэкранировать строку и получить байты.
    3) Можно хранить данные в БД в обычном текстовом или текстовом blob-поле, но в виде закодированно последовательности base16 или base64. В base64 каждые два байта кодируются тремя символами из 64-битного набора печатных символов. Нужно кодировать и декодировать такие строки при сохранении\загрузке.

    Вам больше всего подходит base64. Посмотрите в документации как с этим работать
    Ответ написан
    4 комментария
  • Как округлять числа после деления в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Самым правильным будет не округлять, я преобразовывать в строку с нужной точностью.
    f'{54 / 11:.1f}'
    Обычно в вычислениях нужно работать с по возможности наиболее точными числами. но выводить в результате округленные числа без лишних знаков.
    Округление с помощью round для этих целей может сделать "сюрприз". Не все дроби можно представить конечным числом знаков в любой системе счисления. Например, в десятичной системе нельзя представить 1/3, а в троичиной легко, как и в девятиричной. В двоичной системе не получится представить 0.2, а в десятичной вот я только что это сделал. В двоичной системе счисления получится периодическая запись.
    В компе числа с плавающей токой представлены в двоичной форме, и да, некоторые десятичные числа с конечным числом знаков после запятой будут в двоичном виде запиываться не точно. потому что потребуется бесконечное число знаков для точной записи.
    В общем, round испольуем только если по алгоритму нам требуется округленное значение в промежуточных вычислениях. Для округления результата с целью показать человеку нужно использовать округление при приведении к строке.
    Ответ написан
    Комментировать
  • Как загрузить картинку в базу данных сайта с python?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы не предоставили достаточной информации для ответа.
    Не понятно какой библиотекой для работы с БД вы пользуетесь. Но в любой есть механизм работы с бинарными данными.
    И нет, в текстовый формат бинарные данные не требуется переводить. Это избыточно, медленно и неэкономично.
    Приведите код, которым вы вставляете какие-то другие данные в вашу таблицу, тогда будет понятнее в каком ключе вам подсказывать решение.
    загрузить изображение в базу данных сайта

    А если у вашего сайта уже есть API для загрузки и получения (отображения) изображений, то вам, скорее всего, вообще не придётся работать с БД, достаточно использовать API сайта через скрипт на питоне и изображение загрузится на сайт штатным способом, как это делается со стороны браущера.

    В общем мало подробностей для корректного обстоятельного ответа.
    Ответ написан
    Комментировать
  • Какой использовать GSM модем для приема и чтения SMS сообщений?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Практически любой.
    Полно в сети инструкций
    https://xakep.ru/2015/04/07/195-sms/
    https://habr.com/ru/post/133085/
    Не искали что ли ответа в гугле? ем вам не подошли те ответы. что дает гугл на первой странице?
    Ответ написан
  • Как сделать выносную кнопку включения пк из переключателя от механической клавиатуры?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вообще я механический свитч от клавиатуры в руках никогда не держал, но на всех картинках в инете они нормально-размокнутыми показаны. Вот, например: https://habr.com/ru/post/140454/
    Это значит что кнпку включения можно напрямую заменить. Почему нет?
    Но если надо именно инвертировать сигнал, то можно воспользоваться транзистором и резистором. .Можно взять полевой транзистор любой почти и притянуть ему базу к нулю через кнопку. И через резистор в несколько килоом к пдюсу постоянного питания. А цепь сток-исток включить вместо штатной кнопки (только полярность не перепутать).
    Тогда размыкание притяжки к нулю приведет к открытию транзистора и включению компа.
    Ответ написан
    Комментировать
  • Почему пустой кортеж весит больше, чем кортеж с одним числом?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    b - это не кортеж. Это просто единичка (int)
    Вот так правильно:
    a = ()
    b = (1,)
    Ответ написан
    Комментировать
  • Что дешевле: переменные или массив?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    FFmpeg позволит вам соединить отдельные кадры в видеоролик и свести этот ролик со звуковой дорожкой, но не более.
    Сами кадры стекстом придётся чем-то рисовать. Причем не только сам текст печатать, но и покадрово раскладывать анимацию.
    Если в приведенном вами примере была "простая уинетическая анимация", то для ее отрисовки готовых стандартных утилит скорее всего нет никаких. Придётся делать модель и рендерить ее.
    В принципе, задача не сложная. В том примере. что вы привели есть две четко выраженные фазы:
    1) добавление слова
    2) анимация масштабирования всего холста так, чтобы добавленное слово заполнило по ширине основную часть экрана.

    На первой фазе слово может быть добавлено просто снизу текущей области отображения с рандомным размером шрифта. Первое слово каждой строки (или предложения) переворачивается на рандомный бок.
    На второй фазе происходит покадровая анимация перемещения, масштабирования и (если надо) поворота всего холста до заполнения центральной части только что добавленным прямоугольником. Несложная математика.
    Да, динамика процесса нелинейная, а первое слово там после немножко еще уменьшается после максимальной фазы, но это уже детали.
    Ответ написан
    4 комментария
  • Как работает это решение задачи с LeetCode?

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

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

    Что конкрено не понятно?

    Вот поэкспериментируйте сами:
    class ListNode:
        def __init__(self, val, next=None):
            self.val = val
            self.next = next
    
        def __str__(self):
            tail = self.next and f', {self.next}' or ''
            return f'{self.val!r}{tail}'
    
        def __next__(self):
            if self.next:
                return self.next
            raise StopIteration
    
        def __iter__(self):
            item = self
            while item:
                yield item.val
                item = item.next
    
        def copy(self):
            return ListNode(self.val, self.next and self.next.copy())
        
        __repr__ = __str__
    
    
     ln=ListNode; l=ln(1, ln(1, ln(2, ln(3, ln(3)))))
    Ответ написан
    Комментировать
  • Как записать hashsum в файл?

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

    Так бывает когда пытаешься переделывать прогу совершенно не понимая что в ней творится. Наймите фрилансера на эту задачу за сто рублей, или учите питон с нуля, он вам может пригодиться и дальше
    Ответ написан
    Комментировать
  • Как преобразовывать RSS в PDF?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    https://habr.com/ru/post/459112/
    Погуглить - не?
    Ну а RSS обойти простеньким скриптиком.
    Ответ написан
    Комментировать
  • Как быть с этой функцией?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Типо Начинающий кодер IT :D, в сообщении нельзя отпрвить видеоролик, который больше допустимого по объёму. Как отправить маленький ролик есть в документации к библиотеке, на которой реализован ваш бот.
    Большой фильм можно пересылать только в виде ссылки на страницу просмотра на каком-то ресурсе вроде ютуба, кинопоиска или нетфликсе, или ещё где-то. Невозможно в сообщении прислать фильм целиком в виде вложенного видеоролика. Не поместится.

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Такого рода проблемы все и всегда решаются однотипно.
    1. Необходимо сформулировать критерии наличия проблемы.
    Как именно пропадает интернет, насколько часто, как надолго. Это нужно для диагностики. поиска причины и определения ушла ли проблема после принятия каких либо мер.
    2. Делить проблему на части и проверять части по отдельности.
    Самый эффективный способ делить - это пополам. Отсекаем часть сети и проверяем наличие проблемы в обеих частях (если есть возможность) или в одной из частей.
    3. Когда найден минимальный проблемный участок, который уже нельзя или бессмысленно делить - заменяем его.
    4. Помним, что чаще всего сложные проблемы - это композиция нескольких более простых. которые по отдельности могут не проявляться. В вашем случае может быть проблема, связанная с нагрузкой на роутер, например, которую создает один из услов из-за плохого контакта обжима и большого объёма биттых пакетов. Устранив одну из причин, вы, может быть, сделаете проявления проблемы реже, но не устраните её полностью. К примеру, если замените ротуер, битые пакеты будут всё равно будут нагружать вашу сеть и портить ее производительность, но это будет не так очевидно. Переобжав коннектор вы избавитесь от части нагрузки, но еслив ваш ротуер работал на переделе, то лишний вафай-клиент или тяжелый видос в сети сможет его снова нагрузить до критического снижения производительности.

    Итак, пробежимся по перечисленным пунктам сначала.
    1. Критерии. Поиск критериев - это часть решения. Обычно в этом случае нуно сорать необходимую статистику. Есть куча софта, который это умеет делать, но пинг есть всегда под рукой.
    Для этой тулзы есть две полезных опции: ключ для бесконечного пинга и размер пакета.
    В разных ОС эти ключи немного разные, поэтому ищите их отдельно, у меня нет винды под рукой, поэтому не стану на этом заострять.
    Скаж лишь, что пинговать лучше большими пакетами, жалетально превышающими размер TTL, прописанный в роутере. Тогда такой пинг будет реже проскакивать в периоды хорошей связи, то есть выловит больше пролблем.
    Пинговать нужно в отдельных окнах сразу несколько хостов:
    - ya.ru - этот хост всегда отвечает на пинги и выявит проблемы с DNS
    - 8.8.8.8 - это гугловый DNS-сервер, тоже всегда отвечает на пинги, покажет, что связь с инетом есть даже если DNS, прописанныйна компе не правильно работает.
    - 192.168.0.1 - или какой там IP у вашего роутера. Нужно. чтбы отделить проблемы с инетом от проблем с внутренней связностью до роутера
    - 192.168.0.x - ip одного из компов в сети. Я обычно пингую несколько компов, доступных через баксимальное число потенциально проблемных узлов - ethernet-розеток, свичей, вайфай-соединений... Этот пинг поможет понять где проблема, во внутрисетевой связности или в последней миле.

    Учтите, что проблемы часто бывают комбинированные и каждое сочетание симптомов будет свидетельствовать о раных проблемах.
    Да, тревожным принаком может служить не только пропадание пакетов, но и скачки в длительности их возврата, особенно если такие длительности достигают 500мс и выше. Но и скачки от 3мс до 250мс тоже будут свидетельствовать о каких-то проблемах.

    Запускать пинг на всех компах лучше одновременно и на некоторое время. Например минут на 20. Потом по статистике будет видно сколько где пакетов пропало.

    2. Если критерии наличия проблемы позволяют, то можно попробовать отрубать части сети и смотреть наличие проблемы. Это я в том смысле, что если проблема происходит в среднем раз в пару-тройку часов, то отрубать на многие часы части сети при диагностикем ожет быть неприемлемым.
    Редкеи пробемы дольше отлавливать. Но напоминаю, что критерии можно детализировать, ведь если пакеты у вас пропадат относительно редко, то скачки времени их возврата могут случаться чаще и подсвечивать проблему. Также можно сделать рамер пакета близким к максимальному, это должно тоже в некоторых случаях участить проявление проблемы.
    Иногда не мешает нагрузить сеть комированием по локалке большого файла. В линуксе можнно с помощью утилиты tc послать большой поток рандомных байт на любой сокет..
    3. Плавающие проблемы случаются из-за плохого обжима, перебитого жверью кабеля, перегрызенного UTP в плинтусе, из-за умиращих конденсаторов в блоке питания роутера (БП может не выдавать необходимого при нагрузках тока, но вольтметром такая неисправность не будет различима без нагрузки). Вообще старые (да и не только) роутеры могут страдать поплывшими электролитическими конденсаторами не только в блоках питания.
    Хорошо, когда можно подменить роутер.
    4. ну с четвертым пунктом ничего не пососветуешь, только разделать и тестировать все по отедльности и в разных сочетания и да поможет нам ктулху.

    А для тех, кто дочитал этот опус до конйа - интересная задачка. Что пингуют эти команды, как и почему?
    ping 1.1
    ping 2130706433

    Тех, кто знает, попрошу не спойлерить=)
    Пусть для кого-то будет сюрпризом этот дивный мир=)

    UPD. Простите за адское количество опечаток в тексте. Писал в спешке и с непривычной клавиатуры. Исправлю всё попозже. Не ожидал, что многим ответ придётся по душе. Вроде ж накапитанил как мог.
    Ответ написан
    5 комментариев
  • Чем лучше слушать книги?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    С помощью TTS я через AlReader слушал. В принципе, приемлемо. Но всё же предпочитаю искать на торрентах книги в живлй озвучке и слушать Podcast Addict'ом.
    Даже наловчился скриптом rss делать и заивать на vds, чтобы книга не сразу весь объём на смартфоне занимала, а по главам загружалась, хотя с современными смартфонами это вообще не критично.
    Ответ написан
    Комментировать
  • Можно ли использовать датчик mpu9250 для измерения положения робота в пространстве?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Обычно такие задачи решаются с помощью фильтра Калмана. Но вам этого датчика будет недостаточно для вашей задачи. Акселерометры не показывают абсолютных координат, они дают только скорость изменения скорости. Для получения координат надо дважды интегрировать ускорение, а при этом быстро накапливается ошибка, ведь нет способа ее устранить.
    Для устранения ошибок используют дополнительную информацию о положении робота. К примеру можно поставить энкодеры на колёса, тогда сведения о перемещении вы будете получать не только от интегрирования ускорений, но и от вращения колёс. При этом вы никак не решаете проблему ошибки, вознкающей з-за проскальзывания колёс.
    Вообще, фильтр калмана довольно гибкий инструмент, он подразумевает построение модели перемещения вашего робота и фильтрует поток информации с датчиков в соответствии с тем, насколько близко их показания соответствуют модели перемещения.
    Грубо говоря, например, будут приняты с малым коэффициентом показания датчиков, которые говорят, что робот внезапно дёрнулся влево с большой скоростью и ускорением, которое очень маловероятно для математической модели перемещения вашего робота. А вот показания. которые близки к тому, что предсказывает модель, будут приняты с коэффициентом, близким к единице.
    Прочитайте про фильтр Калмана, подумайте какие еще датчики можно прикрутить к вашему роботу кроме акселерометров и гироскопов, которые, безусловно, способны помочь, но их будет не достаточно для навигации робота в локальной системе координат.
    Самый точный способ - это маркировать робота инфракрасным или любым другим светодиодом и находить его камерой, подвешенной над сценой. Так вы получите достаточно точную локализацию и относительно дешево.
    Можно оставить на робота сканирующий оптический пассивный радар (фотодиод в трубочке на вращающейся башне), а маячки разместить на местности. Так робот вращая своей башней (с энкодером дляопределения угла поворота относительно корпуса робота) и регистрируя модулированные уникальные сигналы от маячков. сможет триангулировать и доуточнять своё положение. Даже двух разнесенных маячков, если они не на одной линии с роботом, достаточно для очень неплохой точности локализации.
    Бывает, что на местности активные маячки разместить проблематично, тогда используются пассивные маркеры - яркие конусы, QR-коды, контрастные метки. Тогда на робота надо ставить камеру. таком случае добиться можно еще бОльшей точности локации, но в ущерб сложности и ресурсоемкости бортового оборудования.

    В следующий раз боле еразвернуто описывайте свою задачу. Тут либо спрашивающий потрудится описать (не)лишние детали своей задачи, либо отвечающим надо целую книгу писать, чтобы перебрать все возможные варианты.
    Проявляйте уважение к людям, которые вам хотят помочь.
    Ответ написан
    4 комментария
  • Как избавится от проблемы CORS в Flask?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    "x.x.x.x" - это невалидный ip-адрес и домена такого не существует.
    С чего вы взязли, что проблема в CORS? При GET-запросах CORS не задействуется.
    Ответ написан
  • Как использовать одновременно django и pyTelegrambotAPI?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Дополню соседний ответ для ясности.
    Не нужно городить монолит из совершенно разных сервисов.
    Если боту не обязательно реагировать на появление новых уведомлений в БД очень быстро, то можно сделать чтобы бот просто читал с некоторой периодичностьб ту же БД, что прописана в джанго. Можно построить индекс по таймштампу события и вычитывать все, что позднее прошлой проверки. Это будет и быстро и эффективно.
    Если реакция нужна очень быстрой, то лучше сделать очередь и применить pub\sub механизм. Бот подписывается на тред событий, а джанго пушит в него сообщения.
    Вполне можно в этом качестве использовать, например, rabbitmq.

    Если это просто односторонние уведомления, то, кстати, можно слать их прямо из кода на джанго через API. Но это если у бота нет интерактиности никакой с пользователем.
    Ответ написан
  • Как можно получить карту мира ввиде одного или нескольких изображений с максимальной детализацией?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Простешие арифметические вычисления вам бы показали, что единственное векторное изображение с таким количеством деталей вы ничем не сможете открыть и отрендерить.
    Растровое изображение тоже скорее всего превысит допустимые размеры популярных форматов, но даже изображения, близкие к максимальным по размеру уже будут открываться и отображаться очень долго даже на современном оборудовании.
    И это ещё речь незаходила об объёме картинки такого размера и с такой детализацией.
    Именно поэтому все современные картографические программы и сайты работают не с цельным изображением, а с тайлами: квадратными (обычно) картинками, векторными или растровыми, которые стыкуясь друг с другом ормируют фрагмент карты, который в данный момент виден на экране.

    Если бы действительно стояла такая абсурдная задача, то имело бы смысл, чтобы она стала хоть немного реалистичнее, разбить, всё же, всю карту на большие куски и рендерить их отдельно.
    Тут есть два подхода:
    1) можно качать готовые тайлы и клеить из них тайлы побольше. Есть много источников, многообразие которых можно оценить с помощью ресурса https://nakarte.me/. Это, кстати, opensource-прокт и его исодники доступны на гитхабе.
    Качать тайлы можно с помощью проги SAS planetа - www.sasgis.org/sasplaneta
    2) Самостоятельно рендерить карты загрузив и отфильтровав дамп БД OSM. Это более сложный путь, но он реализцется на готовых и вплне рабочих компонентах (за исключением абсурдного и нереализуемого требования про рендер в единый файл).

    Вы бы подробнее рассказали чего хотите добиться и для чего, а вам бы тут объяснили пределы возможного и целесоообразность разных попыток реалиации этого, а ещё как лучше делать то, что вы в итоге на самом деле хотите.
    https://habr.com/ru/post/270513/
    Ответ написан
    Комментировать