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
Спортивное программирование
Курс посвящен методам решения задач школьных и студенческих олимпиад по программированию. Ориентирован на уровень начинающих участников олимпиад, владеющих основами программирования.