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

В двоичном интерфейсе приложений (ABI) x64 по умолчанию используется четырехрегистровое соглашение о вызове, т. н. x64 calling convention

Могу ошибаться, но это справедливо только для windows. В linux x86_64 ABI передаёт через регистры 8 целочисленных аргументов (остальные через стек).

Иногда в changelog'ах и такое встречается: мы пофиксили падение программы под windows, но на всякий случай пересобрали программу и под linux с новой версией, обновляйтесь.

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

Вот только на 64-битном линуксе не запускается, увы.

openat(AT_FDCWD, "/lib32/tls/i686/sse2/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
...
openat(AT_FDCWD, "/usr/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
./Fresh3: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory

ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so.6 /usr/lib/libfreetype.so.6

openat(AT_FDCWD, "/usr/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
./Fresh3: error while loading shared libraries: libfreetype.so.6: wrong ELF class: ELFCLASS64

Вот-вот, тем более джанговский for … empty в шаблонизаторе работает именно так.

А мьютекс где хранить?

Про мульфильмы: даже относительно новые делались на флеше, та же My Little Pony: Friendship is Magic (2011-2019 года). Были утечки исходников, действительно программирования на ActionScript'e не было, что в то время сильно удивило, так как довольно много писали, что "эта анимация без души, её создаёт компьютер". А в итоге всё-всё заанимировано вручную и каждый файл разбит на очень маленькие порции по 30-60 секунд.

Чуть более многословно:

#[derive(Clone, Copy)]
pub struct Bit(f32);

impl std::ops::Not for Bit {
    type Output = Self;

    fn not(self) -> Self::Output {
        Self(Self::ZERO.0 - self.0)
    }
}

impl std::ops::BitOr for Bit {
    type Output = Self;

    fn bitor(self, rhs: Self) -> Self::Output {
        Self(self.0 - (!rhs).0)
    }
}

impl std::ops::BitAnd for Bit {
    type Output = Self;

    fn bitand(self, rhs: Self) -> Self::Output {
        !(!self | !rhs)
    }
}

impl std::ops::BitXor for Bit {
    type Output = Self;

    fn bitxor(self, rhs: Self) -> Self::Output {
        (!self & rhs) | (self & !rhs)
    }
}

impl Bit {
    pub const ZERO: Self = Self(-0.0);
    pub const ONE: Self = Self(0.0);

    pub fn adder(a: Self, b: Self, c: Self) -> (Self, Self) {
        let s = a ^ b ^ c;
        let c = ((a ^ b) & c) | (a & b);
        (s, c)
    }
}


pub struct SoftU8 {
    inner: [Bit; 8],
}

impl std::ops::Add for SoftU8 {
    type Output = Self;

    fn add(self, rhs: Self) -> Self::Output {
        let (s0, c) = Bit::adder(self.inner[0], rhs.inner[0], Bit::ZERO);
        let (s1, c) = Bit::adder(self.inner[1], rhs.inner[1], c);
        let (s2, c) = Bit::adder(self.inner[2], rhs.inner[2], c);
        let (s3, c) = Bit::adder(self.inner[3], rhs.inner[3], c);
        let (s4, c) = Bit::adder(self.inner[4], rhs.inner[4], c);
        let (s5, c) = Bit::adder(self.inner[5], rhs.inner[5], c);
        let (s6, c) = Bit::adder(self.inner[6], rhs.inner[6], c);
        let (s7, _) = Bit::adder(self.inner[7], rhs.inner[7], c);
        Self {
            inner: [s0, s1, s2, s3, s4, s5, s6, s7],
        }
    }
}

impl Into<SoftU8> for u8 {
    fn into(self) -> SoftU8 {
        SoftU8 {
            inner: std::array::from_fn(|i| if (self >> i) & 1 == 1 { Bit::ONE } else { Bit::ZERO }),
        }
    }
}

impl Into<u8> for SoftU8 {
    fn into(self) -> u8 {
        (0..8).filter(|i| self.inner[*i].0.signum() > 0.0).map(|i| 1 << i).sum()
    }
}

fn main() {
    let a: SoftU8 = 23.into();
    let b: SoftU8 = 19.into();
    let c = a + b;
    let c: u8 = c.into();
    println!("{}", c);
}

Мне нравится, как сделано в расте, никогда не забудешь взять мьютекс или освободить его:

// Here we're using an Arc to share memory among threads, and the data inside
// the Arc is protected with a mutex.
let data = Arc::new(Mutex::new(0_u32));

// …
{
    let mut data = data.lock().unwrap();
    *data += 1;
    // the lock is unlocked here when `data` goes out of scope.
}

Вот только картинка с подписью "Связь объектов для Feature" очевидно неверная. Но красивая, да :)

Конечно, это юмористическая статья, но подобная сортировка оптимизированная под размер массива (4-9 элементов) существует в прод-коде. Если не изменяет память, разработчики гугла применили такое в одной из библиотек и увеличили скорость сортировки внутри sql-запросов до 30 %.

Реализация libcxx обрабатывала несколько конкретных случаев особым образом. Коллекции длиной 5 или меньше сортировались при помощи специальных самописных сортировок на основе сравнений.
https://habr.com/ru/articles/662181/

nat'a между подсетями не было в моём случае, просто связь между двумя машинами, на одной из которых был доступ в интернет, и на обеих админские права.

Интересная идея, но бесполезное.

Вспомнилось, как я в своё время реализовал ICMP-туннель между двумя подсетями. Дано: две подсети A, B, между которыми отсутствуют acl - даже пинги не ходят. И есть общий ресурс в третьей подсети C, который доступен всем. Отправляем пинг на общий ресурс, подделывая IP-адрес отправителя. В итоге пакет ходит по маршруту A->C->B. Из встреченных сложностей: нужно знать все три ip-адреса, но позже ICMP-туннель оброс функционалом служебных сообщений, чтобы можно было протестировать туннель или сообщить реальный ip-адрес отправителя. Внутри туннеля бегал обычный tcp, так что потери пакетов восстанавливались им. Для браузинга интернета по выходным этого хватало.

Вот-вот. Чем такой синтаксис не угодил?

animals = Stack.<Animal>()

Или так (return type polymorphism):

animals: Stack<Animal> = Stack()

Стандартизованность.

Разные кодировки, наличие/отсутствие BOM для юникода, разные переводы строки: \n \n\r

Размер.

Юникод для кириллицы увеличивает раза в два размер файлов.

Что-то в этом есть: одна табличка с полями: id человека, id мамы и id папы.

12 ...
25

Information

Rating
2,980-th
Registered
Activity

Specialization

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