Size: a a a

2021 August 02
Блог*
Не БалАшиха, а БалашИха
источник
Блог*
#rust #cpp #meme

Source
источник
Блог*
#prog #cpp #article

Google pushed a one-character typo to production, bricking Chrome OS devices

И да, это и впрямь так ошибка, которую Rust мог бы предотвратить ввиду наличия нормальных сумм-типов. Эквивалент на Rust выглядел бы примерно так:

impl VaultKeySet {
   fn get_label(&self) -> String {
       match self.key_data.label() {
           Some(label) if !label.is_empty() => label.into(),
           _ => format!("{}{}", KEY_LEGACY_PREFIX, self.legacy_number),
       }
   }
}


То есть если label отсутствует, то последующий код не исполняется вовсе. И никаких причудливых танцев с .has_value() и оператором разыменования с неопределённым поведением.
источник
Блог*
Если б сразу две парламентские комиссии, сенатская и думская, по расследованию иностранного вмешательства во внутренние дела России занимались тем, что написано у них на этикетке, то лучше примера такого вмешательства и совершенно чуждой россиянам псевдо-ценности, чем институциональная гомофобия, просто не найти. Тут даже искать ничего не надо. Подумайте сами. Кто у нас главное «консервативное» медиа, рупор самых оголтелых конспирологов-гомофобов? Телеканал «Царьград»? Создан видным функционером Fox News. Законы против «гей-пропаганды»? Списаны у консервативных американских штатов и буквально под диктовку американских же пасторов. Причём этого никто даже и не пытался как-то скрывать. Тогда ещё депутат Мизулина этих пасторов буквально в Думу приглашала. И таких примеров море. А иностранный агент кто? Правильно, я и ты! Причём эта импортированная гомофобия — идеология лузеров. Американские пасторы вчистую проиграли культурную войну у себя дома: в США однополые браки окончательно и бесповоротно легальны. С тех пор они пытаются впарить отрыжки этой войны во 2-3 мире — бывшем совке и Африке. Это не преувеличение — гомофобные законы в Уганде и в России продвигали и буквально писали рукой Елены Мизулиной одни и те же люди. Например, Скотт Лайвли, автор уникальной идеи «геи виноваты в Холокосте, потому что среди нацистов были геи» (он про это целое письмо Путину. Он прямо ГОРДИТСЯ российскими гомофобными законами, которые сам помогал писать! Поэтому каждый россиянин, который приветствует закон «против пидоров» и разгром какой-нибудь выставки или лекции, должен спросить себя — как ему в этой человеческой многоножке, слепленной американским пастором, стоять на карачках следующим после Уганды? Потому что это именно так и выглядит. А реальные российские традиционные ценности — это оголтелый гомосекс и кроссдрессинг, а не импортная гомофобия.
источник
Блог*
источник
Блог*
источник
2021 August 04
Блог*
Есть такая сеть магазинов — Вкусвилл. Я сейчас не буду подробно расписывать, что это такое — скажу лишь, что магазин действительно уникальный. Так вот, 30 июня (кстати, последний день месяца гордости) на сайте магазина и в инстаграме была опубликована статья "Рецепты семейного счастья", в которой рассказывалось о семьях некоторых постоянных покупателей. Вот только если вы пройдёте по этой ссылке, то найдёте не статью, а лишь извинения. Оригинальную статью придётся читать в веб-архиве. Так что же произошло?

А дело вот в чём: в рассказе про одну из семей промелькнули следующий строки: "Алина — моя сестра, А Ксюша — её невеста. Они обручились буквально пару недель назад.". Из-за этой мелочи статью пришлось пометить рейтингом 18+ — всё из-за нечеловечного закона 6.21 КоАП РФ (aka "Пропаганда нетрадиционных сексуальных отношений среди несовершеннолетних"). Впрочем, это не смутило ни тех, кто написал и опубликовал статью ("Будьте внимательны: мы присвоили этой статье рейтинг 18+, согласно требованиям статьи 6.21 КоАП РФ. Это впервые в истории ВкусВилла. Однако мы считаем, что не рассказать о реальных семьях наших покупателей будет лицемерием. "), ни большинство покупателей. На первых порах публикацию приняли восторженно. И вообще событие было уникальное — впервые в истории России столь крупный бренд открыто выступил в поддержку ЛГБТК+. Но...

Извините, у нас Россия. А это значит, что очень скоро в комментарии набежали гомофобы, начали поносить компанию почём зря — и в результате добились того, что Вкусвилл публикацию удалил. Как они это мотивировали:

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

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

Ожидаемо, на него обрушился шквал критики с противоположной стороны — на этот раз за то, что прогнулись под требования гомофобов (подавляющее большинство которых даже не были покупателями магазина). При этом надо отметить, что даже с сугубо с точки зрения бизнеса этот манёвр был проигрышным: Вкуссвилл потерял заметную долю лояльной аудитории и при этом не приобрёл новой.

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

Данная история в очередной раз показала, насколько Россия — гомофобная (и вообще в целом ЛГБТК+-фобная) страна. Лично я не хочу жить в стране, в которой люди подвергаются преследованиям за, вообще говоря, не самые примечательные части идентичности, не наносящие вреда окружающим — причём преследованиям как со стороны государства, так и со стороны обычных людей. Также я сильно разочарован руководством "Вкусвилл" — их действия противоречат ценностям, которые они декларируют, причём не только словом, но и делом. И нельзя не отметить, что эта история создала неприятный прецедент в практике России, который будет говорить другим компаниям: "Не поддерживай ЛГБТК+ публично, а не то огребёшь". В общем, сплошная печаль. Единственное хорошего, что есть в этой истории — это то, что та семья теперь находится там, где им гомофобы могут навредить с гораздо меньшей вероятностью. Искренне рад за них.
источник
Блог*
А вот сейчас можете называть меня циником и лицемером, но я, не смотря на всё это, продолжу пользоваться услугами этого магазина. Почему? Потому что другого такого — с натуральными свежими продуктами, крайне человечным отношением персонала, удобной доставкой, программами лояльности и политиками возврата денег — попросту нет.
источник
Блог*
#prog #rust

TL;DR: GAT теперь не является incomplete feature
источник
Блог*
https://blog.rust-lang.org/2021/08/03/GATs-stabilization-push.html

👀👀👀👀👀👀👀👀👀👀👀👀
источник
Блог*
#music

youtube.com/watch?v=nuw-cxKhW5A

P. S.: да, это намёк
источник
2021 August 05
Блог*
источник
2021 August 06
Блог*
#prog #rust #моё

Одна из частых ошибок новичков в Rust — это ошибка при считывание строк из файла. Они вызывают в цикле read_to_string, но забывают очищать строку в конце итерации, из-за чего в строке остаётся то, что было прочитано на предыдущих операциях. Более того, просто воткнуть s.clear(); в конце тела может быть недостаточно: если в цикле есть оператор continue, то до исполнения этой строчки дело может и не дойти — в подобных случаях не только новички делают ошибки. Было бы хорошо иметь что-то, что выполняется автоматически в конце каждой итерации цикла вне зависимости то того, как она выполняется... И такая вещь в Rust есть: Drop::drop aka деструктор!

Не будем решать сугубо конкретную задачу очищения строки и решим сразу задачу выполнения произвольного кода при окончании итерации цикла (на самом деле просто при дропе, но нас сейчас интересует именно цикл). Очевидно, для того, чтобы добиться нужного нам эффекта, требуются ссылка на значение и действие, которое будет на нём вызвано. Для простоты рассмотрим вариант, когда действие одно и тоже для каждой операции дропа — в этом случае можно сохранить значение и это действие в одной структуре и, соответственно, хранить в структуре с интересующим нас дропом одну лишь ссылку на этот агрегат:

struct AutoDo<T, F> {
   value: T,
   action: F,
}


Теперь выпишем определение интересующей нас структуры — точнее, попытаемся:

struct DoOnDrop<'a, T, F>(&'a mut AutoDo<T, F>);


Нам нужно будет описать поведение этой структуры при дропе, но для этого требуется, чтобы ограничение на тип F — которое неизбежно появится для описания того факта, что это функция — повторялось при определении структуры. Без выполнения этого требования компилятор выдаст ошибку. А как, собственно говоря, должно выглядеть это требование? Это должна быть функция, которая принимает мутабельную ссылку на значение, причём не с каким-то конкретным временем жизни, а с произвольным. В итоге определение выглядит так:

struct DoOnDrop<'a, T, F: FnMut(&mut T)>(&'a mut AutoDo<T, F>);


Помним, что на самом деле это сахар для higher-ranked trait bounds:

struct DoOnDrop<'a, T, F: for<'val> FnMut(&'val mut T)>(&'a mut AutoDo<T, F>);


Так что же в дропе? Просто вызываем действие на значении:

impl<'a, T, F: FnMut(&mut T)> Drop for DoOnDrop<'a, T, F> {
   fn drop(&mut self) {
       (self.0.action)(&mut self.0.value)
   }
}


Скобки вокруг self.0.action тут необходимы, поскольку иначе это будет проинтепретировано, как вызов метода AutoDo::action, коего, разумеется нет.

Для удобства использования — ну и для того, чтобы не нарушать инкапсуляцию — реализуем для DoOnDrop трейты Deref{, Mut}<Target = T>, а также метод AutoDo::get, который будет оборачивать ссылку в DoOnDrop. Реализацию, с вашего позволения, опущу в силу тривиальности.

Теперь покажем, как это работает. Сделаем простую программу: она будет считывать ввод по строкам и печатать их с переводом в верхний регистр, кроме строк, содержащих nope — их она будет просто отбрасывать:

fn main() {
   use std::io::Read;

   let stdin = std::io::stdin();
   let mut stdin = stdin.lock();
   let mut buf = AutoDo::new(String::new(), String::clear);

   loop {
       let mut buf = buf.get();
       if let Ok(0) | Err(_) = stdin.read_to_string(&mut buf) {
           break;
       }
       if buf.contains("nope") {
           continue; // работает и с continue
       }
       println!("{}", buf.to_uppercase());
   }

   let buf = buf.into_inner();
   assert!(buf.is_empty()); // буфер в итоге пустой
}


Вот и всё! Как всегда, весь код в гисте.
Telegram
Блог*
Прошу прощения. В общем, я хотел рассказать про одну продвинутую фичу системы типов Rust...

Так, мне уже это не нравится

...Которая формально не связана с замыканиями, но фактически была введена ради них. Я говорю про higher-ranked trait bounds. В качестве демонстрационного примера я возьму несколько переработанный пример из rustonomicon. Пусть у нас есть структура, в которой лежат какие-то данные и замыкание, которое можно к эти данным применить:

struct Point {
   x: u32,
   y: u32,
   z: u32,
}

struct Closure<F> {
   data: Point,
   func: F,
}

Попробуем написать для Closure метод, который применяет функцию func к point:

impl<F> Closure<F>
where
   F: Fn(&Point) -> &u32,
{
   fn apply(&self) -> &u32 {
       (self.func)(&self.data)
        // ^---- эти скобки необходимы, потому без них это будет означать
        // вызов метода func
   }
}

Пока вроде всё нормально, но мы знаем, что в данном случае Rust вывел времена жизни за нас, в том числе и в ограничении на F. Как это выглядит в развёрнутом…
источник
Блог*
#prog #meme

Ну ведь правда же!
источник
Блог*
источник
Блог*
#prog #rust

Интересный способ обойти (для некоторых случаев) нехватку trait bounds в const fn при помощи GAT.

twitter.com/DrawsMiguel/status/1422770131969716228
источник
Блог*
источник
Блог*
#prog #article

Занятная статья об оптимизации базы данных. Один из тех редких случаев, когда промахи кеша инструкций действительно стали сдерживающим фактором. Что удивительно, эту проблему удалось решить довольно небольшими изменениями, которые в итоге привели к снижению задержки (в смысле latency), причём как средней, так и хвостовых перцентилей.
источник
2021 August 07
Блог*
Как называется ситуация, когда посылка из Москвы в Санкт-Петербург ездит по Транссибирской магистрали?

Логистическая регрессия.
источник
Блог*
Зачем уходить из C++?

Самый важный вопрос: зачем вообще что-то менять?
С годами понял такую вещь: если у тебя есть перфекционистские наклонности, то изучать C++ тебе противопоказано. Этот язык манит ощущением полного контроля над происходящим, но на деле все эти обещания, словно узоры на крыльях бабочки, рассыпаются в прах, стоит лишь к ним прикоснуться. В итоге твоя карьера программиста на C++ вырождается в попытки заставить эту бабочку двигаться по твоему маршруту, не касаясь её крыльев, иначе она упадёт и больше не сможет летать.

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

Дичайшая разрозненность экосистемы — ещё одна из проблем, разъедающих C++ изнутри. Нет единого способа сделать вообще хоть что-то. У абсолютно каждого «эксперта» в C++ своё мнение о том, как решать те или иные задачи.
Я перестал пытаться делать пет-проджекты на C++, потому что вместо того, чтобы реализовывать свою идею, я всё своё время тратил на подбор подходящих библиотек: эта слишком жирная, тут система сборки непонятная, эту поддерживает один калека, эта не кроссплатформенная, и т.д., и т.п.
Слишком много свободы и слишком мало контроля — всё это вырождается в то, что есть тысячи недоделанных решений, ни одно из которых не подходит тебе полностью — потому что, ну, можно ведь лучше вот тут сделать! И оптимизированнее! И вот ты уже в одном шаге от переизобретения велосипеда. Вместо того, чтобы пилить по кайфу свой пет-проджект.

И язык развивается куда-то не туда. С каждой новой версией стандарта C++ становится всё больше недовольных тем, что фундаментальные проблемы языка не решаются вообще никак. Вместо этого мы просто получаем очередную кучу фич, предназначенных для всех сразу и ни для кого по отдельности. Взять хотя бы многострадальный std::variant — могли бы сделать нормальный паттерн-матчинг, а получилось какое-то дикое говно, которое невозможно читать, а написать корректно ещё сложнее. И ещё пачку новых способов инициализации, куда же без этого.

В результате, в каждой команде для поддержания хоть какого-то порядка будет разрешено только своё собственное подмножество языка, за пределы которого выходить ни в коем случае нельзя, иначе всё вмиг развалится.
И вот реально все по-своему пишут. Единства нет и не предвидится.

Если честно, мне всё это очень надоело. С моим устройством мышления очень сложно оставаться продуктивным в таком болоте: слишком много времени и мозга уходит на технические детали и решение «детских» проблем языка, а не на то, чтобы заставить компьютер делать то, что ты от него хочешь. Мотивация в этом ковыряться уже давно иссякла. Я в программирование не за этим пришёл.
источник