1.83K subscribers
3.3K photos
131 videos
15 files
3.57K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Вы не поверите, но это японские блины. Их подают в Crepes de Anne в Нагое.
Forwarded from Puh
Как сделать ноготочки на типах rust
#prog #rust #rustlib #serde

Трейт Deserializer имеет методы вида deserialize_type. Трейт Serializer имеет методы вида serialize_type. Что это значит? Это значит, что одно можно непосредственно сцепить с другим, и таким образом перегонять данные из одного формата данных, поддерживаемых serde, в другой, никогда не материализуя экземпляры соответствующих типов в памяти целиком. Собственно, именно это и делает serde-transcode.

Пример из документации (преттификация JSON):

extern crate serde;
extern crate serde_json;
extern crate serde_transcode;

use serde::Serialize;
use serde_json::{Serializer, Deserializer};
use std::io::{Read, Write, BufReader, BufWriter};
use std::fs::File;

fn main() {
let reader = BufReader::new(File::open("input.json").unwrap());
let writer = BufWriter::new(File::create("output.json").unwrap());

let mut deserializer = Deserializer::from_reader(reader);
let mut serializer = Serializer::pretty(writer);
serde_transcode::transcode(&mut deserializer, &mut serializer).unwrap();
serializer.into_inner().flush().unwrap();
}
Сделать, что ли, отдельный хештег для serde 🤔
Forwarded from Санечка Ъысь (Anna Weiss)
Я уволился.
#prog #article

Статья о PubGrub — алгоритме разрешения ограничений, который используется в pub — пакетном менеджере для Dart — для выбора версий зависимостей.

Во главе алгоритма лежит идея несовместимостей (incompatibilities) — набор ограничений на версии, которые не могут быть удовлетворены все одновременно. Замечательной особенностью несовместимостей является то, что они являются фактами конкретного набора ограничений: неважно, какие именно версии будут выбраны в процессе разрешения зависимостей, они не могут инвалидировать уже обнаруженные несовместимости.

Алгоритм состоит из двух частей: unit propagation и decision making (нет, я не смог придумать перевода, который бы звучал не коряво). Unit propagation анализирует несовместимости и выводит конкретные факты (то бишь ограничение на версии), которые должны быть справедливы при текущем выборе версий. Так как эти факты зависят от принятых решений, в базу знаний они добавляются не напрямую, а в виде несовместимостей. Эта фаза продолжается до тех пор, пока получение новых фактов возможно.

Вторая фаза, decision making, вступает в силу, если unit propagation закончил работу, но в отношении конкретных выбранных версий ещё осталась неопределённость. Алгоритм пробует одну из возможных альтернатив для выбора версии и пытается вывести версии, исходя из этого решения. Важным тут является то, что когда выбор альтернативы приводит к конфликту ограничений, этот факт записывается в базу знаний в виде несовместимости. Это позволяет не терять полученную информацию и и использовать её при выборе альтернатив, существенно снижая список альтернатив для проб за счёт пропуска диапазонов версий, которые заведомо не приведут к решению.

Так как несовместимости могут выводиться из других несовместимостей, их набор представляет собой не просто множество, а направленный ациклический граф (DAG), где направленные рёбра являются логической импликацией. Само по себе это не влияет на работу алгоритма, но позволяет серьёзно улучшить диагностику для случаев, когда набор ограничений на версии несовместим: вместо того, чтобы просто сказать "я не могу, у меня лапки", PubGrub показывает пошаговое объяснение, почему выбрать удовлетворяющий ограничениям набор версий зависимостей не удалось.

P. S.: не смотря на мои объяснения, советую прочитать оригинальную статью: мало того, что я мог понять что-то неправильно, так ещё и там работа алгоритма демонстрируется на наглядном конкретном примере.
#prog #meme
Я старый(
rustc известен своей медлительностью, но есть ли улучшения в этом плане?

TL;DR: The Rust compiler has gotten faster again
Новая статья — о простом тайп-левел представлении UUID:
https://ybogomolov.me/type-level-uuid
dd if=/dev/stuff of=/dev/tg
Новая статья — о простом тайп-левел представлении UUID: https://ybogomolov.me/type-level-uuid
Решаю повторить на расте
@
Начинаю расписывать через const generics
@
Понимаю, что стейбл слишком немощный, и подрубаю nightly с #![feature(const_adt_params, generic_const_exprs)]
@
ВНЕЗАПНО ICE (internal compiler error)
@
Минифицирую
@
ВНЕЗАПНО ICE-ится и на стейбле, не смотря на использование фичей
@
Заполняю issue
@
Попутно, проверяя, не дубликат ли это, нахожу вот это issue, открытое несколько часов назад
@
"Привет, у нас тут можно, оказывается, написать Drop с более сильными ограничениями на тип, чем в объявлении, что позволяет промоутить произвольный тип до 'static, что может привести к use after free, кстати, вот пример для воспроизведения"
@
Лейбл: regression-from-stable-to-stable
@
Как страшно жить