• Как узнать IP адрес устройства, подключенного по Wi-Fi, раздаваемого с телефона, и ввести его в строку ввода Xamarin Form-ы?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Поставьте PingTools, наример, или любую софтину со сканнером локальной сети и просканируйте сеть.
    Если это не удаётся сделать со смратфона, где поднят вайфай, то можно подключиться к нему еще одним смартфоном и просканировать с него.
    Ответ написан
    Комментировать
  • Как найти ошибку в XML файле?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Читайте внимательно, в сообщении об ошибке у вас написано, что тег description должен быть простым и не должен содержать дочерних тегов, а у вас не так. Причем везде.
    <description>![CDATA[Матрас VIRGINIA Black&White MultiPack, Средней/Мягкой жесткости, высота 230 мм
          
          <strong>Состав:</strong>
          <ul>
            <li>Латекс перфорированный - 30 мм</li>
            <li>Кокос латексированный - 10 мм</li>
            <li>Термовойлок</li>
            <li>Блок независимых пружин Multi Pocket - 512 пружин/м²</li>
            <li>Термовойлок</li>
            <li>Пена с эффектом памяти (мемориформ) - 40 мм</li>
            <li>Короб из ППУ</li>
          </ul>
          <strong>Чехол:</strong> Трикотаж Black&White простеган на синтепоне.
          
          <b>Особенности матраса:</b>
          <ul>
            <li><span style="text-decoration: underline;">Термовойлок</span>, плотный и упругий материал, отлично изолирует пружинный блок от верхних слоёв матраса. Использование термовойлока обеспечивает более равномерное распределение давления пружин на тело, увеличивает комфорт и продлевает срок эксплуатации матраса.</li>
            <li><span style="text-decoration: underline;">Multi Pocket (мультипакет</span>) это блок с увеличенным (512 на 1 м²) ) числом независимых пружин. Они отличаются меньшим диаметром и, благодаря своей плотности, обеспечивают повышенную комфортность для спящего человека. Используется в матрасах, рекомендованных для людей с большим весом.</li>
            <li><span style="text-decoration: underline;">Кокосовое волокно</span> один из самых натуральных, экологичных и долговечных материалов. Кокосовое волокно не подвержено гниению, не вызывает аллергии, отлично вентилируется и не впитывает запахи. Используется для жёсткости и равномерному распределению веса на пружинный блок.</li>
            <li><span style="text-decoration: underline;">Перфорированный латекс</span> это замечательный материал, обладает гипоаллергенными свойствами и не допустит развития бактерий, которые смогут вызвать аллергию или нанести какой-то вред телу. Он не впитывает запахи и влагу. Пористая структура прекрасно «дышит» — влага, попавшая внутрь, тут же испаряется.</li>
            <li><span style="text-decoration: underline;">«Memory Foam» (мемориформ</span>) или «пена с эффектом памяти» – новое поколение эластичных наполнителей для матрасов. Тонко реагируют на нагрузку и тепло, создают ощущение невесомости во время отдыха, отсутствие ответного давления на тело и деликатная поддержка физиологических изгибов позвоночника, не подвержены биопоражениям, гипоаллергенный, отличная вентиляция спального места, гарантирует спокойный сон, долговечность, не накапливает пыль.</li>
            <li><span style="text-decoration: underline;">Чехол</span> собран из трикотажа, приятного на ощупь и имеющего дышащий эффект для проветривания и циркуляции воздуха внутри матраса. Чехол простеган на синтепоне, что делает его более мягким и долговечным.</li>
            <li><span style="text-decoration: underline;">Короб ППУ(пенополиуретановый</span>). Для сохранения внешнего вида матраса правильной формы по периметру матраса используется короб из пенополиуретана.</li>
          </ul>
          <strong>Характеристики</strong>
          <ul>
            <li>Производитель: ООО ТПФ Текса</li>
            <li>Страна производитель: Россия</li>
            <li>Материал наполнения: ППУ, Кокос, Латекс, Мемориформ, Термовойлок</li>
            <li>Пружинный блок: Независимый пружинный блок <span style="text-decoration: underline;">Multi Pocket</span></li>
            <li>Высота: 23 см</li>
            <li>Жесткость: Средняя/Мягкая</li>
            <li>Вес на спальное место: до 140 кг</li>
            <li>Сертификат: EAC</li>
            <li>Гарантия: 18 мес.</li>
          </ul>]]</description>
    Ответ написан
    Комментировать
  • Как сделать работу django и pyrogram одновременно?

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

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

    Как ситуация может исправиться сама собой? Да так же. Напрмер у вас запущен по крону скрипт бэкапа или той же самой ротации, который тоже работает от рута, но писался девопсами и учитывает историю с правами пересоздавая файл от имени нуного юзера или с нужными правами.

    Я могу дого гадать на койейной гуще, но ставить какие-то мониторинги - это охота на ведьм.
    Поищите все места, где присходит конфигурирование логов. Выясните какие процессы могут писать в этот файл и от чьего имени они запущены. Выясните какие крон-джобы запланированы и посмотрите по содержимому файлов и их метаданным когда именно случались проблемы.

    Важно. чтобы в каждый отдельный лог-файл писал один и только один процесс. Он же занимался его ротацией (если, к примеру, вы логгируете стандартной питонячьей либой). Ещё хорошая идея не засталять софт писать логи в файлы, пусть пишет логи в stderr и/или stdout, а оттуда вы их на уровне системы перенаправите куда положено и отфильтруете как надо. если необходимо.

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

    UPD:
    Почему-то не обратил внимания, что речь о логах mysql. Но всё по-прежнему: конфиг логгирования и ротации, распсиание и механизм ротации и бэкапа, поиск по конфигам фрагментов этого пути на предмет аномалий и повторов.
    Ответ написан
    Комментировать
  • Как посмотреть логи bluetooth на windows или linux?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В линуксе есть тулза bluetoothctl
    А вот статья про отладку https://wiki.ubuntu.com/DebuggingBluetooth
    Вы вообще искать пробовали прежде чем сюда приходить?
    Ответ написан
    Комментировать
  • Python exception, какой будет правильным?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    . чтоВообще игнорировать любые исключения - это очень плохая идея. Причин этому много даже за рамками тех, с которыми вы уже столкнулись.
    Если вы немного почитаете про обраотку исключений, то увидите блоков except в этой конструкции может быть несколько и они фильтруют происходящие исключения в том порядке, в котором указаны.
    В общем случае следует различать два вида исключений: штатные и нештатные.
    Штатные - это те исключения о которых вы знаете, которые предусматриваете. В данном контексте это, например KeyboardInterrupt. Кроме того, вам нужно понимать какие ещё исключения порождает ваш код, какие из этих исключений нжно считать штатными, и поэтому как-то конерктно обрабатывать ил игнорировать, а какие считать нештатными.

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

    Если ваш скрипт должен во что бы то ни стало работать и никогда не падать в продакшн-режиме, то можно поступить так:
    По факту KeyboardInterrupt делайте её рерайз. Остальные ошибки подробно логируйте и двигайтесь дальше:
    for item in items:
        try:
            ...
        except KeyboardInterrupt:
            raise
        except Exception as e:
            with open('errors.log', 'a') as log:
                log.write(f'{e}')
                # сюда же можно вывести трейсбэк, но я бы воспользовался стандартным логированием, чтобы не изобратать велосипед, однако его конфигурирование выходит за рамки данного отета.
    Ответ написан
    Комментировать
  • Как организовать docker-compose для микросервисов на локальной машине для разработки?

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

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

    Для разработки и отладки вы обычно изолированы в своём микросервисе, вам может быть достаточно для девелоперских нужд докер-компоуза, который поднимет вам БД, nginx, очереди и что вам там еще надо для нужд локальной отладки и тестирования.
    Ответ написан
    Комментировать
  • Как разбить массив на подмассивы используя "0" как разделитель?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Без сторонних либ я бы делал так:
    def split0(arr: list) -> list:
        res = [[]]
        for x in arr:
            res[-1].append(x) if x else res.append([])
        return res

    А вот для любителей функциональщины:
    from itertools import takewhile  
    def split0(a): 
        it = iter(a) 
        return [[x for x in takewhile(bool, it)] for _ in range(a.count(0) + 1)]
    Ответ написан
    2 комментария
  • Что тут надо отпаять/припаять что оно заработало?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Начнём стого, что это не bluetooth мышки, а простые с радиолинком. Для блютус мышей донгл обычно в комплекте не поставляется, поскольку расчет идет на то, что в компьютере уже встроен блютуз. Во всех ноутбуках почти он есть.
    Если мыши разные, то, скорее всего, у вас не получится ничего перепаять. По крайней мере следует детально сфотографировать мышь-донор и мыш-рецепиент, их платы с о всех сторон, внутренности донгла.
    Если мыши одинаковые, то можно посто плату из разбитой вставить в живую целиком. Если повреждены кнопки, перепаять их.
    Ответ написан
    7 комментариев
  • Как в django можно реализовать транслит url адресов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вот есть детальная каноничная окументация как такое делать
    https://learndjango.com/tutorials/django-slug-tutorial
    Если вам нужно удовлетворить какие-то свои изощренные хотелки, то, предполагается, что у вас уже достаточно опыта, чтобы обосновать таковые как с точки зрения производительности, так и с точки зрения архитектуры.
    Я не понимаю вот этого "не хочу". Детализируйте причину этого? У вас джанго лишь для рендера статического контента и вам не нужна индексация? Вы как-то глубоко переделали индексы и БД, чтобы отдельное поле было не нужно или выглядело слишком сложным?

    Мне кажется, что пока нет достаточно опыта и понимания, нужно делать классически и по документации. А когда появится глубокое понимание, то отпадут либо лишние сомнительные хотелки, либо вопросы как их удовлетворить.
    Ответ написан
    Комментировать
  • Как перебрать все возможные варианты?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    [''.join(letters) for letters in itertools.product(string.ascii_uppercase, string.ascii_uppercase)]


    То же, но красивенько:
    [
        ''.join(xy)
        for xy in itertools.product(*(string.ascii_uppercase,) * 2)
    ]
    Ответ написан
    1 комментарий
  • Как преобразовать список в диапазон?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    years[1] += 1
    range(*years)

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

    В итоге я бы провалидировал список годов убедившись, что он имеет ровно два элемента и они в разумнух пределах.
    Ответ написан
    Комментировать
  • Как выбрать 3 записи с максимальным значение PostgreSQL?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Отсортировать и указать лимит выдачи. Буквально. А в чем вопрос? Что у вас не получилось?
    Ответ написан
    7 комментариев
  • Какую модель контроллера температуры с возможностью отправки данных по GSM использовать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Можно взять с алиэкспресса ардуинку и GSM-модуль. К ардуинке подключаете по 1-wire сколько хотите датчиков DS18B20 с того же алиэкспресса.
    AT-командами заставляете GSM-модуль сделать подключение к вашему серверу и проксиовать туда UART с ардуинки. Ардуинка будет периодически снимать температуру с датчиков и слать их в GSM-модуль.
    Если частота опроса датчиков высокая не нужна, то имеет смысл усыплять GSM-модуль в периоды между отправками данных.
    Ответ написан
  • Что такое "типы данных" в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Все типы данных - это классы, но не все классы - это типы данных. Хотя классы - это типы=) но не буду вас путать.
    "map, range, срез" - это не типы данных.
    Полагаю в том вашем вопросе од типами жанных имеют в виду простые типы вроде строк, чисел с плавающей точкой, целых чисел и даже комплЕксных.
    Кортежи (tuple) и словари (dict) - это уже структуры данных, коллекции... как угодно. Да, технически это тоже классы и в каком-то смысле их можно назвать типами, но все эти терминологические дебри вам ни к чему.
    Просто считайте типами данных атомарные значения простых типов. Если к вам докопаются при таком понимании, то надо таких слать=).
    Дальше интереснее. range, к примеру, это класс, инстанс которого "умеет" делать генератор арифметических последовательностей. Вот это вот слово "умеет" связано с питоновским понятием протоколов. К примеру, если к объекту можно обратиться по индексу, значит он поддерживает соответствующий протокол __getitem__. Если объект поддерживает срезы, то в этот метод можно подать специальный объект - инстанс slice. Этот инстанс просто несёт три параметра среза (начало, конец и шаг), а как его будет применять объект - это на откуп программисту.

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

    Просто доверьтесь одному из учебников и не пытайтесь перепрыгнуть через голову.
    Ответ написан
    3 комментария
  • Вопрос про sqlite?

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

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

    Такое элегантно записыается с помощью функции divmod:
    month -= 1
    year_increment, month = divmod(month + 1, 12)
    month += 1
    Ответ написан
    Комментировать
  • Что такое range() в Python 3?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В целом всё верно. range реализоан как класс, при его инстанцировании (или вызове в качестве функции. что в питоне, суть, одно и тоже) формируется инстанс этого класса, который поддерживает протокол получения итератора.
    Если воспользоваться этим протоколом (iter(range(3, 33))), то получим итератор - инстанс класса range_iterator.
    Ещё инстанс range позволяет получать доступ к элементам по индексу, делать срезы, инвертировать, получать количество элементов, проверять на вхождение элемента и т.д.
    Ответ написан
    1 комментарий