• Как получить доступ к свойству объекта JSON не зная его название?

    Vindicar
    @Vindicar
    RTFM!
    JSON-объекты загружаются в простой питоновский словарь (а массивы - в список).
    Так что окей, гугл, перебор элементов словаря python.

    В твоём случае что-то вроде
    pages = info["query"]["pages"]
    for page_id, page_data in pages.items():
        ...   # что-то делаешь с page_id и page_data


    Если ты уверен, что у тебя всегда ровно один элемент в словаре, и его ключ тебя не интересует, то можно и так:
    pages = info["query"]["pages"]
    if pages:  # есть что-то в словаре?
        page_data = list(pages.values())[0]
        ...   # работаешь с page_data
    Ответ написан
    1 комментарий
  • Как защитить свой токен?

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

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

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

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

    Итак, пробежимся по перечисленным пунктам сначала.
    1. Критерии. Поиск критериев - это часть решения. Обычно в этом случае нуно сорать необходимую статистику. Есть куча софта, который это умеет делать, но пинг есть всегда под рукой.
    Для этой тулзы есть две полезных опции: ключ для бесконечного пинга и размер пакета.
    В разных ОС эти ключи немного разные, поэтому ищите их отдельно, у меня нет винды под рукой, поэтому не стану на этом заострять.
    Скаж лишь, что пинговать лучше большими пакетами, жалетально превышающими размер TTL, прописанный в роутере. Тогда такой пинг будет реже проскакивать в периоды хорошей связи, то есть выловит больше пролблем.
    Пинговать нужно в отдельных окнах сразу несколько хостов:
    - ya.ru - этот хост всегда отвечает на пинги и выявит проблемы с DNS
    - 8.8.8.8 - это гугловый DNS-сервер, тоже всегда отвечает на пинги, покажет, что связь с инетом есть даже если DNS, прописанныйна компе не правильно работает.
    - 192.168.0.1 - или какой там IP у вашего роутера. Нужно. чтбы отделить проблемы с инетом от проблем с внутренней связностью до роутера
    - 192.168.0.x - ip одного из компов в сети. Я обычно пингую несколько компов, доступных через баксимальное число потенциально проблемных узлов - ethernet-розеток, свичей, вайфай-соединений... Этот пинг поможет понять где проблема, во внутрисетевой связности или в последней миле.

    Учтите, что проблемы часто бывают комбинированные и каждое сочетание симптомов будет свидетельствовать о раных проблемах.
    Да, тревожным принаком может служить не только пропадание пакетов, но и скачки в длительности их возврата, особенно если такие длительности достигают 500мс и выше. Но и скачки от 3мс до 250мс тоже будут свидетельствовать о каких-то проблемах.

    Запускать пинг на всех компах лучше одновременно и на некоторое время. Например минут на 20. Потом по статистике будет видно сколько где пакетов пропало.

    2. Если критерии наличия проблемы позволяют, то можно попробовать отрубать части сети и смотреть наличие проблемы. Это я в том смысле, что если проблема происходит в среднем раз в пару-тройку часов, то отрубать на многие часы части сети при диагностикем ожет быть неприемлемым.
    Редкеи пробемы дольше отлавливать. Но напоминаю, что критерии можно детализировать, ведь если пакеты у вас пропадат относительно редко, то скачки времени их возврата могут случаться чаще и подсвечивать проблему. Также можно сделать рамер пакета близким к максимальному, это должно тоже в некоторых случаях участить проявление проблемы.
    Иногда не мешает нагрузить сеть комированием по локалке большого файла. В линуксе можнно с помощью утилиты tc послать большой поток рандомных байт на любой сокет..
    3. Плавающие проблемы случаются из-за плохого обжима, перебитого жверью кабеля, перегрызенного UTP в плинтусе, из-за умиращих конденсаторов в блоке питания роутера (БП может не выдавать необходимого при нагрузках тока, но вольтметром такая неисправность не будет различима без нагрузки). Вообще старые (да и не только) роутеры могут страдать поплывшими электролитическими конденсаторами не только в блоках питания.
    Хорошо, когда можно подменить роутер.
    4. ну с четвертым пунктом ничего не пососветуешь, только разделать и тестировать все по отедльности и в разных сочетания и да поможет нам ктулху.

    А для тех, кто дочитал этот опус до конйа - интересная задачка. Что пингуют эти команды, как и почему?
    ping 1.1
    ping 2130706433

    Тех, кто знает, попрошу не спойлерить=)
    Пусть для кого-то будет сюрпризом этот дивный мир=)

    UPD. Простите за адское количество опечаток в тексте. Писал в спешке и с непривычной клавиатуры. Исправлю всё попозже. Не ожидал, что многим ответ придётся по душе. Вроде ж накапитанил как мог.
    Ответ написан
    5 комментариев
  • Существует ли быстрый алгоритм поиска общих подстрок во множестве больших строк?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Пока главная проблема, что надо сравнивать все строки со всеми. Если бы их поделить на какие-то части, когда сравнивается не так много строк, пусть даже этих частей много, то задача решается Гораздо проще.

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

    Вот построили вы деревья для всех строк, дальше надо их попарно сравнить простым рекурсивным обходом. Если оба дерева содержат переход по какому-то символу, рукурсивно идите по нему. Если дошли до глубины N - вы нашли совпадение. Можно вообще идти пока не обломитесь и взять максимальную глубину. Такой обход обойдет дерево один раз для каждой пары строк. Да, еще надо будет хорошенько потрахаться с хранением дерева на диске и подгрузкой его кусками, ибо в оперативку оно все не поместится никак.

    Второй вариант, возможно более подходящий для таких объемов данных - это полиномиальные хеши. Можно для каждой строки вычислить L-N+1 хешей для всех подстрок длины N. Первый хеш считается тупо по формуле, а дальше дописывание одного символа справа и удаление одного символа слева можно за 2 операции пересчитать. Вот так вы быстро, за линейное время, можете построить все хеши для одной строки. Запишите их в файл, отсортируйте его (гуглите - известная задача сортировки очень большого файла). А потом операцией слияния можно найти повторяющиеся числа во всех файлах.

    Более того, можно не сравнивать каждый файл с каждым, а выполнять слияние сразу на всех файлах. Для этого надо завести приоритетную очередь, она же куча, она же heap, в которую складывать текущие числа из всех файлов (по одному из файла) вместе с указателем на сам файл. Вам надо из этой очереди вынуть минимальное число, и потом вынимать дальше, пока минимум в очереди не изменился. Т.е. вынуть все одинаковые минимальные числа. Файлы, на которые они указывают - это строки с совпадениями. Пометьте это где-то, и для каждого файла прочитайте следующее число и положите его в очередь.

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

    Если совпадений не очень много это будет работать довольно быстро, отлично параллелится (сортировка разных файлов).

    Если все-таки надо искать совпадения по всем строкам глобально, то придется помучиться. Разбейте ваши данные на K частей примерно одинакового размера так, что каждый компьютер может обработать по 2 части, а хранить хотя бы по 3 части.

    В идеале у вас должно быть еще и K/2 компьютеров, иначе схема усложняется.

    Надо будет провести K-1 раундов. На первом раунде части 1 и 2 лежат на компьютере 1, части 3 и 4 на втором, и т.д. На втором раунде вы храните части 2 и 3 на компе 1, 4 и 5 на компе 2 ... K и 1 на последнем. При переходе между раундами каждый комп отдает одну часть куда-то, и одну откуда-то получает. На третьем и четвертом раунде вы обрабатываете все пары, в которых вторая часть имеет номер на 2 больше первой части (если брать по модулю K). И так далее. На последнем раунде будут обрабатываться пары, где одно число больше другого на (K-1)/2.

    Например, для K=4 вы получаете такие пары на компах:
    1. (1,2) (3,4)
    2. (2,3) (4,1)
    3. (1 3) (2 4)


    Тут надо порисовать и составить схему так, чтобы поменьше данных перекладывалось. Для некоторых K так красиво не получится, и какие-то компы будут простаивать на каких-то раундах.

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

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Ответ написан
    Комментировать
  • Какую IDE выбрать для разработки на Java?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    https://www.jetbrains.com/idea/
    CE подойдет
    Ответ написан
    Комментировать
  • Чем качественно сравнить два каталога с файлами?

    @MIDNSK Автор вопроса
    Что ж, всем спасибо, кто пытался помочь мне найти решение этой непростой, как оказалось, задачи. я нашёл его в итоге сам, и сейчас опишу, в чём оно состоит. Как я сказал ранее, ещё в вопросе, оперировать нужно было с двумя огромнейшими собственными накоплениями программного обеспечения, которые в большинстве своём идентичны. Так вот, нашлась в этом накоплении такая Программа. Как оказалось в дальнейшем, сейчас это уже "Duplicate Files Search & Link" версии 8, тогда как у меня это ещё "Duplicate Same Files Searcher 2.0.1.21125". В прочем, думаю, что новая версия не должна потерять нужный нам функционал. Итак, я поставил Duplicate Same Files Searcher, открыл программу, нажал "Начать поиск" и указал ей оба каталога с софтом - на (L:) и на (D:). Прождал полдня, пока завершилось сканирование (программа нашла дубликаты в папке на L, в папке на D и, естественно, файлы, совпадающие и на L, и на D), затем вызвал на каком-то файле в таблице с результатами контекстное меню и выбрал "Отметить файлы по фильтру". Фильтр может быть таким: "Имя файла содержит...", "Путь к файлу содержит..." и "Реальный путь к файлу содержит...". Можно отметить все сразу, но я отметил только второй. Далее указал, что путь к файлу должен содержать "d:\" и дал программе команду "Отфильтровать". После завершения процесса отметки файлов просто нажал в контекстном меню "Удалить" и смело удалил разом 300773 файла. В итоге, что и требовалось, на диске (D:) остались только уникальные файлы, дубликатов которых на (L:) - нет.
    Огромное спасибо Юрию Маличу за эту замечательную программу.
    Игорь, Новосибирск.
    Ответ написан
    1 комментарий
  • Влладалаьаьыджввла?

    freeExec
    @freeExec
    Участник OpenStreetMap
    В направлении чего-нибудь полезного. А то один тоже тренировался, теперь Варгеймингу 600 тысяч должен.
    Ответ написан
    5 комментариев
  • Может ли третий питон работать на разных компьютерах?

    iggor-markin
    @iggor-markin
    Python Developer
    1. Питон третий может работать на разных компьютерах
    2. Какую ошибку синтаксиса выдаёт, в какой строке, какой код?
    3. Установлены ли в виртуальное окружение зависимости на обоих компьютерах?
    Ответ написан
    Комментировать
  • Как устроен append в list?

    sswwssww
    @sswwssww
    То на что ты смотришь это stub файлы сгенерированные Pycharm(например), т.е это просто служебные файлы "подделки", для того чтобы ты мог смотреть документацию, сигнатуры и тп. Если хочешь узнать как реально устроен метод append тебе нужно ковыряться в исходниках на C.
    CTRL + F и ищи по list_append, а далее смотри на стек вызовов других функций(_PyList_AppendTakeRef и т.д).
    Ответ написан
    Комментировать
  • Как создать телеграм бота для парсинга Instagram на Python?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    1. Выучить питон
    2. Написать грабер(парсер)
    3. Создать первого тестового телеграм бота по примерам
    4. Модифицировать бота из пункта 3 грабером из шага 2

    Профит
    Ответ написан
    2 комментария
  • Что делает "..." в Python?

    Vindicar
    @Vindicar
    RTFM!
    Вообще обычно это заглушка. Но это уникальное значение (как None), и его можно использовать для своих целей, при желании.
    Например, в numpy он используется так: если у нас есть массив с 3 измерениями, и мы хотим задать срез по третьему измерению, мы можем записать либо так array[:, :, 0] либо так array[..., 0].
    По-моему, еще в typing есть применения.
    Ответ написан
    Комментировать
  • Как заставить бота отправить геопозицию в aiogram?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Плеткой можно заставить

    https://core.telegram.org/bots/api#sendlocation

    Соответственно,
    bot.send_location(chatid, lat, lon)
    Ответ написан
  • Как удалить клавиатуру в Telegram?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Имеет по умолчанию клавиатуру это как? Библиотека дописывает рандомные кнопки к сообщениям что ли

    reply_markup=types.ReplyKeyboardRemove()
    Ответ написан
    3 комментария
  • Зачем нужен return, когда есть print?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Если нужно просто вывести на экран результат - разницы нет, в данном примере. Если нужно в дальнейшем использовать значение, возвращенное функцией, то, конечно, нужен return. Допустим, как тут, если нужно сравнить два числа, и вернуть из них большее, чтобы затем работать с ним дальше, можем сделать так:
    def func(x, y):
        if x > y:
            return x
        elif x == y:
            return 'Числа равны.'
        else:
            return y
    
    max_num = func(3,4)

    И в результате в переменной max_num будет наше наибольшее число (ну, либо текст). В данном примере несовсем понятно, конечно.

    Ну вот допустим у нас есть встроенная функция max, которая возвращает максимальное значение из переданных параметров, нечто похожее на то, что сделали вы. Для более наглядного примера я бы рассмотрел random.choice()

    Предположим, у нас есть список элементов и нам надо из него выбрать случайный элемент и работать с ним дальше. Мы вызываем random.choice(), который через return вернет нам этот случайный элемент и мы будем с ним работать дальше. Например, использовать его как часть текста.
    greetings = ['Привет', 'Hello', 'Здравствуйте']
    
    greeting = random.choice(greetings)
    
    print(f'{greeting}, master')


    В итоге при каждом запуске кода мы будем получать случайный элемент списка в переменную, и все это благодаря наличию return в методе choice. Если бы там было не возвращение элемента через return, а просто print. то тогда наш случайный элемент печатался в консоль и на этом все. Ну, надеюсь понятно.

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

    Если надо будет найти максимальный элемент и использовать его в дальнейшей работе, то с таким кодом -
    def func(x, y):
        if x > y:
            print(x)
        elif x == y:
            print('Числа равны.')
        else:
            print(y)
    
    max_num = func(3,4)
    print('Максимальное число -', max_num)

    получите None в ответе.
    Ответ написан
    2 комментария
  • Как написать другому боту через своего?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Любая библиотека, позволяющая работать с клиентским API Telegram (telethon, pyrogram, etc, etc) и вперёд, писать от имени пользователя боту

    Боты не видят сообщений ботов
    Ответ написан
    Комментировать
  • Python. Не могу понять данный пример на фото, объясните подробнее и попроще??

    Vindicar
    @Vindicar
    RTFM!
    Срезы пишутся в виде "откуда:докуда" или "откуда:докуда:шаг", при этом любая часть может быть опущена, получив значение по умолчанию.
    "откуда" определяет номер первого элемента, который мы выбираем, включительно. Если он опущен, то это эквивалент указания 0.
    "докуда" определяет номер первого элемента, который мы УЖЕ НЕ выбираем, т.е. не включительно. Если он опущен, то это эквивалент "до конца списка".
    "шаг" определяет шаг, с которым мы идём по коллекции, т.е. берем ли мы каждый элемент, или каждый второй (через один), или каждый третий, и так далее. Если шаг не указан, то это эквивалент шага 1.

    В общем-то и всё, остались мелочи типа отрицательного шага (идём в обратном порядке). Что именно непонятно?
    Ответ написан
    1 комментарий