• Как продолжить разговаривать с нейросетью?

    Vindicar
    @Vindicar
    RTFM!
    Гугли finite state machine (FSM) для библиотеки, которой пользуешься.
    Ответ написан
    Комментировать
  • Как цифру в строке преобразовать в числовой формат?

    Vindicar
    @Vindicar
    RTFM!
    Затем все приводится к формату строки типа ключ=значение

    Как можно значение оставить типа float?


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

    Vindicar
    @Vindicar
    RTFM!
    Храни в asyncio.Queue очередь запросов к API. Отдельная задача пусть выбирает запросы из очереди, отправляет, получает ответ и оповещает о результате. Например, так.
    import asyncio
    import typing
    
    class ThrottledResource:
        def __init__(self, delay: float):
            self._delay = delay
            self._queue = asyncio.Queue()
            self._task = None
        
        def start(self):
            self._task = asyncio.create_task(self._work_loop)
        
        def stop(self):
            self._task.cancel()
            self._task = None
    
        # этот метод вызывается клиентским кодом, получает параметры и возвращает отклик спустя время.
        async def query(self, params):
            future = asyncio.Future()  # Future просигналит, когда наш запрос будет обслужен
            await self._queue.put((future, params))
            result = await future  # корутина спит, пока запрос не обслужат
            return result
    
        async def _work_loop(self):
            while True:
                future, params = await. self._queue.get()  # ждем, пока не придёт запрос
                try:
                    result = await call_api(params)  # тут делаем асинхронное обращение к сервису
                except Exception as err:
                    future.set_exception(err)  # была ошибка - теперь await future выкинет исключение
                else:
                    future.set_result(result)  # полуен результат - await future вернёт его
                self._queue.task_done()  # каждому успешному get() соответствует task_done()
                asyncio.sleep(self._delay)  # можно учесть, сколько времени делался запрос. Но стоит ли?

    Код примерный, но идею передаёт. Использоваться будет как-то так
    api = ThrottledResource(delay=1.0)
    api.start()
    ...
    result = await api.query(params)  # await подождёт, пока не дойдёт очередь до нашего запроса


    Нужно добавить обработку ошибок, корректное завершение работы при наличии задач в очереди, и так далее.
    Технически вместо класса можно было реализовать это всё в виде декоратора над replier(), но это уже на вкус и цвет.
    Ответ написан
    6 комментариев
  • Как реализовать распознавание объектов на python?

    Vindicar
    @Vindicar
    RTFM!
    1. Данные, данные и ещё раз данные. У тебя есть выборка на несколько тысяч (а лучше десятков тысяч) дефектов? А выборка "приемлемо чистых", т.е. с незначительными дефектами?
    2. Допуски. Сколько допустимо пропущенных дефектов? На 100% даже не надейся, 90% уже будет подвигом. Аналогично, сколько допустимо "ложных тревог"?
    3. Как обеспечить условия съёмки? Какую предобработку изображения делать? Что за данные в итоге будет получать модель, которую ты будешь использовать? На эти вопросы нужно ответить. Кривые данные на входе - и ни одна ML модель не справится.
    4. Эксперименты с моделями на тему "кто лучше". Подбор гиперпараметров модели.

    Ну и просто для представления, что за жесть внедрение CV на производстве.
    Тоссим руду: очень неочевидная ИТ-задача
    Что случается с металлоломом и зачем там хардкорное ИТ

    Короче, про "кратчайшие сроки" лучше забыть, имхо.

    Если б мне поставили такую задачу, я бы уволился нафиг взял бы python-opencv для получения и предварительной обработки изображений, и tensorflow, если бы остановился в итоге на нейронках для анализа. Но это только потому что я другими инструментами не владею. =(

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

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func=lambda call: True)
    def work(call):


    Не надо описывать обработчики внутри других обработчиков. Это не будет работать так, как ты этого ожидаешь. Однажды прописанный, обработчик остаётся до конца работы программы.
    И уж ТОЧНО не нужно делать самому вызов work(call).
    Ответ написан
  • Могу ли я сделать блокировщик сайтов без использования файла "Hosts" и его изменения?

    Vindicar
    @Vindicar
    RTFM!
    Поднять свой как-бы DNS сервер на машине, прописать этот DNS сервер как основной и единственный для данной машины, предыдущие прописанные сервера сохранить. Админские права на этом этапе понадобятся.
    При поступлении запроса проверять запрашиваемое имя. Если не в чёрном списке - перенаправлять запрос на сохранённый DNS, полученный ответ отдать самому.
    Грубо и не всегда надёжно (есть DNS over HTTPS, например, который так не перехватишь), но в базовом варианте сработает.
    Ответ написан
    Комментировать
  • Как на сайте получить идентификатор ОС или устройства?

    Vindicar
    @Vindicar
    RTFM!
    неизменяемый идентификатор пользователя

    Нет такого. Тема browser fingerprinting обширная, и сильно зависит от конкретного рассматриваемого браузера.
    Просто пропиши пользователю самостоятельно сгенерированный айдишник куда сможешь (куки, local storage, все дела), и имей ввиду что снести его и получить новый достаточно просто.
    Единственное решение - это аппаратный USB-ключ, и соответсвующее API/расширение в браузере. Но таким будут пользоваться разве что в интернет-банкинге.
    Ответ написан
    1 комментарий
  • PyMySQL не хочет принимать определенный запрос, в чем может быть проблема?

    Vindicar
    @Vindicar
    RTFM!
    Гугл говорит, что DELIMITER - это фича именно клиента, а не сервера MySql. Поэтому команда не поддерживается сторонними библиотеками.
    И разве там синтаксис для тела хранимки/триггера не BEGIN ... END?
    Ответ написан
  • Как запустить телеграмм бота и flask одновременно?

    Vindicar
    @Vindicar
    RTFM!
    Фласк очень, очень плохо дружит с асинхронщиной. Так что проще всего - подход на базе сервисов. Отдельные процессы, отдельные реализации.
    Раз инициатива исходит от фласка, то пусть бот слушает сокет, а фласк отправляет на этот сокет данные в каком-то типовом формате. Можно тот же JSON с нуль-разделителем, например. Набросать велосипед на сокетах с помощью asyncio труда не составит.
    Ответ написан
  • Как записать for, if-else в одну строку?

    Vindicar
    @Vindicar
    RTFM!
    Если я верно понял, что требуется...
    [(even, uneven)[arg % 2].append(arg) for arg in args]
    Ответ написан
    3 комментария
  • Не понимаю суть ошибки, можете объяснить?

    Vindicar
    @Vindicar
    RTFM!
    from sqlite import db_start, create_profile, edit_profile
    from main import balance


    main импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который ...
    Ну ты понял.

    Быстрого волшебного решения тут нет. Разбирайся с областями видимости, избавляйся от глобальных переменных.
    Например, почему у тебя при создании нового профиля используется balance? Т.е. новый пользователь получает столько денег, сколько было у последнего активного?
    Почему вообще у тебя вещи, специфичные для одного пользователя, лежат то в глобальных переменных, то в данных машины состояний (state)? Бери их из БД , когда они потребуются.
    Ответ написан
    6 комментариев
  • Как решить ошибку RuntimeWarning: Enable tracemalloc to get the object allocation traceback?

    Vindicar
    @Vindicar
    RTFM!
    Выше же RuntimeWarning: coroutine XXXXX was never awaited.
    await позабывал. Читай документацию на методы, которыми пользуешься, чтобы знать, как их запускать.
    Ответ написан
    Комментировать
  • Как можно реализовать обработку текста?

    Vindicar
    @Vindicar
    RTFM!
    Читай про finite state machine (FSM) в aiogram.
    Если коротко, надо отслеживать и хранить, в каком меню находится каждый пользователь.
    Ответ написан
    Комментировать
  • Как проверить ячейку бд на наличие конкретных данных Sql?

    Vindicar
    @Vindicar
    RTFM!
    Не стоит полагаться на возвращаемое значение cursor.execute().
    Выхлоп твоего запроса нужно получать через fetchone()/fetchall(), даже если запрос вернул одно значение.
    У тебя тогда в выдаче будет одна строка с одним столбцом. Выбираешь строку через fetchone(), у полученного значения берёшь нулевой столбец.
    Ответ написан
    Комментировать
  • Почему Python выдает ""(" was not closed"? хотя все нормально?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в строке одинаковые одинарные кавычки - как вокруг всей строки, так и вокруг значения href. Так что https://www.google.com/ оказалось вне строковой константы. Будь внимательнее. И вообще, в HTML кавычки должны быть двойные.
    Ответ написан
    Комментировать
  • Почему дублируется слэш и не работают сырые строки?

    Vindicar
    @Vindicar
    RTFM!
    Обрати внимание, как ты выводишь значение.
    В питоне есть два строковых представления: str и repr.
    str - человекочитаемое представление. Его можно увидеть, сделав просто print(path). Сразу станет видно, что ничего не удваивается.
    repr, же, по идее, представляет объект так, что если его записать прямо в коде, как показано - получим обратно этот объект. Если это вообще возможно.
    В случае с числами разницы нет.
    В случае со строками - она будет. У тебя на скриншоте именно repr-представление строки - в кавычках, и с экранированием спецсимволов. При этом, записав такую константу, получишь ту же самую строку, что логично.
    Ведь 'a\\b' - это то же самое, что и r'a\b'.

    Короче, не парься, всё работает как надо. Просто имей ввиду, в каком виде у тебя выводятся значения. Кавычки должны были сразу заставить заподозрить неладное.
    Ответ написан
    Комментировать
  • Два одинаковых кода, но один не хочет работать! Почему?

    Vindicar
    @Vindicar
    RTFM!
    for i in range(word_count, 0, -1):
    На первой итерации цикла i примет значение word_count.
    Символы в строке word имеют индексы от 0 до word_count-1.
    Так что индекс, равный word_count, не существует. Ты поймаешь исключение IndexError.

    И можно ли его написать более компактно? Если да, то как?

    Освоить срезы (slice). part = word[a:b:c] будет (условно) эквивалентно
    part = ''
    i = a
    while i < b:
        part = part + word[i]
        i = i + c

    для положительного c. А для отрицательного будет while i > b:.
    Если a опущено, по умолчанию это начало последовательности (для c > 0) или конец (для c < 0).
    Если b опущено, по умолчанию это конец последовательности (для c > 0) или начало (для c < 0).
    Если c опущено, по умолчанию это 1.

    Так что для обращения строки нам нужно пройтись по всей строке с шагом -1. Получим вот что:
    word_reversed = word[::-1]
    # это эквивалентно
    word_reversed = word[len(word)-1:-1:-1]
    Ответ написан
    1 комментарий
  • Как соединить 2 python файла в один код?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема в том, что во второй файл надо будет передать объект bot, которого, скорее всего, не будет на момент импорта этого файла.
    Есть не слишком изящный, но простой способ.
    # imported_file.py
    import telebot
    from telebot import types
    
    def setup(bot):  # setup() принимает бота и прочее как параметры.
        # да, прописываем обработчики прямо внутри setup()
        # но вот глобальные переменные здесь прописывать не стоит
        @bot.message_handler(content_types=['text'])
        def get_text_messages(message):
            ...
    
    # main_file.py
    import telebot
    from telebot import types
    import time
    
    import imported_file
    
    bot = telebot.TeleBot("ТОКЕН")
    # убедись, что setup() вызывается строго один раз для каждого дополнительного файла!
    imported_file.setup(bot)  
    ...  # дальше работаем как обычно


    Этот вариант позволяет загрузить файл уже в ходе работы бота, но не предусматривает возможности выгрузить файл на ходу. Впрочем, не все библиотеки позволяют отвязать обработчик от события, так что это не только проблема этого подхода.
    Ответ написан
    1 комментарий
  • Как с вм2 подключиться по ssh ключу к вм3, если закрытый ключ храниться на 1 вм?

    Vindicar
    @Vindicar
    RTFM!
    У некоторых SSH клиентов есть ключ -J, попробуй его.
    Альтернативно, установи первое соединение с пробросом порта на локальную машину, и коннекться ко второму хосту через проброшенный порт.
    Ответ написан
    2 комментария
  • Почему не создается БД при старте телеграм бота?

    Vindicar
    @Vindicar
    RTFM!
    просто в папке не создается таблица бд и на этом все.

    создает товар и сохраняет в бд без ошибок.

    Дай угадаю, коннект к базе делаешь командой вида sqlite3.connect('somefile.db')?
    Если так, то ты налетел на проблему относительных путей. Основы информатики, начальная школа.
    Путь somefile.db будет рассчитываться относительно текущего рабочего каталога, который может меняться в зависимости от способа запуска скрипта, да и просто в ходе его работы. А может не меняться. Т.е. нет гарантий, что текущий рабочий каталог будет совпадать с каталогом, где лежит скрипт.
    Лучше определить абсолютный путь к файлу самостоятельно.

    from pathlib import Path
    import sys
    
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()  # каталог, где лежит выполняемый скрипт
    DB_PATH = SCRIPT_DIR / 'somefile.db'  # путь к файлу БД в этом каталоге
    
    conn = sqlite3.connect(DB_PATH)
    Ответ написан
    Комментировать