Задать вопрос
  • Бот долго отвечает сообщением, где фото+текст. Как исправить?

    @twistfire92
    Python backend developer
    По-хорошему нужно фото на сервер загрузить один раз и сохранить его file_id. И все дальнейшие ответы с этим фото реализовывать через этот file_id, а не загружая каждый раз одно и то же фото. Вполне возможно это ускорит ответ.

    Как и где хранить этот file_id для фото нужного товара - тема отдельного вопроса. Обычно используется БД для подобных вещей, но у вас уже есть какой-то словарь products со словарями внутри. Предлагаю каждый элемент этого словаря расширить ключом file_id.
    Далее логика следующая:

    Когда нужно отправить фото товара, смотрите сначала на значение в file_id.
    - Если оно пустое - отправляете по-старому сценарию, только сначала дождитесь ответа от метода message.answer_photo(). Результатом этого метода будет объект Message, в котором можно найти file_id для вашего загруженного файла (поиски возложу на вас). Просто прописываете его в ваш словарь products[product_id][file_id].

    - Если значение file_id заполнено, то делаете все то же самое, что и сейчас, только в методе message.answer_photo() в параметре photo передаете file_id.

    получается, что сам файл будет загружен на сервер только один раз, а все остальные разы будет браться только с сервера. Кстати в документации Bot API так и сказано, что предпочтительнее использовать file_id, нежели каждый раз загружать файлы на сервера телеги.
    Ответ написан
    1 комментарий
  • Как реализовать превращение вектора объектов в дерево?

    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
    Разрешаю изучать Котлин с любым уровнем знания джавы, в том числе и без знания джавы.
    Ответ написан
    Комментировать
  • Как рассчитать температуру воды в общей емкости?

    По формуле теплоёмкости.
    Чтобы нагреть 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
    Дома с переломом ноги
    Обычно по поводу Kali совет дают один - вернись к майнкрафту :)

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

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