Задать вопрос
  • Возможно ли организовать сеть таким образом (схема)?

    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.
    Пооксирует вообще весь трафик
    Ответ написан
    1 комментарий
  • 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 комментария
  • Возможно ли выполнить JavaScript код в Rust при помощи NodeJS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Хоть и вопрос несколько сумбурный и не совсем понятно, что автор хочет на самом деле...
    Но краткий ответ: да, возможно, но есть нюансы...

    Самый простой вариант - запускать node как отдельный процесс. Можно просто запускать на каждый чих, а можно заморочиться и организовать общение между приложением на Rust и приложением на Node.js

    Вариант поинтереснее - Node.js можно собрать как библиотеку (есть даже готовые бинарные сборки такого), линкуем с приложением на Rust. Всё живёт в одном процессе, но node будет запускать свои потоки.

    Есть и обратный последнему вариант. Можно из Rust кода собрать бинарный аддон к Node.js
    Правда тут уже JS код будет запускать код на Rust.
    https://napi.rs
    https://neon-rs.dev

    Можно пойти дальше. Если задача просто исполнять JS код из приложения на Rust, то можно слинковаться с одним из JS движков. Приколюх предоставляемых платформой Node.js здесь не будет (вроде fs или http), хотя никто не мешает реализовать это самостоятельно.
    https://crates.io/crates/v8
    https://crates.io/crates/quickjs_runtime
    Ответ написан
    3 комментария
  • Почему Jest не может распарсить CSS модуля?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    https://jestjs.io/docs/webpack#handling-static-assets

    В обычной сборке у Вас scss файлы собираются бандлером вроде webpack.
    А в jest никакого бандлера нет.
    Ответ написан
    Комментировать
  • Как реализовать свой класс мап, имитируя поведение стандартной хэш-мапы?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Для начала стоит почитать про устройство хэш таблиц:
    https://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88-%...
    https://habr.com/ru/articles/509220/
    Куча вопросов сразу отпадёт.
    Классическая структура данных кстати, полезно знать не зависимо от ЯП.

    1) Не понятно, что конкретно должна делать hash функция
    Вычисляет хэш от ключа. Остаток от деления хэша на длину массива - это индекс бакета, в котором будет хранится пара ключ-значение.

    2) Какой тип использовать у buckets
    Как вариант такой:type Buckets<K, V> = ([K, V] | undefined)[];
    Ответ написан
    Комментировать
  • Как реализовать превращение вектора объектов в дерево?

    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 комментария
  • Вызов функций С++ из .h?

    bingo347
    @bingo347
    Crazy on performance...
    Скорее всего придётся сделать extern C обёртку над библиотекой и биндится уже с ней. Ну и надо понимать, что никакие абстракции плюсов вроде темплейтов, классов и т.д. в раст не протащить.

    В какой-то степени может помочь cxx, но надо понимать, что эта штука тоже не всесильна.
    Ответ написан
  • Как правильно организовать shared проект?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Как правильно организовать shared проект?
    Как npm пакет.
    При этом не обязательно публиковать в общий npm репозиторий, можно поднять свой или устанавливать прямо из git
    Ответ написан
    Комментировать