All streams
Search
Write a publication
Pull to refresh
21
0.1
Send message

Вот более современная сборка под таргет *-unknown-uefi

С UEFI вообще забавно, стандарты не читал, но большинство материнок просто ищут файл на первом разделе жёсткого диска по пути /EFI/BOOT/BOOTX64.EFI и запускают его на выполнение (справедливо для x86_64, для других архитектур другие имена). Даже ядро линукса давно умеет грузиться в UEFI.

The EFI Boot Stub
On the x86 and ARM platforms, a kernel zImage/bzImage can masquerade as a PE/COFF image, thereby convincing EFI firmware loaders to load it as an EFI executable.

Даже существуют утилиты, которые соберут вам в один EFI-файл initrd+kernel linux (даже без загрузчика!) и это просто будет запускаться с флешки, по факту являясь файлом-прошивкой для архитектуры x86_64.

Питоновский скрипт здесь явно лишний, хватило бы строк десять в уже существующем makefile. А так поздравления с первым работающим кодом!

Теперь ждём такую же статью не на Си, а на Расте.

Именно, не загрузчик, а EFI-приложение, работающее на bare metal.

Почти на 100% уверен, что там бесконечная крутилка, как колёсико мыши.

В стабильном дебиане такого нет. В убунте да, такое бесило.

Так новая версия XFCE вышла Dec 15 2022.

миф, что пользователи хотят именно так. Они хотят хорошо структурированную информацию

Делали приложение, так главная страница занимает, наверное, экранов двадцать - приходится скроллить. Пользователей переубедить не удалось, им привычен такой порядок элементов и чтобы всё находилось в одном месте. Только добавили сбоку быструю навигацию, но ей не пользуются.

Извиняюсь за оффтоп. Пример кода:

int Letter(unsigned char ch) {
    if (isalnum(ch) == 1 || isalnum(ch) == 2) return 1;
    if (ch >= 192 && ch <= 255) return 1;
    return 0;
}

warning: V560 A part of conditional expression is always true: ch <= 255. The value range of unsigned char type: [0, 255].

Отлично, один варнинг есть. Но есть ещё претензии к коду, который можно отловить автоматически:

  • повторный вызов isalnum в этом же выражении - микрооптимизация: вынести вызов перед сравнением

  • isalnum возвращает 0 или НЕ ноль, то есть сравнение == 2== 1) некорректно. Правильно == 0 или != 0 Незамеченное UB?

В расте так и сделано, переменные по умолчанию не мутабельные, хочешь изменить переменную - укажи модификатор mut.

У нас в организации как-то временно запрещали закупать компьютеры. Окай, подумали мы, и в следующей закупке было закуплено:

  • компьютерный корпус с блоком питания мин ХХХ ватт и usb3 на передней панели * 12 штук

  • материнская плата, сокет такой-то с M2 * 12 штук

  • процессор Ryzen 5 (?) столько-то ядер * 6 штук

  • процессор Ryzen 3 (?) столько-то ядер * 6 штук

  • кулеры мин ХХХ ватт

  • оперативная память DDR4 комплект 16*2 ГБ минимальная частота ХХХХ ГГц * 10 штук

  • оперативная память DDR4 комплект 8*2 ГБ или 16 ГБ * 6 штук

  • оперативная память DDR3 комплект 8*2 ГБ или 16 ГБ * 10 штук

  • SSD M2 NVME 512 ГБ * 6 штук

  • SSD M2 NVME 256 ГБ * 10 штук

  • SSD sata 256 ГБ * 10 штук

  • SSD sata 512 ГБ * 5 штук

Потом всё это совершенно внезапно собралось в новые компьютеры, лишнее из заказа пошло на апгрейды существующих. Года через два на системниках появились инвентарные номера. Как это оформили в бухгалтерии - не знаю

Любой лазерный принтер и даже простая фотобумага легко позволит печать с плотностью пикселей 1200 dpi. Теперь сравните с экранами тех же смартфонов.

Это несравнимые категории: самостоятельное изготовление книги и домашняя печать на лазерном принтере. Заказывал в типографии книгу на 700+ ч/б страниц в твёрдом цветном переплёте, размер А5. У типографии стоит готовая машина, которая печатает с двух сторон на стандартной 80 г/м2 офисной бумаге А4, финишер складывает тетрадки с сразу же сшивает блок книги. Человеку остаётся только приклеить обложку (+500 рублей). Книга обошлась где-то в 2700 рублей за каждый экземпляр.

Что там за глобальная переменная _isWithFracture?

Либо две функции делать:

public double ParseLengthValue(byte a, byte b, byte c)
{
    double val;
    bool negativeSign = (a & 0b10000000) > 0;
    int tmp = ((((a & 0b01111111) << 16) | (b << 8) | c) & 0b011111111111111111111111);
    if (negativeSign)
    {
        tmp = (~tmp) & 0b011111111111111111111111;
    }
    val = tmp / 64.0;
    return negativeSign ? -val : val;
}

public double ParseLengthValueWithFracturee(byte a, byte b, byte c)
{
    double val;
    bool negativeSign = (a & 0b10000000) > 0;
    int intPart = 0;
    double fracPart = 0;
    //val = intPart + fracPart;
    if (negativeSign)
    {
        intPart = ((~a & 0b01111111) << 10) | ((~b & 0b11111111) << 2) | ((~c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
        fracPart = 1 - fracPart;
    }
    else
    {
        intPart = ((a & 0b01111111) << 10) | ((b & 0b11111111) << 2) | ((c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
    }
    val = intPart + fracPart;
    return negativeSign ? -val : val;
}

Либо условную компиляцию:

public double ParseLengthValue(byte a, byte b, byte c)
{
    double val;
    bool negativeSign = (a & 0b10000000) > 0;
#ifdef IS_FRACTURE
    int intPart = 0;
    double fracPart = 0;
    //val = intPart + fracPart;
    if (negativeSign)
    {
        intPart = ((~a & 0b01111111) << 10) | ((~b & 0b11111111) << 2) | ((~c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
        fracPart = 1 - fracPart;
    }
    else
    {
        intPart = ((a & 0b01111111) << 10) | ((b & 0b11111111) << 2) | ((c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
    }
    val = intPart + fracPart;
#else
    int tmp = ((((a & 0b01111111) << 16) | (b << 8) | c) & 0b011111111111111111111111);
    if (negativeSign)
    {
        tmp = (~tmp) & 0b011111111111111111111111;
    }
    val = tmp / 64.0;
#endif
    return negativeSign ? -val : val;
}

Тогда так:

trait Hello: std::fmt::Display {
    fn hello(&self) {
        println!("meow: {self}");
    }
}

impl Hello for i32 {}

fn main() {
    let i = 42;
    i.hello();
}

"git add ." - это вообще за гранью зла, особенно если есть специально не добавленные в коммит файлы.

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

let mut buf_rx: [MaybeUninit<u8>; 2048] = …;
let size = socket.recv(&mut buf_rx).unwrap();

с++ же не умеет в возвратный полиморфизм, или нет?

Выше про примитивы рассказали, но не показали. А ваш с++ может так?

trait Hello {
    fn hello(&self);
}

impl Hello for i32 {
    fn hello(&self) {
        if *self == 42 {
            println!("число {self} = 42");
        } else {
            println!("число {self} != 42");
        }
    }
}

fn main() {
    let i = 42;
    i.hello();
}

Да, накладываются большие ограничения на реализацию трейтов (типажей), реализация может быть написана только для своего трейта или для своего типа, но нельзя взять одновременно чужой трейт и чужой тип - не скопилируется. Раньше, вроде, обходилось путём typedef - и у тебя на руках якобы свой тип.

Извините, а где можно скачать старую версию приложения (например, 5.39 LTS для старой архитектуры процессора)? Раньше была ссылка вида repo.2gis.ru.

Information

Rating
3,003-rd
Registered
Activity

Specialization

Application Developer
Software development
Database
Oracle PL/SQL
Oracle SQL
Linux administration
Python
Rust
Git
Database administration
Oracle administration