Programming News and Articles
8 subscribers
5 photos
3 files
241 links
Download Telegram
Forwarded from Блог*
#prog #rust

Пара советов по строкам в Rust:

1) Если вам нужно разбить строку по одному из нескольких возможных символов — не спешите расчехлять регулярки, для это задачи вполне хватит стандартной библиотеки. Множество строковых методов навроде {, r}split{, _terminator}, trim{, _start, _end}_matches, find и прочие принимают в качестве аргумента для поиска значение, тип которого реализует пока нестабильный трейт Pattern. В настоящий момент его реализуют &str, &&str, &String, impl FnMut(char) -> bool и (почему-то малоизвестный) &[char]. Таким образом, разбить строку по нескольким символам легко:

let result = "Hello, world!".split(&['o', 'l'][..]).collect::<Vec<_>>();
assert_eq!(result, vec!["He", "", "", ", w", "r", "d!"]);


2) Если функция принимает на вход &mut std::str::Chars, что она может с ним сделать?

Вызвать `next`?

Нет.

Также вызвать `next_back`?

Нет.

Это всё неполные ответы. Если мы получаем мутабельную ссылку на Chars, мы можем редактировать произвольным образом, в том числе и поменять его целиком. Chars внутри себя содержит строки, символы которой он перебирает, и при помощи метода Chars::as_str эту строку можно достать. Таким образом, имея мутабельную ссылку на Chars, можно вытащить из него строку, вырезать из строки нужный кусок и переписать переданный итератор .chars() от этого кусочка.

Покажу на примере.

Вот первый способ вытащить строку из Chars (медленный, требующий аллокаций и не совсем корректный):

fn extract_line2(chars: &mut Chars) -> String {
chars.take_while(|&ch| !matches!(ch, '\r' | '\n')).collect()
}


Второй способ (побыстрее и не требующий аллокаций):

fn extract_line<'s>(chars: &mut Chars<'s>) -> Option<&'s str> {
let s = chars.as_str();
let line = s.lines().next()?;
*chars = s[line.len()..].chars();
Some(line)
}
Forwarded from oleg_log (Oleg Kovalov)
Развернутое сравнение rust & Zig. Не побоюсь сказать, что лучшее из увиденного по теме.

https://scattered-thoughts.net/writing/assorted-thoughts-on-zig-and-rust/
Forwarded from Bortlog
Вот вам подборочка хаков из кишочек Pebble:

1) https://github.com/cockroachdb/pebble/blob/master/internal/rawalloc/rawalloc.go
Аллоцируем неинициализированый (незануленый) слайс байт. Иногда надо если Вы знаете что всеравно сейчас перезапишите все эти байты своими, так что на инициализацию платить не хочется. Еще бывают случаи что вы предаллоцируете такой слайс, но может на полную его использовать не будете, поэтому вручную делаете инициализацию ленивой. Остальные варианты использования можете придумать сами и написать в коментарии.

2) https://github.com/cockroachdb/pebble/blob/master/internal/fastrand/fastrand.go
Прилинкованый lock free uint32 рандом из рантайма Go.

3) https://github.com/cockroachdb/pebble/blob/master/internal/bytealloc/bytealloc.go
Если Вы знаете что сейчас будете аллоцировать много маленьких байтслайсов можно предалоцировать их в одном слайсе побольше.

4) https://github.com/cockroachdb/pebble/blob/master/internal/intern/intern.go
Смотрите кто использует sync.Pool для построения кеша интернированых строк. А я то думал что первым додумался так ипользовать Pool 😐 в https://github.com/storozhukBM/pcache

5) https://github.com/cockroachdb/pebble/tree/master/internal/invariants
Как понять что тебя запустили под рейс детектором.
Forwarded from PONV Daily (Danila Matveev)
#distributed #lectures #edu

Странный состав лекций, возможно есть предварительный осенний курс. Но это MIT.

https://www.youtube.com/playlist?list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB
Forwarded from Блог*
#prog #python #article

Статья (в двух частях: первая, вторая), которая наглядно показывает слабость тайпчекера Mypy и проблемы с производительностью строк в Python. А, и ещё это статья о конструировании парсер-комбинаторов на Python, но это уже вторично.
Forwarded from Linker Unsafe
В дополнение анимированный интерактивный туториал по Raft консенсусу. Известная ссылка, но вдруг кто не видел.
https://thesecretlivesofdata.com/raft/
Forwarded from Evil Martians
Чем заняться вечером нерабочего дня? Можно вложиться в самообразование и начать смотреть стенфордский курс лекций по распределенным системам от Мартина Клеппманна. Имя хорошо известно в кругах CRDT (бесконфликтные реплицируемые типы данных).

Плейлист: https://www.youtube.com/playlist?list=PLeKd45zvjcDFUEv_ohr_HdUFe97RItdiB
Forwarded from Блог*
#prog #article

Продолжение темы от того же автора: Names are not type safety.
https://lexi-lambda.github.io/blog/2020/11/01/names-are-not-type-safety/
В рассуждениях автора легко провести параллели с тем, как использовать и ограничивать unsafe-код в Rust.
Forwarded from oleg_log (Oleg Kovalov)
А здесь более расширенный бугурт по поводу ipv6. И он вполне логичен.

Когда я впервые посмотрел, сколько же нас ждёт адресов, возник осмысленный вопрос: зачем моей стиральной машинке несколько лярдов адресов? (и если бы только моей).

NAT хоть и имеет свои особенности, но все же решает(?) проблему. Забавно что теперь это NPT (network prefix translation, а не address).

Ах, и конечно же безопасность. Самое время думать о миграции из network engineer в network security engineer, 3х ставку требовать с порога)

Думаю сейчас кто-то из сетевиков придет в коменты или в лс и расскажет мне как мир устроен, но все же - много.

Лонгрид на самом деле, но советую https://teknikaldomain.me/post/ipv6-is-a-total-nightmare/
Егор Бугаенко замутил конфу по code quality: iccq.ru

Должно быть круто, жаль не успею подготовить доклад до 4 декабря.

Справедливости ради, это не первая конфа по качеству кода. Существует Static Analysis Symposium, который через несколько дней будет проводиться уже в 27 (!!!) раз. Да, это не совсем про code quality, но все-таки...
Forwarded from ọzkriff
"The Rust Performance Book": https://nnethercote.github.io/perf-book