• Как вытащить из текста эмоджи?

    Maksim_64
    @Maksim_64
    Data Analyst
    В целом тебе нет необходимости для "удаления" вытаскивать в отдельную колонку. Обычно из фрейма ничего не удаляют, его не изменяют, а извлекают из него подсеты которые отвечают твоим требованиям. Код придется картинкой опубликовать а то форматирование не поддерживает эмоджи.
    6580990e822cb151482037.png

    Если ты не знаешь всех своих эмоджи то есть библиотеки получи все юникоды своих эмоджи и проверяй строку не содержит ли она юникод эмоджи, это будет очень медленно. лучше выбрать их несколько я думаю там их не много и как у меня в примере просто пусть их там десятка два будет а не два. Можно также попробовать простенькой регуляркой отловить что то типа такого
    df[df['comment_text'].str.contains(r'[^\w\s,]', regex=True)]
    Для моего примера работает, сработает ли в целом неизвестно.
    Ответ написан
    4 комментария
  • Как сделать индикатор подключенного устройства для линукса (XFCE)?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Напишите простенькое приложение на питоне и wxwidgets, которое отображает свое состояние в системном трее (taskbar) - https://wiki.wxpython.org/How%20to%20create%20a%20...
    Я таких приложений с десяток написпл, с менюшками и плюшками.
    Ответ написан
    2 комментария
  • Какая МЛ модель лучше подходит чтобы находить похожие названия (похожие не по смыслу)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Это называется стиль leet - https://ru.wikipedia.org/wiki/Leet
    Тут даже ML модель не нужна, алгоритм простой:
    1. Переводишь из leet в нормальный язык -> простая замена символов
    2. Нормализуешь
    3. Находишь расстояние хэмминга
    Ответ написан
    7 комментариев
  • Как FastAPI определяет, что запрос нужно обработать параллельно другим?

    Daemon23RUS
    @Daemon23RUS
    Note: You can mix def and async def in your path operation functions as much as you need and define each one using the best option for you. FastAPI will do the right thing with them.

    Anyway, in any of the cases above, FastAPI will still work asynchronously and be extremely fast.

    But by following the steps above, it will be able to do some performance optimizations.


    Обычный вызов выполняется асинхронно, но если вы указываете асинхронную обработку, то и асинхронность лежит на вас, а у вас там sleep во 2м примере который возвращает промис с задержкой.
    Ответ написан
    Комментировать
  • Чем подобрать пароль к архиву ARJ на линуксе?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    нет ничего лучше программ от Elcomsoft

    для ARJ- и ZIP-документов перебор ключей ведётся по содержимому, и, если сохранился исходник хотя бы одного документа, пароль будет найден в течение нескольких часов независимо от его длины и сложности;


    https://archpr.ru/
    Ответ написан
  • Есть ли боты для модерации?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Есть
    Ответ написан
    1 комментарий
  • Почему он выдает interrupt exception, который не ловится?

    Vindicar
    @Vindicar
    RTFM!
    Потому что вызов thread.start() который внутри start_listen() - не блокирующий. Главный поток продолжит работу, выйдет из try-except и завершится, так что на момент возникновения KeyboardInterrupt он уже будет завершён. Твой поток не помечен как daemon, поэтому интерпретатор продолжит работу (был бы помечен - программа бы завершилась тут же).
    Если ты делаешь join() - то пока запущенный поток не закончится, главный не продолжит работу.

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

    @Drno
    lxd контейнеры
    ставится и настраивается в 2 клика, запускаете каждому свой контейнер и пусть там развлекается
    ну и ssh каждому прокинуть в нужный контейнер
    Ответ написан
    Комментировать
  • Я пишу музыкального бота для Discorda, но выводит ошибки. Не могу понять в чем именно проблема?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямым английским текстом написано: ты обращаешься к объекту, описывающему сервер(гильду), и пытаешься у него добыть свойство voice, а такого свойства нет.
    server.voice.channels - получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.
    И в документации свойства voice у объектов класса Guild тоже нет. Зато есть voice_channels.
    Ответ написан
    Комментировать
  • Вероятностные алгоритмы: какие бывают и где найти полный их список?

    begemot_sun
    @begemot_sun Автор вопроса
    Программист в душе.
    Здесь буду собирать ссылки на вероятностные алгоритмы:
    1. Фильтр блума https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D...
    2. MinHash habrahabr.ru/post/115147
    3. LogLog: находим число уникальных элементов -- habrahabr.ru/post/119852
    3.1 HyperLogLog
    4. Поиск похожих документов с MinHash + LHS: habrahabr.ru/post/250673
    5. https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch -- приближенный сбор частот событий в потоке.
    6. Алгоритм Рабина — Карпа: поиск подстрок в строке через хеширование. https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...

    https://en.wikipedia.org/wiki/Category:Probabilist...
    Ответ написан
    Комментировать
  • Как в питоне обеспечить контроль целосности данных?

    Vindicar
    @Vindicar
    RTFM!
    С переменными так не прокатит. А вот с полями класса - при желании можно, если использовать property.
    Базовая идея простая - пусть сеттер свойства производит валидацию.
    Например, так
    class Person:
        def __init__(self, name: str):
            self._name: str = ''
            self.name = name
        
        @property
        def name(self) -> str:
            return self._name
        
        @name.setter
        def name(self, value: str) -> None:
            if not value:
                raise ValueError('Must not be empty')
            self._name = value

    Но писать такой бойлерплейт быстро надоест. Поэтому можем попробовать обобщить процесс.
    Например, так
    from typing import TypeVar, Type, Any, Annotated, Callable, Dict, get_args, get_origin
    
    T = TypeVar('T')
    ValidationRule = Callable[[Any], bool]
    ValidationRules = Dict[str, ValidationRule]
    
    class ValidatedProperty:
        """Экземпляры этого класса будут свойствами в валидируемых классах, и будут заниматься валидацией."""
        def __init__(self, name: str, storagename: str, rules: ValidationRules):
            self.name = name  # как называется свойство
            self.storagename = storagename  # где его хранить
            self.rules = rules  # какие правила применять
    
        def __get__(self, instance, owner=None):
            return getattr(instance, self.storagename)  # при чтении просто возвращаем свойство
        
        def __set__(self, instance, value):  # при записи валидируем
            for message, rule in self.rules.items():  
                if not rule(value):  # если правило нарушено, выкидываем исключение с сообщением
                    raise ValueError(f'{instance.__class__.__name__}.{self.name}: {message}')
            setattr(instance, self.storagename, value)
    
    
    def validated(klass: Type[T]) -> Type[T]:
        """Декоратор для валидируемых классов."""
        for name, annot in klass.__annotations__.items():  # проверяем список аннотаций в классе
            base = get_origin(annot) or annot
            if base is not Annotated:  # нас интересуют только те, которые помечены как Annotated
                continue
            args = get_args(annot)
            rules = [arg for arg in args if isinstance(arg, dict)]
            if not rules:  # и только если один (любой) из аргументов Annotated - словарь
                continue
            # в этом случае мы считаем, что словарь содержит правила валидации, и создаём свойство класса
            setattr(klass, name, ValidatedProperty(name, f'_{name}', rules[0]))
        return klass  # не забываем вернуть изменённый класс!
    
    
    @validated
    class Person:
        name: Annotated[str, {'must not be empty': lambda v: bool(v)}]
        age: Annotated[int, {'must be positive': lambda v: v > 0}]
    
        def __init__(self, name: str, age: int):
            self.name = name  # валидация отработает уже здесь
            self.age = age  # валидация отработает уже здесь
        
        def __repr__(self) -> str:
            return f'Person(name={self.name!r}, age={self.age!r})'
    
    try:
        Person('John Doe', 23)  # отработает успешно
    except Exception as err:
        print('Failed to create person 1')
        print(f'{err.__class__.__name__}: {err!s}')
    else:
        print('Person 1 created')
    
    try:
        Person('', 23)  # выкинет исключение
    except Exception as err:
        print('Failed to create person 2')
        print(f'{err.__class__.__name__}: {err!s}')
    else:
        print('Person 2 created')
    
    try:
        Person('Jane Doe', -23)  # выкинет исключение
    except Exception as err:
        print('Failed to create person 3')
        print(f'{err.__class__.__name__}: {err!s}')
    else:
        print('Person 3 created')
    
    p = Person('John Doe', 23)
    try:
        p.name = ''  # выкинет исключение
    except Exception as err:
        print('Failed to modify person')
        print(f'{err.__class__.__name__}: {err!s}')
    
    try:
        p.age = 0  # выкинет исключение
    except Exception as err:
        print('Failed to modify person')
        print(f'{err.__class__.__name__}: {err!s}')
    
    try:
        p.age = 24  # отработает успешно
    except Exception as err:
        print('Failed to modify person')
        print(f'{err.__class__.__name__}: {err!s}')
    
    print(p)
    print(vars(p))


    Это, конечно, велосипед, и пользоваться им я бы не посоветовал. Для валидации есть библиотеки типа pydantic.
    Плюс, как было указано выше, не всё и не всегда имеет смысл валидировать...

    А для работы с БД лучше использовать ORM. SqlAlchemy популярна, но есть и более простые, например, peewee или ponyorm.
    Ответ написан
    Комментировать
  • Как в Python, используя logging, записать в traceback пойманного исключения значения локальных переменных функции?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй создать свой LoggerAdapter или Filter. Вообще в доках есть секция на эту тему, почитай, может, найдешь что полезное.
    По сути, схема работы logging такая:
    • Logger предоставляет интерфейс генерации логов приложению, и создаёт объект-запись.
    • LoggerAdapter вызывается логгером, чтобы дополнить запись специфичной для программы контекстной информацией.
    • Filter определяет, какие записи реально выводить в лог, и может их менять
    • Formatter делает из записи строку.
    • Handler записывает записи по назначению.


    Либо, если тебя устраивает вариант делать это вручную, ты можешь передать в параметр exc_info методов логгера кортеж вида (класс исключения, объект исключения, трейсбэк). Тогда ты можешь подставить свой трейсбэк вместо "родного".
    Ответ написан
    Комментировать
  • Как создать кнопки в ТГ боте Golang (telegram-bot-api)?

    RimMirK
    @RimMirK
    Вроде человек. Вроде учусь. Вроде пайтону
    кнопка под сообщением
    Инлайн кнопка, ее вставить в инлайн маркап. Инлайн маркап передать функции отправляющей сообщение.

    кнопа внизу
    Репли кнопку (кейборд батн) вставить в репли маркап. Маркап в функцию отправки.
    Ответ написан
    Комментировать
  • Какой гайд поможет делать авторизацию на сайте golang?

    DollyPapper
    @DollyPapper
    Во первых аутентификацию. Авторизация это про проверку прав.
    Если без REST API, то классика это принимать через POST запрос данные с формы.
    Вот статья
    Если кратко:
    Делаете ручку /signin, которая проверяет пароль присланный пользователем с хешем паролей в базе данных (ну или где вы храните данные)
    Если всё ок, создаете сессию, сохраняете сессию где нибудь в хранилище (опять же это может быть база данных, может быть ин мемори, есть библиотеки для этого, погуглите, да хоть в памяти приложения в мапе храните)
    Далее ID сессии записываете в куки и посылаете ответ пользователю в заголовком Set-Cookie sessid="session_id", где session_id это айди который вы раньше сгенерили.
    А далее пользователь ходит на ваш сайт, и какая нибудь мидлвара берет из запроса куки, берете оттуда id сессии, ищет этот айди в хранилище. Если нашла, то пропускает запрос дальше, если нет - 401 Unauthorized.
    Ну в статье вобщем всё подробно описано.
    Ответ написан
    Комментировать
  • Как замокать зависимость в pytest?

    i229194964
    @i229194964
    Веб разработчик
    import pytest
    from unittest import mock
    
    class B:
        def __init__(self, db_connection):
            self.__db_connection = db_connection
    
    class A:
        def __init__(self, b: B):
            self.__b = b
    
        def do_something(self) -> None:
            pass
    
    @pytest.fixture(scope="module")
    def mock_b(mocker):
        mocker.patch('path.to.B')  # Здесь 'path.to.B' - это путь к классу B, который нужно замокать
        return B(mock.MagicMock())  # Возвращаем экземпляр класса B с мок-объектом для db_connection
    Ответ написан
    Комментировать
  • Как правильно запускать бота Telegram через Flask Server?

    WolfInChains
    @WolfInChains
    Вот так можно. Но стоит учитывать что если Flask сервер упадет, то упадет и бот.

    from multiprocessing import Process
    
    
    class BotProcess:
    
        def __init__(self):
            self.process = None
    
        def get(self) -> Process:
            return self.process
    
        def is_alive(self) -> bool:
    
            if self.process is not None and self.process.is_alive():
                return True
            else:
                return False
    
        def stop(self) -> None:
            self.process.terminate()
            self.process = None
    
        def start(self, process: Process) -> None:
            self.process = process
            self.process.start()


    bot_process = BotProcess()
    
    @app.route("/bot-start", methods=["GET"])
    def bot_start():
        if not bot_process.is_alive():
            bot_process.start(Process(target=start_bot))
            return "Bot started"
        else:
            return "Bot is already running"
    
    
    @app.route("/bot-restart", methods=["GET"])
    def bot_restart():
        if bot_process.is_alive():
            bot_process.stop()
            bot_process.start(Process(target=start_bot))
            return "Bot restarted"
        else:
            return "Bot is not running"
    
    
    @app.route("/bot-stop", methods=["GET"])
    def bot_stop():
        if bot_process.is_alive():
            bot_process.stop()
            return "Bot stopped"
        else:
            return "Bot is not running"
    Ответ написан
    Комментировать
  • Как сделать музыкального бота в discord, disnake(cogs)?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Программировать и гуглить решения ошибок вы, судя по постановке вопроса, не умеете.
    Читать документацию по библиотекам не хотите или не можете.
    Экстрасенсов, чтобы угадывать, что именно "не работает" здесь нет.
    Поэтому выход один - заказывайте разработку на фрилансе.
    Ответ написан
    Комментировать
  • Хостинг телеграм бота с базой данных SQLite3, как?

    Vindicar
    @Vindicar
    RTFM!
    Расширю ответ выше для случая, если VPS под линуксом:
    0. Добавь журналирование действий в бота, это упростит отладку потом.
    1. Арендуешь VPS.
    2. Получаешь доступ по SSH.
    3. Проверяешь, какая версия питона установлена по умолчанию.
    4. Если требуется, устанавливаешь предпочительную версию питона. По возможности используй пакетный менеджер.
    5. Создаёшь каталог для своего бота. Под никсами обычно это каталог внутри /opt.
    6. Создаёшь в каталоге виртуальное окружение через venv.
    7. Активируешь это окружение и ставишь в него нужные боту пакеты через pip. Это предпочтительнее, чем ставить пакеты прямо в системное окружение.
    8. Загружаешь в каталог бота. Либо прямо с машины, используя scp, либо загрузив его куда-то ещё, и скачав через wget. Есть ещё вариант с загрузкой бота на гитхаб, но тут надо быть осторожным и не запалить токен бота и другую секретную инфу.
    9. Проверяешь, что бот работает. Рекомендуется не запускать бота из-под root. Создай новую учётную запись, и сделай chown на все файлы бота, чтобы они принадлежали этой учётке.
    10. Формулируешь и записываешь команду, которая позволит запустить бота через желаемое виртуальное окружение от имени правильной учётной записи.
    11. Разбираешься, как том дистрибутиве, под которым работает VPS, настроить автозапуск. Скорее всего это systemd, но может быть и просто скрипт в /etc/init.d или ещё что. Прописываешь автозапуск бота, например, через systemd модуль.
    12. Убеждаешься, что бот заводится через автозапуск.
    13. PROFIT.
    Ответ написан
    Комментировать
  • Какую key-value БД использовать с данными в 10 млрд строк записей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Несколько мыслей.

    1) У меня устойчивое дежа-вю. Периодически в топик заходят люди с именно этим вопросом. Разница только в количестве. Кому 1 млрд. Кому 10. Можно также поискать и слинковать эти вопросы в один большой вопрос.

    2) MySQL который указан в тегах - нормально справляется с этой задачей. Он и не такое число строк
    умеет хранить. И если взять MariaDb - там есть куча новых engines которые можно крутить для тюнинга
    именно скорости чтения. Разумеется жертвуя чем-то другим. Транзакциями и записью например.

    3) Непонятно что такое минимальное время? Если использовать дисковую БД типа MySQL то деградация времени
    поиска будет примерно зависеть от логарифма количества строк. Тоесть деградация будет но очень медленно.
    Для 10 млрд индекс по key будет содержать порядка 4-5 уровней BTree дерева. Тоесть дисковой системе
    нужно будет сделать до 5 или до 6 рандомных чтений (если нужные данные лежат в таблице). Это достаточно
    быстро для того чтобы моргнуть глазом за это время. Рандомное чтение любого блока из магнитного диска
    класса SATA-3 занимает порядка 20 милисекунд. Тоесть для 5 уровней - это 100 милисекунд. Для дисков
    класса SSD и это время можно уже считать меньше милисекунды. Точно я не знаю надо мерять.

    Испортить это время может сетевой лаг который в данной задаче мы просто не учитываем. Считаем что сеть идеальна.

    4) Непонятно зачем здесь указан Redis. Его задача не хранить 10 млрд а хранить только горячие
    ключи по котороым идет очень частый доступ. Если автор хочет In-memory хранение - то время можно
    еще сильнее улучшить. Его можно свести практически до нуля (я вангую несколько микро-секунд)
    но придется прикупить планок памяти побольше и посчитать сколько памяти
    надо для 10 млрд key/values неизвестной длины. Вообще крутить регулятор в направлении
    микро-секунд нет особого смысла т.к. другие звенья вашего стека (приложение и сеть) могут
    быть на порядки медленнее а это вообще нивелирует всю пользу от такой оптимизации.
    Ответ написан
    41 комментарий