Задать вопрос
  • В чем минусы событийно ориентированного подхода?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну да, Вы перепутали сообщение и событие. Вызов метода объекта в ООП можно интерпретировать как сообщение этому объекту из конкретного места и контекста в выполняющемся коде.
    Это не то же самое, что события. Нет никакой шины или очереди событий.
    Для событийного программирования существуют Pub\Sub механизмы, в рамках которых есть паблишеры, которые формируют событие в любом месте и контексте кодовой базы, а есть подписчики, которые реагируют на конкретные типы событий, обрабатывают и передают их дальше или терминируют.
    Этот подход иногда полезен, но часто он рубит распыляет логику по куче обработчиков. Такие системы очень сложно отлаживать, трудно тестировать, практически невозможно доказывать корректность программы для любой допустимой входной последовательности событий. Антипаттерн это потому, что после некоторого порога сложности начинает накапливаться много формальных событий и неочевидных состояний системы. Эта мешанина трудно воспринимается и анализируется человеком
    Ответ написан
    7 комментариев
  • Есть ли простое и быстрое решение определить, что фраза изменена незначительно?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    это классическая задача. Решается через расстояние Левенштейна
    Ответ написан
    1 комментарий
  • Есть ли простое и быстрое решение определить, что фраза изменена незначительно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно вести подсчет триграмм. (Троек символов). И если разница в небольшом числе триграмм - тогда
    считаем что слова равны с "допуском". Величину допуска можно установить экспериментально исходя
    из тестовых выборок.

    Для случая сходразвал сход-развал.
    сходразвал: схо ход одр дра раз азв вал
    для слова с дефисом из триграмм выпадают
    одр дра
    следовательно допуск равен двум.

    Можно использовать би-граммы или четерех-граммы. Это вопрос эксперимента. Что лучше подойдет на
    данном наборе исходных данных.
    Ответ написан
    Комментировать
  • Правильно ли решил задачу?

    bingo347
    @bingo347
    Crazy on performance...
    Задачка прикольная для обучения, позволяет поработать сразу со многими конструкциями языка.

    Для начала комментарии по Вашему решению:
    1. Тип String алоцирует память на куче, операция += над типом String может приводить к реалокации памяти. Алокация памяти не дешевая операция, в данной задаче можно обойтись вообще без нее.
    2. Для повторяющихся операций придумали циклы, а с циклами хорошо сочетаются коллекции, например массивы и слайсы.
    3. Уже писали в комментах, но все же, if true - бесполезная штука.

    Теперь давайте посмотрим на текст песни. У нас 12 куплетов.
    Каждый куплет начинается с очень похожих строчек: "On the first day of Christmas", "On the second day of Christmas", и т.д., меняется только числительное.
    Потом всегда идет строчка "My true love sent to me" в каждом куплете.
    Затем идет от 1 до 12 строчек, повторяющиеся из куплета в куплет, но в i-том куплете будет только i таких строчек. Притом тут есть особенность, что первая строчка в куплете иногда отличается от своих аналогов в последующих куплетах.
    Ну и наконец, в 12 куплете мы видим, что строка "And a partridge in a pear tree" присутствует 2 раза, что выбивается из общего правила.

    Решение с объяснением

    Для начала вынесем факт того, что у нас 12 куплетов в константу, это нам пригодится для дальнейшего объявления массивов и итерации по ним.
    const NUMBER_OF_VERSES: usize = 12;

    Заведем массив числительных, которые меняются в первых строчках куплетов.
    const NUMERALS: [&str; NUMBER_OF_VERSES] = [
        "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth",
        "11th", "12th",
    ];


    Так же заведем массив, для повторяющихся строчек куплетов.
    const LINES: [&str; NUMBER_OF_VERSES] = [
        "And a partridge in a pear tree",
        "Two turtle-doves",
        "Three French hens",
        "Four calling birds",
        "Five golden rings (five golden rings)",
        "Six geese a-laying",
        "Seven swans a-swimming",
        "Eight maids a-milking",
        "Nine ladies dancing",
        "Ten lords a-leaping",
        "Eleven pipers piping",
        "12 drummers drumming",
    ];


    Так же нам понадобится массив первых строчек куплетов, так как среди них есть отличающиеся. Я нашел такие в 1 и 11 куплете (так как массивы у нас индексируются с 0, то они будут под индексами 0 и 10 соответственно). Остальные же будут такими же как в массиве LINES, а значит можно по экономить размер бинаря и занимаемую память за счет того что в массивах у нас только ссылки на строки, которые можно копировать.
    Тут конечно можно написать что-то вроде
    const DIFFERING_LINES: [&str; NUMBER_OF_VERSES] = [
        "A partridge in a pear tree",
        LINES[1],
        LINES[2],
        // ...
    ];
    но это дикая копипаста, которая плохо читается и подвержена ошибкам.
    Благо в Rust есть константные функции, которые могут выполняться в compile-time и возвращают константы, а значит можно наш константный массив сгенерировать. Правда константные функции довольно сильно ограничены, в них можно пользоваться лишь ветвлениями, циклами, простейшей арифметикой (в том числе над указателями, а значит и получать доступ к элементам массива по индексу). Так же можно вызывать другие константные функции. Цикл for нам к сожалению тут не доступен, так как он работает поверх итераторов, а методы IntoIter::into_iter и Iterator::next, которые он вызывает, не являются константными. Но цикл со счетчиком можно сделать и через while. По итогу получим такую функцию:
    const fn gen_differing_lines() -> [&'static str; NUMBER_OF_VERSES] {
        let mut i = 0;
        let mut lines = [""; NUMBER_OF_VERSES];
        while i < NUMBER_OF_VERSES {
            lines[i] = match i {
                0 => "A partridge in a pear tree",
                10 => "I sent 11 pipers piping",
                i => LINES[i],
            };
            i += 1;
        }
        lines
    }

    И инициализируем ей наш массив:
    const DIFFERING_LINES: [&str; NUMBER_OF_VERSES] = gen_differing_lines();


    Теперь еще особенность, в самих куплетах, строчки из LINES в них идут в обратном порядке. То есть для 4 куплета (индекс 3) нам помимо строчки DIFFERING_LINES[3] нам нужно напечатать строки под индексами 2, 1 и 0 из LINES. Для удобства вынесем печать строк из LINES в отдельную функцию:
    fn print_verse(mut i: usize) {
        while i > 0 {
            i -= 1;
            println!("{}", LINES[i]);
        }
    }


    Ну и осталось написать основной код для печати:
    fn main() {
        for i in 0..NUMBER_OF_VERSES {
            println!("On the {} day of Christmas", NUMERALS[i]);
            println!("My true love sent to me");
            println!("{}", DIFFERING_LINES[i]);
            print_verse(i);
        }
        println!("{}", LINES[0]);
    }


    А полное решение можно посмотреть и запустить тут:
    https://play.rust-lang.org/?version=stable&mode=re...
    Ответ написан
    Комментировать
  • Как в ubuntu запускать скрипт при старте?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    1. гуглить enable rc.local ubuntu
    2. написать systemd скрипт автозапуска.
    Ответ написан
  • Как работает docker на MacBook с m1?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    На М1 работает отлично: десяток-полтора контейнеров перевариваются вполне нормально. Все запускается, работает как надо. Да, х86 виртуализация работает медленно - но тут ничего не поделать, хост все же арм. Если нужна максимально быстрая виртуализация х86 - надо использовать х86 машину с линуксом или виндой.
    Ответ написан
    Комментировать
  • Как сделать белый список для тг бота?

    Vindicar
    @Vindicar
    RTFM!
    1. Хранить список допущенных к работе пользователей.
    2. При обработке каждого события определять id пользователя-отправителя и проверять его на вхождение в список.
    3. Добавить команды для управления списком.
    Ответ написан
  • Возможно ли настроить доверие для Сбербанк?

    CityCat4
    @CityCat4 Куратор тега Цифровые сертификаты
    Жил да был черный кот за углом...
    Глеб. елы-палы. Ты башкой своей пойми, что сертификаты для банков, херанков, еще чего - это только предлог. Тебе напомнить, как создавался РКН? Изначально там были заложены только цели защиты детей от изображений писек.

    Точно также будет и здесь - не поставишь сертификаты от Сбера - поставишь еще от чего-нибудь, не поставишь ни от чего - просто в тырнет не выйдешь. Провайдеру организовать дополнительную страницу, на которую нужно просто зайти (но для захода нужен российский сертификат) - да вообще делать нефиг.

    Если ты чего-то опасаешься - юзай виртуалку с российскими сертификатами.
    Ответ написан
    7 комментариев
  • Возможно ли настроить доверие для Сбербанк?

    @d-stream
    Готовые решения - не подаю, но...
    Использовать отдельный броузер/виртуалку с подключенным УЦ Russian Trusted CA
    Ответ написан
    Комментировать
  • Существует ли сервис наглядной интерпретации python в байткод?

    @deliro
    Получить байткод:
    import dis
    dis.dis(твоя функция)


    Либо на уровне AST:

    import ast, inspect
    ast.dump(ast.parse(inspect.getsource(твоя функция)))
    Ответ написан
    Комментировать
  • Какие книги прочитать по Форт (Forth) языку программирования?

    @Filipp42
    Поищите книги Лео Броуди.
    Ответ написан
    Комментировать
  • Можно ли в месте файл указать ссылку?

    Vindicar
    @Vindicar
    RTFM!
    Можно было чуть-чуть погуглить примеры, и почитать код, там всё написано простым английским:
    async def recognize_song(
            self, data: Union[str, pathlib.Path, bytes, bytearray, AudioSegment]
        ) -> Dict[str, Any]:
            """
            Creating a song signature based on a file and searching for this signature in the shazam
            database.
                :param data: Path to song file or bytes
                :return: Dictionary with information about the found song
            """

    Т.е. data принимает или путь к файлу, или байты с содержимым файла.
    Поэтому ответ на твой вопрос: нужно самому скачать аудиофайл по ссылке, и скачанное содержимое отдать в recognize_song().
    Если у тебя ссылка на youtube, то либо используй пакет youtubedl, либо посмотри в примерах есть что-то на тему.
    Ответ написан
    Комментировать
  • Стоит ли данные авторизации главного администратора хранить в окружении?

    @12rbah
    Вот пример того пользователи хранятся в вордпрессе примерв целом как вариант можете загуглить rbac + ваш язык и посмотреть как реализована либа и как её используют. Еще будет полезно погуглить rbac design.
    Мне пришла мысль, что можно указать логин и хэш пароля прямо в .env файле
    На самом деле немного странное решение, вполне нормально хранить эти данные в бд, если не ошибаюсь в wp так и делают.
    К роуту авторизации этого пользователя можно предоставлять только с определённого пула IP-адресов, которые храним в этом же файле окружения вместе с ключами шифрования JWT.
    Так не стоит делать, если это нужно то лучше написать в отдельноё middleware, которое будет уметь это делать, эта задача к системе ролей никак не относится.
    Раз в этом файле хранятся ключи шифрования, то полагаю место достаточно надёжное и почему бы так не поступить.
    Довольно неудобно менять пароль, по сути нужно перезапускать систему для этого
    создать одного главного админа который будет либо единственным в своём роде, либо сможет раздавать такой же уровень прав
    Вообще это не такая и редкая ситуация когда только 1 человек знает все пароли, но стоит предусмотреть возможность чтобы была возможность того, чтобы админ мог создавать пользователей с любыми ролями и привилегиями. Я же правильно понял, что вы хотите создать систему ролей которую можно будет применить к любому проекту, то глупо ограничивать пользователя, пусть делает что ему нужно, с вашей стороны нужно обеспечить гибкую систему ролей.
    Ответ написан
    Комментировать
  • Не понимаю данную бесконечность в операторе while?

    @dima20155
    you don't choose c++. It chooses you
    Ты в цикле не изменяешь х.
    Каждую итерацию проверяется условие, оно всегда верно, поэтому и бесконечный цикл.
    Ответ написан
    Комментировать
  • Не понимаю данную бесконечность в операторе while?

    @deliro
    Давай по буковкам читать как в детском саду:

    икс равно нулю
    пока икс меньше десяти, печатай икс

    Икс всегда равно нулю, ты это нигде не меняешь, а ноль всегда меньше десяти. Выхода из цикла не планируется, по крайней мере, в пределах нашей вселенной
    Ответ написан
    Комментировать
  • Как циклом Python for пройти несколько (сотен) range?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как называются "\n","\r","\t"... в строках?

    drygdryg
    @drygdryg
    Python-разработчик
    Это специальные управляющие последовательности (англ. escape sequences), которые используются для записи пробельных (непечатных) символов (англ. whitespace characters). Все эти символы соответствуют шаблону \s в регулярных выражениях:
    import re
    
    print(all(re.fullmatch(r'\s', string) for string in ('\n', '\r', '\t', ' ')))  # True
    Ответ написан
    1 комментарий
  • Как называются "\n","\r","\t"... в строках?

    paran0id
    @paran0id
    Умный, но ленивый
    В общем случае - escape sequences, управляющие последовательности по-нашему.
    Ответ написан
    Комментировать
  • Как последовательно объединить несколько DataFrame с одинаковыми столбцами?

    Maksim_64
    @Maksim_64
    ML Engineer
    если планируете использовать pd. concat(), то сначала собираете ваши фреймы в список frame_list. A потом этот список в pd.concat(). далее pd.concat имеет аргумент axis, его поставьте 0 (если у вас совпадают имена столбцов), он будет добавлять их вниз новыми рядами.
    ваш псевдо код будет иметь вид
    frame_list = []
    for i in ally_code:
        df = get_units_player( get_player_json(i) )
        frame_list.append(df)
    final_df = pd.concat(frame_list,axis= 0)
    Ответ написан
    1 комментарий