• Как сделать пагинацию в Django для итерируемых в шаблоне объектов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В таких случаях обычно не разворачивают дерево начиная с какого-то уровня, иначе найти что-то полезное при наличии пагинации становится очень трудно. К примеру, у какого-нибудь Donald Duck'а будет две сотни подчиненных, а пагинация у вас ограничена пятьюдесятью. Показывая третью страницу вы не сможете отобразить всех сотрудников вверх по иерархии до корня дерева, поэтому не ясно будет кому они подчинены.

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    За такие деньги (если в месяц) можно арендовать 6 VDS, которые будут отлично заменять вам свой колхозный датацентр.
    Более-менее надёжное железо, бесперебойное питание к нему, канал с белым IP, резервный канал (если есть требования по доступности), обслуживание, бэкапы... всё это очень долго не окупится, если сравнивать с самым дешевым VDS.
    Ответ написан
    Комментировать
  • Как отчистить глобальное окружение python?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В большинстве случаев не стоит использовать регекспы для работы с html-разметкой. Для этого есть другие средства, например xpath-селекторы или обход дерева тегов скриптом на питоне.
    Если нужно поправить ссылки, то тут можно и регекспами, ведь ссылки, как правило, различаются внутри, часто можно по префиксу в URI понять о какой ссылке речь.
    Обратите внимание на библиотеку beautiful soup. Там есть всё необходимое для конвертации ваших статей.
    Более детальных рекомендаций не дам ввиду ограниченности примеров, которые вы привели. Надо показывать примеры как есть, ведь из-за отсутствия опыта вы опускаете важные существенные детали и подробности. Например, структуру URL в ссылках, стили и классы в тегах...
    Ответ написан
    9 комментариев
  • Откуда брать фильмы для телеграмм бота?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    можно ли как-то отправлять видео в телеграмм используя, например, ссылку на это видео?

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

    Очень наивный поход, в общем.

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

    Но аудиокниги можно искать на торрент-трекерах, кэшировать метаданные, формировать RSS-ленту в виде подкаста с файлами книги, но закачивать файлы только после первого их запроса.
    Тут можно пойти двумя путями:
    1. асинхронно открыть и держать открытым коннект с нулевой скоростью отдавая данные пока не получится скачать конкретный файл с торрентов полностью.
    2. Возвращать 503 или 504 ошибку намекая на временную недоступность ресурса, а файл поставить в очередь на закачку.

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

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

    Соберётесь делать такого бота для аудиокниг - пишите. Подскажу план работ.
    Ответ написан
    Комментировать
  • Почему в данных таблицы все не по порядку?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вообще такая себе идея проверять принадлежность адреса подсети с помощью строковых операций. Мне кажется лучше вместо баша заюзать питоновский скрипт и сделать все правильно. ВОт такие функции могут пригодиться:
    def mask(bitcount):
        return 2**bitcount-1 << (32-bitcount)
    
    def ip2int(ip):
        return sum(256**i*int(octet) for i, octet in enumerate(reversed(ip.split('.'))))
    
    def addr_in_network(addr, network):
        net, mask_size = network.split('/')
        mask_value = mask(int(mask_size))
        return ip2int(addr) & mask_value == ip2int(net) & mask_value
    Ответ написан
    Комментировать
  • Многопользовательский телеграм бот для получения индивидуальных данных?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Есть ещё один способ загружать неформатные файлы, похожие на json.
    Дело в том, что любой json файл представляет собой валидный yaml-файл.
    Но yaml гораздо боле гибкий формат, который "проглатывает" и ключи без кавычек, и трейлинговые запятые.
    Можно много спорить по поводу безопасности и корректности использования yaml для парсинга невалидных json, но иногда просто нет выхода и нужно обрабатывать огромное количество таких уже имеющихся файлов.
    import yaml
    with open('test.json', encoding='utf-8') as f:
        data = yaml.load(f, yaml.CSafeLoader)
    Ответ написан
    Комментировать
  • Как реализовать функционал отмены последних изменений в определенных CRUD эндпоинтах с использованием FastAPI?

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Извлекаете с помощью overpass turbo необходимые вам данные. Если объём отфильтрованных данных получится небольшим (а тут уж всё зависит от того, какой объём вам-таки нужен), то можете выгрузить всё в GeoJSON и отображать его на каком-нибдуь leaflet или аналогичных виджетах. Можно пойти инфм путём, и отренедрить себе карту в тайлы, которые можно положить локально и отображать таким же виджетом, но у уже в виде растра. Если вам нужна более насыщеная геоданными карта, то, возможно, этот формат будет даже компактнее и проще.
    Если у вас есть опыт в ГИС, то для вас не составит труда разобраться с overpass turbo, для остального нужны навыки программирования на js.
    Ответ написан
    Комментировать
  • Как визуализировать границы районов Москвы на Python?

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

    Для начала вам придётся достать границы или полигоны районов Москвы. Сделать это можно из БД OpenStreetMap с помощью инструмента Overpass Turbo.
    Получить их можно сразу в GeoJson, чтобы отобразить на каком-нибудь картографическом виджете вроде Leaflet или аналогичных.
    Нужно будет закодить обработчики событий клика и хинта. В полигонах у вас уже будет тег с идентификатором района, нужно чтобы в отображаемом датасете были те же идентификаторы, или их придётся мапить отдельным скриптом.

    Если вам не понятно что-то из этого даже после продолжительного гугления, то стоит, всё же, сходить к фрилансерам, или забить на эту задачу, поскольку вам её решать рано.
    Ответ написан
    4 комментария
  • Python как быстро получить число элементов архива tar.gz?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не получится из-за специфики устройства tar-файла. Пока весь не прочитаешь, не узнаешь сколько в нём каталогов. Это потоковый формат, а тут он ещё и сжат сверху gzip'ом.

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

    Придётся как-то обходить эту проблему. Например использовать другой формат архива, или еред архивацией делать отдельный файл с перечнем всех файлов, и его класть в архив первым. А может быть вам и не нужно на самом деле количество элементов в архиве,а того, что вы этим количеством хотите добиться можно достичь иначе.
    Ответ написан
    2 комментария
  • Стоит ли мне знать как работает cmd для Python?

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

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Странные ответы тут приводят.
    import random
    lst = list(range(1, 5+1))
    random.shuffle(lst)

    Так у вас в списке будет случайно перемешанная последовательность.
    Но у вас есть требование (не знаю насколько оно осозанное), чтобы это была непременно функция.
    Надо понимать, что такая функция не будет чистой. Она должна выдать конечное количество разных значений и её придётся вернуть исключение, если от нее потребуют больше очерендым вызовом. Сделать это можно с помощью генератора.
    def make_shuffled_gen(a, b):
        lst = list(range(a, b + 1))
        random.shuffle(lst)
        yield from lst
    
    shuffled_getter = make_shuffled_gen(1, 5).__next__


    Ну или одним выстрелом:
    def make_shuffled_getter(a, b):
        lst = list(range(a, b + 1))
        random.shuffle(lst)
        return iter(lst).__next__
    
    shuffled_getter = make_shuffled_getter(1, 5)
    Ответ написан
    3 комментария
  • Как в игровых движках реализованы отскоки?

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Рисуете на бумажке граф состояний вашей игры.
    Каждый узел этого графа - это вопрос. Из узла выходят стрелочки в другие узлы. Каждая стрелочка - это вариант ответа и реакция на нее игры.
    Так вы опишете граф состояний конечного автомата.
    Теперь этот граф вам нужно оформить для использования в программе.
    Обычно граф описывают с помощью матрицы состояний. Это матрица N*N, где N-это количество состояний игры. Каждая ячейка с координатами (i, j) такой матрицы определяет переход из i-ого в j-ое состояние. Если в ячейке ноль, то перехода нет, а если 1, то есть.
    Обычно в такой матрице нулей гораздо больше чем единиц, поэтому такую матрицу кодируют в виде перечисления всех стрелочек-переходов из исходного в следующее состояние.
    В исходном коде или в файле описываете N состояний, для каждого состояния перечисляете все варианты ответов, для каждого варианта ответа указываете какое состояние будет при его выборе.
    Такую структуру можно описать в виде json или yaml-файла, либо прямо в коде средствми выбранного языка программирования (словарь, или функция с switch-case, или много if-ов).
    Программа будет представлять цикл и переменную со ссылкой на текущее состояние.
    В цикле печатаете вопрос, который соответствует текущему состоянию и варианты ответов на него, запрашиваете ответ у пользователя, в зависимости от ответа присваете в качестве текущего новое состояние.

    Если вам что-то не понятно в этом тексте, то нет смысла задавать дополнительные вопросы, в этом случае вы гарантированно не справитесь с заданием. Следует искать информацию о ненакомых терминах в интернете.
    Удачи.
    Ответ написан
    Комментировать
  • Как написать регулярное выражение?

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