Задать вопрос
  • Почему не выводит посты на сайт Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В комментариях ответили. В контекст передаётся коллекция статей в одной переменной, а в шаблоне итерируется другая.
    Ответ написан
    2 комментария
  • Python не может найти путь к файлу?

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

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

    Чтобы мой ответ не был совсем бсполезным, могу посоветовать вот этот сайт: https://alexgyver.ru/
    Здесь полно обучающих материалов, рассказано как работать с ардуино, RGB-светодиодами и адресными лентами. У автора сайта есть канал на ютубе с кучей обучающих роликов, а также подборки компонентов, инструментов и прочего. Есть даже проект лампы-будильника, о которой вы спрашиваете: https://alexgyver.ru/dawn-clock/
    Ответ написан
    Комментировать
  • Как исправить AttributeError: 'NoneType' object has no attribute 'find_all'?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Нужно приводить сообщение об ошибке полностью. Всё целиком что пишется в терминал. Там исчерпывающая информация о том, что конкретно и где пошло не так.
    2. Если вы не способны читать сообщения об ошибках, то вам надо учиться на более простых примерах. Сейчас же ваша проблема выглядит так, что вы совершенно не умея программировать и не зная основ пытаетесь с помощью данного ресурса решить свою какую-то задачу.
    3. У вас в коде только два места. где происходит вызов метода find_all. В котором конкретно ваша проблема указано в подробном сообщении об ошибке, которое вы не потрудились привести.
    4. 'NoneType' object has no attribute 'find_all' означает, что вы пытаетесь вызвать метод у объекта, у которого нет этого метода. Видно даже у какого объекта - у Null.
    5. Если вам этих намёков не достаточно, то вам следует взять учебник по питону и начинать учиться с простого. Или обратитесь к фрилансерам за помощью.
    Ответ написан
    Комментировать
  • Как вычленить из текста ФИО на python, при том что конкретных шаблонов нет?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В общем случае эта задача не решается на 100% по определению.
    Вы говорите, что вокруг фамилий у вас произвольный текст, а это значит, что среди этого текста попадаются слова, которые чем-то похожи на ФИО, но не ФИО, или имя отчество, без фамилии, или что-то вроде "светкин василёк Игоревич". Можно это считать таким экзотическим ФИО, или отчество тут просто отдельно стоит и искать его не надо?
    В любом случае схема решения примерно такая. Если у вас есть знаки препинания, то можно разбить по ним фрагменты текста, ФИО не разделяется знаками препинания (кроме дефиса), но дефис отличается от тире пробелами по бокам.
    Далее у вас есть цепочки слов. Если в цепочке N слов, то в ней, можно сказать, N-2 кандидата на ФИО.
    Каждая трока-кандидат на ФИО может быть проклассифицирована по ряду признаков, свидетельствующих в пользу того, является ли эта тройка ФИО. Осталось только определить набор признаков и веса этих признаков. Каждый признак определяет два показателя: 1) насколько этот признак добавляет шансов тройке быть ФИО; 2) на сколько несовпадение по этому признаку отнимает шансов быть ФИО. Показатели определяются от нуля до 1 и перемножаются. Подбор признаков и их показателей будет настройкой вашего классификатора.
    Тут дальше можно двигаться разными путями.
    Часть детектов вы сможете надёжно определять по окончанию отчества.
    Часть признаков у вас будут словарными словами, которые, по вашему, не могут быть именем и\или фамилией.
    На этом этапе уже будет довольно хорошая детекция. Вопрос что вам важнее, отсутствие false positive, или отсутствие false negative.
    Так же по-разному может повезти с входными данными. Если у вас много "ловушек" в виде разбросанных по тексту бесхозных отчеств, если у вас много очень странных имён... в общем тут вам никто не выдаст идеальное решение. При отсутствии четкого ТЗ результатом будет расплывчатое ХЗ.
    В целом обычно на настройку таких классификаторов под текст на первое время сажают людей. У нас сейчас есть ChatGPT и ему, думаю, вполне можно скидывать наборы имён, чтобы он вычеркивал те, которые вряд ли именами являются. Если вы приняли, что какое-то слово не может являться именем, или фамилией, то такое решение хорошо бы кэшировать, а затем для консистентности придерживаться аналогичного в других случаях.

    Странная у вас задача, сударь. Выглядит как учебная. В этом случае рассуждений вроде приведенных мной здесь хватило бы для успешного ответа на собеседовании.
    Ответ написан
    2 комментария
  • Как сделать подложку(карту) на Python?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Самый простой, быстрый и универсальный путь такой.
    Взять готовый https://github.com/nextgis/nextgisweb
    Развернуть его в докере и у вас практически всё что надо есть. Исходники тоже есть, так что можно допилить.
    Теперь на счет подложки. Всё зависит от того, насколько детальная вам нужна карта и какую площадь вы ею хотите покрыть. Если небольшую площадь или не очень глубокий зумм нужен, то можно просто файловый кэш тайлов локально хранить и отдавать тупо через nginx локально.
    Про массовое скачивание тайлов можно посмотреть вот этот проект sasgis.ru

    Я бы сделал получение тайлов из сети и кеширование в каком-нибудь key-value локальном сторадже. Для нужной территории сделал бы "прогрев" кэша, а саму карту либо nextgis'ом, либо сам на лифлете или аналогичных сверстал.
    Кстати, точки можно и не из базы потдятгивать, а разместить в том же файловом кеше файлы с geo-json порезанные рамками тайлов уровня 8, к примеру. Ну или какой вам удобно там будет. Смотря сколько точек.
    Ответ написан
    Комментировать
  • Как исправить TypeError: Node() takes no arguments?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Оформите код специальным тегом. Неужели не видно, что он в таком виде не читаемый?
    __init__ и init - две большие разницы. Читайте какие служебные методы бывают и что такое dunder-атрибуты.
    Ответ написан
    Комментировать
  • Будут ли два лазерных датчика мешать друг другу?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Обычно световой поток от датчика модулируется неким паттерном или ШИМ, а приёмник учитывает показания только в моменты высокого уровня этой модуляции. Так два или больше датчиков или какие-то блики не будут мешать сигналу. Можно операционным усилителем сравнивать уровни входного сигнала с включенным и выключенным лазером. Это отметёт помехи.
    Правильные лазерные датчики не будут мешать друг другу.
    Ответ написан
    Комментировать
  • Как отрисовывать Tileset'ы на Canvas?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    --dry-run убери=)
    О в комментах уже ответили оказывается.
    Ну, короче, это такой флаг, который позволяет что-то проделать "пешим по-конному", так сказать. Типа всё скачает, всё проделает понарошку, выхлоп будет адекватный как по-настоящему, но без аффекта на реальной системе, без записи.
    Ответ написан
    Комментировать
  • Как перенести базу данных из СУБД Postgresql в MySQL?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Представляете, если бы врачи с таким же уровнем понимания что делают делали трансплантацию органов? Нафаршировал пациента мелко порублеными топором органами донора и ждём выздоровления=).

    Ваш сервис видеоконференций наверно постоянно работает с БД, это значит, что для интеграции вам нужно постоянно делать экспорты. Странное решение дампить и переносить БД целиком. Типа если у вас молоток, то вокруг всё похоже на гвозди?

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

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

    Используйте профильные инструменты по назначению и не бойтесь осваивать новые. Такой вот совет.
    А если ближе к вашим попыткам, то смотрите глазами, SQL вполне читаемый, можно по шагам посмотреть что не так. Есть в экспортированном SQL данные? Что это за данные? Куда они вставляются? Есть они там, куда вставляются? Просто проследите поэтапнро.

    Вот про это я и говорил, когда объяснял, что костыльное решение очень трудно дебажить и поддерживать. У вас что-то идёт не так, но вместо того. чтобы разобраться пошагово, вы приходите и заставляете нас тут гадать на кофейной гуще без малейшей информации по теме.
    Ответ написан
    2 комментария
  • Можно ли оптимизировать этот код?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Конечно. Вот этот цикл совершенно не имеет никакого смысла:
    for i in range(len(t)):
        tl.append(t[i])

    Третий цикл тоже не нужен. Вы всё можете делать в одном цикле.
    Или это вы разрешения спрашивали? Никто не запрещает.
    Ответ написан
    2 комментария
  • Правильная и красивая замена if?

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

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

    Но учтите, что вам может захотеться хранить в таких вот местах какие-то чувствительные, т.н. секретные данные. Например, ключи шифрования, пароли для подключения к БД или другим сервисам, ключи API, всякие токены и т.д. Такие данные опасно, неудобно и неправильно хранить в репозитории вместе с кодом. Для хранения таких параметров тоже нужно использовать библиотеки для хранения, сериализации и десериализации настроек.

    Возможно у вас возникнет соблазн сейчас сделать вот так по-простому, а чувствительные данные и секреты тоже импортировать в виде питоновских модулей, но эти модули добавить в игнор-лист репозитория, а импортировать с соответствующим перехватом ошибок импорта... Так можно сделать, если вам критически не хочется брать в проект лишние зависимости, но это тот ещё геморрой. Лучше использовать специальные механизмы хранения настроек сразу. Тем более это потребует меньше кода (который нужно еще и тестировать) и сложности (которую принято выносить и тестировать отдельно, чем такие либы как Pydantic и занимается).
    Ответ написан
    1 комментарий
  • Можно ли восстановить данные?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если вопрос стоит в том, чтобы надёжно удалить, то лучше переписать весь освободившийся объём заполнив его мусором или хотя бы нулями. В линуксе это делается простой командой, в винде наверняка есть куча утилит.
    Для восстановления же нужно пробовать. Утилит тоже полно всяких. Теоретически можно.
    Ответ написан
    Комментировать
  • Как обезопасить post/get реквесты на фласке?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Шифровать ничего не надо, просто правильно реализовать авторизацию. Этому учат в учебниках, мануалах к фреймворкам, документации к библиотекам.
    Авторизация и аутентификация - это базовые принципы и технологии, вам не будут здесь индивидуально разъяснять такие элементарные вещи. Читайте профильные материалы в официальной документации.

    Ну или задавайте конкретные вопросы что у вас не получается.
    Ответ написан
    5 комментариев
  • Как симулировать сбои в файловой системе?

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

    Копать надо в сторону документации к своему языку программирования, к библиотекам, которыми вы взаимодействуете с файлами.
    Нужно делать аудит кода, понимать какие ошибки возможны в том или ином месте, в конкретных вызовах системных API прямых или косвенных. Эмулировать можно как обычно моками. Просто бросаете все возможные ошибки в моках и смотрите на реакцию тестов. Да, нужны юнит-тесты. Нужно правильно декомпозировать задачи, чтобы их легко можно было тестировать по частям, чтобы прозрачно было чем могут обернуться те или иные unhandled исключения.
    Почитайте про Gracefull Degradation, про иммутабельность, журналирование и прочее, что может пригодиться для разработки надёжного кода и архитектуры.
    А вы пытаетесь стрелять из ружья дробью по автомобилю, чтобы проверить его надёжность. Это не системный подход.
    Ответ написан
    Комментировать
  • Почему не работает скрипт в crontab?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Самая распространённая ошибка - это полагать, что команды в кронтабе выполняются так же как и в обычном баше. Нет.
    Нужно указывать абсолютные пути ко всем файлам которые запускаете.
    В данном случае это docker и head
    Ответ написан
    7 комментариев
  • Flask приложение и cache в gunicorn?

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

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

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

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