• Как работает этот код?

    bingo347
    @bingo347
    Crazy on performance...
    Очень упрощенно HashMap можно представить следующим образом:
    pub struct HashMap<K, V> {
        table: Table<(K, V)>,
    }
    
    struct Table<T> {
        // битовая маска занятых ячеек в items
        mask: u64,
        items: Box<[std::mem::MaybeUninit<Item<T>>; 64]>,
        len: usize,
    }
    
    struct Item<T> {
        data: T,
        next: Option<std::ptr::NonNull<Item<T>>>,
    }


    А Entry так:
    pub enum Entry<'a, K, V> {
        Vacant(VacantEntry<'a, K, V>),
        Occupied(OccupiedEntry<'a, K, V>),
    }
    
    pub struct VacantEntry<'a, K, V> {
        hash: u64,
        key: K,
        table: &'a mut Table<(K, V)>,
    }
    
    pub struct OccupiedEntry<'a, K, V> {
        elem: Bucket<(K, V)>,
        table: &'a mut Table<(K, V)>,
    }
    
    // указатель на Item.data
    struct Bucket<T> {
        ptr: std::ptr::NonNull<T>,
    }


    Как можно заметить у Entry есть лайфтайм, который связывает его с HashMap от которой он создан. А внутри есть мутабельная ссылка с этим лайфтаймом на таблицу с данными HashMap.
    Метод entry упрощенно выглядит примерно так:
    impl<K, V> HashMap<K, V> {
        pub fn entry<'a>(&'a mut self, key: K) -> Entry<'a, K, V>
        where
            K: Eq + std::hash::Hash,
        {
            use std::hash::Hasher as _;
            let mut hasher = self.get_hasher();
            key.hash(&mut hasher);
            let hash = hasher.finish();
    
            if let Some(elem) = self.table.find(hash, |(k, _)| key == *k) {
                Entry::Occupied(OccupiedEntry {
                    elem,
                    table: &mut self.table,
                })
            } else {
                Entry::Vacant(VacantEntry {
                    hash,
                    key,
                    table: &mut self.table,
                })
            }
        }
    
        fn get_hasher(&self) -> impl std::hash::Hasher {
            todo!()
        }
    }
    
    impl<T> Table<T> {
        fn find(&self, hash: u64, is_match: impl FnMut(&T) -> bool) -> Option<Bucket<T>> {
            todo!()
        }
    }

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

    bingo347
    @bingo347
    Crazy on performance...
    Крэйт - это в первую очередь дерево модулей. Каждый крэйт содержит как минимум 1 корневой модуль (обычно это main.rs или lib.rs, но так же это могут быть модули доп бинарников, модули интеграционных тестов, модули примеров). Так же к крэйту относятся модули, которые объявили в других модулях этого крейта (ключевое слово mod).
    Помимо этого крэйт - это сущность которой оперирует компилятор rustc, крэйт является единицей компиляции, то есть в rustc на компиляцию попадает крэйт целиком (на вход подаём корневой модуль, а он уже сам бегает по всему дереву согласно объявлениям mod).

    Пакет - это сущность которой оперирует cargo. Компилятор rustc ничего не знает про пакеты. По простому пакет это папка с файлом Cargo.toml, в котором есть секция package (бывают ещё Cargo.toml объявляющие только workspace). Пакет состоит из крейтов, притом должен быть как минимум 1 крейт бинарника или библиотеки, а библиотечный крейт может быть только 1 или отсутствовать вовсе.
    Пакет - это то, что публикуется в registry (такие как crates.io).
    Так же в зависимостях мы указываем именно пакеты (но только те, что содержат крэйт-библиотеку).
    Так же именно пакеты указываются в команде cargo install, при этом будут собраны все бинарные крейты входящие в пакет, а получившиеся исполняемые файлы будут помещены .cargo/bin
    Ответ написан
    2 комментария
  • Как правильно разбивать функции в javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Результат вот этого будет потерян:
    let logMessage = type
        .replace('[playerKick]', name1)
        .replace('[playerDefence]', name2);


    Я бы ожидал, что функция с именем generate мне что-то вернёт, а не сделает сайд эффект.

    Можно как то так:
    export const generateLogs = (type, player1, player2, damage = 0) => {
        const { name: name1 } = player1;
        const { name: name2 } = player2;
    
        const logMessage = type
            .replace('[playerKick]', name1)
            .replace('[playerDefence]', name2);
    
        switch (type) {
            case 'start':
                return logMessage + LOGS.start
                    .replace('[time]', getTime())
                    .replace('[player1]', name1)
                    .replace('[player2]', name2);
            case 'hit':
                return logMessage + `${LOGS.hit[getRandom(0, LOGS.hit.length - 1)]
                    .replace('[playerKick]', name1)
                    .replace('[playerDefence]', name2)} -${damage} 
                    [${player2.hp} / 100]
                `;
            case 'defence':
                return logMessage + LOGS.defence[getRandom(0, LOGS.defence.length - 1)]
                    .replace('[playerKick]', name2)
                    .replace('[playerDefence]', name1);
            case 'end':
                return logMessage + LOGS.end[getRandom(0, LOGS.end.length - 1)]
                    .replace('[playerWins]', name1)
                    .replace('[playerLose]', name2);
            case 'draw':
                return logMessage + LOGS.draw;
            default:
                return logMessage + '...';
        }
    };
    
    export const insertLogs = (logMessage) => {
        const el = `<p>${logMessage}</p>`;
        chat.insertAdjacentHTML('afterbegin', el);
    };
    Ответ написан
    1 комментарий
  • Возможно ли запускать виртуальные машины с Linux Live CD с помощью Qemu?

    bingo347
    @bingo347
    Crazy on performance...
    Готовый live образ скорее всего не найдёте, но никто не мешает сделать свой.
    Типичный live образ содержит squashfs образ и загрузчик (например grub), настроенный монтировать этот образ и грузить ядро с него.
    Образ в принципе не обязан быть в squashfs и может содержать слепок любой fs пригодной для linux (ext4, btrfs, ...), но у последнего есть преимущество в виде сжатия и возможности монтирования только в ro режиме (образ не сломают).

    Сделать такой образ проще простого:
    - Собираете систему с нужными установками, например можете воспользоваться утилитой debootstrap или скачать archlinux bootstrap, разверните систему в директорию, сделайте chroot туда и доустановите необходимы софт.
    - С помощью mksquashfs соберите из папки образ.
    - Прикиньте сколько примерно нужно место под образ + grub, возьмите с запасом, сгенерируйте файлик нужного размера (например через dd if=/dev/null)
    - Натравите на файлик утилиту parted (или аналоги), сделайте в нём таблицу разделов gpt и fat32 раздел на всё место, переименуйте файлик в .iso и смонтируйте с него созданый раздел
    - закиньте туда свой образ squashfs и установите grub с настройками грузится с образа
    Ответ написан
  • Как правильно задать тип события мыши?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    React.MouseEvent - это события реакта, их нельзя передавать в addEventListener, только в ноды реакта.
    Event - это наиболее обобщенный тип события.
    Вам нужен тип MouseEvent, в нём будет соответствующее свойство.
    Ну и сам element должен иметь тип HTMLElement или производные по идее.
    Ответ написан
    2 комментария
  • Как собрать свой Linux дистрибутив с grub?

    bingo347
    @bingo347
    Crazy on performance...
    Ну вот ещё туториал:
    https://habr.com/ru/articles/709528/

    А вообще адекватный туториал вот:
    https://linuxfromscratch.ru/

    А если честно, чем не угодили alpine, arch, artix, gentoo?

    получается на выходе файл .img
    Со слепком root-fs получившейся ОС? Тогда достаточно флешки форматированной в fat32, заливаете этот образ туда и делаете туда же grub-install с монтированием этого образа.
    Ответ написан
  • Чем записать возможности программы, чтобы показать на собеседовании?

    bingo347
    @bingo347
    Crazy on performance...
    - записать экран с программой
    OBS Studio
    - нанести надписи - тут такой компонент, тут делал то
    Kdenlive или DaVinci Resolve
    Ответ написан
    Комментировать
  • Как проверять линтом только измененные файлы при pre-push?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Что-то вроде такого:
    git ls-tree --name-only -r origin/HEAD | egrep '\.(js|ts)$' | xargs npx eslint
    Ответ написан
    Комментировать
  • Как реализовать взятие текста из файла JSON, в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    У Вас относительный путь, относительные пути зависят от контекста запуска, то есть считаются они относительно той папки из которой производится запуск.
    То есть данная программа будет искать разные файлы в зависимости от того из какой папки Вы её запустите.
    Ответ написан
  • Как передать параметр из события?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    rMyEvent.initCustomEvent( 'appTabsGroupOpen', false, false, { rElem: 'DDDDD' });
    то что посылается последним аргументом, это и есть event.detail

    Ну а правильнее конечно делать так:
    new CustomEvent("appTabsGroupOpen", {
      detail: {
        rElem: 'DDDDD',
      },
    });
    Ответ написан
    2 комментария
  • В чем причина ошибки IndentationError: unexpected unindent?

    bingo347
    @bingo347
    Crazy on performance...
    // вот тут косяк:
        @bot.message.handler(content_types=['text'])
    def bot_massage(massage):
    декоратор находится на уровне предыдущей функции, а функция, которую он декорирует на верхнем уровне
    Ответ написан
    Комментировать
  • Как сделать правильный shared проект?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вариант 1: монорепа
    Подойдёт если все 3 проекта будут в одном репозетории.
    Доп пакеты (вроде lerna) уже не нужны, используйте npm/yarn workspace
    https://docs.npmjs.com/cli/v10/using-npm/workspaces

    Вариант 2: установка из git
    Подойдёт если каждый проект в своём репо
    https://docs.npmjs.com/cli/v10/commands/npm-install
    Ответ написан
    Комментировать
  • Есть ли реальный профит от использования актуальных фронтенд-технологий?

    bingo347
    @bingo347
    Crazy on performance...
    Да используйте что хотите, кто Вам запретит то?
    Только не удивляйтесь, если однажды наступит бас-фактор и Ваш разработчик за 50 тыс уволится, уйдёт на пенсию или ещё чего хуже... А нового найти на это легаси будет проблема, мало кто будет готов, а те кто готов запросто могут запросить з/п 500к+.
    Я бы может согласился, но просил бы лям... Хотя скорее всего нет, нервы дороже бабла...
    Ответ написан
  • Как сделать чтобы терминал в VS Code был таким же как у этого челика?

    bingo347
    @bingo347
    Crazy on performance...
    Судя по всему это один из клонов oh-my-zsh, например oh-my-powershell или что-то в этом роде
    Ответ написан
  • Как написать такой тип для typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    const transformObject = <const K0 extends string, const K1 extends string>(obj: Record<K0, Record<K1, string>>) => {
      let result: Partial<Record<K1, Partial<Record<K0, string>>>> = {};
    
      for (const key of Object.keys(obj) as K0[]) {
        for (const lang of Object.keys(obj[key]) as K1[]) {
          (result[lang] ??= {} as Partial<Record<K0, string>>)[key] = obj[key][lang];
        }
      }
    
      return result;
    };
    Ответ написан
    Комментировать
  • Простыми словами, чем отличаются UTC or GMT?

    bingo347
    @bingo347
    Crazy on performance...
    UTC - Universal Time Coordinated, универсальное координированное время.
    Стандарт регулирования времени с точностью до секунд или дробных частей секунд. Эталоном являются атомные часы. На основе UTC формируется время в разных часовых поясах.

    GMT - Greenwich Mean Time, среднее время по Гринвичу.
    По сути является усредненным за некоторый промежуток времени измерением времени по солнцу в определенной точке земли, а именно в обсерватории Гринвича, что недалеко от Лондона.

    От какого времени принято отталкиваться в программировании
    Делают и так и так, но лучше от UTC ибо стандарт и формально более точный, например учитывает високосные секунды именно в те дни, когда они были добавлены.
    Ответ написан
    Комментировать
  • Как открывать много TCP соединений и поддерживать их?

    bingo347
    @bingo347
    Crazy on performance...
    Как уже написали в соседнем ответе, лимит портов 65535 на 1 интерфейс.
    Но это на один интерфейс, самое простое решение тут воткнуть несколько сетевых карт, да у них будут разные ip (по сути у одной машины будет пул ip), но для 100к коннектов хватит 2 карточек.
    В Linux (насчет других ОС не уверен, но возможно тоже) есть способы поизвращаться и поднять 2+ виртуальных интерфейса на одной сетевой карте. При этом у машины так же будет 2 ip адреса и нужно будет распределять соединения между ними.

    Хотя по хорошему я бы посмотрел здесь в сторону UDP с одним занятым портом на машине, а необходимые возможности TCP уже воспроизводить программно.
    Ответ написан
    5 комментариев
  • Как правильно расположить config.toml?

    bingo347
    @bingo347
    Crazy on performance...
    Cargo считывает все конфигурационные файлы начиная с папки проекта (там где файл Cargo.lock и папка target) и во всех его родительских папках, а так же в домашней папке cargo.
    https://doc.rust-lang.org/cargo/reference/config.h...
    То есть в данном примере будут работать оба этих файла.

    Я бы проверял в сторону работает ли это условие:
    cfg(all(windows, target_env="msvc"))
    Ответ написан
    1 комментарий