За час с момента публикации пост расшарили трижды, но ни одного комментария не последовало. Всё и так понятно или всё совсем непонятно? 🤔
Forwarded from Санечка Ъысь (Anna Weiss)
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from мне не нравится реальность
Наткнулся в твиттере на анонс интересного инструмента:
> cargo-hakari
Он автоматизирует создание и поддержку "workspace-hack" крейтов, ускоряя компиляцию для больших воркспейсов. Что такое "workspace-hack" и зачем его используют в rustc и firefox — читайте в треде.
> cargo-hakari
Он автоматизирует создание и поддержку "workspace-hack" крейтов, ускоряя компиляцию для больших воркспейсов. Что такое "workspace-hack" и зачем его используют в rustc и firefox — читайте в треде.
Twitter
rain 🌧
Announcing cargo-hakari, an easy-to-use way to generate and manage Cargo workspace-hack packages. Speed up your local @rustlang builds by up to 95%, and cumulatively by 25% or more! 🧵follows. crates.io/crates/cargo-h…
Forwarded from Врен о Японии для туриста
Вы не поверите, но это японские блины. Их подают в Crepes de Anne в Нагое.
#prog #rust #rustlib #serde
Трейт Deserializer имеет методы вида deserialize_type. Трейт Serializer имеет методы вида serialize_type. Что это значит? Это значит, что одно можно непосредственно сцепить с другим, и таким образом перегонять данные из одного формата данных, поддерживаемых serde, в другой, никогда не материализуя экземпляры соответствующих типов в памяти целиком. Собственно, именно это и делает serde-transcode.
Пример из документации (преттификация JSON):
Трейт 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();
}
docs.rs
Deserializer in serde - Rust
A data format that can deserialize any data structure supported by Serde.
#prog #parsing
libphonenumber — библиотека для парсинга и форматирования телефонных номеров. Почему это необходимо? Ну, потому что телефонные номера — запутанная вещь.
libphonenumber — библиотека для парсинга и форматирования телефонных номеров. Почему это необходимо? Ну, потому что телефонные номера — запутанная вещь.
GitHub
GitHub - google/libphonenumber: Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international…
Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers. - google/libphonenumber
#prog #article
Статья о PubGrub — алгоритме разрешения ограничений, который используется в pub — пакетном менеджере для Dart — для выбора версий зависимостей.
Во главе алгоритма лежит идея несовместимостей (incompatibilities) — набор ограничений на версии, которые не могут быть удовлетворены все одновременно. Замечательной особенностью несовместимостей является то, что они являются фактами конкретного набора ограничений: неважно, какие именно версии будут выбраны в процессе разрешения зависимостей, они не могут инвалидировать уже обнаруженные несовместимости.
Алгоритм состоит из двух частей: unit propagation и decision making (нет, я не смог придумать перевода, который бы звучал не коряво). Unit propagation анализирует несовместимости и выводит конкретные факты (то бишь ограничение на версии), которые должны быть справедливы при текущем выборе версий. Так как эти факты зависят от принятых решений, в базу знаний они добавляются не напрямую, а в виде несовместимостей. Эта фаза продолжается до тех пор, пока получение новых фактов возможно.
Вторая фаза, decision making, вступает в силу, если unit propagation закончил работу, но в отношении конкретных выбранных версий ещё осталась неопределённость. Алгоритм пробует одну из возможных альтернатив для выбора версии и пытается вывести версии, исходя из этого решения. Важным тут является то, что когда выбор альтернативы приводит к конфликту ограничений, этот факт записывается в базу знаний в виде несовместимости. Это позволяет не терять полученную информацию и и использовать её при выборе альтернатив, существенно снижая список альтернатив для проб за счёт пропуска диапазонов версий, которые заведомо не приведут к решению.
Так как несовместимости могут выводиться из других несовместимостей, их набор представляет собой не просто множество, а направленный ациклический граф (DAG), где направленные рёбра являются логической импликацией. Само по себе это не влияет на работу алгоритма, но позволяет серьёзно улучшить диагностику для случаев, когда набор ограничений на версии несовместим: вместо того, чтобы просто сказать "я не могу, у меня лапки", PubGrub показывает пошаговое объяснение, почему выбрать удовлетворяющий ограничениям набор версий зависимостей не удалось.
P. S.: не смотря на мои объяснения, советую прочитать оригинальную статью: мало того, что я мог понять что-то неправильно, так ещё и там работа алгоритма демонстрируется на наглядном конкретном примере.
Статья о PubGrub — алгоритме разрешения ограничений, который используется в pub — пакетном менеджере для Dart — для выбора версий зависимостей.
Во главе алгоритма лежит идея несовместимостей (incompatibilities) — набор ограничений на версии, которые не могут быть удовлетворены все одновременно. Замечательной особенностью несовместимостей является то, что они являются фактами конкретного набора ограничений: неважно, какие именно версии будут выбраны в процессе разрешения зависимостей, они не могут инвалидировать уже обнаруженные несовместимости.
Алгоритм состоит из двух частей: unit propagation и decision making (нет, я не смог придумать перевода, который бы звучал не коряво). Unit propagation анализирует несовместимости и выводит конкретные факты (то бишь ограничение на версии), которые должны быть справедливы при текущем выборе версий. Так как эти факты зависят от принятых решений, в базу знаний они добавляются не напрямую, а в виде несовместимостей. Эта фаза продолжается до тех пор, пока получение новых фактов возможно.
Вторая фаза, decision making, вступает в силу, если unit propagation закончил работу, но в отношении конкретных выбранных версий ещё осталась неопределённость. Алгоритм пробует одну из возможных альтернатив для выбора версии и пытается вывести версии, исходя из этого решения. Важным тут является то, что когда выбор альтернативы приводит к конфликту ограничений, этот факт записывается в базу знаний в виде несовместимости. Это позволяет не терять полученную информацию и и использовать её при выборе альтернатив, существенно снижая список альтернатив для проб за счёт пропуска диапазонов версий, которые заведомо не приведут к решению.
Так как несовместимости могут выводиться из других несовместимостей, их набор представляет собой не просто множество, а направленный ациклический граф (DAG), где направленные рёбра являются логической импликацией. Само по себе это не влияет на работу алгоритма, но позволяет серьёзно улучшить диагностику для случаев, когда набор ограничений на версии несовместим: вместо того, чтобы просто сказать "я не могу, у меня лапки", PubGrub показывает пошаговое объяснение, почему выбрать удовлетворяющий ограничениям набор версий зависимостей не удалось.
P. S.: не смотря на мои объяснения, советую прочитать оригинальную статью: мало того, что я мог понять что-то неправильно, так ещё и там работа алгоритма демонстрируется на наглядном конкретном примере.
Medium
PubGrub: Next-Generation Version Solving
Introducing a new package management algorithm for selecting packages more quickly and explaining failures more clearly than ever before.
Forwarded from мне не нравится реальность
rustc
известен своей медлительностью, но есть ли улучшения в этом плане? TL;DR: The Rust compiler has gotten faster again
Forwarded from dd if=/dev/stuff of=/dev/tg
Новая статья — о простом тайп-левел представлении UUID:
https://ybogomolov.me/type-level-uuid
https://ybogomolov.me/type-level-uuid
ybogomolov.me
Compile-time validation of UUIDs