Задать вопрос
  • Как определить причины низкой производительности postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы смотрите на совершенно бесполезный график. Смотрите на полезные.

    Если у вас табличка с 10 индексами и к ней select * from foo where id = ? - то это минимум 11 AccessShareLock. Совершенно логично, что чем больше параллельно нагрузки - тем больше вы увидите AccessShareLock. И дальше куда с этим? Вот и получается совершенно бесполезный график. А задирание max_connections сделает только хуже.

    Посмотрите график CPU, есть ли в принципе CPU свободный (помним что у вас наверняка есть HT, значит 100% утилизации недостижимы, реальный потолок окажется где-то в районе 70-90%)
    Посмотрите графики латентности IO. Если проседает латентность чтения или записи под нагрузкой - то это будет причина замедления. СУБД очень чувствительны к латентности.
    Дальше графики pg_stat_activity с разбивкой по state. Если растут idle in transaction - проверять как дела на приложении, а так же сеть.
    Конечно, графики по pg_stat_statements. top5 запросов по времени выполнения, для начала.
    И проверить наличие корреляции с графиком длительности самой старой транзакции.
    Ответ написан
    4 комментария
  • Почему self интерпретируется как None в ходе инициализации __init__?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    def __init__(self, depth: int):
        self.split_pair: Optional[SplitPair] = None
    …
    def __str__(self):
        return str(self.split_pair)

    Полагаю, причина тут. self получает «строковое представление» “None”
    Ответ написан
    Комментировать
  • Почему данные в БД SQlite добавляются в новую строку?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты выполняешь два запроса INSERT. Запрос INSERT добавляет новую строку. Всё логично.
    Тебе нужно сделать одно из двух:
    Вариант 1. Изменить код так, чтобы бот накапливал сведения в памяти, и только на самом последнем этапе заносить собранное в БД. Я вижу, ты используешь FSM - отлично! Этот механизм позволяет хранить произвольные данные в контексте состояния.
    Вариант 2. Сделать, как сделал Pasha выше - вносишь первую порцию данных через INSERT, остальные - через UPDATE. Тогда у тебя на последующих этапах будут обновляться существующая строка.
    Можно сделать, как предложил fenrir - использовать UPSERT, который сводится к "если строки нет, делай INSERT, если есть, делай UPDATE", но я бы не советовал его тут использовать - лучше сначала чётко разобраться, что и как работает.

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

    В любом случае, поддерживаю замечание насчёт первичного ключа - это основное понятие! Пойми, что это такое, и задай его для своей таблицы.
    Ответ написан
    1 комментарий
  • Как реализовать авторизацию на ТВ по 6 значному коду?

    Или проще сделать наоборот: показывать код на мобильном устройстве, а на ТВ вводить?

    Для пользователя проще вводить что-либо на телефоне, а не на телевизоре.

    В общем-то такой способ входа не только на телевизорах и yt практикуется. Такое есть ещё у Microsoft и Github при использовании oauth, например. Ещё видел такое у samsung на телевизорах/мониторах и у nintendo на свиче

    Смысл такой:
    1. Клиент инициирует процесс аутентификации запросом к серверу аутентификации и просит, чтобы аутентификация происходила на другом клиенте. (при этом передаётся clientid / client secret просто чтобы понять, что за приложение этот запрос инициировало).

    2. Сервер генерирует какой-то уникальный идентификатор для этого запроса с некоторым временем жизни (обычно не больше 30 минут). И передаёт его клиенту в ответе на запрос.

    3. Клиент показывает пользователю:
    1) qr-код с ссылкой для аутентификации, где уже зашит этот id
    2) ссылку в виде текста
    3) этот id, если вдруг его придётся вводить руками

    4. Пользователь переходит в итоге по ссылке и опционально вводит этот id. Дальше идёт обычная oauth аутентификация, только без коллбэка (в конце, вместо коллбэка просто страничка аля "всё готово, страницу можно закрыть")

    5. Параллельно с этим клиент в фоне опрашивает сервер аутентификации о том, прошла ли аутентификация (просто периодические запросы раз в n секунд, long polling, sse, websocket - не важно). В один прекрасный момент сервер сообщит, что аутентификация прошла и передаст твои обычные токены (обычно пару access/refresh)
    Ответ написан
    Комментировать
  • Как скачать файлы с директории сайта, если не знаешь имени файлов?

    iDx
    @iDx
    Данная директория не скрыта от индексации гуглом. В гугле вбейте следующий запрос:
    site:www.inkema.com "/images/cms/" filetype:pdf

    отобразит все файлы из директории /images/cms/ с расширением PDF

    Утилита googler для Linux поможет выдернуть ссылки с названием файлов в файлик files.json. Синтаксис:
    googler "site:www.inkema.com /images/cms/ filetype:pdf" --json > files.json
    Ответ написан
    6 комментариев
  • Aiogram не могу скачать видео весом в 30мб. Telegram server says - Bad Request: file is too big. Как исправить?

    @Everything_is_bad
    для неспособных гуглить
    https://core.telegram.org/bots/api#sending-files лимиты
    https://core.telegram.org/bots/api#using-a-local-b... как повысить лимиты
    Ответ написан
    Комментировать
  • Как найти паттерн на картинке с OpenCV?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформи код, нечитаемо. Кнопка </> в помощь.
    Во-вторых, matchTemplate(), насколько я знаю, не-инвариантна к поворотам и масштабу. Иными словами, поворот или изменение размера целевого объекта сломают сопоставление.
    В-третьих, на показанном кадре более одного экземпляра целевого объекта. Так предполагается или нет? Если предполагается, сколько экземпляров ожидается? Потому что разница очень большая с точки зрения методики.

    Варианта тут три.
    1. пытаться обучать под задачу нейронку. А лучше дообучить существующую, скажем, YOLOv5. Но тебе потребуется минимум несколько сотен размеченных изображений объекта в разных комбинациях, плюс в 2-3 раза больше похожих изображений без целевого объекта. Готовить такую базу будет утомительно, да и само обучение требует понимания что ты делаешь.
    2. попробовать зафиксировать угол поворота или масштаб (т.е. допустить, что он всегда одинаков). Тогда другой параметр можно будет подбирать. Например, мы фиксируем масштаб и делаем 16 изображений объекта в разных поворотах, а потом поочерёдно ищем каждый вариант на кадре. Потом анализируем силу откликов - сколько их, насколько они сильные и т.д. Скорее всего, будет медленно
    3. взять за основу поиск по локальным особенностям. Он справляется с масштабом и поворотом, но не справляется с несколькими экземплярами объекта. Это можно забороть, если использовать скользящее окно. Иными словами, находим на кадре узнаваемые точки - локальные особенности (желательно достаточно много и достаточно плотно), используя алгоритмы вроде ORB или SIFT. Затем выбираем те из них, которые попадают в прямоугольную рамку-окно. Затем сверяем эти особенности с особенностями объекта, используя RANSAC или подобный метод. Если получилось хороше совпадение - значит, в этой рамке есть объект или значительная его часть, и мы можем оценить его позицию в кадре в целом. Повторяем процесс, сдвигая рамку, пока оно не "обойдёт" всё изображение. Тоже может быть небыстро, так как нам требуется неоднократный поиск по картинке.
    Ответ написан
    Комментировать
  • Проблемы с ядром от ИСП РАН?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Возможно. Но будет:

    1) Высокая нагрузка в простое
    2) Характерный свист дросселей
    3) Не работать Wi-Fi
    Ответ написан
    Комментировать
  • Как откатить состояние папки в Git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Отменить все незакоммиченные изменения в рабочем каталоге поможет команда
    git reset --hard

    PS. Немного подумав мне теперь нравится такой универсальный и более корректный способ.
    git restore --source=хеш_коммита --staged --worktree .

    Затем не забудьте закоммитить новые изменения.

    Указывая --source=хеш_коммита, вы говорите Git использовать содержимое файлов из этого коммита.

    Флаг --staged значит, что изменения будут сразу проиндексированы, как если бы вы их добавили с помощью git add. Этот флаг особенно полезен, если вы хотите сбросить изменения, которые уже были добавлены в индекс, но ещё не закоммичены.

    Флаг --worktree указывает Git восстановить файлы в рабочем каталоге до состояния указанного коммита. Это означает, что любые незакоммиченные изменения в рабочих файлах будут сброшены, и файлы будут восстановлены до состояния, соответствующего указанному коммиту.

    Точка в конце команды указывает, что операция восстановления должна быть применена ко всем файлам в текущем каталоге и его подкаталогах. Это значит, что все файлы в проекте будут восстановлены до состояния, соответствующего указанному коммиту.
    Ответ написан
    5 комментариев
  • В браузере brave определяется двухсторонний пинг на 2ip, а в хроме нет. Почему и как обойти?

    @agpecam
    В хроме запрещен JavaScript или какое-то расширение его режет. Проверка на двусторонний пинг осуществляется примерно так: вы заходите на 2ip с адреса vps, 1) 2ip пингует адрес vps и засекает время ответа. 2) код страницы 2ip в вашем браузере на домашнем компе дергает пустую страницу с сайта 2ip. Пишут, что с помощью XMLHttpRequest, но я бы на это не полагался. Время ответа опять засекается. Так как ваш домашний комп объективно дальше от сервера 2ip, чем vps из-за туннеля ( t(browser -> vps -> 2ip) больше, чем t(vps -> 2ip)), вы палитесь на этом тесте. Глобально можно просто дропать ICMP Echo Request на vps, чтобы 2ip не мог выполнить п. 1)
    Ответ написан
    Комментировать
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    vabka
    @vabka Куратор тега Rust
    Не скажу ничего про алгоритм и корректность замеров, но время t01 и t02 ты точно измеряешь неправильно

    subsec_nanos
    Returns the fractional part of this Duration, in nanoseconds.

    This method does not return the length of the duration when represented by nanoseconds. The returned number always represents a fractional portion of a second (i.e., it is less than one billion).
    https://doc.rust-lang.org/std/time/struct.Duration...

    У структуры Duration есть операторы для сравнения, так что тебе не обязательно знать конкретное число, пока ты не выводишь его в консоль

    let mut t01 = Duration::MIN;
    let mut t02 = Duration::MAX;
    if duration> t01 {
          t01 = duration; // здесь
       }
       if duration< t02 {
          t02 = duration; // и здесь
       }


    UPD:


    Комп 6 ядер 12 потоков ничем не нагружен. Если не накосячил с кодом, а так
    захватывается периодически ресурс потоков компа, то как такое решить
    и получать расхождение в пределах 20%?

    1. Такой разброс, как у тебя показан - это норма. Нужно смотреть не на минимум/максимум, а на распределение (в комментах скинул график - там тоже минимум и максимум сильно различаются, но прогонов с таким временем мало)
    2. Я не увидел в вопросе описания того, как происходит запуск. Хотябы в --release компилировал?
    3. У тебя данные вполне статичные, так что компилятор при желании мог очень много наоптимизировать, что даст тебе некорректные результаты, но на распределение это влиять не должно.
    Ответ написан
    5 комментариев
  • Как сделать kill switch для докера?

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

    @Everything_is_bad
    http и https можно поднимать на любом порту, просто его придется явно указывать в отличие от дефолтных. Самое просто это делать через проксирование в нормальные веб-серверы, nginx и подобные.
    Ответ написан
    1 комментарий
  • Если любой из элементов массива слов имеется в строке - выдать true, как?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Проходишься по своему массиву и спрашиваешь присутствует ли твое слово в тексте который ввел пользователь.
    2. В результате получаешь массив булевых значений True False
    3. Если в массиве есть True, значит в тексте введенным пользователем есть слово из твоего массива слов.

    Детали реализации: any и list comprehension
    Ответ написан
    Комментировать
  • Почему объект копируется, а не создаётся заново?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Понять разницу между объектом класса, и объектом экземпляра класса.
    2. Понять разницу между атрибутами класса и атрибутами экземпляра класса.
    Ответ написан
    Комментировать
  • Как ввести несколько строк в стандартный ввод python?

    Vindicar
    @Vindicar
    RTFM!
    Стандартный ввод - это файл, и его технически можно "прочитать до конца". Пример:
    import sys
    for line in sys.stdin:
        print('Got', repr(line))
    print('Done')

    Запусти как обычно, введи несколько строк, а потом в терминале (если под виндой) нажми Ctrl-Z, затем Enter.
    Это пошлёт сигнал "конец файла", и дальнейшие попытки ввода через input() будут не успешными.

    Также можешь записать строки в текстовик, и запустить файл с перенаправлением ввода:
    python3 main.py < data.txt
    Тогда скрипт тоже получит сигнал о конце ввода, когда файл закончится.
    Ответ написан
    1 комментарий
  • Что делать с пайтоном на телефоне?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что делать с пайтоном на телефоне?

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

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Мне необходимо создавать и записывать данные в новый файл

    Читать 1 файл (mode='r') можно неограниченному количеству скриптов единовременно.

    Чтение с возможностью записи (w, a или r+):
    - В винде файл может блокироваться первым читающим, остальные сосут чупик.
    - В линуксе возможно не блокирование файла, но могут возникнуть проблемы с записью, если не реализован механизм синхронизации.

    Самое простое - использовать контролируемую блокировку файла на уровне скрипта, который взаимодействует с файлами (fcntl==linux, msvcrt==win):
    import fcntl
    
    with open('file.txt', 'a') as f:
        fcntl.flock(f, fcntl.LOCK_EX)  # файл кем то заблокирован, ждем
        try:
            f.write("Some data\n")  # файл разблочился, блокируем его и работаем с ним
        finally:
            fcntl.flock(f, fcntl.LOCK_UN)  # что то пошло не так, снимаем блокировку с файла принудительно
    Ответ написан
    Комментировать
  • Что использовать в качестве workerА для отложенных задач?

    Vindicar
    @Vindicar
    RTFM!
    Я бы вообще изобрёл велосипед, если честно.
    У тебя есть список или база активных (неслучившихся) событий. Пусть это будет пара ID-метка времени, остальная инфа нам без надобности.
    При запуске бота выбираем из списка ближайшее событие, и вычисляем время ожидания (с небольшим запасом) и спим в корутине. В случае, если ожидание прервано раньше - повторяем то же самое, чтобы либо "доспать", либо переключиться на ожидание более близкого события.
    Если же ожидание закончилось успешно, обрабатываем событие и снова повторяем поиск ближайшего события.
    Если список событий изменился, прерываем текущее ожидание, чтобы корутина ожидания могла адаптироваться к изменениям.

    Кода - строк на пятьдесят, не больше, и выносится в отдельный класс на ура. Как мне кажется, если бот не супер-нагружен (в том смысл, что список хранимых событий изменяется не каждую минуту, и событтия тоже срабатывают не так часто), то этого будет вполне достаточно.
    А когда он будет так нагружен - проще будет раз в минуту выбирать то, что должно сработать сейчас.
    Ответ написан
  • БД и Микросервис в одном pod, но разных контейнерах - хорошо или нет?

    @d-stream
    Готовые решения - не подаю, но...
    Обычно подразумевается что микросервис/под - это одноразовая рыбка без памяти. В любой момент экземпляр микросервиса может быть убит и трафик будет передан другому экземпляру например в другом месте (нода, локация и т.п.). Грубо следует ориентироваться что сервис обслуживает один запрос и мрёт.

    А вот база данных - долговременное (постоянное, надёжное) хранение данных. Если говорить о популярных реляционных СУБД, то на сегодня это с большой вероятностью - postgress
    То что касается "изоляции" данных разных микросервисов - у него уже всё есть. К примеру в его терминах "каждому микросервису по базе данных" - это "каждому микросервису по схеме" (ибо БД растяжимое понятие и database в терминах pg - это чуть иное) притом естественно к каждой схеме отдельная УЗ (роль)
    Ответ написан
    7 комментариев