• Как защитить админку?

    @12rbah
    Советую в гугл вбить node js authorization, и там будут примеры того как можно реализиовать авторизацию/аутентификацию
    Ответ написан
    Комментировать
  • Почему после очистки добавленного листа исчезают значения из другого листа?

    fenrir1121
    @fenrir1121
    Начни с документации
    c.add(b)
    b.clear()

    Ознакомьтесь с тем, что из себя представляет список в питоне. Если упрощать это динамический массив ссылок. В вашем случае все элементы списка c фактически ведут в один и тот же очищенный b.
    Кстати у списка нет метода .add, поэтому такой код вообще не запустится.

    Визуализация как связаны объекты в вашем коде63fc85239dd32123307508.png
    Ответ написан
    2 комментария
  • Зачем именно нужны связи в бд?

    @deliro
    Когда к тебе придёт менеджер и скажет: "эй, hrnsywtfczlh, а почему у нас тут вот заказов отгруженных на 15 миллионов, а получателей даже не в базе?", тогда-то ты и поймёшь, зачем нужны связи в БД. Но сперва поседеешь.
    Ответ написан
    7 комментариев
  • Зачем именно нужны связи в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно поговорить об аномалиях. Например в твоей системе я могу (теоретически) добавить месседж
    который не принадлежит ни одному пользователю системы. Я просто сделаю

    insert into message(9999999, -1, "Mua-haha...");

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

    Разумеется можно полагаться на логику твоего приложения и думать что такая ситуация невозможна
    но с точки зрения БД она вполне возможна потому как родственная связь User + Message нигде не объявлена.
    И SQL позволяет это сделать.

    Чтоб поправить ситуацию надо эту связь добавить и тогда я не смогу создать фейковые посты от анонимосов.
    ALTER TABLE Message
    ADD FOREIGN KEY (userid) REFERENCES users(id);

    По умолчанию констрейнт создается с опцией restict (это было в Оракле как в Майскл - не знаю)
    и это гарантирует что невозможно также удалять родительские записи пока есть дочки.
    Для скорости ссылочные ключи всегда - индексированы.

    Рассуждать на тему вреда от аномалий - это просто терять время. Каждый владелец БД сам решает
    какие уровни строгости ему вводить. Вообще любая теория касаемая БД - по сути просто развивает
    идею строгости НФ1,2,3,4,5,6 и ссылочных ограничений.

    Будет ли виден пост от анонимосов - это тоже другой вопрос и он не имеет отношения к обсуждаемой
    теме. Ведь тема касается именно логичности данных в БД а не тем методам которые их отображают.

    По сути вопрос сводится к тому как не создавать мусор в БД.
    Ответ написан
    2 комментария
  • Почему is работает не так, как ожидается?

    ElonMask2
    @ElonMask2
    Autor of Tesla Machini and SpaxeX
    Ладно
    a = 'af' Инициализируем ПЕРВУЮ переменную А = АФ  идентиф=1
    b = 'a' Инициализируем ВТОРУЮ переменную Б= А     идентиф=2
    b += 'f' Инициализируем ТРЕТЬЮ переменную Б = А + Ф  идентиф=3
    # А все почему? Строка - НЕИЗМЕНЯЕМЫЙ ТИП
    print(a is b)
    >>> False
    a = 5
    b = 2
    b += 3
    # Тоже самое но, в питоне числа до 255 КЕШИРУЮТСЯ и 50 is 50 и 255 is 255
    print(a is b)
    >>> True


    А тут,
    a = 'af'       #Инициализируем ПЕРВУЮ (ОНА ИДЕТ В КЕШ) А = АФ
    b = 'a' + 'f'  #Инициализируем ВТОРУЮ интерпретатор не тупой и Б = ТОЖЕ АФ (а так как аф есть в кеше Б получает ссылку на ту же память)
    
    print(a is b)
    >>> True


    Где читать? Гугл-
    Изменяемые неизменяемые типы,
    Ответ написан
  • В чем минусы событийно ориентированного подхода?

    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 Куратор тега Цифровые сертификаты
    //COPY01 EXEC PGM=IEBGENER
    Глеб. елы-палы. Ты башкой своей пойми, что сертификаты для банков, херанков, еще чего - это только предлог. Тебе напомнить, как создавался РКН? Изначально там были заложены только цели защиты детей от изображений писек.

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

    Если ты чего-то опасаешься - юзай виртуалку с российскими сертификатами.
    Ответ написан
    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
    Ты в цикле не изменяешь х.
    Каждую итерацию проверяется условие, оно всегда верно, поэтому и бесконечный цикл.
    Ответ написан
    Комментировать