Блог* – Telegram
1.93K subscribers
3.53K photos
136 videos
15 files
3.75K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
#meme про текст песни
😁17🌚1
#prog #article

snuffle / salsa / chacha

Небольшой текст про анатомию ChaCha20, крутое свойство этого шифра (которым обладают далеко не все поточные шифры) и про то, как это шифр был рождён из-за, внезапно, #politota соображений.
👍7
#meme про нефть
🔥17💯71🌚1
#meme

Environmental storytelling
😁39🔥6🤔1😱1
#prog #article

GSoC 2025: Usability Improvements for the Undefined Behavior Sanitizer

clang поддерживает несколько санитайзеров, в том числе UBSan для отловки неопределённого поведения (с оговорками). Запускать их при этом можно в двух разных режимах. Первый — с добавлением рантайма, который при детектировании UB перед завершением работы программы печатает, что конкретно пошло не так. Второй вариант — без рантайма, в котором при детектировании UB просто исполняется trap-инструкция процессора.

Второй вариант больше годится для случаев, когда важны оверхед на производительность и размер компилированного кода (в embedded, например). Проблема в том, что UX у такого решения ужасный: получай аварийное завершение программы, а что именно пошло не так — гадай сам. И даже дебаггер в этих случаях не особо помогает, потому что он максимум укажет на инструкцию рядом с trap и на соответствующую строку исходного кода, но не более.

Anthony Tran задался целью исправить этот недостаток. С этой целью он модифицировал кодогенерацию так, чтобы к trap-инструкции прицеплялась отладочная информация, в которую уже включалось человекочитаемое сообщение об ошибке. Этот подход хорош тем, что сразу же подхватывается существующими отладчиками. Разумеется, дополнительная отладочная информация требует места, но оверхед на размер кода на практике пренебрежимо мал.

Не обошлось без костылей из-за ограниченности DWARF:

To accomplish this, we needed to find a place to “stuff” the string in the DWARF DIE tree. Using a
DW_TAG_subprogram was deemed the most straightforward and space-efficient location. This means we create a synthetic DISubprogram which is not a real function in the compiled program; it exists only in the debug info as a container.
<...>
When a trap is hit in the debugger, the debugger retrieves this string from the debug info and shows it as the reason for trapping.
👍7
Use non-human-readable ids (for example objectGuid) instead of things like SAM account name or email address for data that you expect to live longer that a single day - names tend to change even if this was not originally planned by the spec.
#software_work_tips
💯8🤔2
Блог*
#prog #rust #article Four challenges cargo-semver-checks has yet to tackle
Почти все до сих пор не решены :/ Ну, хотя бы по cross crate analysis и type checking подвижки есть
🤡13🫡3😁1
#prog #rust #article

What does it take to ship Rust in safety-critical?

Статья про очень конкретные препятствия к использованию Rust в safety-critical системах.

Это именно препятствия, а не блоки — в этих областях Rust уже используется в проде.
🤔2
Forwarded from [LLC] food and ass
Оказывается если закрывать как можно быстрее срочные задачи - это не значит что ты сможешь сделать в спокойном темпе не срочные но нужные, тебе просто дадут новых срочных задач от коллег 🥵
Please open Telegram to view this post
VIEW IN TELEGRAM
🫡19😢7💯1
#prog #rust #article

Офигенно!

Rust's standard library on the GPU

GPU code can now use Rust's standard library. We share the implementation approach and what this unlocks for GPU programming.


This works because of our custom hostcall framework. A hostcall is analogous to a syscall. A hostcall is a structured request from GPU code to the host CPU to perform something it cannot execute itself. You can think of it like a remote procedure call from the GPU to the host to achieve syscall-like functionality.

To end users, Rust's std APIs appear unchanged and act as one would expect.
11👍7
#лингво #video

Девять минут нытья по поводу того, какая китайская система письменности логичная и одновременно нет

youtu.be/cYcO3G8Gxu8
4
xxx: ssh over mattermost =)
yyy: Лучшие практики =)


#трудовыебудни
😱92😁1🍌1
"Cloud-native" is a catch-all term for widely adopted shitty technology, such as Go and YAML
💯13🌚3👍1
#prog #c #article

You (probably) don’t need to learn C

I’m all for learning C if it will be useful for the job at hand, but you can write lots of great software without knowing C. [выделение моё]

A few people repeated the idea that C teaches you how code “really” executes. But C is an abstract model of a computer, and modern CPUs do all kinds of things that C doesn’t show you or explain. Pipelining, cache misses, branch prediction, speculative execution, multiple cores, even virtual memory are all completely invisible to C programs.

C is an abstraction of how a computer works, and chip makers work hard to implement that abstraction, but they do it on top of much more complicated machinery.
5💩3👍2😁1
Блог*
В этом случае достаточно поменять тип поля irrelevant на UnconditionallyEqual<String> — и можно будет использовать стандартный #[derive(PartialEq)] для достижения требуемого функционала.
#prog #rust

Кое-что я при написании этого поста упустил. Именно, к хэшированию предъявляется логичное требование: если два значения равны, то их хэши также равны. UnconditionallyEqual в том виде, как я написал, не реализовывает Hash, поэтому #[derive(Hash)] работать не будет. Тем не менее, заставлять программиста вручную писать реализацию Hash из-за наличия одного такого поля — не лучший UX. Поэтому стоит написать реализацию Hash для UnconditionallyEqual. Из-за изложенного выше требования и того факта, что UnconditionallyEqual не влияет на операцию равенства, корректной реализацией будет noop:

impl<T> Hash for UnconditionallyEqual<T> {
fn hash<H: Hasher>(&self, _state: &mut H) {}
}
🍌2
#math #article

Hobby’s algorithm for aesthetic Bézier splines

Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.

В самом начале есть интерактивная демонстрация.
🤔2
#prog #rust

Одна из клёвых вещей, которые есть в #zig — это синтаксис для многострочных строковых литералов:

const hello_world_in_c =
\\#include <stdio.h>
\\
\\int main(int argc, char **argv) {
\\ printf("hello world\n");
\\ return 0;
\\}
;


Большим преимуществом этого синтаксиса является тот факт, что он позволяет с лёгкостью сделать отступ для литерала целиком и при этом не добавлять этот отступ в сам литерал, а также требует минимального экранирования (всё до перевода строки — содержимое строки). Аналогичный код в, скажем, Rust, требует такой неприятной вещи:

    let hello_world_in_c = "\
#include <stdio.h>\
\n\
\nint main(int argc, char **argv) {\
\n printf(\"hello world\\n\");\
\n return 0;\
\n}";


и поддержки со стороны компилятора для того, чтобы экранирование перевода строки убирало не только сам перевод строки, но и предшествующие пробельные символы. Обратите внимание на то, что мне также пришлось экранировать кавычки и \n в коде. Сырые строковые литералы позволяют убрать экранирование, но не лишние отступы:

    let hello_world_in_c = r#"#include <stdio.h>

int main(int argc, char **argv) {
printf("hello world\n");
return 0;
}"#;


Именно по этой причине есть аж два RFC (раз, два), которые добавляют новые виды строковых литералов для подобных целей (включения многострочного кода на другом языке). Тем не менее, в обсуждении второго один человек заметил (и тут дела приобретают #abnormalprogramming оборот), что имитировать многострочные литералы из Zig в Rust в некоторой мере можно уже сейчас. Именно, doc-комментарии уже на этапе лексирования заменяются на #[doc]-атрибуты, а потому можно макросом извлечь эти литералы из атрибутов и сконкатенировать:

macro_rules! text {
(#[doc=$first_line:literal] $(#[doc=$lines:literal])*) => {
concat!($first_line, $("\n", $lines),*)
};
}
let hello_world_in_c = text! {
///#include <stdio.h>
///
///int main(int argc, char **argv) {
/// printf("hello world\n");
/// return 0;
///}
};
🥴17🤔21