• Как реализовать превращение вектора объектов в дерево?

    bingo347
    @bingo347
    Crazy on performance...
    Главная проблема тут - лайфтаймы. В частности у переменной на стеке никогда не будет лайфтайма 'static.
    Ну и отдавать в куда либо долгоживущее ссылку на временное значение - UB. Благо лайфтаймы и тут спасают.
    Собственно для этого Rc и нужен - он владеющая ссылка. Соответственно в нём должно быть значение, а не ссылка (ссылка на ссылку редко когда нужна).

    use std::cell::RefCell;
    use std::rc::Rc;
    
    #[derive(Default, Clone, Debug)]
    struct NodeInner {
        name: String,
        source: String,
    
        path: String,
        leaf: bool,
        children: Vec<Node>,
    }
    
    #[derive(Default, Clone, Debug)]
    struct Node(Rc<RefCell<NodeInner>>);
    
    impl Node {
        fn fast(name: impl Into<String>, source: impl Into<String>) -> Self {
            Self(Rc::new(RefCell::new(NodeInner {
                name: name.into(),
                source: source.into(),
    
                path: String::new(),
                leaf: true,
                children: Vec::new(),
            })))
        }
    
        fn insert(&self, node: Node) {
            let mut current = self.clone();
            for part in node.0.borrow().source.split(".") {
                let inner = node.0.borrow();
                let found = inner.children.iter().find(|&v| v.0.borrow().path == part);
    
                match found {
                    None => {
                        let tmp = Node::fast(String::new(), String::new());
                        current.0.borrow_mut().children.push(tmp.clone());
                        current = tmp;
                    }
                    Some(val) => current = val.clone(),
                }
            }
        }
    }
    
    fn main() {
        let mut root = Node::default();
        root.insert(Node::fast("First", "e"));
        root.insert(Node::fast("First", "e.sources"));
        root.insert(Node::fast("First", "e.sources.two"));
        root.insert(Node::fast("First", "e.secret"));
        root.insert(Node::fast("First", "e.secret.left"));
        root.insert(Node::fast("First", "e.secret.right"));
        print!("{:#?}", root);
    }

    Как заполнять поля уже сами разбирайтесь, думаю тут не сложно
    Ответ написан
    3 комментария
  • Какой сайт с задачами rust?

    vabka
    @vabka Куратор тега Rust
    1. Не сайт, но сборник задач: Rust koans. По сути своей - интерактивный учебник по синтаксису языка.
    (UPD: на самом деле я думал про rustlings - это официальный сборник задач, а не koans)
    2. Когда уже уверенно можешь писать код/знаком с синтаксисом - можешь попрактиковаться на leetcode и codewars.

    Ну и лучше не на сайте сидеть, а нормальный редактор на компьютер установить, который будет давать подсказки по синтаксису и API.
    Ответ написан
    Комментировать
  • Какие знаниями java нужно обладать чтобы переходить на kotlin?

    xez
    @xez
    TL Junior Roo
    Разрешаю изучать Котлин с любым уровнем знания джавы, в том числе и без знания джавы.
    Ответ написан
    Комментировать
  • Почему postgres отвечает джанго отличные от реальности данные?

    @KingstonKMS
    Задать часовой пояс в конфигурации или для сеанса. Подробнее https://postgrespro.ru/docs/postgresql/9.6/datatyp...
    Ответ написан
    5 комментариев
  • Как рассчитать температуру воды в общей емкости?

    По формуле теплоёмкости.
    Чтобы нагреть 500 литров воды с 20 градусов до 45, нужно 4200дж/кг*К*500кг*(45-20)=52500000 дж = 52500 кДж

    в минуту мы гоняем по 2 литра, которые нагреваем до этих 45 градусов, получается мы будем гонять по 210 кДж.

    Получается 52500/210 чуть больше 4х часов.
    Но! Это нижняя граница, тк вода постепенно перемешивается и в минуту уже будет передаваться меньше 210 кДж.
    + С какой-то скоростью тепло будет уходить, тк бочка не термос, причём чем выше температура, тем быстрее будет уходить тепло.
    Строго говоря, до 45 градусов вода вообще может никогда и не нагреться, если теплообменник нагревает воду ровно до 45 градусов, тк пока вода крутиться - какое-то количество тепла уйдёт и будет температура 44.99999
    Ответ написан
    9 комментариев
  • Почему видеокарта с меньшим потреблением требует более сильный БП?

    @lonelymyp
    Хочу вылезти из минуса по карме.
    Если сейчас работает прекрасно, то можно не менять, общее потребление компьютера только снизится.
    Ответ написан
    Комментировать
  • Почему видеокарта с меньшим потреблением требует более сильный БП?

    @kalapanga
    https://www.nvidia.com/ru-ru/geforce/graphics-card...
    У них там в сносках есть объяснение. Блок питания же не только видеокарту кормит. Предполагается, что более мощная видеокарта будет стоять в более мощной и прожорливой системе в целом. Там так и написано "Требования к питанию определяются в зависимости от конфигурации системы."
    Так что если у Вашего блока честные и надёжные ватты, то сразу бросаться менять его не обязательно.
    Ответ написан
    Комментировать
  • Как формировать сырые SQL запросы максимально эффективно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычно если в запрос может быть передано значение, а может и нет, делают так:
    ... AND (column = {parameter} OR {parameter} IS NULL) ..

    При подстановке параметра сервер уже на этапе построения плана выполнения запроса, зная значение {parameter}, получит либо
    ... AND (column = {parameter} OR FALSE) .. ==> ... AND (column = {parameter}) ..
    либо
    ... AND (column = {parameter} OR TRUE) .. ==> ... AND (TRUE) ...

    PS. Чтобы не геморроиться с определением, когда ставить WHERE, начальный шаблон делают такой:
    SQL = "SELECT * FROM USERS WHERE 1=1 {} LIMIT %s OFFSET %s"

    и все дополнительные условия формируют в виде
    AND {условие}
    Тогда не надо оглядываться, первое это условие или нет.

    Само же условие 1=1 будет обращено в TRUE и отброшено опять-таки на этапе построения плана.
    Ответ написан
    2 комментария
  • Не работает библиотека Openai на python. Как исправить?

    @va_k
    У вас закончилась квота. О чём вам и сообщает ошибка
    openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details.
    Ответ написан
    Комментировать
  • Как убрать ошибку: Not Found?

    deepblack
    @deepblack Куратор тега Django
    Вот тебе ссылки на документацию, которую нужно было изучить чтобы не задавать элементарных вопросов:


    по первой ссылке конкретный ответ на твой вопрос, т.е. статику тебе нужно раздавать с помощью nginx или чем тебе удобно.
    Ответ написан
    Комментировать
  • Какая временная сложность у этого алгоритма?

    miraage
    @miraage
    Старый прогер
    Не силен в этой теме, но вот какие мысли.

    Есть два списка размером M и N.
    Есть 1 цикл до M+N.
    Внутри цикла нет вложенных циклов.

    O(M+N)
    Ответ написан
    Комментировать
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?


    этот монолит очень тяжело поддерживать, обновлять код и дебажит.

    Распилив его на два микросервиса ты получишь два микросервиса, которые ещё тяжелее поддерживать, обновлять, и дебажить.

    В твоём случае будет лучше разобраться с первопричиной, тк монолитность сама по себе очень редко приводит к описанным проблемам.

    Дело пахнет скорее масштабным рефакторингом, чем разделением.
    Ответ написан
    1 комментарий
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Смотри. Уже прошло время когда все пилили монолиты на микросервисы. Щас пошло переосмысление.
    Объективно есть 2 причины пилить. Первое - организационная. Команда по какой-то причине не хочет
    или не может поддерживать приложение. Или там что-то с бизнесом. Слияние. Поглощение. Передача
    проекта другой команде в поддержку. Тогда берут и ставят задачу раздела отвественностей.
    Конвей про это писал еще.

    И второе - это баланс нагрузки и децентрализация. Про failover тут еще даже речи нет. Это
    тяжелая тема и распилить монолит так чтобы его части были отказоустойчивы очень трудно. Более
    того в случае синхронных взаимодействий между частями микросервисов может быть даже падение
    перформанса
    . Да. Теоретики которые там пишут восторженные отзывы - совершенно игнорируют
    накладные на RPC. И не упоминают что в монолите цена RPC была равна нулю. Иногда RPC заменяют
    на MQ - но это новая архитектура и это надо полностью переделывать бизнес.

    И что делать с базой данных? Это тот еще вопрос. Я почти готов спорить что вы базу пилить не будете.
    И что в результате будет? Иммитация микро-сервисов? Где слабая связность?

    Тоесть если у вас нет таких кричащих ситуаций что оргазниация требует или нужно баланс
    нагрузки как-то разнести - то тебе вообще-вообще нет смысла ходить ни в какие микросервисы.

    Но имеет смысл сделать модуляризацию монолита. Например что там...
    application
    - sales
    - hiring
    - userprofiles

    Тоже очень полезно для управления сложностью. И пускай себе будет монолит зато будет сильный
    контроль за изменениями.
    Ответ написан
    6 комментариев
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    @Jack444
    Вообще на самом деле джанго можно сделать аля-микросервисным если рассматривать каждое приложение как отдельный микросервис.
    В Джанго можно подключить для любой модели отдельную базу данных которая может находится на отдельном сервере или другом порту.
    Всё что требуется добавить в модель следующие:
    class MyModel(Model):
        class Meta:
            using = 'default'  # дефолтная база из DATABASES из settings.py

    Использование отдельных баз данных это дело одно, но вам скорее всего хотелось бы чтобы каждое приложение работало на отдельном порту, это тоже не проблема, в каждом приложении создайте systemd.service который запустит экземляр на другом порту и делайте жесткую ссылку в systemd/system, после через nginx проксируйте по location на порт приложения.
    Чисто так технически можно перенести экземпляры на разные серверы и поправить конфиги.
    Важно чтобы секретный ключ был один и тот же везде, иначе будет много проблем, по безопасности всё ок если не раскрывать его третьим лицам.
    Как вариант секретный ключ и другие данные можно хранить в .env и подгружать их в settings.py.
    Если хотите сохранить чистоту коду, то экземляры можно раскидать по папкам, в каждой из них набросать по минималке README.txt с инфой на каком порту запущено, какие команды для остановки и перезапуска, какие паки нельзя трогать а какие можно, можно только ту в которой висит приложение а все остальные папки которые не взаимодействуют из этого приложения можно снести.

    В общем какой-то такой вариант можно реализовать, но я бы рекомендовал оставить как есть и по возможности старые сервисы переписывать на микросервисы FastAPI а новые эндпоинты сразу пилить на нём.
    Ответ написан
    Комментировать
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    @deliro
    "Разбивать" монолит на сервисы хорошая идея только если у вас больше 500 разработчиков. Никаких плюсов кроме независимого деплоя микросервисы не имеют, зато минусов — перечислять не хватит недели
    Ответ написан
    Комментировать
  • VK api получить id текущей группы?

    @niriter Автор вопроса
    User
    разобрался, id можно получить через groups.getById без указания доп полей, и потом берется [0]['id']
    Ответ написан
    Комментировать
  • Что делать если при загрузке linux(2023.2a) с флешки я вижу GNU GRUB?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Обычно по поводу Kali совет дают один - вернись к майнкрафту :)

    Человек, который ставит Kali - не должен задавать такие вопросы.
    Человек, который задает такие вопросы - не должен ставить Kali. Если руки чешутся поставить линух - возьми астру какую-нибудь или simply linux.
    Ответ написан
    7 комментариев
  • Как открыть все порты в промежутке?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    nmap показывает не открытые порты, а открытые порты, на которых "слушает" какой-то сервис.
    Если порт пустой - кто даст ответ, что он открыт?
    Ответ написан
    Комментировать
  • Как отправить через ajax файл на сервер?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Так у вас тут
    data: {
              pk: 11,
              img: formData,
            },

    img это не картинка, это FormData. Правильнее вот так
    var formData = new FormData();
          // добавляем в объект FormData файл
          formData.append('img', file.prop('files')[0]);
          formData.append('pk', 11);
          $.ajax({
            url: "http://127.0.0.1:8000/api/v2/update-ava/11/",
            data: formData,
    ...
    Ответ написан
    1 комментарий
  • Почему функция y=x^x начинает возрастать, начиная с аргумента 1/e?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что точка (1/e, f(1/e)), это критическая точка. Критическая точкой называется точки где функция либо не дифференцируема, либо производная функции равна нулю.
    Соответственно наша функция, y = x^x, ее производная будет x^x*(ln(x) + 1). далее приравниваем производную к нулю x^x*(ln(x) + 1) = 0 и решаем для x. Решением данного уравнения будет 1/e Подставляем 1/e в исходное функцию и получаем это вы уже нашли округленно 0.692. (1/e,0.692) - Критическая точка. А в критических точках функция меняет свое направление, то есть если до этого шла на убавление проходя через критическую точку она пойдет на возрастание и наоборот.
    И так ответ Потому что (1/e, f(1/e)) Является критической точкой.
    Также далее посредством тестов можно найти является ли критическая точка локальным минимумом или максимум в нашем случае глобальным потому что она одна. В данном случае тест легко покажет что это точка глобальный минимум. А минимум слева убывает проходит через критическую точку и начинает возрастать.
    ДОПОЛНЕНИЕ К ответу.
    Выходит, что до 1/e функция убывает, а после - возрастает. Откуда берется такая связь?

    Здесь дело в том что данная критическая точка как указал выше является минимумом в контексте вашего вопроса даже не важно глобальным или локальным. Что бы критическая точка называлась минимум производная функции должна быть отрицательной слева от критической точки и положительной справа от критической точки если подставим в производную (ее я привел в самом начале) число не много меньшее чем критическая точка то мы получим отрицательное значение (что значит функция убывает) а если не много большее то положительное значит (функция возрастает). Поскольку функция убывает слева от критической точки и возрастает после нее это и есть определение минимума. Мы сейчас математическим методом нашли минимум. То есть ваша функция убывает до критической точки и возрастает после нее. Потому что точка является минимумом (в данном случае глобальным). Так будет не много точнее.
    Ответ написан
    Комментировать