Задать вопрос
  • В каких случая стоит использовать usize?

    bingo347
    @bingo347
    Crazy on performance...
    Для операций сводящихся к арифметике указателей.
    Помимо непосредственно арифметики указателей сюда относятся индексация и длина слайсов/массивов/векторов/строк, capacity вектора/строки, размеры и выравнивание типов, смещение полей относительно начала структуры.
    Но в целом, где удобно, там и используйте, никто не запрещает использовать usize/isize как и другие int типы
    Ответ написан
    2 комментария
  • Как проверить перемещается ли в памяти объект при "перемещении"?

    bingo347
    @bingo347
    Crazy on performance...
    При перемещении адрес на стеке изменится, а адрес памяти выделенной на куче - нет.
    Тут очень тонкий момент, который нужно понимать, данные которые мы помещаем в Box или Vec будут размещены на куче, но сами Box и Vec - это такие же структуры, как и любые другие, просто на них есть некоторая логика для управления памятью на куче, в случае 64 битной архитектуры и T: Sized, Box<T> будет занимать 8 байт на стеке и размер T на куче, а Vec<T> - 24 байта на стеке (указатель на начало, длина и фактически выделенная память) и размер T умноженный на capacity на куче.

    fn main() {
        let a = Box::new(42);
        println!("Stack address of a: {:p}", &a);
        println!("Heap address of a: {:p}", &*a);
        
        let b = a;
        println!("Stack address of b: {:p}", &b);
        println!("Heap address of b: {:p}", &*b);
    }
    Stack address of a: 0x7fff59586010
    Heap address of a: 0x58cf76717b10
    Stack address of b: 0x7fff59586018
    Heap address of b: 0x58cf76717b10
    Ответ написан
    Комментировать
  • Rust как подключить внешний файл в модуле?

    bingo347
    @bingo347
    Crazy on performance...
    Структура модулей в крейте с точностью повторяет структуру файлов на диске, даже если модуль объявлен внутри модуля не вынесеного в отдельный файл.
    То есть одно и то же объявление mod db;будет искать файл в разных местах, в зависимости от того, где оно написано:
    • если написать в корне src/lib.rs то будет искать src/db.rs или src/db/mod.rs
    • если написать в модуле cmd внутри src/lib.rs то будет искать src/cmd/db.rs или src/cmd/db/mod.rs

    Но у меня большое подозрение, что Вы вообще не понимаете, как работает ключевое слово mod, ибо напихали его где только можно, включая сам db.rs (там будет искать src/db/db.rs кстати). Ключевое слово mod подключает модуль как дочерний того модуля, где оно написано. А для импорта имён нужно использовать use.

    И как верно подметил fenrir, если бы Вы внимательно прочитали растбук, то Вы бы это поняли.
    Ответ написан
    3 комментария
  • Простой счётчик без БД (допустим на основе txt файла)?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Что-то вроде такого:
    cat /var/log/nginx/access.log | grep 'GET /path/to/page' | awk '{print $1}' | sort | uniq | wc -l

    где /path/to/page - web путь к странице
    Ответ написан
    1 комментарий
  • Есть ли разница каким способом добавлять обработчик события в js, конкретно элементу или всему документу, смотря со стороны производительности?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Первый вариант предпочтительнее, когда у нас есть один единственный элемент с такой логикой и этот элемент существует на момент добавления обработчика.
    Второй вариант предпочтительнее, когда таких элементов много, или когда они появляются динамически.

    По перфомансу:
    метод closest не бесплатный и здесь он будет вычислятся на любой клик по документу
    создание функций тоже не бесплатно, но можно навешивать одну и ту же функцию на множество событий

    хотя по последнему моменту, в коде типичной react-макаки будет создаваться по тысяче функций на каждый чих и никто особо не парится (код то работает на девайсах юзера, за оперативку, проц и электричество платят юзеры, а не те кто свои поделия клепает)
    Ответ написан
    Комментировать
  • Как создают панорамные сайты с возможностью 360° вращения вокруг объекта?

    bingo347
    @bingo347
    Crazy on performance...
    Здесь самое настоящее 3D на webgl.
    Создаётся сфера, на неё натягивается текстура - та самая фотка, камера размещается в центре сферы и вращается по событиям мыши.
    Ну и фотка должна быть специально для этого снята, такое умеют 3D камеры.
    Ответ написан
    2 комментария
  • Возможно ли организовать сеть таким образом (схема)?

    bingo347
    @bingo347
    Crazy on performance...
    У меня ровно такая схема как на картинке, с уточнением, что роутер 1 и роутер 2 имеют разные подсети.
    В качестве роутера 1 используется мини пк с 4 ethernet, в 2 подключены 2 провайдера между которыми балансируется нагрузка, 2 других объеденены в бридж и рулят подсетью 192.168.32.0/28 и 1 идет в WAN порт роутера 2, а второй в мой рабочий комп.
    В качестве роутера 2 - обычный бытовой роутер, для WiFi и тд, он рулит подсетью 192.168.0.0/19 рабочий комп к нему так же подключен второй сетевухой, дабы иметь доступ в локалку.
    Ответ написан
    1 комментарий
  • Как в код сервера axum внести счётчик ответов на запросы клиента из браузера?

    bingo347
    @bingo347
    Crazy on performance...
    https://doc.rust-lang.org/std/sync/atomic/struct.A...

    use std::sync::atomic::{AtomicU32, Ordering};
    
    async fn create_user(
        Json(payload): Json<FromBrowser>,
     ) -> (StatusCode, Json<User>) {
        static COUNTER: AtomicU32 = AtomicU32::new(0);
    
        // подготавливаю данные на отправку в браузер:
        let user = User {
           id: payload.id,
           username: payload.username,
           tm: payload.tm,
           cnt: COUNTER.fetch_add(1, Ordering::SeqCst),   // считаю отправки; 
        };
    
        (StatusCode::CREATED, Json(user))
     }
    Ответ написан
    1 комментарий
  • Как инициировать скрипт при определенной ширине экрана?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, стоит убедится, что запрос матчится, во-вторых возможно имеет смысл запускать скрипт по событию change
    Ответ написан
    Комментировать
  • Как скрыть подключение прокси/впн на пк?

    bingo347
    @bingo347
    Crazy on performance...
    Если речь о прокси, то скрыть его от конечного приложения никак, разве что превратить в псевдовпн через tun2socks

    А вот vpn уже можно поднять на отдельной машине (например взять у того же хостера самую дешевую виртуалку), поднять между машинами vlan (многие хостеры делают его между машинами одного пользователя) и завернуть на целевой машине весь трафик в этот vlan + прописать на интерфейсе ip виртуалки в качестве шлюза. А на виртуалке уже завернуть весь или только нужный трафик в vpn.

    Ну и как отметили выше, ничего не поможет если сервису не нравится ip vpn
    Ответ написан
    Комментировать
  • Слайс на неинициализированную память?

    bingo347
    @bingo347
    Crazy on performance...
    MaybeUninit под капотом - это union, то есть компилятор ничего не знает, инициализированное там значение или нет и перекладывает эту ответственность на программиста. А значит UB здесь не будет.
    То есть спокойно делаете &mut [MaybeUninit<*mut State>], инициализируете элементы и после std::mem::transmute в &mut [*mut State]
    Ответ написан
    2 комментария
  • Как заменить $('#more').ready(function() { на чистом js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    document.addEventListener('DOMContentLoaded', () => {
        // ...
    }, {once: true});
    Ответ написан
    2 комментария
  • Возможно ли собрать данные из итератора в уже созданный буфер?

    bingo347
    @bingo347
    Crazy on performance...
    let arr: [i32; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    let mut arr2: [i32; 10] = [0; 10];
    
    arr.iter()
        .zip(arr2.iter_mut())
        .filter(|(el, _)| **el % 2 == 0)
        .for_each(|(el, target)| {
            *target = *el;
        });
    Ответ написан
    Комментировать
  • Почему на многих крупных сайтах не используются смысловые теги main,section, article, aside, header, footer?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, по тому что большинство разработчиков работает чисто чтоб закрывать задачки в джире, и напрягать голову сверх задачи не видит смысла.
    Во-вторых, менеджеры порой на задачи ставят такие сроки, что напрягать голову особо и нет времени, тяп ляп и в продакшн.
    В-третьих, большинству бизнеса, который вкладывает в разработку сайта деньги, это нафиг не сдалось. Если сам бизнесмен не имеет ни каких ограничений по здоровью во взаимодействии с сайтом (а именно ради этого нужна семантическая разметка, а не ради какого-то СЕО), то вот он потыкал успешно пальцем на своём ойФоне - сайт работает, значит ок, зачем выделять деньги на большее.

    То, что кто-то совсем не сможет пользоваться сайтом имея ограничения по зрению или со сломанной рукой или с ребёнком на руках - никого в этой цепочке не волнует.
    Да банально попробуйте купить мышку онлайн не пользуясь мышкой/тачпадом/тачскрином. Но при этом мышки успешно продаются, а значит ничего меняться не будет.
    Ответ написан
  • Как исправить ошибку error: linking with `link.exe` failed: exit code: 1120?

    bingo347
    @bingo347
    Crazy on performance...
    Попробуйте добавить build скрипт (файл build.rs на том же уровне где Cargo.toml) со следующим содержимым:
    fn main() {
        println!("cargo:rustc-link-lib=dylib=Gdi32.dll");
    }
    Ответ написан
  • Как распарсить данный объект вернувшийся в строковом формате JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    а он возвращается именно так, в раскрытом виде?

    Просто есть очень похожая штука - jsonl, когда 1 json на строку и достаточно просто разделить ответ построчно.

    Ну а если в таком виде, то явный паттерн завершения json - закрывающая скобка - это единственное что есть на строке
    Ответ написан
    1 комментарий
  • Почему не работает прокси?

    bingo347
    @bingo347
    Crazy on performance...
    Вот по Вашей же ссылке на доку:

    https://docs.rs/reqwest/latest/reqwest/struct.Prox...
    Proxy all HTTP traffic to the passed URL.
    Проксирует весь HTTP трафик

    https://docs.rs/reqwest/latest/reqwest/struct.Prox...
    Proxy all HTTPS traffic to the passed URL.
    Проксирует весь HTTPS трафик

    https://docs.rs/reqwest/latest/reqwest/struct.Prox...
    Proxy all traffic to the passed URL.
    Пооксирует вообще весь трафик
    Ответ написан
    Комментировать
  • FnMut в немутабельной переменной?

    bingo347
    @bingo347
    Crazy on performance...
    Мутабельность нужна для вызова, так как FnMut вызывается по мутабельной ссылке.
    Здесь же только передаётся владение в метод run

    P.S. что-то мне подсказывает, что сигнатура не совсем корректная. Отсутствует объявление дженерика T (и возможно его ограничений), отсутствует лайфтайм для ссылки в колбэке:
    pub fn run<T, F>(self, event_handler: F) -> Result<(), EventLoopError>
        where
            F: for<'a> FnMut(Event<T>, &'a EventLoopWindowTarget<T>),
    {
        self.event_loop.run(event_handler)
    }
    Ответ написан
    Комментировать
  • Напишите код, которой переделает структуру данных вот в такую?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если нужно просто методы массива и коротко, то можно так:
    Object.entries(events).flatMap(([date, dateEvents]) => dateEvents.map(event => ({date, event})))
    Ответ написан
    Комментировать
  • Каких вещей следует избегать в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    Я знаю, что следует избегать всяких "продвинутых" штук из ряда связных списков, самореферентных структур и т.п.
    Односвязные списки никаких проблем не доставляют (ну кроме того, что они плохо ложатся на процессорный кэш). Для двусвязных списков и самореферентных структур придётся использовать сырые указатели и unsafe.

    Ещё я обнаружил, что создание больших структур, с методами, с кучей полей, обычно приводит к проблемам с borrow checker.
    Borrow checker абсолютно плевать на размер структур. Это никак не связано.

    А если в структуре будет ссылка или иное заимствование, то это гарантированные проблемы.
    Нет ни каких проблем.

    Насколько я понимаю, самым рабочим выглядит чисто функциональный подход, а не структур с методами.
    Одно другому никак не противоречит.

    И правильно ли я понимаю, что следует избегать структур хранящих ссылки и имеющими лайфтайм?
    Не правильно.

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

    И очень часто в Rust программах, мне приходится идти на более уродливую архитектуру, дабы избежать проблем с (почти ненужным в однопоточном коде) borrow checker.
    Что-то делаете не так. Скорее всего просто не понимаете borrow checker и пытаетесь писать на новом языке так, как привыкли в каком-то другом.

    И в вопросе о borrow checker, разве не является тот факт, что большинство библиотек избегает &mut self в изменяющих что-то методах, звоночком к наличию большим проблем в языке?
    О каком большинстве речь? Библиотеки используют мутабельные ссылки там где это нужно. Если метод действительно что-то меняет, то будет мутабельная ссылка ну и иногда будет использоваться interior mutability там где это необходимо. В языке нет проблем с мутабельными ссылками.

    В общем, посоветуйте что-то что-бы помогало меньше бороться с borrow checker, потому что сейчас я очень много времени трачу именно на это.
    Для начала понять его. Понять какую проблему он решает. Почитайте, что такое undefined behavior. Почитайте, что такое алиасинг.

    Возможно где-то альтернативой мутабельным ссылкам будут Cell/RefCell в однопоточном коде и Mutex/RwLock в многопоточном.
    Возможно если покажете примеры кода, где у Вас проблемы, то можно будет подсказать что-то более конкретное.
    Ответ написан
    3 комментария