1.83K subscribers
3.29K photos
130 videos
15 files
3.56K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Forwarded from концлагерь "закат-13" [экстремист edition]
слишком сложно.
👍29❤‍🔥63😁3
#prog #amazingopensource

ast-grep — инструмент для структурного поиска и замены с паттернами не на уровне текста, а на уровне синтаксических деревьев.

Построен поверх tree-sitter, поэтому охват языков, корректность и произодительность на уровне.

Поддерживает интерактивный режим, который позволяет проверить все места, где применяется правило, перед совершением реальной замены.

Поддерживает предзаписанные правила (в YAML 😒), с возможностью вынесения в отдельные файлы общих определений.

Может быть использован как линтер, для поиска паттернов, но без замены.
👍11🔥3
#meme

Жиза
❤‍🔥21😁7😢1
#prog #rust #rustasync

Хозяйке на заметку

(или "Антон читает за вас документацию tokio")

1. Если вам требуется заспавнить несколько тасок с одинаковыми типами возврата, в количестве, известном только в рантайме, и дождаться результата исполнения каждой из них или только некоторых, то в tokio есть для этого готовый примитив: JoinSet.

Базовый пример использования:

use tokio::task::JoinSet;

#[tokio::main]
async fn main() {
let mut set = JoinSet::new();

for i in 0..10 {
// таски спавнятся при помощи spawn, поэтому
// семантика та же: сразу начинают выполняться
// и паникует вне асинхронного контекста tokio
set.spawn(async move { i });
}

let mut seen = [false; 10];
// мы не обязаны получать все таски до конца
while let Some(res) = set.join_next().await {
let idx = res.unwrap();
seen[idx] = true;
}

for i in 0..10 {
assert!(seen[i]);
}
}


Также можно отменить скопом все таски в наборе через abort_all. Также можно переиспользовать JoinSet, используя detach_all. Это уберёт все таски из JoinSet, но они продолжат исполняться рантаймом.

2. Если у нас есть несколько тасок, которые отсылают результаты своей работы через канал, и мы хотим ограничить число одновременно исполняемых тасок, то это можно сделать при помощи канала ограниченной ёмкости и API, описанного в статье Mutex without lock, Queue without push: cancel safety in lilos (о которой я уже рассказывал):

let (tx, mut rx) = tokio::sync::mpsc::channel(limit);

for _ in 0..n_tasks {
let work = async {
// какая-то полезная работа
};
let tx = tx.clone();
let task = async move {
let send_permit = tx.reserve_owned().unwrap();
let result = work.await;
let _ = send_permit.send(result);
};
tokio::spawn(task);
}

// дропаем свою копию Sender-а, чтобы не заблокироваться
// на чтении из канала, в который никто не пишет
drop(tx);
while let Some(res) = rx.recv().await {
// обрабатываем результат
}


И надо предупредить (хотя навряд ли вы в такое вляпаетесь намеренно): очевидно, если Permit-ов утечёт достаточно много, вы можете оказаться в дурацкой ситуации, когда в канале есть место, но он не работает ни за отправку, ни на получение.
👍3
Forwarded from Jokes++ (Daniil Goncharov)
👍8😱6😁1🤔1
#prog #rust #article

Destructing trees safely and cheaply

О том, как дропать глубоко вложенные рекурсивные типы без переполнения стека.
👍5
Forwarded from Nero's (Nero-sama ᗜˬᗜ 🇷🇺)
👍13😁6🤯3🤡1
Примерно через 3 часа UNIX timestamp достигнет красивой отметки 1700000000


https://www.epochconverter.com/countdown?q=1700000000
11🔥9🎉6
😱11😁5🌚2
Правдивый #prog #meme про Linux
Forwarded from Nero's (Nero-sama 🇷🇺)
😁21😐4👎2
Нужны ли разработчику классы?

Да. С первого по одиннадцатый.
😁17💯4🤡3
#prog #rust #article

How I Improved My Rust Compile Times by 75%*

*с инкрементальной сборкой

TL;DR: инкрементальная сборка выигрывает от использования более быстрого линкера (mold для Linux/sold для Macos) и бекенда Cranelift.
👍4🔥2
#rust #article

Why Rust in Production?

(советую включить режим чтения в вашем браузере, фон ядовито-оранжевого цвета)

Статья о взгляде на Rust со стороны компаний.

The intent is to provide an honest look at Rust's practicality for production to help decision-makers understand its benefits and challenges.

==========

Один из моментов в статье:

Rust is a relatively young language. Version 1.0 was first released in 2015. This means that the ecosystem is still maturing. Many important libraries did not see their 1.0 release yet.

Это правда, но есть много 0.x-библиотек, которые де-факто стабильны.
Высокоинтеллектуальный #meme
всегда так делает
🔥19😁4🌚1