• Как сделать оформление словаря в txt файле и вычитывание значений из этого файла?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Надо вам бы книжечку почитать по питону. Быстрее и полезнее было бы для вас в плане освоения.
    Вот, например устаревшая конструкция:
    #-*- coding:cp1251 -*-
    Сейчас принято весь код держать в utf-8 и испоьзовать свежий питон третьей версии.

    Прочитайте про PEP8.
    Считается плохим стилем использовать CamelCase для чего-то кроме классов.
    Для переменных и имен функций нужно использовать snake_case.
    selected_genre = str()
    selected_game = str()

    Ни к чему объявлять такие переменные присвоением пустой строки, причем с вызовом явного конструктора. В Питоне строки - неизменяемый тип, а переменные. это не ячейки, зарезервированные в памяти, а, как бы, "бирки" с именем, которые вешаются на объекты. ВОт строки - это объекты, которые нельзя менять. Как создаются, так и остаются.

    genre_file = open('genres.txt')
    Не хорошо так открывать файл. Для такого мелкого скрипта это не так важно, но хорошую привычку у себя формировать надо всегда и всегда надо работать с файлами правильно. Через контекстный менеджер with и используя pathlib.

    GenreList.append(line.strip())
    Обратите внимание на разницу между append и extend, именно в этом одна из причин проблемы, с которой вы тут боретесь.

    value = item.split(" ")[1:]
    Сплит можно делать по знаку равно, а не только по пробелу. Такое ощущение, что вы не особо задумываетесь, что пишете в коде.

    Там дальше вообще какая-то дичь. Так писать нельзя. Код непрозрачный и нечитабельный. Если вы наделали кучу косяков и ошибок в более простом коде, то вот в дальнейшей каше там вообще швах.
    Проще надо.

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

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

    Разбивайте всегда задачу на ОЧЕНЬ МАЛЕНЬКИЕ подзадачи и решайте их отдельно. Проверяйте решение подзадачек тоже по отдельности, убеждайтесь, что этим мелкие кирпичики работают.

    Повторюсь, изучайте питон, чтобы программировать на нем как на питоне, а не вот так вот. Успехов.
    Ответ написан
    4 комментария
  • Как настроить автоматический сон ПК при отсутствии раздачи?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Взять старый ноут, вставить в него ssd, отключить сон и закрыть крышку.
    Ноут не так уж много жрёт, особенно с выключенным экраном, графику ведь не надо рисовать. Ввиду отсутствия необходимости в экране, то можно взять убитый в плане корпуса и экрана ноут, поставить на него убунту, подключаться по ssh и работать с торрентами через веб-интерфейс торрентокачалки.
    И не надо засыпать\просыпаться.
    Ответ написан
    Комментировать
  • Как загрузить большое количество данных в базу SQLite на React Native?

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

    В локальной БД сохраняйте дату последней репликации в отдельной таблице.
    Имейте в виду, что обратная репликация из оффлайн БД в основную уже не будет такой простой. Во-первых нужно что-то придумывать с генерацией идентификаторов для новых записей. Возможно придётся переходить на 16-битные идентификаторы (GUID), чтобы они не пересекались с основной базой.
    Ещё нужно понимать, что в оффлайн режиме у вас может оказаться недостоверным время на локальной машине.
    Если на локальной машине есть доступ к GPS, то можно снизить число негативных последствий, но не предотвратить их вовсе.
    Если вам критично не перепутать время правки записей и первоисточник изменений из-за неточности локального времени, то тут надо будет предпринимать меры для решения этой проблемы, и, есть вероятность, что придётся идти на серьёзные компромиссы.
    Если у вас будет много локальных клиентов, которые будут работать в оффлайн-режиме, то ситуация усугубится многократно. Минимизируйте возможность правки общих данных клиентами из оффлайн-режима.

    Помните, что GPS сейчас не гарантирует достоверного времени на локальной машине, поскольку в некоторых регионах военное положение, а подразделения РЭБ в куче мест ставят помехи и искажают сигналы со спутников. Часы могут сильно врать.
    Ответ написан
    Комментировать
  • Почему не запускается manage.py?

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вытащить винт из виндового компа и ставить в линуксовый, примонтировать и скопировать с максимально возможной скоростью.
    Ответ написан
    Комментировать
  • Как сделать автогенерацию поддомена?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если все субдомены должны ввести на один физический сервис, то на днс сервере ничего динамически прописывать не надо, просто добавляете запись со звёздочкой.
    Если нужен просто редирект, то можно реализовать его на nginx, например, a на бэке ничего делать не приедпридется. А можно наоборот, все сделать на быке, туда по-любому прилетает полный урл, можно делать любую логику.

    Что конкретно не понятно? Там вам в комментарии правильно объяснили, что вопрос задан слишком широко. Мало данных. Не понятно что именно не понятно.
    Ответ написан
    Комментировать
  • Как обойти блокировки сайтов?

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

    Не факт, конечно, что там именно такая параноидальная и замороченная система, но такое определённо имеет смысл, если надо предотвратить долбёжку и не целевое использование АПИ.

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    float(k.get('money', 0))
    Ответ написан
    Комментировать
  • Умная розетка с автовключением без интернета?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Я так понимаю речь идёт об импровизированном Watchdog-таймере для роутера.
    Если у роутера есть USB, то вот есть готовые приборчики на али: https://aliexpress.ru/popular/usb-watchdog-timer.html
    Не пробовал их подружить с роутером, но не вижу причины почему бы не заработало.

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

    Если вам нужна перезагрузка роутера не связанная с отсутствием интернета, то можно соорудить что-то из реле и вот такого таймера: https://www.youtube.com/watch?v=A3fozboEvWQ
    Сигнал для этого реле задержки с роутера можно ардуинкой через USB подавать.

    Ещё у умных розеток бывает кнопка для управления э той розеткой. Можно подключиться параллельно этой кнопки и "нажимать" её по таймеру (как в видео) с помощью реле с парой нормально замкнутых контактов. Тогда умная розетка отключит роутер по сигналу из интернета, и, за одно, обесточит реле, которое замкнёт при этом свою пару нормально-замкнутых контактов, что запустит таймер, настроенный на 2 минуты, а он, в свою очередь, через две минуты "нажмёт" через другое реле или оптопару кнопку на умной розетке, что приведет к ее включению.

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

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

    А бесплатных курсов и репетиторов тут нет.
    Ответ написан
    2 комментария
  • Как сделать пагинацию в 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 будет какая-то защита от массового получения данных нештатным способом.
    В целом, если нет специальных методов, то вполне рабочий вариант, как вы написали, равномерно ходить по адресам и запрашивать обновления данных, сравнивать с прошлыми показателями и при изменениях отправлять сообщения
    Ответ написан
    Комментировать