#prog #cpp #article
Google pushed a one-character typo to production, bricking Chrome OS devices
И да, это и впрямь так ошибка, которую Rust мог бы предотвратить ввиду наличия нормальных сумм-типов. Эквивалент на Rust выглядел бы примерно так:
То есть если
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()
и оператором разыменования с неопределённым поведением.Forwarded from Ковалёв Алексей как река Енисей
Если б сразу две парламентские комиссии, сенатская и думская, по расследованию иностранного вмешательства во внутренние дела России занимались тем, что написано у них на этикетке, то лучше примера такого вмешательства и совершенно чуждой россиянам псевдо-ценности, чем институциональная гомофобия, просто не найти. Тут даже искать ничего не надо. Подумайте сами. Кто у нас главное «консервативное» медиа, рупор самых оголтелых конспирологов-гомофобов? Телеканал «Царьград»? Создан видным функционером Fox News. Законы против «гей-пропаганды»? Списаны у консервативных американских штатов и буквально под диктовку американских же пасторов. Причём этого никто даже и не пытался как-то скрывать. Тогда ещё депутат Мизулина этих пасторов буквально в Думу приглашала. И таких примеров море. А иностранный агент кто? Правильно, я и ты! Причём эта импортированная гомофобия — идеология лузеров. Американские пасторы вчистую проиграли культурную войну у себя дома: в США однополые браки окончательно и бесповоротно легальны. С тех пор они пытаются впарить отрыжки этой войны во 2-3 мире — бывшем совке и Африке. Это не преувеличение — гомофобные законы в Уганде и в России продвигали и буквально писали рукой Елены Мизулиной одни и те же люди. Например, Скотт Лайвли, автор уникальной идеи «геи виноваты в Холокосте, потому что среди нацистов были геи» (он про это целое письмо Путину. Он прямо ГОРДИТСЯ российскими гомофобными законами, которые сам помогал писать! Поэтому каждый россиянин, который приветствует закон «против пидоров» и разгром какой-нибудь выставки или лекции, должен спросить себя — как ему в этой человеческой многоножке, слепленной американским пастором, стоять на карачках следующим после Уганды? Потому что это именно так и выглядит. А реальные российские традиционные ценности — это оголтелый гомосекс и кроссдрессинг, а не импортная гомофобия.
Bok-O-Bok
Импорт «традиционных ценностей» в Россию
Почему западные ультраконсерваторы борются с «гей-лобби» в России, рассказал социолог Даниил Жайворонок.
Есть такая сеть магазинов — Вкусвилл. Я сейчас не буду подробно расписывать, что это такое — скажу лишь, что магазин действительно уникальный. Так вот, 30 июня (кстати, последний день месяца гордости) на сайте магазина и в инстаграме была опубликована статья "Рецепты семейного счастья", в которой рассказывалось о семьях некоторых постоянных покупателей. Вот только если вы пройдёте по этой ссылке, то найдёте не статью, а лишь извинения. Оригинальную статью придётся читать в веб-архиве. Так что же произошло?
А дело вот в чём: в рассказе про одну из семей промелькнули следующий строки: "Алина — моя сестра, А Ксюша — её невеста. Они обручились буквально пару недель назад.". Из-за этой мелочи статью пришлось пометить рейтингом 18+ — всё из-за нечеловечного закона 6.21 КоАП РФ (aka "Пропаганда нетрадиционных сексуальных отношений среди несовершеннолетних"). Впрочем, это не смутило ни тех, кто написал и опубликовал статью ("Будьте внимательны: мы присвоили этой статье рейтинг 18+, согласно требованиям статьи 6.21 КоАП РФ. Это впервые в истории ВкусВилла. Однако мы считаем, что не рассказать о реальных семьях наших покупателей будет лицемерием. "), ни большинство покупателей. На первых порах публикацию приняли восторженно. И вообще событие было уникальное — впервые в истории России столь крупный бренд открыто выступил в поддержку ЛГБТК+. Но...
Извините, у нас Россия. А это значит, что очень скоро в комментарии набежали гомофобы, начали поносить компанию почём зря — и в результате добились того, что Вкусвилл публикацию удалил. Как они это мотивировали:
Почему я рассказываю всё это сейчас, месяц спустя? А вот почему: ту самую семью из публикации начали преследовать в соцсетях и по телефонам, присылать оскорбления и даже прямые угрозы расправы. Выдержать подобное, мягко говоря, сложно, так что в итоге девушки переехали в Испанию и пока возвращаться не планируют.
Данная история в очередной раз показала, насколько Россия — гомофобная (и вообще в целом ЛГБТК+-фобная) страна. Лично я не хочу жить в стране, в которой люди подвергаются преследованиям за, вообще говоря, не самые примечательные части идентичности, не наносящие вреда окружающим — причём преследованиям как со стороны государства, так и со стороны обычных людей. Также я сильно разочарован руководством "Вкусвилл" — их действия противоречат ценностям, которые они декларируют, причём не только словом, но и делом. И нельзя не отметить, что эта история создала неприятный прецедент в практике России, который будет говорить другим компаниям: "Не поддерживай ЛГБТК+ публично, а не то огребёшь". В общем, сплошная печаль. Единственное хорошего, что есть в этой истории — это то, что та семья теперь находится там, где им гомофобы могут навредить с гораздо меньшей вероятностью. Искренне рад за них.
А дело вот в чём: в рассказе про одну из семей промелькнули следующий строки: "Алина — моя сестра, А Ксюша — её невеста. Они обручились буквально пару недель назад.". Из-за этой мелочи статью пришлось пометить рейтингом 18+ — всё из-за нечеловечного закона 6.21 КоАП РФ (aka "Пропаганда нетрадиционных сексуальных отношений среди несовершеннолетних"). Впрочем, это не смутило ни тех, кто написал и опубликовал статью ("Будьте внимательны: мы присвоили этой статье рейтинг 18+, согласно требованиям статьи 6.21 КоАП РФ. Это впервые в истории ВкусВилла. Однако мы считаем, что не рассказать о реальных семьях наших покупателей будет лицемерием. "), ни большинство покупателей. На первых порах публикацию приняли восторженно. И вообще событие было уникальное — впервые в истории России столь крупный бренд открыто выступил в поддержку ЛГБТК+. Но...
Извините, у нас Россия. А это значит, что очень скоро в комментарии набежали гомофобы, начали поносить компанию почём зря — и в результате добились того, что Вкусвилл публикацию удалил. Как они это мотивировали:
На этом месте была статья, которая больно задела чувства большого числа наших покупателей, сотрудников, партнеров и поставщиков.
Мы сожалеем, что так получилось, и считаем эту публикацию своей ошибкой, ставшей проявлением непрофессионализма отдельных сотрудников.
Ожидаемо, на него обрушился шквал критики с противоположной стороны — на этот раз за то, что прогнулись под требования гомофобов (подавляющее большинство которых даже не были покупателями магазина). При этом надо отметить, что даже с сугубо с точки зрения бизнеса этот манёвр был проигрышным: Вкуссвилл потерял заметную долю лояльной аудитории и при этом не приобрёл новой.Почему я рассказываю всё это сейчас, месяц спустя? А вот почему: ту самую семью из публикации начали преследовать в соцсетях и по телефонам, присылать оскорбления и даже прямые угрозы расправы. Выдержать подобное, мягко говоря, сложно, так что в итоге девушки переехали в Испанию и пока возвращаться не планируют.
Данная история в очередной раз показала, насколько Россия — гомофобная (и вообще в целом ЛГБТК+-фобная) страна. Лично я не хочу жить в стране, в которой люди подвергаются преследованиям за, вообще говоря, не самые примечательные части идентичности, не наносящие вреда окружающим — причём преследованиям как со стороны государства, так и со стороны обычных людей. Также я сильно разочарован руководством "Вкусвилл" — их действия противоречат ценностям, которые они декларируют, причём не только словом, но и делом. И нельзя не отметить, что эта история создала неприятный прецедент в практике России, который будет говорить другим компаниям: "Не поддерживай ЛГБТК+ публично, а не то огребёшь". В общем, сплошная печаль. Единственное хорошего, что есть в этой истории — это то, что та семья теперь находится там, где им гомофобы могут навредить с гораздо меньшей вероятностью. Искренне рад за них.
vkusvill.ru
ВкусВилл
Официальный сайт «ВкусВилл». Купить товары и продукты для здорового питания в нашем интернет-магазине с бесплатной доставкой на дом всего за 2 часа в городе Москва и других городах России. Можно оформить онлайн-заявку на самовывоз и забрать собранный заказ…
Блог*
Есть такая сеть магазинов — Вкусвилл. Я сейчас не буду подробно расписывать, что это такое — скажу лишь, что магазин действительно уникальный. Так вот, 30 июня (кстати, последний день месяца гордости) на сайте магазина и в инстаграме была опубликована статья…
А вот сейчас можете называть меня циником и лицемером, но я, не смотря на всё это, продолжу пользоваться услугами этого магазина. Почему? Потому что другого такого — с натуральными свежими продуктами, крайне человечным отношением персонала, удобной доставкой, программами лояльности и политиками возврата денег — попросту нет.
Forwarded from мне не нравится реальность
Forwarded from Санечка Ъысь (Anna Weiss)
This media is not supported in your browser
VIEW IN TELEGRAM
#prog #rust #моё
Одна из частых ошибок новичков в Rust — это ошибка при считывание строк из файла. Они вызывают в цикле
Не будем решать сугубо конкретную задачу очищения строки и решим сразу задачу выполнения произвольного кода при окончании итерации цикла (на самом деле просто при дропе, но нас сейчас интересует именно цикл). Очевидно, для того, чтобы добиться нужного нам эффекта, требуются ссылка на значение и действие, которое будет на нём вызвано. Для простоты рассмотрим вариант, когда действие одно и тоже для каждой операции дропа — в этом случае можно сохранить значение и это действие в одной структуре и, соответственно, хранить в структуре с интересующим нас дропом одну лишь ссылку на этот агрегат:
Теперь выпишем определение интересующей нас структуры — точнее, попытаемся:
Нам нужно будет описать поведение этой структуры при дропе, но для этого требуется, чтобы ограничение на тип
Помним, что на самом деле это сахар для higher-ranked trait bounds:
Так что же в дропе? Просто вызываем действие на значении:
Скобки вокруг
Для удобства использования — ну и для того, чтобы не нарушать инкапсуляцию — реализуем для
Теперь покажем, как это работает. Сделаем простую программу: она будет считывать ввод по строкам и печатать их с переводом в верхний регистр, кроме строк, содержащих
Вот и всё! Как всегда, весь код в гисте.
Одна из частых ошибок новичков в 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. В качестве…
Так, мне уже это не нравится
...Которая формально не связана с замыканиями, но фактически была введена ради них. Я говорю про higher-ranked trait bounds. В качестве…
#prog #rust
Интересный способ обойти (для некоторых случаев) нехватку trait bounds в const fn при помощи GAT.
twitter.com/DrawsMiguel/status/1422770131969716228
Интересный способ обойти (для некоторых случаев) нехватку trait bounds в const fn при помощи GAT.
twitter.com/DrawsMiguel/status/1422770131969716228
Twitter
mcyoung
trait-bounds-in-const? who needs that when you have gats? godbolt.org/z/Yvb1vMdvz
#prog #article
Занятная статья об оптимизации базы данных. Один из тех редких случаев, когда промахи кеша инструкций действительно стали сдерживающим фактором. Что удивительно, эту проблему удалось решить довольно небольшими изменениями, которые в итоге привели к снижению задержки (в смысле latency), причём как средней, так и хвостовых перцентилей.
Занятная статья об оптимизации базы данных. Один из тех редких случаев, когда промахи кеша инструкций действительно стали сдерживающим фактором. Что удивительно, эту проблему удалось решить довольно небольшими изменениями, которые в итоге привели к снижению задержки (в смысле latency), причём как средней, так и хвостовых перцентилей.
ScyllaDB
ScyllaDB's Approach to Improve Performance for CPU-bound workloads - ScyllaDB
A database like ScyllaDB can be limited by the network, disk I/O or the processor. Which one it is often dynamic and depends on both the hardware configuration and the workload. The only way of dealing with that is to attempt to achieve good throughput and…
Как называется ситуация, когда посылка из Москвы в Санкт-Петербург ездит по Транссибирской магистрали?
Логистическая регрессия.
Логистическая регрессия.
Forwarded from const_cast
Зачем уходить из C++?
Самый важный вопрос: зачем вообще что-то менять?
С годами понял такую вещь: если у тебя есть перфекционистские наклонности, то изучать C++ тебе противопоказано. Этот язык манит ощущением полного контроля над происходящим, но на деле все эти обещания, словно узоры на крыльях бабочки, рассыпаются в прах, стоит лишь к ним прикоснуться. В итоге твоя карьера программиста на C++ вырождается в попытки заставить эту бабочку двигаться по твоему маршруту, не касаясь её крыльев, иначе она упадёт и больше не сможет летать.
Например, ты никогда не можешь быть уверен, что твоя программа на C++ не содержит неопределённого поведения, разрешающего оптимизирующему компилятору просто удалить к чертям содержимое какой-нибудь функции полностью. В одной версии всё работает, а в новой — раз, и всё поломалось. Такое случается сплошь и рядом.
Дичайшая разрозненность экосистемы — ещё одна из проблем, разъедающих C++ изнутри. Нет единого способа сделать вообще хоть что-то. У абсолютно каждого «эксперта» в C++ своё мнение о том, как решать те или иные задачи.
Я перестал пытаться делать пет-проджекты на C++, потому что вместо того, чтобы реализовывать свою идею, я всё своё время тратил на подбор подходящих библиотек: эта слишком жирная, тут система сборки непонятная, эту поддерживает один калека, эта не кроссплатформенная, и т.д., и т.п.
Слишком много свободы и слишком мало контроля — всё это вырождается в то, что есть тысячи недоделанных решений, ни одно из которых не подходит тебе полностью — потому что, ну, можно ведь лучше вот тут сделать! И оптимизированнее! И вот ты уже в одном шаге от переизобретения велосипеда. Вместо того, чтобы пилить по кайфу свой пет-проджект.
И язык развивается куда-то не туда. С каждой новой версией стандарта C++ становится всё больше недовольных тем, что фундаментальные проблемы языка не решаются вообще никак. Вместо этого мы просто получаем очередную кучу фич, предназначенных для всех сразу и ни для кого по отдельности. Взять хотя бы многострадальный
В результате, в каждой команде для поддержания хоть какого-то порядка будет разрешено только своё собственное подмножество языка, за пределы которого выходить ни в коем случае нельзя, иначе всё вмиг развалится.
И вот реально все по-своему пишут. Единства нет и не предвидится.
Если честно, мне всё это очень надоело. С моим устройством мышления очень сложно оставаться продуктивным в таком болоте: слишком много времени и мозга уходит на технические детали и решение «детских» проблем языка, а не на то, чтобы заставить компьютер делать то, что ты от него хочешь. Мотивация в этом ковыряться уже давно иссякла. Я в программирование не за этим пришёл.
Самый важный вопрос: зачем вообще что-то менять?
С годами понял такую вещь: если у тебя есть перфекционистские наклонности, то изучать C++ тебе противопоказано. Этот язык манит ощущением полного контроля над происходящим, но на деле все эти обещания, словно узоры на крыльях бабочки, рассыпаются в прах, стоит лишь к ним прикоснуться. В итоге твоя карьера программиста на C++ вырождается в попытки заставить эту бабочку двигаться по твоему маршруту, не касаясь её крыльев, иначе она упадёт и больше не сможет летать.
Например, ты никогда не можешь быть уверен, что твоя программа на C++ не содержит неопределённого поведения, разрешающего оптимизирующему компилятору просто удалить к чертям содержимое какой-нибудь функции полностью. В одной версии всё работает, а в новой — раз, и всё поломалось. Такое случается сплошь и рядом.
Дичайшая разрозненность экосистемы — ещё одна из проблем, разъедающих C++ изнутри. Нет единого способа сделать вообще хоть что-то. У абсолютно каждого «эксперта» в C++ своё мнение о том, как решать те или иные задачи.
Я перестал пытаться делать пет-проджекты на C++, потому что вместо того, чтобы реализовывать свою идею, я всё своё время тратил на подбор подходящих библиотек: эта слишком жирная, тут система сборки непонятная, эту поддерживает один калека, эта не кроссплатформенная, и т.д., и т.п.
Слишком много свободы и слишком мало контроля — всё это вырождается в то, что есть тысячи недоделанных решений, ни одно из которых не подходит тебе полностью — потому что, ну, можно ведь лучше вот тут сделать! И оптимизированнее! И вот ты уже в одном шаге от переизобретения велосипеда. Вместо того, чтобы пилить по кайфу свой пет-проджект.
И язык развивается куда-то не туда. С каждой новой версией стандарта C++ становится всё больше недовольных тем, что фундаментальные проблемы языка не решаются вообще никак. Вместо этого мы просто получаем очередную кучу фич, предназначенных для всех сразу и ни для кого по отдельности. Взять хотя бы многострадальный
std::variant
— могли бы сделать нормальный паттерн-матчинг, а получилось какое-то дикое говно, которое невозможно читать, а написать корректно ещё сложнее. И ещё пачку новых способов инициализации, куда же без этого.В результате, в каждой команде для поддержания хоть какого-то порядка будет разрешено только своё собственное подмножество языка, за пределы которого выходить ни в коем случае нельзя, иначе всё вмиг развалится.
И вот реально все по-своему пишут. Единства нет и не предвидится.
Если честно, мне всё это очень надоело. С моим устройством мышления очень сложно оставаться продуктивным в таком болоте: слишком много времени и мозга уходит на технические детали и решение «детских» проблем языка, а не на то, чтобы заставить компьютер делать то, что ты от него хочешь. Мотивация в этом ковыряться уже давно иссякла. Я в программирование не за этим пришёл.
#prog #js #article
(thanks @oleg_log)
-
— подходящее имя для пакета на npm, не находите? И да, он существует и скачивается в больших количествах. В статье рассказывается, почему.(thanks @oleg_log)
BleepingComputer
Empty npm package '-' has over 700,000 downloads — here's why
A mysterious, one-letter npm package named "-" sitting on the registry since 2020 has received over 700,000 downloads. What's more? The package contains no functional code, so what makes it score so many downloads?