Size: a a a

2021 January 16
Блог*
#prog #rust

fast_float — библиотека для быстрого парсинга чисел с плавающей точкой. Судя по бенчмаркам, быстрее lexical_core, да и вообще практически всех библиотек.

Является портом одноимённой библиотеки для C++ за авторством небезызвестного Даниела Лемира.
источник
2021 January 18
Блог*
источник
Блог*
#prog #rust

nom_supreme — библиотека, расширяющая функционал nom. Новые комбинаторы-методы, очень подробный тип ошибок, функция для быстрого создания парсера любого типа, реализующего FromStr и ещё по мелочи.

В примерах используется cool_asserts — библиотека для более пригодных для использования в #[test]-функциях ассертов.
источник
2021 January 19
Блог*
#bio

Статья (перевод на хабре) с разбором строения вакцины от SARS-CoV-2 от Pfizer.

Да, она вышла почти месяц назад, и что
источник
Блог*
dereference_pointer_there
#prog #rust #successstory

Статья об  опыте использования Rust в софте для видеоконференций, который, по словам разработчиков, превосходит по малости задержки все альтернативные решения.

Experiencing no software-related downtime so far is both a pleasant surprise, and a testament to the safety provided by Rust's guarantees. Rust has also made it easy to write performant code with efficient resource usage - both our CPU and memory usage has been predictable and consistent. Without a garbage collector, we can guarantee consistent latency and frame rates.

Our experience maintaining a Rust codebase has also been great. We've been able to introduce significant improvements to our latency through sizable changes to our codebase with confidence. A clean compile doesn't always imply everything will work, but honestly, that's been the case more often than not.

blog.tonari.no/why-we-love-rust
#prog #rust

Статья от этих же разработчиков о разработке firmware для физического пульта. Спойлер: всё прошло на удивление гладко.
источник
2021 January 20
Блог*
#prog #rust

Пара слов о трейте Copy.

Во-первых, это один из "магических" трейтов, помечен атрибутом #[lang = "copy"]. Компилятор проверяет, что если тип тем или иным способом задекларирован как Copy, то и всего его поля должны быть Copy. Следующий код не компилируется:

#[derive(Clone, Copy)]
struct StringHolder(String);

Ошибка:

error[E0204]: the trait `Copy` may not be implemented for this type
--> src/lib.rs:1:17
 |
1 | #[derive(Clone, Copy)]
 |                 ^^^^
2 | struct StringHolder(String);
 |                     ------ this field does not implement `Copy`

Во-вторых, один и тот же тип не может реализовывать Copy и Drop одновременно. Скажем, следующий код не компилируется:

#[derive(Clone, Copy)]
struct Primitive;

impl Drop for Primitive {
   fn drop(&mut self) {}
}

Ошибка:

error[E0184]: the trait `Copy` may not be implemented for this type; the type has a destructor
--> src/lib.rs:1:17
 |
1 | #[derive(Clone, Copy)]
 |                 ^^^^ Copy not allowed on types with destructors

Так как полноценных negative trait bounds в Rust всё ещё нет, ограничение Copy можно использовать как более сильную замену ограничению !Drop.

В-третьих, как сказано в документации к Copy, "Copies happen implicitly, for example as part of an assignment y = x. The behavior of Copy is not overloadable; it is always a simple bit-wise copy.". С другой стороны, Clone является супертрейтом Copy, и наличие реализации Copy не мешает вызывать .clone() явно. Однако, в отличие от Copy, Clone::clone в принципе может вызывать любой код. Поэтому, в частности, технически замена в итераторной цепочке .cloned() на .copied() является ломающим изменением, даже если элементы итератора реализуют Copy.

Продемонстрирую на примере:

use std::cell::Cell;

struct Counter<'a>(&'a Cell<u32>);

impl Clone for Counter<'_> {
   fn clone(&self) -> Self {
       self.0.set(self.0.get() + 1);
       Self(self.0)
   }
}

fn main() {
   let n = Cell::new(0);
   let arr = [Counter(&n), Counter(&n), Counter(&n)];
   arr.iter().cloned().for_each(drop);
   println!("`Counter::clone` called {} times", n.get());
}

Если запустить этот код, то он напечатает `Counter::clone` called 3 times. Теперь добавим к определению Counter аннотацию #[derive(Copy)] и допишем в main тот же код, что там есть, но с заменой .cloned() на copied():

fn main() {
   // ...

   let n = Cell::new(0);
   let arr = [Counter(&n), Counter(&n), Counter(&n)];
   arr.iter().copied().for_each(drop); // изменение в этой строке
   println!("`Counter::clone` called {} times", n.get());
}

Код теперь выводит:

`Counter::clone` called 3 times
`Counter::clone` called 0 times

Берегите себя и не пишите, пожалуйста, в Clone::clone что-то помимо собственно клонирования.
источник
Блог*
#prog #meme
источник
Блог*
источник
Блог*
#prog

Как это ваше ойти работает

https://twitter.com/mrdeadtoast/status/1351846865571098625
источник
Блог*
#prog

Поддерживаю, статья интересная
источник
Блог*
Довольно увлекательная статья о том, как человек участвовал в RAIC 2020. В этот раз необходимо было запрограммировать бота для игры в сильно упрощённый Старкрафт.
Человек решил офигенное количество с виду простых задач по разруливанию поведения юнитов на поле. И когда казалось, что все возможные грабли учтены, оказывалось, что находилась ещё ситуация (и не одна!), когда алгоритм действовал не лучшим образом.

Например,
Еще одной важной проблемой, которая не давала покоя было то, что когда мои лучники и лучники противника сближались, и становились стенка против стенки, то новые лучники подходили сзади и подпирали их. Таким образом они были абсолютно неэффективны, т.к. просто стояли и ничего не делали. И так могло накопиться много слоев моих лучников. Это выглядело как явная тактическая ошибка.

В-общем, стоящая статья, я получил удовольствие от прочтения. Краткий вывод:
1. Для участия в RAIC 2021 нужно уволиться с работы или взять отпуск месяца на 2 😊
2. Большинство задач тривиальны, но обобщённое и эффективное решение части из них позволяет разом убить 100 "зайцев" и избавиться от костылей в будущем.
3. Для участия не нужно иметь опыт в AI, ML, DL и других аббревиатурах, нужно просто уметь писать if-ы и циклы😉, но желательно уметь дебажить и профилировать код.

https://m.habr.com/ru/post/535310/
источник
Блог*
Районный суд в Питере взял и запретил аниме Death Note и Inuyashiki. Правда, не везде запретил, а только на одном пиратском сайте. И не потому что он пиратский, а потому что слово "смерть" в названии Death Note  провоцирует на суицид, а в Inuyashiki эксперты запутались в полах персонажей.

Уровень абсурда невероятен, конечно, но и последствий у этого решения никаких. Просто еще один обычный день России, сценарий для которого был словно написан в редакции ИА Панорама.
источник
Блог*
Колпинский районный суд Петербурга запретил распространение страницы сайта yummyanime с аниме «Токийский гуль» из-за неуказанных возрастных ограничений.

Комментарий эксперта от прокуратуры, доктора психологических наук, Василия Георгиевича Белова с высшим педагогическим образованием и стажем работы более 30 лет, работающего в Санкт-Петербургском институте независимой экспертизы и оценки: «В данном сериале практически формируется установка на садистические наклонности. Из такого человека легко вырастет садист. Надо понимать, что у нас очень много скрытой психопатологии. Такие фильмы выполняют роль выпускания джина из бутылки. То есть ты джина легко выпустишь, но обратно его загнать не получится никакими способами. Посмотрев такие фильмы, формируются соответствующие группы подростков, в которых такое поведение легко воспроизводится. Это недопустимо, потому что фактически идет массовая манипуляция сознания подростков и детей. Вот личностные расстройства легко культивируются, вот он садист будущий! Прямо побуждается к тем действиям, что демонстрируется на экране. Это максимально разрушительный потенциал и недопустимо демонстрировать в открытом доступе»

Судья в свою очередь упоминает «огромное количество писем», в том числе из Владикавказа, Белгорода, Великого Новгорода — в которых россияне требуют «закрыть эти ссылки, ведь они калечат души детей».

📰#заметки ※ #Tokyo_Ghoul
источник
Блог*
#prog

Если вы по каким-то причинам используете свой пароль в командной строке для доступа к GitHub (как это делаю я), то имейте в виду, что, начиная с 13 августа, пароли больше не будут работать. Мотивируют соображениями безопасности и предлагают в качестве альтернативы personal access token-ы, которые... Работают на практике так же, как пароли, но с настраиваемым доступом и всякими секьюрити-плюшками. Включая тот факт, что этот токен можно посмотреть лишь раз после создания, а после этого его уже не получиться посмотреть.

Спасибо за заботу, но нет, для меня неудобно и выглядит как сраный вендор-лок.
источник
2021 January 21
Блог*
#prog #rust #amazingopensource

(на самом деле не такой уж amazing, я этот кодес изнутри видел)
источник
Блог*
Иногда при написании документации не хватает визуальной составляющей, особенно когда нужно описать высокоуровневые взаимодействия компонентов системы, и прочие штуки, которые тяжело воспринимать без диаграммок.

На радость крудошлепам любителям повизуализировать, я сделяль интеграцию mermaid.js в растовые док-комменты, чтобы можно было вообще из docs.rs не вылезать.

Пример как это выглядит в коде:

#[aquamarine]
/// mermaid
/// graph LR
///     s([Source]) --> a[[aquamarine]]
///     r[[rustdoc]] --> f([Docs w/ Mermaid!])
///     subgraph rustc[Rust Compiler]
///     a -. inject mermaid.js .-> r
///     end
///  
pub fn example() {}


Ссылки:
crates.io
docs.rs
github
пост на r/rust (буду благодарен апвоуту :p)

#сделяль
источник
Блог*
#prog #cpp

Короткий код на C++, который выдаёт разные результаты, если его скомпилировать GCC, Clang, MSVC и ICC. Спасибо @oleg_log, наверное
источник
Блог*
#meme

Простите за #politota, но это смешно.
источник
Блог*
Переслано от InLaTeXbot
источник
Блог*
Хотите шутку? Это Путин.
А знаете почему?

После возведения в четвертую степень она обнулится.

ПС. Кстати зацените какой латексный бот классный.
источник