Задать вопрос
  • VPN на wireguard. Устройство подключается, но интернет соединение не проходит. Есть ли способы исправить это на macos или ios?

    На других устройствах интернет есть?
    Ответ написан
    Комментировать
  • На каком языке программирования пишут читы для онлайн игр по типу яндекс игр?

    @Oleg_KeyKode
    На js наверное
    Ответ написан
    Комментировать
  • Как получить доступ к свойству объекта 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 комментарий
  • Как защитить свой токен?

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

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

    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 и т.д).
    Ответ написан
    Комментировать
  • Что делает "..." в 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) и вперёд, писать от имени пользователя боту

    Боты не видят сообщений ботов
    Ответ написан
    Комментировать