Linker Unsafe
Photo
Дождался выхода, наконец-то. Погружаюсь в прослушивание (=чтение).
Forwarded from Блог*
#prog #rust #article
Статья о внутреннем устройстве BTreeMap из стандартной библиотеки Rust. Старая, вышла ещё до Rust 1.0, но она даёт хороший обзор принципиального устройства этой структуры данных вкупе с обзором различных трюков для локализации небезопасных операций. Эти трюки применяются и в современной реализации BTreeMap
Статья о внутреннем устройстве BTreeMap из стандартной библиотеки Rust. Старая, вышла ещё до Rust 1.0, но она даёт хороший обзор принципиального устройства этой структуры данных вкупе с обзором различных трюков для локализации небезопасных операций. Эти трюки применяются и в современной реализации BTreeMap
Дождались, Снойман (известный в хаскеллевских кругах спец) начинает по-маленьку испытывать новые GAT из ночника в Rust.
Неплохая вводная статья о том, чего все носятся с этим ГАТом...
https://www.fpcomplete.com/blog/monads-gats-nightly-rust/
Неплохая вводная статья о том, чего все носятся с этим ГАТом...
https://www.fpcomplete.com/blog/monads-gats-nightly-rust/
FP Complete
Monads and GATs in nightly Rust
I saw a recent Reddit post on the advances in Generic Associated Types (GATs) in Rust, which allows for the definition of a Monad trait. In this post, I'm going to take it one step further: a monad transformer trait in Rust!
Так, тут есть молодой раст-разработчик, пилит небольшие обучающие видеоролики на тему использования Rust и библиотек.
Уровень по-немногу растёт, что отрадно видеть. Возможно, будет интересно: Pretty Code на ютубе
Уровень по-немногу растёт, что отрадно видеть. Возможно, будет интересно: Pretty Code на ютубе
Бриллиант из понва (для понимания контекста: Marz девушка разработчик на пайтоне)
Marz🍰:
Хочу быть довольной, как удав
Anton Trunov:
GIL блокирует центр удовольствий
Marz🍰:
Ору
Сука
АААААААААААААААААААААААААА
Marz🍰:
Хочу быть довольной, как удав
Anton Trunov:
GIL блокирует центр удовольствий
Marz🍰:
Ору
Сука
АААААААААААААААААААААААААА
Forwarded from Generative Anton
#education
Cornell University выпустил на первый взгляд невероятно крутой курс, который сделан специально для самостоятельно онлайн прохождения. Курс CS 6120: Advanced Compilers как можно догадаться про дебри компиляторов и всё, что вокруг. Базируется на LLVM и самодельном IR слое. Есть и лекции, и книги и статьи. Всего 13 уроков.
Cornell University выпустил на первый взгляд невероятно крутой курс, который сделан специально для самостоятельно онлайн прохождения. Курс CS 6120: Advanced Compilers как можно догадаться про дебри компиляторов и всё, что вокруг. Базируется на LLVM и самодельном IR слое. Есть и лекции, и книги и статьи. Всего 13 уроков.
Как сделать язык программирования, используя Rust для реализации.
https://arzg.github.io/lang/
A series about making a programming language called Eldiro using the Rust programming language.
https://arzg.github.io/lang/
A series about making a programming language called Eldiro using the Rust programming language.
Душераздирающая история о том, как человек разочаровался в индустриальном программировании, но потом нашёл Rust, изучил, сменил работу и вновь обрёл веру в человечество.
https://reddit.com/r/rust/comments/khlln4/how_rust_changed_and_saved_my_life
UPD: пофиксил речевой оборот, очень трудно из программирования в литературу вот так вот сразу...
https://reddit.com/r/rust/comments/khlln4/how_rust_changed_and_saved_my_life
UPD: пофиксил речевой оборот, очень трудно из программирования в литературу вот так вот сразу...
reddit
How rust changed and saved my life
**Update:** Seeing how much positive attention this post received, I'd like to use this opportunity give some words of encouragement to all my...
Forwarded from rusta::mann
В этом году я начал задумываться, что, возможно, я выбрал не ту профессию — написание кода перестало меня цеплять, и превратилось в рутину. Подумывал даже в девопсы начать переучиваться, с депрессухи.
Но нет, сегодня я понял, что кодить я люблю — я не люблю C++.
Но нет, сегодня я понял, что кодить я люблю — я не люблю C++.
Человек не ожидал, что Spark это не библиотечка уровня leftpad, а огромный фреймворк. В этой ситуации, увы, только обнять и плакать...😢
===
Lookuut Struchkov:
Всем привет. Ребята есть у кого опыт дебагингга большого опенс сорс проекта, я обнаружил багу в одном проекте(spark), написал тесты которые ловят данную багу, хочется сделать PR но для этого надо понять что конкретно не так работает в самом проекте, но вот уже 2 неделю копаюсь и докопаться не могу (вместо того чтобы готовиться к аикапу:\)
как можно посмотреть в идее лог , типа какие объекты создавались и какие методы вызывались у них?
Roman:
Apache Spark?
Lookuut Struchkov:
да
Roman:
глобальненько
Lookuut Struchkov:
у меня голова уже кругом идет, не знал что он под капотом настолько огромный :(
===
Lookuut Struchkov:
Всем привет. Ребята есть у кого опыт дебагингга большого опенс сорс проекта, я обнаружил багу в одном проекте(spark), написал тесты которые ловят данную багу, хочется сделать PR но для этого надо понять что конкретно не так работает в самом проекте, но вот уже 2 неделю копаюсь и докопаться не могу (вместо того чтобы готовиться к аикапу:\)
как можно посмотреть в идее лог , типа какие объекты создавались и какие методы вызывались у них?
Roman:
Apache Spark?
Lookuut Struchkov:
да
Roman:
глобальненько
Lookuut Struchkov:
у меня голова уже кругом идет, не знал что он под капотом настолько огромный :(
Forwarded from iggisv9t channel
Для любителей странных аттракторов https://www.dynamicmath.xyz/strange-attractors/
Тут картинки, уравнения и ссылки на интерактивные симуляции.
Тут картинки, уравнения и ссылки на интерактивные симуляции.
В процессе решения задачек по курсу Спортивное программирование столкнулся со следующим неудобством Раста, а именно на нём иногда неудобно делать динамическое программирование (не путать с динамической типизацией). Для примера приведу задачу о наилучшем делении множества:
Дан массив `[a_0, a_1,..,a_(n-1)]` длины n, все числа положительные, задача разбить массив на 2 кучи так, чтобы разница между кучами была минимальна.
Скажем, для массива
Каноническое решение этой задачи через динамическое программирование, используя массив
На Rust это в сущности простой цикл:
Очевидный выход из этого положения - склонировать коллекцию перед итерированием по ней:
Где-то невдалеке маячит
Дан массив `[a_0, a_1,..,a_(n-1)]` длины n, все числа положительные, задача разбить массив на 2 кучи так, чтобы разница между кучами была минимальна.
Скажем, для массива
[1,5,3]
оптимальное разбиение будет [1,3]
в одну кучу, [5]
в другую.Каноническое решение этой задачи через динамическое программирование, используя массив
d
boolean-ов размера (n + 1) ⨉ m
, m
это достаточно большое число, можно взять половину суммы. Этот массив мы заполняем сверху вниз строка за строкой, когда d[i][j]==true
это означает, что сумма j
достижима при помощи некоторой комбинации элементов [a_0..a_i]
.На Rust это в сущности простой цикл:
let mut d = vec![vec![false; m]; n + 1];При больших
d[0][a[0] as usize] = true;
for i in 1..n {
d[i][0] = true;
for j in 0..m {
// если выключить элемент i
d[i][j] = d[i - 1][j];
// если включить элемент i
if a[i - 1] <= j as i32 {
d[i][j ] |= d[i - 1][j + a[i] as usize]
}
}
}
// далее ищем максимальный индекс j таких, что d[n][j] == true
// тогда (m - 2*j) будет минимально и это будет решение задачи
m
мы хотим (или даже вынуждены) воспользоваться спецификой задачи и заметить, что массив d
сильно разряжённый. Поэтому от строк-массивов мы переходим ко строкам-множествам. let mut d = vec![HashSet::new(); n];И неожиданно (а для кого-то ожидаемо) получаем cannot borrow `d` as mutable because it is also borrowed as immutable.
d[0].insert(a[0] as i32);
for i in 1..n {
d[i].insert(0);
for j in d[i - 1].iter().copied() {
if d[i - 1].contains(&j) {
d[i].insert(j);
}
if a[i - 1] <= j as i32 {
if d[i - 1].contains(&(j + a[i] as usize)) {
d[i].insert(j + a[i] as usize);
}
}
}
}
Очевидный выход из этого положения - склонировать коллекцию перед итерированием по ней:
// АААААААААА!Не столь очевидный: воспользоваться функцией
for j in d[i - 1].clone().iter().copied() {
...
}
Vec::split_at_mut
:for i in 1..n {Код компилируется, но теперь он не идиоматичный, и это меня несколько расстраивает.
d[i].insert(0);
let (d1, d2) = d.split_at_mut(i);
for j in d1[i - 1].iter().copied() {
// меняем d2[0] как нам угодно!
if d1[i - 1].contains(&j) {
d2[0].insert(j);
}
...
}
}
Где-то невдалеке маячит
unsafe
и напрашивается быть куда-нибудь вкоряченным, но я старательно отмахиваюсь от него. 😊Stepik: online education
Спортивное программирование
Курс посвящен методам решения задач школьных и студенческих олимпиад по программированию. Ориентирован на уровень начинающих участников олимпиад, владеющих основами программирования.
Forwarded from Generative Anton
Нашёл классный курс "Advanced Programming in the UNIX Environment". Всё целиком на C, никакого разжёвывания в начале, есть домашка и лекции в отличном качестве.
Проекты в курсе — реимплементация юниксовых утилит (ls(1) и sws(1)).
Проекты в курсе — реимплементация юниксовых утилит (ls(1) и sws(1)).
Интересная, и в чём-то поучительная история от друзей по ржавому оружию.
https://habr.com/ru/post/537790/
https://habr.com/ru/post/537790/
Хабр
Как мы ржавели. История внедрения и обучения
Все говорили – переходи на rust! Начинай пользоваться самым-самым языком, который самый любимый язык на stackoverflow и всё такое. Я тяжело вздохнул и огляделся. Ну опять двадцать-пять. Ладно, давайте...