Forwarded from Маша и Медведица ✨ (Маша Понедельник)
  
Телескоп Джеймс Уэбб сделал новую невероятную фотографию - перед вами эмиссионная область вокруг протозвезды из молекулярного облака L1527 в созвездии Телец.
Да, звезда ещё не сформировалась окончательно, она ещё не запустила термоядерные реакции синтеза в ядре, и светит за счёт гравитационного сжатия и выделения тепла. Она находится на самой ранней протозвёздной стадии. Её возраст всего лишь около 100 000 лет, а масса - 20-40% от солнечной.
В центре фигуры, похожей на песочные часы, можно увидеть тёмную перемычку - это протопланетный диск. Выбросы из полюсов протозвезды образовали полости в окружающей тёмной туманности. Оранжевый цвет показывает большее количество пыли, голубой - меньшее.
#ММ_JWST
Да, звезда ещё не сформировалась окончательно, она ещё не запустила термоядерные реакции синтеза в ядре, и светит за счёт гравитационного сжатия и выделения тепла. Она находится на самой ранней протозвёздной стадии. Её возраст всего лишь около 100 000 лет, а масса - 20-40% от солнечной.
В центре фигуры, похожей на песочные часы, можно увидеть тёмную перемычку - это протопланетный диск. Выбросы из полюсов протозвезды образовали полости в окружающей тёмной туманности. Оранжевый цвет показывает большее количество пыли, голубой - меньшее.
#ММ_JWST
🔥14👍3
  #gamedev #article
Zendo—Design History — история о создании настольной игры Zendo, рассказанная её непосредственным создателем. Zendo — игра, в которой один игрок берёт на себя роль Мастера и загадывает правило, а остальные — Ученики — пытаются это правило отгадать, строя догадки из местных фигурок и получая контрпримеры от Мастера в случае, если высказанная вслух догадка неверна.
<...> More than anything else I’ve had a hand in creating, Zendo feels more like a discovery than an invention—as though any group of designers and playtesters, given nothing but the phrase “Interactive Bongard problems with Icehouse pieces”, would wend their way through the vastness of design-space, perhaps making different wrong turns and false starts and false assumptions, but ultimately arriving at the same crystal-clear destination. Perhaps this is only the illusion of a fanatic, sleep-deprived game designer, but it’s one I can’t shake.
Zendo—Design History — история о создании настольной игры Zendo, рассказанная её непосредственным создателем. Zendo — игра, в которой один игрок берёт на себя роль Мастера и загадывает правило, а остальные — Ученики — пытаются это правило отгадать, строя догадки из местных фигурок и получая контрпримеры от Мастера в случае, если высказанная вслух догадка неверна.
<...> More than anything else I’ve had a hand in creating, Zendo feels more like a discovery than an invention—as though any group of designers and playtesters, given nothing but the phrase “Interactive Bongard problems with Icehouse pieces”, would wend their way through the vastness of design-space, perhaps making different wrong turns and false starts and false assumptions, but ultimately arriving at the same crystal-clear destination. Perhaps this is only the illusion of a fanatic, sleep-deprived game designer, but it’s one I can’t shake.
👍2
  
  Блог*
#rust  Если вы надумывали купить билет на Rustcon 2022 — сейчас самое время.  https://t.iss.one/rustcon_russia/1394
На покупку билета на RustCon 2022 действует промокод 
  FRIENDS со скидкой на 15%. Он будет действовать вплоть до дня проведения конференции.#prog #rust #article
Набор из трёх статей Niko Matsakis про дизайн параллельных итераторов в rayon. Впрочем, первая статья посвящена обзору обычных, последовательных итераторов. Если у вас есть опыт работы с Rust — первую статью можно спокойно не читать.
Parallel Iterators Part 1: Foundations
Parallel Iterators Part 2: Producers
Parallel iterators, part 3: Consumers
И ещё небольшой документ в репе rayon о том, как реализовывать параллельные итераторы.
  
  Набор из трёх статей Niko Matsakis про дизайн параллельных итераторов в rayon. Впрочем, первая статья посвящена обзору обычных, последовательных итераторов. Если у вас есть опыт работы с Rust — первую статью можно спокойно не читать.
Parallel Iterators Part 1: Foundations
Parallel Iterators Part 2: Producers
Parallel iterators, part 3: Consumers
И ещё небольшой документ в репе rayon о том, как реализовывать параллельные итераторы.
docs.rs
  
  rayon - Rust
  Rayon is a data-parallelism library that makes it easy to convert sequential computations into parallel.
👍8
  #prog #rust
Очередное напоминание, что Rust не является просто улучшенным C и что ссылки не являются просто продвинутой версией указателей.
Рассмотрим вот такой код, полностью нормальный с точки зрения сишника:
Если мы попытаемся обмануть компилятор и взять сырой указатель:
Как же поступить правильно? Можно сформировать указатель на элемент из сырого указателя на сам массив:
  
  Очередное напоминание, что Rust не является просто улучшенным C и что ссылки не являются просто продвинутой версией указателей.
Рассмотрим вот такой код, полностью нормальный с точки зрения сишника:
fn main() {
    let a: [i32; 2] = [0, 1];
    let ptr: *const _ = &a[0];
    let x_ptr = unsafe { ptr.add(1) };
    let x = unsafe { *x_ptr };
    println!("{x}");
}
Тут мы получаем указатель на элементы массива через ссылку на его первый элемент — как это часто делают в C. Если этот код скомпилировать и запустить, то программа напечатает 1, как и ожидается. Но, строго говоря, он не обязан этого делать! Потому что в этой программе есть UB. Действительно, если на этом коде запустить miri, то вот какой будет результат:error: Undefined Behavior: attempting a read access using <3091> at alloc1664[0x4], but that tag does not exist in the borrow stack for this location
 --> src/main.rs:5:22
  |
5 |     let x = unsafe { *x_ptr };
  |                      ^^^^^^
  |                      |
  |                      attempting a read access using <3091> at alloc1664[0x4], but that tag does not exist in the borrow stack for this location
  |                      this error occurs as part of an access at alloc1664[0x4..0x8]
  |
  = help: this indicates a potential bug in the program: it performed an invalid operation, but the Stacked Borrows rules it violated are still experimental
  = help: see https://github.com/rust-lang/unsafe-code-guidelines/blob/master/wip/stacked-borrows.md for further information
help: <3091> was created by a SharedReadOnly retag at offsets [0x0..0x4]
 --> src/main.rs:3:25
  |
3 |     let ptr: *const _ = &a[0];
  |                         ^^^^^
  = note: BACKTRACE:
  = note: inside `main` at src/main.rs:5:22
Ошибка довольно многословная, но суть её состоит в том, что указатель на первый элемент сформирован из ссылки на первый элемент массива и потому имеет право обращаться только к этому конкретному i32 и не может быть использован для того, чтобы обращаться дальше по памяти. Надо отметить, что сама операция ptr.add(1) UB не вызывает — в документации прямо сказано, что при помощи неё можно получить указатель "one byte past the end of the same allocated object". В данном случае именно такой указатель и будет сформирован, ибо этим самым allocated object является отдельный i32, а не массив целиком.Если мы попытаемся обмануть компилятор и взять сырой указатель:
    ...
    let ptr = core::ptr::addr_of!(a[0]);
    ...
, то у нас ничего не выйдет: miri будет так же ругаться, поскольку операция индексации берёт ссылку и фактически ссылку и возвращает.Как же поступить правильно? Можно сформировать указатель на элемент из сырого указателя на сам массив:
let ptr = core::ptr::addr_of!(a) as *const i32;
Но это в основном имеет смысл, когда по каким-то причинам нет возможности использовать ссылку на массив. Если же есть, то проще использовать специальный метод для это, as_ptr (который, кстати, тут работает за счёт deref coercion из ссылки на массив в ссылку на слайс):let ptr = a.as_ptr();
В любом случае, при использовании одного из этих двух методов miri не считает код содержащим UB.doc.rust-lang.org
  
  pointer - Rust
  Raw, unsafe pointers, `*const T`, and `*mut T`.
🔥7👍1😱1