• Должен ли программист выполнять роль девопса на сервере заказчика?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нужно поставлять свои решения с развертыванием в докере. Компоуз файл ему отдаете и говорите. что дальше не ваша забота. Может он на QNX каком-нибудь или OS/2 решил бы все завести. Это его проблемы.
    Ну а то, что вы не согласовали заранее требования к платформе и окружению, не оговорили в каком виже будет поставка и какие вы готовы обеспечить работы по развертыванию - это теперь ваши обоюдные роблемы.
    Если вы уже отдали ему исходники, то он может попытаться свалить с ними под предлогом, что вы ничего не развернули на его железе.
    То. что не оговорено в договоре, будет геморроем. Ну а там уж только меряться кому геморрой длиннее покажется.
    Ответ написан
    Комментировать
  • Для каких проектов и задач в backend предпочтительнее Python с фреймворком Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы немного путаете причины и следствия.
    Если ML и аналитику делают чаще всего н апитоне, это не значит, что на питоне делают чаще всего аналитику и ML. Просто для аналитики и ML в питоне очень много "батареек", он в этом направлении лидер. Но основное применение питона - это бэкенд. Джанго действительно очень популярна, и его только недавно стал перегонять FastAPI соблазняя своей асинхронностью.
    Прелесть и преимущество Джанги в его самодостаточности для многих направлений применения. Там и довольно элегантный ORM в коробке, и шаблонизатор, и, что часто очень важно, простя в использовании и мощная админка с системой атворизации и управления правами. Практически с голой джангой и за пол часика можно быстро набросать модель данных и развернуть MVP, причем совсем не придётся тратить время ни на авторизацию, ни на организацию всяких там систем миграций, таск-менеджмента, модульного согласования разных фичей и т.д..
    А если учесть, что гитхаб ломится от готовых блогов, магазинов, чатов, виджетов, систем работы с комментариями в виде приложений для джанго, а эти приложения егко собираются в один проект и не толкаются друг с другом локтями при этом, то тут вполне можно понять почему Джанго так популярен.
    Питон в целом и Джанго в частности дают скорость разработки, которой позавидуют любые другие языки и фреймворки. При этом язык довольно свежий, современный и удобный.

    Однако меня смущает ваша постановка вопроса. Такое ощущение, что вы себе стек подбираете по озвученным критериям. Эдак могу посоветовать идти в перловики. На перле тонны легаси, в котором сейчас хрен кто ладу даёт, все бегут на что-то покомфортнее, а зарплаты у перловиков из-за вакуума на рынке не маленькая. Ну там, где это вижу я. Да, будущего у языка нет, но здесь и сейчас можно постричь бабла и подоминировать на своей нещаменимости=).
    Java - это жирный энтерпрайз, там всегда были и будут деньги. Полагаю крупные компании не сильно боятся обучать себе джунов, потому что эти джуны не улизнут в стартапы и будут залочены на корпоративный сегмент.
    Почему меня сутил ваш подход. Дело в том, что разных направлений развития много и в каждом можно преуспеть, но преуспеть в любом направлении сложнее, если вы выбрали его не по "зову сердца", а по меркантильным соображениям и требованиям рынка. У вас может просто не хватить мотивации, чтобы добиться нужного уровня профессионализма для востребованности в выбранном сегменте.
    Ответ написан
    Комментировать
  • Как определить коллизию квадратов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Алгоритмов тут за вас никто придумывать не будет. Этот ресурс не для этого.
    Учитесь решать такие задачи начиная с более простых.
    Двухмерный случай с квадратами можно упростить понизив размерность задачи.
    Представьте, что у вас не квадраты, а отрезки и не на плоскости, а на оси.
    Нужно сформулировать булево выражение, которое будет истинно только в случае наложения отрезков (хотя бы частичного).
    Вам уже предлагали в комментариях попробовать представить квадраты не размерами, а координатами границ. Если у вас возникнут трудности и с вычислением координат правых нижних углов, то у меня для вас плохие новости...
    Попробуйте решить задачу для отрезков на оси, а потом подумать как расширить её для квадратов на плоскости.
    Если на этом этапе ещё не очевидно решение, то начинать следует с более простого. Хотя, казалось бы, куда уж проще.
    Ответ написан
    Комментировать
  • Почему скрипт не видит группу data?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Потому что вы два раза пытаетесь зачем-то спарсить http-ответ как JSON. Очевидно в Json один ответ.
    Вы ришли в магазин, запросили коробку конфет, вскрыли, получили список конфет и выкинули вместе с коробкой и конфетами.
    Потом снова делаете двидение руками, будто берете с прилавка коробку конфет (но ее там нет же, вы только одну запросили у продавца), лезете в воображаемую коробку рукой и не находите там конфету.
    Странно, правда?

    Если бы вы не нарушалиправило и не постили код в виде скриншотов, то я бы вам процитировал ваши ошибки и, наверно даже, написал бы как равильно делать.
    Но вы нарушаете правила.
    Ответ написан
    3 комментария
  • Есть ли в python библиотеки для создания графики в стиле MS DOS?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем, собственно, у вас с этим проблема? Что особенного в этой графике? Пиксели крупные, ну так и вы нарисуйте пиксели крупные. Можно даже графический режим такой включить, но смысла мало, можно просто рисовать пиксели прямоугольниками.
    Я понимаю речь бы шла о текстовом режиме, но тут-то что такого MS-DOS'овского?
    PyGame и в путь.
    Ответ написан
    Комментировать
  • Почему csv writer не записывает все итерации, хотя должен?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Почему csv iterator не записывает все, хотя должен?

    Нет, не должен. Итератор не должен ничего записывать, он интератор. Итератор итерирует. Всё.

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

    Во-первых, вы не привели примера данных. Если что-то идёт не так, как ожидается, ВСЕГДА нужно приводить два набора данных: тот, который работает как ожидается и тот, который как ожидается не работает. При этом не обязательно приводить полные наборы данных, ведь их может оказаться очень много. Всегда нужно стараться упростить непонятную ситуацию максимально, и в какой-то момен она станет понятной. Ну, то есть, возможных причин проблемы в рассмотрении станет достаточно мало, чтобы понять какая из них действительна.
    В данном случае нужно было убирать из CSV всё лишнее до тех пор, пока проблема сохраняется. Если убирать уже нечего, то останутся только проблемные записи и, возможно, посмотрев на них, вы сразу всё поймёте. Или поймёт тот, к кому вы пришли с вопросом.

    query = """variables_loaded[variables_iterator]['0']""" ##, так далее

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

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

    execute_query(connection, query)

    В-третьих, вы оставляете за скобками код выполнения SQL-запроса. Мы не знаем что это за код, может быть там вы тупо try-except'ом задавили все возможные ошибки и сами, фактически, отказались от того, чтобы БД вам объяснила в чем проблема. Может быть это вообе пустая функция внутри, или она неправильно обернута каким-нибудь декоратором, который ей не дает работать, а вы просто видите в БД одни и те же данные, и думаете. что они каждый раз туда заливаются вновь вот этим неработающим вообще кодом.

    Как нам судить обо всём этом букете гипотетических пробелм, если вы старательно все улики замели под ковер? Для чего вы это сделали?
    Ответ написан
    2 комментария
  • Запись, получение, хранение текстовой информации в Python, как реализовать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам нужно многое понять и изучить прежде чем такая задача станет вам под силу. Судя по постановке вопроса вы очень далеки пока что от понимания основ алгоритмизации и структур данных.
    Конечно можно ставить любое уникальное значение любому объекту. Структура данных, которая это позволяет, называется map, а в питоне её реализует тип dict - это словарь, который ставит в соответствие любой объект любому уникальному другому объекту.
    Я уверен моего объяснения будет не достаточно вам. Почитайте любую книжку по питону с нуля, например, Марк Лутц пишет приемлемые.
    Ещё вам определенно понадобится какая-то БД, например sqlite, или что-то посерьёзнее, например postgres. Базы жанных - это тоже отдельный целый мир, но вам не нужно вних сильно углубляться, однако, одного вопроса, да и вообще вопросов будет недостаточно для нормального понимания.

    Я вам рекомендовал бы обратиться к фрилансерам за таким ботом, либо, если самому интересно, то читайте книжку по питону с нуля и там вам всё будет объяснено, что нужно для простого бота с вашей функциональностью.
    Ответ написан
    1 комментарий
  • Почему socket работает только в локальной сети? Как это исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Дело в том, что пока ваши устройства в одной подсети (им выдал адреса один DHCP сервер, это обычно ваш роутер), вы, указав локальный IP другого устройства в сокете, можете создать соединение.
    Но если устройства в разных локальных сетях, между которыми не настоен никакой роутинг, то устройства не смогут видеть друг друга. Их адреса будут в разных адресных пространствах.
    Это как звонить внутри отеля по внутреннему номеру телефона. Если один из абонентов окажется в другом отеле, то, даже зная его внутренний номер, вы из первого отеля не дозвонитесь ему напрямую по короткому номеру. Придётся пользоваться шлюзом. Вот шлюз - это NAT.
    Тут дальше аналогия уже поплывёт, если ещё глубже пытаться её применять.
    Прочитайте что такое NAT, что такое белый IP, динамический и статический IP, что такое port-forwarding, сетевая модель OSI, что такое маска подсети и как устроен IP-адрес, как происходит маршрутизация.
    Это слишком много инфы, чтобы рассказывать вам об этом в ответе на один вопрос. Вам нужно изучать это самостоятельно.
    Ответ написан
    3 комментария
  • Что делать, если неработает скрипт?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Павел Панов
    про эту строку from collections.abc import Mapping то я незнаю как и куда её нужно вставить

    Выглядит так, будто вы немного забегаете вперед в изучении языка.
    Прочитайте в любой книге (например Марка Лутца) что такое импорты, как они работают, что за стандартная библиотека collections и что за "Mapping", как он переместился внутри стандартной библиотеки между версиями питона.
    Также можно поискать историю версий питна и почитать когда произошел перенос Mapping, можно выбрать нужную версию интерпретатора, под которую написан ваш скрипт.
    Скорее всего это какой-нибудь 2.7. более точные выводы делать не по чем.
    Ответ написан
  • Как из jpg сделать epub-fb2?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Простым способом никак. Нужно сперва распознать текст на картинках - это называется OCR.
    Есть онлайн сервисы, которые это делают, можно это делать с помощью finereader'а.
    Далее нужно отформатировать и откорректировать неверно распознанные фрагменты текста, убрать лишние пробелы, поправить абзацы.
    Редакторов для fb2 навалом. Вот, например, опенсорсный.
    Было бы сильно проще, если бы вы показали пример типичного вашего jpg с текстом. Как там отформатированы абзацы, встречаются ли иллюстрации, есть ли переносы слов, что за шрифт и ровные ли строки, какой фон и есть ли шум. Всё это будет влиять на распознавание, и какие-то мелкие операции для приведения готового текста в норму.
    Ответ написан
  • Почему не сохраняется проект в PyCharm?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если файлы не менялись, то они и не будут перезаписываться. И у каталога не поменяется дата, если набор файлов в нём не изменился. А в .idea сохраняются настройки и кэш pycharm'а, которые относятся к вашему проекту.
    При нормально работе в IDE ничего сохранять не нужно. оно само сохраняется.
    А вот что нужно - это пользоваться системой контроля версий. Например GIT
    Ответ написан
    Комментировать
  • Можно ли как-то огранчить opencv по поиску объектов на изображении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Да просто обрежьте картинку перед тем как отдать opencv и все.

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

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

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вот такой вот можно использовать. Тоже светодиод и фотодиод инфракрасные. Светит модулировнным сигналом, и, как только "видит" свой сигнал (отраженный от чего-то вроде руки) своим фотодиодом, реагирует.
    Ответ написан
    Комментировать
  • Как вытащить нужные данные из файла?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно реплейсить первый символ на "{", а последний на "}" (если там были не квадратные скобки, то валимся с ошибкой). Ну и предпоследний символ если запятая, то его удаляем.
    Ну и кавычку добавить придётся вторым символом.
    Если от валидного json ваш текст отличают только эти нюансы, то предложенного выше будет достаточно, потом просто парсим как json.

    Ещё можно без модификаций этот текст загрузить как yaml стандартной библиотекой.
    При этом вы получите список из трёх элементов:
    1) строка 'created_at":"2022-08-11T14:01:46.886Z"'
    2) Словарь с одним элементом: {'city': 'Lawton'}
    3) Словарь с одним элементом: {'country': 'US'}
    Ну а что с этим потом делать - уже разберетесь.
    Yaml гораздо больше вольностей в своём формате допускает.
    Ответ написан
    5 комментариев
  • Как работать с БД из другого класса?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Из приведённого кода не понятно для чего вообще выделен класс Sql.
    Фактически вы используете только один метод этого класса, а содержимое конструктора можно разместить в том же методе.
    Бессмысленно и беспощадно.
    Самое правильное - это делать всё как можно проще.
    Вот два очень полезных принципа в разработке:
    - https://ru.wikipedia.org/wiki/KISS_(принцип)
    - https://ru.wikipedia.org/wiki/Бритва_Оккама

    В приведённом вами куске кода не нужен класс sql, достаточно сделать всё внутри одной функции, ведь вы не используете созданный обьект больше никак.
    Другой вопрос, если вам нужно делать много запросов в рамках одного подключения к БД. На подключение тратяся некоторые накладные расходы по времени и трафику, иногда логично вынести подключение и хранить его в выделенном персистентном состоянии, которое будет создано один раз и переиспольовано для множества запросов. В этом случае закрывать коннект после запроса нельзя.
    Прочитайте вот: https://pavel-karateev.gitbook.io/intermediate-pyt...
    Обычно коннект к БД уже является менеджером контекста. Для чего вы делаете вот эту бессмысленную обёртку вокруг - не ясно.
    В соответствии с хоошим стилем прогаммирования нужно, чтобы действие любой функции можно было охарактеризовать простой короткой фразой без союзов, без "и" и "или", без "если".
    Иначе эту функцию стоило бы разбить на более мелкие и простые функции.
    Вот ознакомьтесь с концепцией чистой функции: https://dvmn.org/encyclopedia/clean_code/decomposi...
    Ответ написан
    2 комментария
  • Как расшифровать Exit code?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Начать нужно с того. что никогда не стрелять себе в ногу вот таким вот способом:
    try:
        object_list = Questions.objects.filter(Q(q_name__icontains=q))
    except Exception:
        print('Ошибочка')

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

    Подключите логирование, вынесите в фонфиге в отдельный лог-файл все debug-логи этого модуля и вообще все ошибки. Прологируйте детально все этапы с указанием количества найденных элементов, в общем всё, по порядку, что может пойти не так.
    Откройте лог-файл командой tail -F my_log_file.log в терминале, и вы будете в реальном времени видеть всё, причем гораздо лучше, чем напечатанное принтом.
    Вы можете убрать временно вообще все условия в фильтрации для поиска и проверить работает ли вывод и корректно ли сработает шаблон. А мы тут как заглянем в вашу БД? Может она пустая или вы коннектитесь не туда.
    Ответ написан
  • Как задать логирование через дописывание .log в vscode?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Комментировать