• Не могу приконектится к MySQL который Докере, при этом сам код отдельм проектом без докера, в чем проблема?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Много вопросов:
    - почему вы экспозите не тот же порт, который мапите наружу?
    - как сконфигурирована БД (database.env)? Может быть там порт не указан и сервер внтури контейнера слушает стандартный порт?
    - а БД в контейнере точно существует? Вы её инициализировали?
    Ответ написан
    Комментировать
  • Как сделать выборку из одинаковых по структуре таблиц?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    я делаю `clean` или `refactor`, если код разбивался или переносился между модулями.
    Ответ написан
    1 комментарий
  • Какую ОС ставить на домашний хостинг?

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

    Но я на вашем месте не морочился бы с локальным железом (если вы, конечно, не умный дом городите и не окальный NAS), а завёл себе VDS. Сейчас это недорого и для домашних проектов очень удобно.
    Ответ написан
    3 комментария
  • Где тут ошибка?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    UPD. Нет, пардон. JSON валидный на первом уровне:
    {'text': 'нажми на это сообщение',
     'bold': True,
     'color': 'dark_red',
     'clickEvent': {'action': 'run_command',
      'value': '/give @p written_book{pages:["{\\"text\\":\\"нажми на это сообщение\\",\\"bold\\":true,\\"color\\":\\"dark_red\\",\\"clickEvent\\":{\\"action\\":\\"run_command\\",\\"value\\":\\"/give @p oak_sign{BlockEntityTag:{Text1:\\\\\\"{\\\\\\\\\\\\\\"text\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"нажми на это сообщение\\\\\\\\\\\\\\",\\\\\\\\\\\\\\"bold\\\\\\\\\\\\\\":true,\\\\\\\\\\\\\\"color\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"dark_red\\\\\\\\\\\\\\",\\\\\\\\\\\\\\"clickEvent\\\\\\\\\\\\\\":{\\\\\\\\\\\\\\"action\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"run_command\\\\\\\\\\\\\\",\\\\\\\\\\\\\\"value\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"/title @a title {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"text\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"ТЫ ПРИЁМНЫЙ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"bold\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":true,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"color\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"gold\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"}\\\\\\\\\\\\\\"}}\\\\\\",id:\\\\\\"Sign\\\\\\"}}\\"}}"],title:"Custom Book",author:Player}'}}

    А дальше разворачивайте сами=)
    Ответ написан
    Комментировать
  • Как лучше провести валидацию силы пароля?

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

    Итак,
    1. накладывать оганичения нужно только на энтропию пароля, остальное пойдёт только во вред.
    2. ограничения должны нести рекомендаельный характер, имеет смысл сделать два порога энтропии. Совсем слабые пароли не допускать, средние допускать с предупреждением. Пусть пользователь осознаёт сложность пароля и сам соотносит ее с рисками злонамеренного подбора. Порог энтропии можно проверять на клиенте, базу популярных паролей придётся чекать на сервере.
    3. как следует солите пароли и не храните их в открытом ввиде. Это правило следовало бы вынести на первое место, но это не рейтинг мер, а просто важные замечания. Соль для каждого пароля можно хранить рядом с хешем пароля через разделитель, рядом же можно указать и название алгоритма хеширования.
    4. сложность пароля - не панацея. Нужно делать эффективную систему распознавания попыток подбора пароля. Если сильно ограничить скорость подбора пароля то пароль можно делать простым. Пример тому - пинкоды на вашей банковской карте. У вас всего три попытки неправильного ввода на сутки, ошибочные попытки на следующий день вовсе окирпичат вашу карточку. Не бывает простых решений. Нужно понимать также, что пароли могут брутфорситься не с целью подбора, а с целью блокирования входа законного владельца аккаунта.
    5. Не забывайте про двухфакторную авторизацию. Это важно.
    6. Обновляйте сессию пользователя при штатной работе в аккаунте. Не вынуждайте каждый раз вводить пароль по несольку раз на день. Этим, к примеру, постоянно грешит алиэкспресс. Но у них многое ерез задницу.
    7. Не делайте нестандартных форм авторизации, важно, чтобы ваша форма нормально работала с основными стандартными менеджерами паролей. Если пользователь пользуется менеджерами паролей, то это его осознанный выбор, он может быть вполне обоснован. Это гораздо лучше, чем пароль на стикере, прилепленый к монитору.
    8. Если делаете API, не требуйте использования в нём паролей. Сделайте нормальный менеджмент ключей, не заставляйте светить пользовательские пароли в открытом виде в скриптах и исходниках. Не все, пока еще, грамотно работают с секретами.
    Ответ написан
    1 комментарий
  • Почему не работает super, чтобы взять метод из второго родителя?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Первым аргуменом super нужно передавать класс C, а в третьем питоне вообще ничего не нужно передавать.
    Вызовите нужный метод нужного предка явно, если вам так уж нужно:
    class C(A, B):
        def hi(self):
            B.hi(self)

    Но если вам это нужно, значит вы где-то ошиблись в архитектуре, в дизайне классов и методов. Вы явно не ак поняли принципы ООП.
    Расскажите подробно для чего вам такое нужно, и вам здесь наверняка подскажут как сделать правильно.
    Ответ написан
  • Создание таблицы sql под отдельный приватный чат. Есть ли смысл и почему?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Короткий ответ: варинты 1 и 2 нормальные, третий очень плохой.
    Оптимальным будет первый вариант, потому что он повлечет за собой меньше всего кода. Просто добавится одно поле Адресат. Таким образом вы легко сможете добавить групповые чаты (кроме основого). вам не нужно будет синхронизировать и унифицировать между собой две отдельные модели сообщения, легко и без лишних кейсов можно сделать цитирование, не придётся писать отдельный код для реализации личных сообщений он удет тем же, что и при работе с общим или групповым чатом.
    Ответ написан
    3 комментария
  • Как решить эту задачу(ЕГЭ информатика 2021)?

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

    Есть такая классическая задача "упаковка рюкзака". Там даны неделимые предметы и их массы. У рюкзака есть максимально допустимая масса. Все предметы в рюкзак не влезут, но нужно нужно пдобрать такой набор, чтобы нагрузить рбюкзак максимально. Эта задача вычислительно сложная при большом числе предметов. Она решается полным перебором.

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

    Вот такая вот вам подсказка. Думайте, решайте, задавайте конкретные вопросы и вам дадут еще подсказок. Но готового решения вам здесь, надеюсь, не дадут. Нам нужна достойная смена, а не двоичники, за которых дяди задачки решают.

    Давайте я вам ещё рефакторинг вашего кода сделаю. Это не сделает его правильным, но он станет лучше.
    with open("zadanie26_var_1.txt") as f:  # Так открытый файл будет закрыт после считывания
        # Так вы считаете первые два числа в отдельные переменные:
        total_volume, users_count = map(int, f.readline().strip().split())
        # А так считаете остальные строки в список и нечаянные пустые строки вас не смутят:
        user_sizes = [int(line.strip()) for line in f if line]  
    
    # Хорошо бы вынести логику решения в отдельную функцию:
    def solve(s, n, lst):
        # Вот так можно сделать проверки корректности (ну чисто для себя) входных данных:
        assert s <= 10000, 'Invalid total volume'
        assert len(lst) == n, 'Users count is not valid.'
        assert n <= 2000, 'Wrong users count.'
        assert all(0 < x <= 100 for x in lst), 'Invalid user size.'
    
        # Вот здесь вот вы сделаете нужные вычисления ;)
        backup_users_count = ...
        max_backup_file_size = ...
    
        return backup_users_count, max_backup_file_size
    
    # Ну а вызвать функцию и напечатать ее результат вы тоже сумеете, правда?
    Ответ написан
    4 комментария
  • Быстрый способ подбора всех возможных вариаций значений массива какие есть способы?

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

    Автор вопроса не говорит как именно он хочет получить все эти варианты, но в любом случае сохранить такое количество элементов невозможно, в нащем Солнце атомов примерно всего лишь в сто раз больше, чем это число. Чувствуете проблемочку, да?

    Но задачу-то решать как-то надо. Давайте воспользуемся кодом Грея, чтобы можно было при переходе от варианта к варианту ограничиться изменением всего лишь одного бита. Но и это не поможет нам перебрать все варианты за разумное время.
    Пусть на один вариант нам потребуется безумно мало времени: один такт процессора. Сохранять мы варанты никуда не будем (потребовалось бы десять Юпитеров, чтобы на их атомах записать все варианты), просто покажем на экране. Да, за один такт этого не получится, но предсьавим себе что у нас такой специальный процессор с частотой 3 гигагерца. И нам потребуется 8099185802817355231125623242284335104 лет его работы.
    И всё это бессмысленно. Протсо автор вопроса не понимает чего хочет.
    Ответ написан
  • Как запретить ввод пробелов, скобок и тире в поле?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    https://regex101.com/r/nV9ZLS/1
    ^[^\s()-]*$
    Первая "крышка" означает, что это начало строки. Последний "доллар" означает конец строки.
    Между ними любое (0 или более символов) из множества, описанного в квадратны скобках.
    В квадратных скобках крышка означает, что множество инвертировано. То есть допускаются любые символы, кроме перечисленных.
    То есть, данное множество представляет собой НЕ: пробел, скобки и минус, но любые другие символы.
    Ответ написан
    1 комментарий
  • Как заменить кавычки в получаемом JSON во flask сервисе?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    фласк ничего не меняет, н просто десериализует json, а одинарные кавычки - это строковые литералы в питоне а не json.
    Ответ написан
    7 комментариев
  • Как обработать список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Используйте collections.deque параметром maxlen как очередь с вытеснением.
    При если файла нет в списке, доавляйте его, а лишний будет вытеснен.
    Ответ написан
    Комментировать
  • Как посчитать пройденную дистанцию с помощью map()?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ваш код можно сделать чуточку яснее вот так:
    def distance_traveled(self) -> float:
        return Movement(*self._movements[0]).distance + Movement(*self._movements[1]).distance

    А то, что вы хотите можно можно сделать так:
    return sum(Movement(*step).distance for step in self._movements)
    Ответ написан
    1 комментарий
  • Как использовать тип переменной key в питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Комментировать
  • Как исправить поиск файла?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    значит ошиблись где-то
    Ответ написан
    Комментировать
  • Можно ли сделать картографический сервис с SVG файлом более 20 мб?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Там 20 мегабат векторных данных? Не такая уж и большая проблема, если она у вас быстро рендерится и по содержанию устраивает. Вы бы показали сам svg. тогда было бы понятнее. Может там обычный растр, но каждый пиксель цветным прямоугольником свёрстан в svg, мало ли...
    В любом случае, что-то мне подсказывает, что вам не требуется именно в векторе вся физическая карта. Что вы там показывать предлагаете? Реки? Моря? Горы? Может быть отрендерить карту в растр всю или отдельные слои, а сверху положить контуры областей для интерактивного взаимодействия.

    Посмотрел упомянутый SVG и да, это долго и больно ждать пока он отрендерится браузером весь. В любом случае придётся его как-то либо сегментировать, либо расслаивать.
    Я бы вам порекомендовал посмотреть в сторону NextGIS Web. Исходники есть на гитхабе.
    Но ребята барыжат и данными, и советами, и помощью в импорте геоданных из OSM, хотя там ничего особо сложного и нет.
    Из полезного вам, там есть поддержка растровых и, вроде бы, векторных подложек, можно настроить свой сервер рендера тайлов. Кроме того они поддерживают слои и выделения. В том числе геоданные в слоях вполне могут быть невидимы, а минимальным кодом можно сделать свою выдачу подсвеченных объектов по клику на карте. При этом данные будут запрашиваться с сервера, а не храниться полным набором локально что делает работу с картами быстрее в плане первичной загрузки и рендера.

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

    В общем выбросьте свою svg-шку, предварительно нстроив в том же QGIS стиль, который будет копировать оформление этой карты. Может ыть стоит поискать готовый стиль, ведь наверняка уже кто-то озадачивался уже этой идеей. Потом настойте талйовый сервер, который будет генерить вам подложку в этом стиле и вы получите быстрый просмотрщик карты. Использовать ли NextGIS или пилить своё на leaflet'e (либо аналогах) - дело ваше, по райней мере можно подсмотреть что у них там как.
    Импортируйте снапшот OSM себе в локальную БД, можно отфильтровать ненужное, а можно и не фильтровать, если есть место. Я бы пофильтровал, у вас задача довольно узкая, но нужен весь шарик. К чему вам тогда детальная геометрия улочек и домов всех отрисованных захолустий планеты?
    Наверно весь необходимый вам объём влезет в пару сотен метров, если не упарываться сильно с фильтрацией, а может и меньше.
    Старайтесь использовать стандартные протоколы передачи гео-данных. NextGIS поддерживает WMS из коробки, но можно найти и плагин для лифлета. Можно, кстати, остановитьс яи на голом GeoJSON, если не использовать NextGIS пилить свой бэкенд к вашей карте. то искат, агрегировать и выдавать нужную геометрию в GeoJSON умеет postgis из коробки посредством чистого SQL.

    Итак. Резюмируем варианты:
    1) NextGIS - и вы получаете:
    - работу с геоданными и слоями на пользовательском уровне,
    - достаточно понятное место в исходниках бэка, куда можно вписать свою логику выборки данных,
    - лютый гемор (если ребята не доилили свои фронтовые решения) с модификацией фронтенда некстгиса под свои задачи;
    - профессиональну подготовку данных и консультации (правда платно, но не дорого), у них в портфолио есть задачи и похлеще вашей.
    2) Бэк на каком-нибудь Flask или ноде, который будет отрабатывать API клика по карте и отдавать при необходимости geojson, доставая его из postgis через SQL. Растровые тайлы рендерить стандартными сревисами рендера. благо их много. Единственное. что повозитесь с подгонкой стиля, но если онне критичен, то можно взять сторонние сервисы.
    3) Порежьте ваш svg на векторные или растровые тайлы, но с уменьшением детализации на мелких масштабах, чтобы показывать на фоне через лифлет, а сверху кладите отдельный GeoJSON с реками, с горами или с чем вам там надо для каждого конкретного случая. Это самый трудоёмкий, на мой взгляд, вариант, и самый труднорасширяемый в дальнейшем.
    Ответ написан
    4 комментария
  • Где находится log в linux с записями о низком уровне памяти?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Не всем подойдёт. но если у вас уже используется python, то выдать любую инфу можно так:
    py "(lambda t, u, f: f'Total: {t}; Used: {u} ({100*u/t:.0f}%); Free: {f} ({100*f/t:.0f}%)')(*shutil.disk_usage('/'))"
    Ответ написан
    Комментировать
  • Как в Python 3 изменить голос?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я сам не пробовал. но вот нашлась либа на первых секундах поиска: https://pypi.org/project/pyvoicechanger/
    Вы ее смотрели?
    Ответ написан