#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
dd if=/dev/stuff of=/dev/tg
Новая статья — о простом тайп-левел представлении UUID: https://ybogomolov.me/type-level-uuid
Решаю повторить на расте
@
Начинаю расписывать через const generics
@
Понимаю, что стейбл слишком немощный, и подрубаю nightly с
@
ВНЕЗАПНО ICE (internal compiler error)
@
Минифицирую
@
ВНЕЗАПНО ICE-ится и на стейбле, не смотря на использование фичей
@
Заполняю issue
@
Попутно, проверяя, не дубликат ли это, нахожу вот это issue, открытое несколько часов назад
@
"Привет, у нас тут можно, оказывается, написать Drop с более сильными ограничениями на тип, чем в объявлении, что позволяет промоутить произвольный тип до
@
Лейбл: regression-from-stable-to-stable
@
Как страшно жить
@
Начинаю расписывать через 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
@
Как страшно жить
GitHub
`#![feature(generic_const_exprs)]` ICE on evaluating constans both for type of generic const parameter and trait bound at the same…
Code #![feature(generic_const_exprs)] struct Foo<const A: [(); 0 + 0]> where [(); 0 + 0]: Sized; Note that it is required for both array lengths to be not a literal in order to trigge...
Блог*
Решаю повторить на расте @ Начинаю расписывать через const generics @ Понимаю, что стейбл слишком немощный, и подрубаю nightly с #![feature(const_adt_params, generic_const_exprs)] @ ВНЕЗАПНО ICE (internal compiler error) @ Минифицирую @ ВНЕЗАПНО ICE-ится и…
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from ☕️ Мерлин заваривает τσάι 🐌
TIL в postgres можно накатывать ограничения только для новых записей
https://hakibenita.com/postgresql-unknown-features#add-constraints-without-validating-immediately
ALTER TABLE ordersВот это вот
ADD CONSTRAINT check_price_gt_zero
CHECK (price >= 0) NOT VALID;
NOT VALID
говорид постгре "падажжи, не проверяй старые записи, а вот новые валидируй"https://hakibenita.com/postgresql-unknown-features#add-constraints-without-validating-immediately
Hakibenita
Lesser Known PostgreSQL Features
Features you already have but may not know about!
Блог*
Решаю повторить на расте @ Начинаю расписывать через const generics @ Понимаю, что стейбл слишком немощный, и подрубаю nightly с #![feature(const_adt_params, generic_const_exprs)] @ ВНЕЗАПНО ICE (internal compiler error) @ Минифицирую @ ВНЕЗАПНО ICE-ится и…
Вафелька подсказал, что страшное issue закрыли
GitHub
Unsound drop due to imperfect lifetime checks · Issue #90838 · rust-lang/rust
Looks like it's possible to impl Drop for a stricter lifetime than the one used in the type: struct Wrapper<'a, T>(&'a T) where T: 'a; impl&...
#prog #rust #serde #article
У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
Блог*
#prog #article Системы типов #java и #scala являются unsound. Подробности в статье. TL;DR: Программа определяет тип class Constrain<A, B extends A> {} и метод upcast: static class Bind<A> { <B extends A> A upcast(Constrain<A,B> constrain, B b) { …
DEV Community
Java is Unsound: The Industry Perspective
Discussing a recent academic finding on Java and Scala, from industry's perspective.
Forwarded from Linker Unsafe
Неожиданно Rust Evangelism Strikeforce добралась и до Ёжика Лисичкина (совсем не программерский, и даже не технический канал)
#music
TL;DR: тык.
Продолжаем славную традицию выкладывать саундтреки игр вместо обзоров на них.
Почти десять лет назад вышла игра Vessel, пазл-платформер. Разработанная двумя людьми, которые в своё время покинули Electronic Arts и основали Strange Loop Games, дабы разрабатывать игры с упором на интересный геймплей, а не графику, эта игра была обласкана критиками и игроками (81/7.8 на Metacritic).
В своё время я прошёл эту игру — причём сначала на пиратке, и она мне настолько понравилась, что я купил её в Steam — и потом забросил на полку. Относительно недавно я решил её перепройти — и в процессе обратил внимание на то, что прошло мимо моего внимания несколько лет назад: шикарная музыка. К сожалению, поиски официального саундтрека успехом не увенчались: в Steam его просто нет, а официальная страница игры не работает. Композитор Jon Hopkins выкладывал часть треков на bandcamp и Spotify, но не объединял конкретно треки из Vessel в один альбом. В итоге искомое пришлось искать на YouTube, что немного жаль, поскольку альбомные версии треков отличаются от игровой версии.
Но музыка всё равно хорошая.
TL;DR: тык.
Продолжаем славную традицию выкладывать саундтреки игр вместо обзоров на них.
Почти десять лет назад вышла игра Vessel, пазл-платформер. Разработанная двумя людьми, которые в своё время покинули Electronic Arts и основали Strange Loop Games, дабы разрабатывать игры с упором на интересный геймплей, а не графику, эта игра была обласкана критиками и игроками (81/7.8 на Metacritic).
В своё время я прошёл эту игру — причём сначала на пиратке, и она мне настолько понравилась, что я купил её в Steam — и потом забросил на полку. Относительно недавно я решил её перепройти — и в процессе обратил внимание на то, что прошло мимо моего внимания несколько лет назад: шикарная музыка. К сожалению, поиски официального саундтрека успехом не увенчались: в Steam его просто нет, а официальная страница игры не работает. Композитор Jon Hopkins выкладывал часть треков на bandcamp и Spotify, но не объединял конкретно треки из Vessel в один альбом. В итоге искомое пришлось искать на YouTube, что немного жаль, поскольку альбомные версии треков отличаются от игровой версии.
Но музыка всё равно хорошая.
Forwarded from Generative Anton
В интернете есть все, в том числе сайт, в котором можно играть в Outgage Bingo. Сегодня прямо было близко к бинго.