Forwarded from мне не нравится реальность (вафель 🧇💛)
pretty_assertions — крейт который делает вывод
assert_eq!
более читаемым.Forwarded from Programming sucks
Это победа. В одной из моделей боинга в софтине, управляющей генераторами, каждые 248 дней переполняется память и генераторы вырубаются. Проблемы в авиации решают красиво: кривую софтину обнуляют, обесточивая самолёт во время техобслуживания o\
Problem:
This condition is caused by a software counter internal to the GCUs that will overflow after 248 days of continuous power. We
are issuing this AD to prevent loss of all AC electrical power, which could result in loss of control of the airplane.
Solution:
This AD requires a repetitive maintenance task for electrical power deactivation.
(c) https://s3.amazonaws.com/public-inspection.federalregister.gov/2015-10066.pdf, по наводке https://t.iss.one/sqaunderhood/217
Problem:
This condition is caused by a software counter internal to the GCUs that will overflow after 248 days of continuous power. We
are issuing this AD to prevent loss of all AC electrical power, which could result in loss of control of the airplane.
Solution:
This AD requires a repetitive maintenance task for electrical power deactivation.
(c) https://s3.amazonaws.com/public-inspection.federalregister.gov/2015-10066.pdf, по наводке https://t.iss.one/sqaunderhood/217
Forwarded from Anton Repushko
мне один челик с работы прошлой одной (он до этого работал в маленькой компании, которая саппортила и мониторила спутники в космосе телевизионные), что спутники запланированно обестачиваются и перезагружаются каждые N-минут, чтобы никакой хрени не случалось, мол так спокойнее. Знаешь, что если переполнение или какая-то хрень, то он перезагрузится
#prog #rust #rustlib
Тайп-левел программирование на расте с вменяемым синтаксисом.
github.com/jerry73204/typ
Тайп-левел программирование на расте с вменяемым синтаксисом.
github.com/jerry73204/typ
GitHub
GitHub - jerry73204/typ: Experimental type level programming in Rust
Experimental type level programming in Rust. Contribute to jerry73204/typ development by creating an account on GitHub.
Forwarded from Neural Machine
Старая поговорка гласит: гуманитарий всегда расстроен, сердит, раздражен и раскаивается.
#blogrecommendation
Этот канал не существует в вакууме. Есть и другие каналы, которые интересны мне и которые я бы мог назвать друзьями Блог*а. Так что без лишних слов представляю вам их, с описаниями от авторов.
@ihatereality
Личный блог вафли, где он в основном пишет о извращениях с растом. Или просто о чём ему в голову взбредёт. Но в основном о расте.
(^берегите его, он умный и он няша)
@optozorax_dev
Илья программирует всякое и периодически пишет о результатах. При этом он старается объяснить как проблему, так и решение, не забывая ссылаться на известные результаты. Поэтому читатель может узнать что-то новое для себя. Не репостит другие каналы, поэтому контента мало, зато он уникальный.
(а ещё он обожает кастомные клавиатуры)
@ShadyBytes
Личный блог айтишника-либертарианца про технологии и общество. Меньше пресс-релизов крупных компаний, больше личного опыта.
@repushko_channel
Один шизоид ругается на IT индустрию и постит иногда смешные мемы.
(любитель философии)
@tipaproit
Типа про IT и вот это вот всё. Прокрастинируем и программируем программы на компьютере. Авторский блог exclusively for Telegram.
@rustamann
(микро) блог @mersinvald о Rust, разработке, и жизни экспата в Германии. Ахтунг! Повышенное содержание мемов.
Этот канал не существует в вакууме. Есть и другие каналы, которые интересны мне и которые я бы мог назвать друзьями Блог*а. Так что без лишних слов представляю вам их, с описаниями от авторов.
@ihatereality
Личный блог вафли, где он в основном пишет о извращениях с растом. Или просто о чём ему в голову взбредёт. Но в основном о расте.
(^берегите его, он умный и он няша)
@optozorax_dev
Илья программирует всякое и периодически пишет о результатах. При этом он старается объяснить как проблему, так и решение, не забывая ссылаться на известные результаты. Поэтому читатель может узнать что-то новое для себя. Не репостит другие каналы, поэтому контента мало, зато он уникальный.
(а ещё он обожает кастомные клавиатуры)
@ShadyBytes
Личный блог айтишника-либертарианца про технологии и общество. Меньше пресс-релизов крупных компаний, больше личного опыта.
@repushko_channel
Один шизоид ругается на IT индустрию и постит иногда смешные мемы.
(любитель философии)
@tipaproit
Типа про IT и вот это вот всё. Прокрастинируем и программируем программы на компьютере. Авторский блог exclusively for Telegram.
@rustamann
(микро) блог @mersinvald о Rust, разработке, и жизни экспата в Германии. Ахтунг! Повышенное содержание мемов.
Хочу ли я, чтобы вы подписались на эти каналы? Ну, скорее да, чем нет. Но есть одна небольшая проблема...
Forwarded from илья optozorax
ПОДПИСАН НА ВАФЕЛЯ, АНТОНА, НИКА ЛИНКЕРА И RUSTA::MANN'А
@
ЕСЛИ НОВОСТЬ ИНТЕРЕСНАЯ, ТО ПРИХОДИТСЯ ЧИТАТЬ ЕЁ ПО ЧЕТЫРЕ РАЗА
@
ЕСЛИ НОВОСТЬ ИНТЕРЕСНАЯ, ТО ПРИХОДИТСЯ ЧИТАТЬ ЕЁ ПО ЧЕТЫРЕ РАЗА
Forwarded from xor eax, eax
Сейчас все эти каналы перешлют и это сообщение. Читать придется более 4-ех раз
Блог*
#prog #parsing #regex #article (строго говоря, не про разбор, а про распознавание, но всё же) Можно ли подсчитать производную от регулярного выражения? Можно и нужно! Статья рассказывает о изученной и эффективной, но почему-то мало известной на практике технике…
#prog #parsing #regex #article
Почему эта статься называется "Regular-expression derivatives reexamined"? Это не оригинальная статья, а более современный пересказ оригинальной статьи Брзозовски (вот pdf, но читать не советую — это просто довольно грубый скан с бумаги, над нормальной перепечаткой которого никто не заморачивался). Идея производной от регулярного выражения оказалось достаточно плодотворной, чтобы её можно было обобщить до более продвинутых конструкций. Собственно, в этой статье от Мэтта Майта и прочих (pdf) вводится в рассмотрение производная от контекстно-свободных грамматик (CFG), заданных при помощи взаимно-рекурсивных определений, содержащих альтернативы, конкатенацию и звезду Клини, и на основе этого определения реализуется на Racket парсер (именно парсер, а не распознаватель) таких грамматик. Весь код в итоге занял около 30 строк, но для корректной работы полагался на ленивость, мемоизацию и вычисление неподвижных точек функций (есть также реализация на Haskell, но она выглядит так себе, в частности, там зачем-то есть вызов
Как показал себя этот парсер на практике? Паршиво: на разбор 31-строчного синтаксически корректного файла на Python у парсера ушло три минуты. Причина? Неконтролируемые взятия производной от грамматики приводят к тому, что ошмётки грамматики растут экспоненциально. Введение дополнительного шага обработки, названного авторами "сжатием" (compaction) и состоящей в преобразованиях грамматики, уменьшающей её размер, но сохраняющей поведение, привело к желаемому эффекту — повышению производительности. Тем не менее, производительность всё равно осталась достаточно низкой — на разбор того же 31-строчного файла теперь уходило две секунды. Многовато.
Так что же, парсинг с использованием производных (parsing with derivatives, PwD) является непрактичной игрушкой? Отнюдь, как было показано в статье Майкла Адамса. Сложность у этого алгоритма отнюдь не экспоненциальная, как считали авторы, а кубическая. Также оригинальная реализация была написана несколько неоптимально. Во-первых, вычисление неподвижных точек производилось при помощи многократного вызова одной и той же функции, что приводило в худшем случае к квадратичной сложности. Более умная реализация позволяет найти неподвижную точку за линейное время. Во-вторых, в правилах compaction были пропущены парочка правил переписывания грамматики, из-за отсутствия которых грамматика могла прийти в состояние, далёкому от оптимального, но к которому неприменимы операции переписывания. В-третьих, мемоизация в оригинальной реализации использовала хэш-таблицы (причём вложенные). Перемещение мемоизируемых данных из таблиц непосредственно в узлы грамматики положительно сказалось на производительности (надо отметить, что на практике в этих вложенных таблицах было не более одной записи. Хранение единственного значения, разумеется, снизило возможности мемоизации, но, как ни странно, на практике не сильно сказалось на производительности). Итого? Та же идея, но производительность выше на три порядка. Элегантность кода и краткость кода, впрочем, была потеряна.
Можно ли сделать лучше? В принципе, да. Последовательное взятие производной требует многократного прохода по одному и тому же графу, причём, как правило, обход с корня идёт по почти тому же самому пути. Для оптимизации работы над деревьями есть специальная структура данных, zipper (pdf), которая позволяет сфокусироваться на какой-то части дерева и иметь к ней быстрый доступ (кстати, сам автор, Huet, не считает себя изобретателем этой структуры данных, поскольку она переизобреталась неоднократно, статью же он написал главным образом ради того, чтобы идея была более известна). Встраивание зиппера в PwD позволяет повысить его производительность.
⬇️⬇️⬇️
Почему эта статься называется "Regular-expression derivatives reexamined"? Это не оригинальная статья, а более современный пересказ оригинальной статьи Брзозовски (вот pdf, но читать не советую — это просто довольно грубый скан с бумаги, над нормальной перепечаткой которого никто не заморачивался). Идея производной от регулярного выражения оказалось достаточно плодотворной, чтобы её можно было обобщить до более продвинутых конструкций. Собственно, в этой статье от Мэтта Майта и прочих (pdf) вводится в рассмотрение производная от контекстно-свободных грамматик (CFG), заданных при помощи взаимно-рекурсивных определений, содержащих альтернативы, конкатенацию и звезду Клини, и на основе этого определения реализуется на Racket парсер (именно парсер, а не распознаватель) таких грамматик. Весь код в итоге занял около 30 строк, но для корректной работы полагался на ленивость, мемоизацию и вычисление неподвижных точек функций (есть также реализация на Haskell, но она выглядит так себе, в частности, там зачем-то есть вызов
unsafePerformIO
).Как показал себя этот парсер на практике? Паршиво: на разбор 31-строчного синтаксически корректного файла на Python у парсера ушло три минуты. Причина? Неконтролируемые взятия производной от грамматики приводят к тому, что ошмётки грамматики растут экспоненциально. Введение дополнительного шага обработки, названного авторами "сжатием" (compaction) и состоящей в преобразованиях грамматики, уменьшающей её размер, но сохраняющей поведение, привело к желаемому эффекту — повышению производительности. Тем не менее, производительность всё равно осталась достаточно низкой — на разбор того же 31-строчного файла теперь уходило две секунды. Многовато.
Так что же, парсинг с использованием производных (parsing with derivatives, PwD) является непрактичной игрушкой? Отнюдь, как было показано в статье Майкла Адамса. Сложность у этого алгоритма отнюдь не экспоненциальная, как считали авторы, а кубическая. Также оригинальная реализация была написана несколько неоптимально. Во-первых, вычисление неподвижных точек производилось при помощи многократного вызова одной и той же функции, что приводило в худшем случае к квадратичной сложности. Более умная реализация позволяет найти неподвижную точку за линейное время. Во-вторых, в правилах compaction были пропущены парочка правил переписывания грамматики, из-за отсутствия которых грамматика могла прийти в состояние, далёкому от оптимального, но к которому неприменимы операции переписывания. В-третьих, мемоизация в оригинальной реализации использовала хэш-таблицы (причём вложенные). Перемещение мемоизируемых данных из таблиц непосредственно в узлы грамматики положительно сказалось на производительности (надо отметить, что на практике в этих вложенных таблицах было не более одной записи. Хранение единственного значения, разумеется, снизило возможности мемоизации, но, как ни странно, на практике не сильно сказалось на производительности). Итого? Та же идея, но производительность выше на три порядка. Элегантность кода и краткость кода, впрочем, была потеряна.
Можно ли сделать лучше? В принципе, да. Последовательное взятие производной требует многократного прохода по одному и тому же графу, причём, как правило, обход с корня идёт по почти тому же самому пути. Для оптимизации работы над деревьями есть специальная структура данных, zipper (pdf), которая позволяет сфокусироваться на какой-то части дерева и иметь к ней быстрый доступ (кстати, сам автор, Huet, не считает себя изобретателем этой структуры данных, поскольку она переизобреталась неоднократно, статью же он написал главным образом ради того, чтобы идея была более известна). Встраивание зиппера в PwD позволяет повысить его производительность.
⬇️⬇️⬇️
Journal of the ACM
Derivatives of Regular Expressions | Journal of the ACM
Блог*
#prog #parsing #regex #article (строго говоря, не про разбор, а про распознавание, но всё же) Можно ли подсчитать производную от регулярного выражения? Можно и нужно! Статья рассказывает о изученной и эффективной, но почему-то мало известной на практике технике…
⬆️⬆️⬆️
Первая статья (pdf) (июнь 2020!), с подходом, адаптировавшим зипперы к PwD, использует понятия синтаксиса (как единого объекта) и сфокусированного синтаксиса, который суть синтаксис плюс стек слоёв, который можно к нему применить (отчасти напоминает то, о чём говорил я). Ограничив себя LL(1)-грамматиками, авторы сумели реализовать парсер, работающий за время, пропорциональное количеству входных лексем, причём все важные свойства промежуточных операций они верифицировали при помощи доказательств на Coq. Сам парсер доступен в виде библиотеки на Scala.
Вторая статья (август 2020!) не ограничивается LL(1)-грамматиками, а даёт способ парсить произвольные контекстно-свободные грамматики. Т. к. на вход подаётся лишь единственное правило, алгоритму приходится разбираться с произвольными графами с циклами и использовать несколько изощрённое обобщение зиппера. Статья ценна тем, что в ней реализация выводится через ряд промежуточных версий (одним из шагов, как и в статье Майкла Адамса, является замена таблицы мемоизаций на единственное значение для мемоизации). Получившийся парсер короче оригинального PwD и при этом показывает лучшую производительность, чем оптимизированный PwD Майкла Адамса. К сожалению, не смотря на то, что данный парсер, по всей видимости, имеет кубическую производительность для худшего случая, доказать этот факт авторы не сумели из-за приличного количества нетривиальной логики с мемоизацией.
Как вам уже известно, я выкладываю лишь то, что прочитал/посмотрел сам. Последние две статьи я прочитал, но, к сожалению, не уяснил полностью излагаемые там алгоритмы. Буду перечитывать.
Первая статья (pdf) (июнь 2020!), с подходом, адаптировавшим зипперы к PwD, использует понятия синтаксиса (как единого объекта) и сфокусированного синтаксиса, который суть синтаксис плюс стек слоёв, который можно к нему применить (отчасти напоминает то, о чём говорил я). Ограничив себя LL(1)-грамматиками, авторы сумели реализовать парсер, работающий за время, пропорциональное количеству входных лексем, причём все важные свойства промежуточных операций они верифицировали при помощи доказательств на Coq. Сам парсер доступен в виде библиотеки на Scala.
Вторая статья (август 2020!) не ограничивается LL(1)-грамматиками, а даёт способ парсить произвольные контекстно-свободные грамматики. Т. к. на вход подаётся лишь единственное правило, алгоритму приходится разбираться с произвольными графами с циклами и использовать несколько изощрённое обобщение зиппера. Статья ценна тем, что в ней реализация выводится через ряд промежуточных версий (одним из шагов, как и в статье Майкла Адамса, является замена таблицы мемоизаций на единственное значение для мемоизации). Получившийся парсер короче оригинального PwD и при этом показывает лучшую производительность, чем оптимизированный PwD Майкла Адамса. К сожалению, не смотря на то, что данный парсер, по всей видимости, имеет кубическую производительность для худшего случая, доказать этот факт авторы не сумели из-за приличного количества нетривиальной логики с мемоизацией.
Как вам уже известно, я выкладываю лишь то, что прочитал/посмотрел сам. Последние две статьи я прочитал, но, к сожалению, не уяснил полностью излагаемые там алгоритмы. Буду перечитывать.
Telegram
Блог*
#prog #rust #моё
Исторически решение задач с бектрекингом является более простым в функциональных ЯП с персистентными структурами данных. Взял состояние, немного поменял его и получил новую версию, делаешь на ней рекурсивный вызов, если решение зашло в тупик…
Исторически решение задач с бектрекингом является более простым в функциональных ЯП с персистентными структурами данных. Взял состояние, немного поменял его и получил новую версию, делаешь на ней рекурсивный вызов, если решение зашло в тупик…