...

суббота, 14 марта 2020 г.

[Перевод] Выпуск Rust 1.42.0: шаблоны срезов и более удобные сообщения о панике

Команда Rust рада сообщить о выпуске новой версии, 1.42.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.42.0 вам достаточно выполнить следующую команду:

rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Что вошло в стабильную версию 1.42.0

Основными нововведениями Rust 1.42.0 являются более удобные сообщения о панике в случае вызова unwrap, шаблоны срезов, объявление устаревшим Error::description и многое другое. Смотрите подробности выпуска для дополнительной информации.


Сообщения о панике из Option и Result теперь включают полезные номера строк

В Rust 1.41.1 вызов unwrap() для значения Option::None порождало сообщение об ошибке примерно такого содержания:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /.../src/libcore/macros/mod.rs:15:40

Аналогично, номера строк в сообщениях о панике, порождаемые вызовами unwrap_err, expect и expect_err, как и соответствующими методами для типа Result, тоже ссылались на внутренности core.

В Rust 1.42.0 все эти восемь функций порождают сообщения о панике, которые включают такие номера строк, откуда они были вызваны. Новые сообщения выглядят примерно так:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:2:5

Это означает, что ошибочный вызов unwrap находился на строке 2 в файле src/main.rs.

Это поведение стало возможным благодаря аннотации #[track_caller]. Эта аннотация ещё не доступна в стабильной версии Rust, но если вы уже сейчас хотите использовать её в своём коде, вы можете отслеживать прогресс в этой задаче.


Образец по части среза

В Rust 1.26 мы стабилизировали так называемые "образцы по срезам", позволяющие сопоставлять с образцами на срезах. Такие образцы выглядели примерно так:

fn foo(words: &[&str]) {
    match words {
        [] => println!("empty slice!"),
        [one] => println!("one element: {:?}", one),
        [one, two] => println!("two elements: {:?} {:?}", one, two),
        _ => println!("I'm not sure how many elements!"),
    }
}

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

В Rust 1.42 у нас теперь есть расширенная поддержка сопоставления с частью среза:

fn foo(words: &[&str]) {
    match words {
        ["Hello", "World", "!", ..] => println!("Hello World!"),
        ["Foo", "Bar", ..] => println!("Baz"),
        rest => println!("{:?}", rest),
    }
}

Синтаксис .. называется "остаточный образец" (rest pattern), потому что он сопоставляется с остаточной частью среза. Данный пример чуть выше использует остаточный образец в конце среза, но вы можете использовать такие образцы множеством других способов:

fn foo(words: &[&str]) {
    match words {
        // Игнорируем всё, за исключением последнего элемента, который должен быть "!".
        [.., "!"] => println!("!!!"),

        // `start` - это срез из всех элементов, кроме последнего, который должен быть "z".
        [start @ .., "z"] => println!("starts with: {:?}", start),

        // `end` - это срез из всех элементов, кроме первого, который должен быть "a".
        ["a", end @ ..] => println!("ends with: {:?}", end),

        rest => println!("{:?}", rest),
    }
}

Если вы заинтересовались и хотите узнать больше, мы опубликовали статью в блоге Inside Rust с обсуждением этих изменений и разные улучшений сопоставления с образцом, которые мы могли бы включить в стабильную версию языка в будущем! Вы также можете прочитать больше об образцах по срезам в статье Томаса Хартманна.


matches!

Этот релиз стабилизирует новый макрос, matches!, который принимает выражение и образец, и возвращает true, если образец сопоставим с выражением. Другими словами:

// Используя выражение match:
match self.partial_cmp(other) {
    Some(Less) => true,
    _ => false,
}

// Используя макрос `matches!`:
matches!(self.partial_cmp(other), Some(Less))

Вы можете также использовать образцы с | и условные ограничения if:

let foo = 'f';
assert!(matches!(foo, 'A'..='Z' | 'a'..='z'));

let bar = Some(4);
assert!(matches!(bar, Some(x) if x > 2));

use proc_macro::TokenStream; теперь работает

В Rust 2018 мы избавились от необходимости в extern crate. Однако процедурные макросы оказались в какой-то степени особенными и, таким образом, когда вы создавали процедурный макрос, вам по-прежнему приходилось писать extern crate proc_macro;.

В данном релизе, если вы используете Cargo, и если вы работаете с изданием 2018, вам больше не нужна эта строка; вы можете использовать use подобно импорту из любого другого крейта. Поскольку большинство проектов уже используют импорты, подобные use proc_macro::TokenStream;, это изменение означает, что вы можете просто удалить строку extern crate proc_macro; и ваш код останется рабочим. Изменение хоть и маленькое, но делает использование процедурных макросов более органичным по отношению к обычному коду.


Библиотеки


Стабилизированные API


Другие изменения

Есть также другие изменения в релизе Rust 1.42.0: их полное описание смотрите в Rust и Cargo.


Замечания о совместимости

В этом релизе есть два наиболее значимых момента по совместимости: устаревший функционал в стандартной библиотеке и понижение 32-битной платформы Apple до уровня 3.


Error::Description устарел

Ошибки иногда совершаются. Error::description теперь рассматривается как одна из таких ошибок. Проблема возникла с данной сигнатурой метода:

fn description(&self) -> &str

Поскольку метод description возвращает &str, теперь он совсем не так полезен, как мы ожидали этого раньше. То есть вам придётся возвратить содержимое значения Error буквально; если вы хотели, скажем, использовать форматирование для более удобного и дружественного к пользователю описания ошибки, это оказывалось невозможно: вам нужно было вернуть String. Вместо этого, современная практика программирования на языке Rust предполагает, что типы ошибок должны реализовывать типажи Display/Debug, чтобы предоставить возможность получения описания ошибки.

Этот API существовал начиная с Rust 1.0. Мы работали в этом направлении достаточно продолжительное время: ещё в Rust 1.27, мы объявили этот метод "немного устаревшим". Что это означало на практике это то, что мы сделали для этой функции реализацию по умолчанию. Это в свою очередь означает, что пользователи больше не вынуждены реализовывать типаж Error. В данном релизе мы на самом деле объявили его устаревшим, и предприняли некоторые шаги, чтобы ослабить значимость этого метода в документации типажа Error. Однако мы вынуждены следовать нашему соглашению о стабилизации, то есть метод description никогда не будет удалён, и объявить устаревшим — это наибольшее, что мы можем сделать в данных условиях.


Понижения приоритета для 32-битной платформы Apple

Apple больше не поддерживает 32-битные системы, так что и мы тоже не хотим. Эта платформа была понижена до поддержки Уровня 3. Детальнее об этом читайте эту статью вышедшую ещё в Январе, там изложены все подробности.


Участники 1.42.0

Множество людей собрались вместе, чтобы создать Rust 1.42.0. Мы не смогли бы сделать это без всех вас, спасибо!


От переводчиков

С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов.

Данную статью совместными усилиями перевели andreevlex, funkill, Hirrolot и nlinker.

Let's block ads! (Why?)

История синтезаторов речи: компьютерная эра

Ранее мы рассказали о том, как появились речевые синтезаторы — поговорили о первых механических и электрических установках. Продолжаем обсуждение тем, что было в эпоху мейнфреймов.


Фото Kate Ter Haar / CC BY

Гибридные компьютерные системы


Считается, что первая компьютерная система для синтеза речи появилась в Японии. Её разработала команда специалистов из Электротехнической лаборатории (ETL), которую Министерство связи основало еще в XIX веке. В 1956 году её сотрудники представили транзисторный компьютер ETL Mark III — одну из первых вычислительных систем со встроенной памятью. Найти более подходящее место для разработки синтезатора речи на территории страны было сложно.

Свою работу в 1963 году инженеры начали с построения полимерной модели человеческого голосового тракта. На протяжении двух лет специалисты изучали происходящие в нем физические процессы — особое внимание они уделили роли носа в окраске речи. Собрав необходимые данные, они обратились к коллегам из Hitachi, которые помогли спроектировать аналоговый компьютер на основе лестничной логики. Он включал 71 операционный усилитель и 22 множителя, представлявшие собой резисторные сети с фотопроводниками и неоновыми лампами. Система подключалась к IBM 7090 с управляющим программным обеспечением на Fortran.

Первое время синтезатор умел говорить только на японском. Но в 1967 году его адаптировали для работы с английским языком. Словарь машины включал полторы тысячи слов — этого было достаточно, чтобы читать детские сказки. Однако устройство все равно оставалось частично аналоговым — но ситуация изменилась довольно быстро.

Цифровые синтезаторы


Глава акустического отделения лаборатории ETL Эиичи Мацуи (Eiichi Matsui) в конце 60-х взял наработки своих коллег и спроектировал полностью цифровой синтезатор речи для компьютера IBM S/360. Для моделирования характеристик голосового тракта он использовал преобразование Фурье. Каждая секунда синтезированной речи требовала 20 секунд ее предварительной обработки. Но несмотря на этот недостаток, проект привлек внимание международного научного сообщества.

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

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

Одну из них запустили в Лаборатории искусственных языков открытой при Мичиганском государственном университете США. Устройство получило название Votrax и стало одним из первых полнофункциональных «голосовых протезов» в мире. В декабре 1974 года Дональд Шерман (Donald Sherman), у которого диагностировали синдром Мёбиуса (паралич мышц лица), использовал его для заказа пиццы по телефону.

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



В 1976 году американский изобретатель Рэймонд Курцвейл (Raymond Kurzweil) представил миру свою «читающую машину». Коробка размером с напольный офисный принтер сканировала документы, распознавала их, и читала вслух. В том же году вышел «говорящий» калькулятор — LPC Speech+. Он был построен на базе первой коммерческой микросхемы со встроенным голосовым синтезатором.

Еще два года спустя Texas Instruments выпустили Speak & Spell — детскую образовательную игрушку со встроенным речевым синтезатором. В память устройства было заложено 200 слов, которые дети часто неправильно произносят. Ребенок вводил слово на клавиатуре, а игрушка воспроизводила его. Продукт стал абсолютным хитом — его даже использовали музыканты в своих проектах. Голос Speak&Spell можно услышать на альбоме «Computer World» группы Kraftwerk.

Speak & Spell, пусть и в обновленном виде, есть на прилавках и сегодня. В каком-то смысле гаджет был первым умным цифровым устройством. Его даже называют «праотцом» персональных компьютеров. Но о том, как системы синтеза речи развивались на ПК, мы расскажем в следующий раз.



Материалы по теме из нашего «Мира Hi-Fi»:

Траутониум: немецкая волна в истории синтезаторов
История аудиотехнологий: синтезаторы и сэмплеры
«Машинный звук»: синтезаторы на базе нейросетей
Как устроен Sporth — ЯП для музыкальных live-сессий
Создатели музыки к компьютерным играм — несколько самых выдающихся имён


Let's block ads! (Why?)

Apple закрывает все свои магазины за пределами Китая

Компания временно прекращает работу всех магазинов в Америке, Европе и Азии (кроме Китая) до 27 марта, сообщил Тим Кук в открытом письме, опубликованном вчера на сайте компании. «Самый эффективный способ минимизировать риск распространения вируса – снизить плотность людей и максимизировать социальную дистанцию», – написал Кук. – «»

Это первое такое решение крупного ритейлера в США. Все остальные большие сети магазинов пока продолжают свою работу.

Купить технику теперь можно будет только в онлайн-магазине Apple и у сторонних ритейлеров, вроде странички компании у Amazon. Поддержка также будет осуществляться онлайн, на Support.apple.com, и в авторизированных сервисах ремонта, которые останутся открытыми.


Распространение COVID-19 влияет на всех нас. В Apple, для нас в первую очередь важны люди. И мы делаем то, что должны, веря, что технологии смогут стать важным инструментом в такие моменты, как этот.


Сотрудники магазинов, отправившиеся в вынужденный отпуск, всё равно будут получать зарплату. Apple также выделила $15 млн на борьбу с пандемией, а на любой доллар, пожертвованный сотрудниками, будет выделять ещё два – чтобы «поддерживать усилия по реагированию на COVID-19 на локальном, национальном и международном уровнях».

Своё письмо Кук закончил в мрачном, обнадеживающем тоне:


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

И всё же я был вдохновлен гуманностью и решительностью, которую я увидел во всех уголках нашего мирового сообщества. Как сказал президент Линкольн во времена больших невзгод: «Мы должны встретить проблему лицом к лицу. Поскольку это новая сложность, мы должны думать по-новому и действовать по-новому».


Let's block ads! (Why?)

[Из песочницы] IT-эмиграция в Новую Зеландию

Это очередная статья про IT-эмиграцию, но про Новую Зеландию пока информации не было.

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


Почему стоит здесь жить

Типичная Новая Зеландия

Это англоговорящая страна, которых не так уж и много. Иммиграционные правила чётко определены и в данный момент попасть сюда очень просто по рабочей визе — страна нуждается, в частности, в IT персонале. Глобально по стране минимум бюрократии — например, чтобы получить свидетельство рождения для ребенка, нужно просто заполнить форму онлайн, заплатить немного денег, и его просто пришлют по почте. Большинство операций — банк, визы, телефон, счета — можно сделать или онлайн или по телефону.

Система здравоохранения, на мой взгляд, тоже логичная. Медицинская страховка условно здоровым людям по большей части не нужна — медицина условно бесплатная. Это значит, что первоначальный приём будет стоить около $65NZ (в зависимости от места жительства), а дальше большинство анализов будет бесплатным. Скорая помощь и неотложка в госпитале бесплатны. Для беременных платить нужно около $50NZ за несколько необязательных УЗИ. Детям вся медицина включая зубного бесплатны.

Зарплаты в IT выше, чем медианные по стране, поэтому если в семье работает среднестатистический айтишник уровня intermediate, то денег должно хватать на аренду, еду, машину и нечастые путешествия по округе. Если в семье работают двое, по сути неважно в каких областях, то жить будет намного веселее.

Всё дело в прогрессивной шкале налогообложения: шкала налога начинается с 10% и доходит до 33% при зарплате от $70k. Налоговых вычетов почти нет. Налоговую декларацию в конце года нужно подавать только если есть дополнительный доход кроме зарплаты/процентов на депозиты в банке, например чтобы задекларировать подработку.

Вид с горы Kaukau на Makara

Климат по сравнению с сибирским просто сказка. Просто посудите: зимой в Веллингтоне по ночам температура может опускаться до 5-7 градусов выше ноля, но днем вполне может быть и 15 градусов в тени, а на солнышке и того больше. Летом в тени днем может быть от 20 до 25 градусов (но если подуют южные ветра, то может резко стать и 15). Снега нет! Можно купить мотоцикл и кататься круглый год. На машине не нужно менять резина на летнюю и зимнюю, вместо омывайки просто вода. В основном на улице можно ходить в футболке или кофте, иногда в легкой куртке, и очень редко в куртке потеплее, хотя всё зависит от личного восприятия — в один момент можно увидеть на улице людей в куртках-дутышах и других людей в шортах и сланцах.

Море

Море, ну точнее океан. В нем можно купаться почти круглый год если есть гидрокостюм толщиной от 4мм. Можно сёрфить, плавать на каяке, рыбачить, собирать съедобных моллюсков или просто плавать.

Веллингтон, вид с горы Kaukau

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

Карьера. В частности, в IT сейчас очень не хватает хороших разработчиков, и правительство заинтересовано в привлечении таких людей — как глобально через визу Talent (Accredited Employer) и локально через LookSee Wellington. В нашу компанию часто требуются как Python так и Javascript разработчики, которых очень трудно найти здесь, потому что рынок труда очень маленький.

Зарплаты довольно высокие, поэтому, например, машину можно купить на одну-две месячных зарплаты. Или топовый iPhone на зарплату. Нужно, правда, учитывать, что цены тоже высокие, но об этом в минусах.

Несмотря на то, что страна находится на острове, вокруг крупных городов в большое количество домов проведена оптика. Интернет предлагается со скоростью 100/20 для Fiber где он есть, или ADSL/VDSL с соответствующими скоростями. Мобильная связь представлена несколькими операторами, один из которых — Vodafone — развёртывает сеть 5G.

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

Страна мультинациональна, коллеги будут из разных стран. Официальные языки — английский, маори и язык жестов.


Какие есть минусы

Землетрясения! Они случаются почти каждый день если считать всю территорию Новой Зеландии. Центр Christchurch был почти разрушен в 2010 и 2011 годах.

Я вижу в сейсмоопасной регионе — Веллингтоне. Большинство из землетрясений настолько слабы, что их невозможно почувствовать. Примерно раз-два в год случаются такие, которые немного потряхивают, если находиться в здании на 7 этаже и выше. В ноябре 2016 было сильное землетрясение, которое повредило несколько зданий в центре Веллингтона. Моё мнение: лучше жить на окраине, где большинство зданий одноэтажные.

Жильё дорогое и обычно не очень хорошего качества. Центрального отопления в подавляющем большинстве домой нет, все отапливают комнаты локально. В living room (обычно то что у нас называют "зал" и кухня") бывает стоит печка, которую топят дровами. В спальнях в лучшем случае есть панельный обогреватель, обычно покупают электропростыни с подогревом.

Если повезет, то будет кондиционер с обогревом, который тут называют heat pump.

Климат подходит не всем. Веллингтон считается одним из самых ветреных городов в мире. Зимой температура в доме такая же как на улице — может быть и 5-7 градусов в спальне.

Цены. Они высокие на всё — аренда, жилье для покупки, еда, коммунальные услуги, связь. Для среднестатистического россиянина может быть ужасно платить $70NZ в месяц за интернет и по $200NZ за электричество, но такова жизнь тут.


Иммиграционный процесс

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

На данный момент есть 2 основных направления:


  1. Рабочая виза Talent (Accredited Employer). Можно найти работу удаленно, и если работодатель из списка аккредитованных, то он спонсирует визу.
  2. Студенческая виза с правом на работу после.

Также при наличии большого опыта работы и подходящего образования можно попробовать оценить свои шансы на Skilled Migrant Category Visa, но набрать необходимое количество баллов без имеющегося предложения работы в НЗ очень трудно, а если оно есть то лучше не ждать а сразу ехать по Talent Visa.


Рабочая виза Talent (Accredited Employer)

Самая лучшая рабочая виза на данный момент. Выдается при наличии job offer (предложения работы) от аккредитованного работодателя с зарплатой от $79,560 в год (до налогов). Это примерно зарплата intermediate разработчика в Wellington/Auckland.

Длительность визы — 30 месяцев, позволяет спонсировать визу для семьи. Партнеру дают тоже рабочую визу, не привязанную к работодателю. Визы дают доступ к условно бесплатной медицине. Через 2 года меняется на Resident Visa (ПМЖ).

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


Студенческая виза

Нужна довольно солидная сумма денег, и правила постоянно ужесточаются. Зато дает возможность спонсировать семью а также работать на пол-ставки (20 часов в неделю).


Перевозка вещей

В зависимости от количества вещей можно заказать контейнер или перевозку вещей самолетом. Примерно 150кг самолетом должно выйти в $2000 NZ. Контейнер — намного дороже.


Жизнь в Новой Зеландии


Поиск жилья и первые месяцы

Поначалу есть смысл снять что-нибудь вроде AirBnB или хостел подешевле. На постоянный срок жильё ищется в основном на Trademe. Машину проще всего купить у дилера, за $7,000 NZ можно купить машину с пробегом до 100000км, а вообще цены на более-менее живые начинаются от $4,000.

Простую мебель можно купить там же на Trademe. Вещи первой необходимости — в дешевом супермаркете.


Визовая стратегия

На рабочей визе жить морально непросто, поэтому можно сразу смотреть на балльную резидентскую визу. Если есть работа в НЗ, диплом от бакалавра, результаты IELTS от 6.5, то баллов должно хватить. Срок ожидания резидентской визы может дойти и до двух лет, поэтому лучше подаваться чем скорее тем лучше. Если у обладателя визы резидента (хотя бы у одного из родителей) рождается ребенок, то он автоматически становится гражданином Новой Зеландии.

После 5 лет обладания резидентской визы можно подаваться на гражданство, и от предыдущего отказываться не просят (если другая страна не налагает своих запретов).


3 года спустя. Стоило ли того?

До Новой Зеландии я 2,5 года жил в Минске, а до этого в Омске.

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

Минск был просто сказкой после Сибири, из-за климата, близости к Европе и айтишным зарплатам, несмотря на вопросы к сфере обслуживания. Но главной причиной было то, что к сожалению, Беларусь не предлагает простых возможностей остаться там жить — приходилось каждый год идти отмечаться в МВД для продления разрешения на временное проживание. А чтобы получить разрешение на постоянное проживание нужно пройти девять кругов ада. И как того так другого могут лишить за несколько административных правонарушений в год.

Новая Зеландия в этом отношении намного лучше — даже рабочую визу дают сразу на более чем 2 года, после которой можно подаваться на резидентство.

После трех лет проживания здесь появились вещи, которые могли бы быть лучше, но в общем и целом я не знаю страны лучше! Мы смогли купить дом после двух лет проживания, а теперь у нас родился ребенок — гражданин Новой Зеландии.

Let's block ads! (Why?)

[Перевод] Covid-19, ваше общество и вы с точки зрения науки о данных

Как датасайентисты, мы обязаны уметь анализировать и интерпретировать данные. И мы были очень обеспокоены результатами анализа данных, касающихся covid-19. Наибольшему риску подвержены самые уязвимые категории – пожилые люди и люди с достатком ниже среднего, но для контроля распространения и влияния заболевания все мы должны изменить свое поведение. Тщательно и регулярно мойте руки, избегайте скоплений людей, отменяйте мероприятия и не касайтесь своего лица. В этом сообщении мы объясним причину нашего беспокойства, и расскажем, почему вам также следует беспокоиться. Краткое изложение ключевой информации можно найти в публикации Итана Алли (Ethan Alley) Corona in Brief (автор — президент некоммерческой организации, разрабатывающей технологии для уменьшения риска пандемий).


Содержание:


  1. Нам нужна работоспособная медицинская система
  2. Это не что-то типа гриппа
  3. Подход «Не паникуйте, сохраняйте спокойствие» не помогает
  4. Это касается не только Вас
  5. Мы должны сделать кривую более пологой
  6. Реакция общества имеет значение
  7. Мы в США плохо проинформированы
  8. Заключение

1. Нам нужна работоспособная медицинская система

Всего 2 года назад одна из нас (Рэйчел) заразилась инфекцией, которая поражает мозг и убивает ¼ зараженных, а также приводит к когнитивным нарушениям у каждого третьего заразившегося. Многие переболевшие получают постоянные нарушения слуха и зрения. Рэйчел была в бреду к тому моменту, когда добралась до больницы. Ей повезло получить своевременную медицинскую помощь, диагностику и лечение. Непосредственно перед этим событием она чувствовала себя замечательно, и ее жизнь наверняка была спасена благодаря быстрому доступу к отделению скорой помощи.

Теперь давайте поговорим о covid-19 и о том, что в ближайшие недели и месяцы может случиться с людьми в ситуации, подобной ситуации с Рэйчел. Количество выявленных случаев заражения covid-19 удваивается каждые 3-6 дней. Если принять этот срок равным трем дням, за три недели число зараженных возрастет в 100 раз (на самом деле все не так просто, но не будем отвлекаться на технические детали). Каждый десятый инфицированный нуждается в длительной (много недель) госпитализации, и большинству таких пациентов требуется подача кислорода. Хотя распространение вируса только начинается, в некоторых регионах больницы уже переполнены, и люди лишены возможности получить требуемое лечение (в различных состояниях, а не только в случае заражения covid-19). Например, в Италии, где всего неделю назад власти говорили, что все хорошо, сейчас 16 млн. человек находятся на карантине (upd: спустя 6 часов после публикации была закрыта вся страна). Чтобы помочь справиться с наплывом пациентов, устанавливают палатки вроде этой:

image

Доктор Antonio Pesenti, глава регионального центра по борьбе с кризисом в наиболее сильно пострадавшем районе Италии, говорит: «Нам приходится организовывать отделения интенсивной терапии в коридорах, операционных и комнатах для реабилитации… Одна из наилучших систем здравоохранения в мире, в Ломбардии, находится в шаге от краха».


2. Это не что-то типа гриппа

Смертность при гриппе составляет примерно 0,1%. Марк Липсич (Marc Lipsitch), директор Center for Communicable Disease Dynamics в Гарварде, дает оценку для covid-19 на уровне 1-2%. Новейшее эпидемиологическое моделирование дает уровень смертности 1,6% для Китая в феврале, то есть в 16 раз выше, чем при гриппе1 (это может быть весьма консервативной оценкой, поскольку смертность резко возрастает, когда система здравоохранения перестает справляться). Лучшие на сегодняшний день оценки говорят, что covid-19 в этом году убьет в 10 раз больше людей, чем грипп (а модель Елены Гриваль (Elena Grewal), бывшего датасайенс-директора в Airbnb, в худшем случае дает оценку в 100 раз больше, чем грипп). И все это не принимая по внимание важное влияние системы здравоохранения, о чем было сказано выше. Можно понять, почему некоторые люди убеждают себя, будто не происходит ничего нового и это болезнь типа гриппа. Весьма некомфортно осознавать, что на самом деле они с таким вообще не сталкивались.

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

image

Каждый зараженный гриппом в среднем заражает 1,3 других людей. Этот показатель называется R0. Если R0 меньше 1, инфекция прекращает распространяться, а если больше 1, происходит ее дальнейшее распространение. Для covid-19 за пределами Китая R0 сейчас составляет 2-3. Разница может показаться незначительной, но после 20 «итераций» заражения в случае R0=1,3 количество зараженных составит 146 человек, а для R0=2,5 – 36 млн.! Это упрощенные расчеты, но они служат разумной иллюстрацией относительной разницы между covid-19 и гриппом.

Обратите внимание, что R0 не является фундаментальной характеристикой заболевания. Этот показатель в значительной степени зависит от реакции [на заболевание] и может меняться со временем2. Например, в Китае R0 для covid-19 быстро уменьшается и сейчас достигает 1! Вы спросите, как такое возможно? Путем применения мер, масштаб которых тяжело представить в странах типа США – например, полная изоляция многих гигантских городов и разработка диагностических процедур, позволяющих выполнять проверку миллиона человек в неделю.

В соцсетях (включая популярные аккаунты, такие как аккаунт Илона Маска) часто можно видеть непонимание разницы между логистическим и экспоненциальным ростом. Логистический рост на практике соответствует S-образной форме кривой распространения эпидемии. Разумеется, экспоненциальный рост тоже не может продолжаться бесконечно, поскольку количество зараженных всегда ограничено численностью населения Земли. Вследствие этого уровень заболеваемости должен уменьшаться, приводя в итоге к S-образной кривой (сигмоиде) для зависимости скорости роста от времени. Тем не менее, уменьшение достигается определенными путями, а не магическим образом. Основные способы:


  • массовая и эффективная реакция общества;
  • доля заболевших настолько велика, что остается слишком мало незаболевших для дальнейшего распространения инфекции.

Таким образом, неразумно ссылаться на логистическую кривую роста как на способ «контроля» пандемии.

Другим сложным аспектом для интуитивного понимания влияния covid-19 на местное общество является очень значительная задержка между заражением и госпитализацией – обычно около 11 дней. Может показаться, что это не очень долго, но такой срок означает, что к моменту заполнения всех койко-мест в больницах число зараженных будет в 5-10 раз превышать количество госпитализированных.

Заметим, что есть некоторые ранние признаки влияния климата на распространение инфекции. В публикации Temperature and latitude analysis to predict potential spread and seasonality for COVID-19 говорят о том, что пока что болезнь распространяется в умеренном климате (к несчастью для нас, температура в Сан-Франциско, где мы живем, как раз находится в нужном диапазоне; сюда же попадают густонаселенные регионы Европы, включая Лондон).


3. Подход «Не паникуйте, сохраняйте спокойствие» не помогает

В соцсетях людям, указывающим на причины для беспокойства, часто советуют «не паниковать» или «сохранять спокойствие». Это, как минимум, бесполезно. Никто не утверждает, что паника является приемлемой реакцией. Но есть причины, по которым «сохранение спокойствия» является распространенной реакцией в определенных кругах (но не среди эпидемиологов, чьей работой является отслеживание таких вещей). Возможно, «сохранение спокойствия» помогает людям комфортнее воспринимать собственное бездействие, или же позволяет чувствовать свое превосходство над теми, кто, по их мнение, бегают вокруг как курица без головы.

Но «сохранение спокойствия» легко может помешать подготовиться и адекватно среагировать. В Китае были изолированы десятки миллионов граждан и построены две больницы к тому моменту, как статистика заболевания достигла уровня, наблюдаемого сейчас в США. Италия ждала слишком долго, и лишь сегодня (8 марта) было сообщено о 1492 новых случаях и 133 новых смертях, несмотря на пребывание 16 млн. человек на карантине. Основываясь на наиболее достоверной доступной нам информации, всего 2-3 недели назад по статистике заболеваемости Италия была на том же уровне, что США и Великобритания сейчас.

Обратите внимание, что на данном этапе у нас мало знаний о covid-19. На самом деле мы не знаем, какая у него скорость распространения или летальность, как долго он сохраняется на поверхностях, может ли он выживать и распространяться в теплых условиях. Все, что у нас есть, это предположения, основанные на собранной воедино наиболее достоверной информации. И помните, что основная часть информации приходит из Китая на китайском языке. Сейчас наилучшим источником для понимания китайского опыта является отчет Report of the WHO-China Joint Mission on Coronavirus Disease 2019, основанный на совместном работе 25 экспертов из Китая, Германии, Японии, Кореи, Нигерии, России, Сингапура, США и ВОЗ.

В условиях такой неуверенности насчет того, что глобальной пандемии не будет и все, возможно, обойдется без краха системы здравоохранения, бездействие не кажется правильной реакцией. Это было бы чрезвычайно рискованным и неоптимальным при любом смоделированном сценарии. Также выглядит маловероятным, что такие страны, как Италия и Китай, фактически остановили значительные сегменты своей экономики без веской причины. И еще бездействие не согласуется с фактическим влиянием, которое мы наблюдаем в зараженных регионах, где медицинская система не в состоянии справиться с ситуацией (например, в Италии используют 462 палатки для предварительной сортировки пациентов, и там по-прежнему требуется вывоз находящихся в реанимации пациентов из зараженных областей.

Вместо этого обдуманная и разумная реакция состоит в выполнении шагов, которые рекомендуются экспертами для предотвращения распространения инфекции:


  • Избегайте больших мероприятий и толп людей
  • Отменяйте мероприятия
  • По возможности работайте из дома
  • Мойте руки по приходу домой, а также когда выходите на улицу и проводите время вне дома
  • Старайтесь не прикасаться к лицу, особенно когда вы вне дома (это непросто!)
  • Дезинфицируйте поверхности и упаковки (возможно, вирус сохраняет активность на поверхностях до 9 дней, хотя это точно неизвестно).

4. Это касается не только Вас

Если вы моложе 50 лет и у вас нет таких факторов риска, как ослабленная иммунная система, сердечно-сосудистые заболевания, история курения в прошлом или хронические заболевания, вы можете с достаточной степенью быть уверенным, что COVID19 вряд ли вас убьет. Но Ваша реакция на происходящее по-прежнему крайне важна. У вас все еще есть такой же шанс заразиться, как у всех, и в случае заражения, так же много шансов заразить других. В среднем каждый инфицированный заражает более двух человек, и они становятся заразными до того, как проявляются симптомы. Если у вас есть родители, о которых вы волнуетесь, или бабушка с дедушкой, и вы планируете провести с ними время, а после обнаружите, что несете ответственность за их заражение вирусом COVID19, это будет тяжким бременем.

Даже если вы не контактируете с людьми старше 50 лет, скорее всего, у вас больше коллег и знакомых с хроническими заболеваниями, чем вы думаете. Исследования показывают, что немногие люди раскрывают свое состояние здоровья на работе, если могут этого избежать, опасаясь дискриминации. Мы оба [Рэйчел и я] в категориии высокого риска, но многие люди, с которыми мы регулярно общаемся, возможно, не знали об этом.

И, конечно же, речь идет не только о людях в Вашем непосредственном окружении. Это очень важный этический вопрос. Каждый человек, который делает все возможное для борьбы с распространением вируса, помогает всему сообществу в целом снизить уровень заражения. Как писала Зейнеп Туфекчи (Zeynep Tufekci) в журнале Scientific Amercian: «Подготовка к почти неизбежному глобальному распространению этого вируса… является одной из самых просоциальных, альтруистических вещей, которые вы можете сделать». Она продолжает:

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

Это коснулось лично нас. Самый обширный и самый важный курс, который мы когда-либо создавали на fast.ai, который представляет собой кульминацию нашей многолетней работы, должен был начаться в Университете Сан-Франциско через неделю. В прошлую среду (4 марта) мы приняли решение перенести все это в онлайн. Мы были одними из первых крупных курсов, которые перешли в онлайн режим. Почему мы это сделали? Поскольку в начале прошлой недели мы осознали, что, если мы проведем этот курс, мы будем косвенно поощрять сотни людей собираться в замкнутом пространстве несколько раз в течение нескольких недель. Худшее, что можно сделать, это собирать группы людей в замкнутом пространстве, и нашим моральным долгом было избежать этого. Решение было тяжелым, ведь наша работа с учащимися каждый год была для нас наибольшим удовольствием и наиболее продуктивным периодом. И были студенты, которые собирались прилететь из-за границы, которых мы не хотели подводить3.

Но мы знали, что поступаем правильно, потому что в противном случае поспособствовали бы распространению заболевания в нашем сообществе4.


5. Мы должны сделать кривую более пологой

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

image

Фарзад Мосташари (Farzad Mostashari), бывший национальный координатор Health IT, поясняет: «Новые случаи среди не путешествовавших и не имевших контактов с зараженными выявляются каждый день, и мы знаем, что это лишь вершина айсберга из-за задержек с проверкой. Это означает взрывной рост количества зараженных в следующие две недели… Попытка сдерживания при экспоненциальном распространении в обществе — это все равно, что сосредоточиться на тушении искр, когда горит весь дом. Когда это происходит, нам нужно переключиться на ослабление — принять защитные меры для замедления распространения и снижения пикового воздействия на здравоохранение». Если мы будем поддерживать скорость распространения на достаточно низком уровне, больницы смогут справиться с нагрузкой, и пациенты получат требуемое лечение. Иначе нуждающиеся в госпитализации госпитализированы не будут.

Согласно расчетам Лизы Шпект (Liz Specht):
В США имеется примерно 2,8 больничных коек на 1000 человек. При численности населения 330 млн. это дает примерно 1 млн. коек, 65% из которых постоянно заняты. Таким образом, всего доступно 330 тыс. коек (возможно, немного меньше из-за сезонного гриппа и пр.). Давайте поверим опыту Италии и будем считать, что примерно 10% случаев достаточно серьезны, чтобы потребовалась госпитализация. И помним, что часто госпитализация длится неделями – другими словами, койки с больными COVID19 будут освобождаться очень медленно. По таким оценкам все больничные койки будут заняты к 8 мая. И при этом мы не учитываем приспособленность данных койко-мест к содержанию пациентов с вирусными заболеваниями. Если мы ошибаемся насчет доли тяжелых случаев в 2 раза, это сдвигает время насыщения больниц всего на 6 дней в том или ином направлении. Все это не предполагает роста потребности в местах из-за других причин, что выглядит сомнительным предположением. С ростом нагрузки на систему здравоохранения и появлением дефицита рецептурных препаратов люди с хроническими заболеваниями могут оказаться в ситуации, требующей ухода и госпитализации.


6. Реакция общества имеет значение

Как уже обсуждалось, в этих цифрах нет уверенности – Китай уже продемонстрировал, что экстремальные меры позволяют снизить распространение заболевания. Другим прекрасным примером является Вьетнам, где, среди прочего, общенациональная рекламная кампания (включая навязчивую песню!) быстро мобилизовала население и обеспечила требуемые изменения в поведении.
Эти расчеты не гипотетические – все было проверено во время пандемии гриппа в 1918 г. В США два города совершенно по-разному среагировали: в Филадельфии прошел гигантский парад с участием 200 тыс. человек для сбора денег на войну. Но в Сент-Луисе были минимизированы социальные контакты для уменьшения распространения вируса, а также отменены все массовые мероприятия. Так выглядело количество смертей в каждом из городов по данным Proceedings of the National Academy of Sciences:

image

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

Ричар Бессер (Richard Besser), который был исполнительным директором ЦКЗ (Centers for Disease Control and Prevention) во время пандемии H1N1 в 2009, говорит, что в США «риск заражения и способность защитить себя и свою семью зависят, среди прочих факторов, от дохода, доступа к медицинской помощи и иммиграционного статуса». Он утверждает:

Пожилые люди и люди с ограниченными возможностыми подвергаются особому риску, когда их повседневная жизнь и система поддержки нарушаются. Те, у кого нет легкого доступа к медицинской помощи, в том числе сельские жители и коренное население, могут столкнуться с потребностью преодолевать огромными расстояниями в случае необходимости. Люди, живущие в стесненных условиях — будь то социальное жилье, дома престарелых, тюрьмы, приюты (или даже бездомные на улицах) — могут поражаться волнами, как мы уже видели в штате Вашингтон. И уязвимые сферы экономики с низкой заработной платой, с неоплачиваемыми работниками и нестабильным графиком работы, будут выставлены на всеобщее обозрение во время этого кризиса. Спросите 60 процентов рабочей силы в США, которые получают почасовую оплату, насколько легко отказаться от работы при необходимости.

Бюро трудовой статистики США показывает, что менее трети лиц с самым низким доходом имеют доступ к оплачиваемому отпуску по болезни:

image


7. Мы в США плохо проинформированы

Одна из больших проблем в США – в том, что проводится очень мало тестов на коронавирус, а результаты испытаний не распространяются должным образом, и мы толком не знаем, что на самом деле происходит. Скотт Готлиб (Scott Gottlieb), бывший уполномоченный Управления по контролю за продуктами и лекарствами (FDA), объяснил, что в Сиэтле проводилось более качественное тестирование, и поэтому там мы наблюдаем инфекцию: «Причина, по которой мы рано узнали о вспышке COVID-19 в Сиэтле, заключалась в работе санитарно-эпидемиологического надзора [sentinel surveillance] независимых ученых. Такой надзор никогда не проводился в подобном масштабе в других городах. Таким образом, другие горячие точки США могут быть еще не полностью обнаружены”. По сообщению The Atlantic, вице-президент Майк Пенс (Mike Pence) пообещал, что на этой неделе будет доступно «примерно 1.5 миллиона тестов», но на данный момент в США было протестировано менее 2000 человек. Опираясь на результаты The COVID Tracking Project, Робинсон Мейер (Robinson Meyer) и Алексис Мадригал (Alexis Madrigal) из The Atlantic утверждают:

Собранные нами показания свидетельствуют о том, что реакция США на вирус COVID-19 и вызываемое им заболевание была чрезвычайно инертной, особенно по сравнению с другими развитыми странами. Восемь дней назад Центр по контролю и профилактике заболеваний (CDC) подтвердил, что в США вирус распространяется среди людей, а именно, что он заражал американцев, которые не ездили за границу и не общались с теми, кто ездил. В Южной Корее более 66 650 человек прошли тестирование в течение недели после первого случая заражения, и очень быстро стало возможным тестировать 10 000 человек в день.

Отчасти проблема в том, что это стало политическим вопросом. Президент Дональд Трамп дал понять, что он хочет, чтобы число людей, инфицированных в США, оставалось низким. Это пример того, как оптимизация показателей мешает получению хороших результатов на практике (подробнее об этой проблеме изложено в статье об этике Data Science – The Problem with Metrics is a Fundamental Problem for AI). Глава Google AI Джефф Дин (Jeff Dean) выразил в Твиттере свои опасения по поводу политизированной дезинформации:

Когда я работал во Всемирной Организации Здравоохранения (ВОЗ), я был причастен к Глобальной Программе по СПИДу (ныне UNAIDS), созданной для того, чтобы помочь миру справиться с пандемией ВИЧ / СПИДа. Там работали добросовестные врачи и ученые, сосредоточенные на оказании помощи в преодолении этого кризиса. Во время кризиса важна четкая и достоверная информация, которая поможет принять обоснованное решение о том, как реагировать (на всех уровнях: страны, штата, местных органов власти, компании, НКО, школы, семьи и отдельного человека). Имея доступ к верной информации и советам лучших медицинских и научных экспертов, мы справимся с проблемами, будь то ВИЧ / СПИДом или COVID-19. Но в случае дезинформации, движимой политическими интересами, есть огромный риск серьезно усугубить положение, если не действовать быстро и решительно перед лицом растущей пандемии, а наоборот, активно способствовать более быстрому распространению болезни. Очень больно смотреть, как все это происходит прямо сейчас.

Не похоже, что найдутся политическая силы, заинтересованные в прозрачности ситуации вокруг COVID-19. Министр здравоохранения и социальных служб [Health and Human Services Secretary] Алекс Азар (Alex Azar), по словам Wired, «начал обсуждать тесты, которые медицинские работники используют, чтобы определить, заражен ли кто-то из них новым коронавирусом. Но нехватка таких тестов означает нехватку информации о распространении и серьезности эпидемиологического заболевания в США, усугубляемую непрозрачностью со стороны правительства. Азар упоминал, что новые тесты сейчас проходят контроль качества». Но далее, согласно Wired:

Затем Трамп прервал Азара. «Я считаю, главное, что любой человек, нуждающийся в тестировании, проходит его. Тесты есть, и они хороши. Любого нуждающегося в проверке проверяют», — сказал Трамп. Это неправда. В четверг вице-президент Пенс (Pence) заявил журналистам, что в США не хватает тестов на COVID-19 для удовлетворения спроса.

Другие страны реагируют гораздо оперативнее, чем США. Многие страны Юго-Восточной Азии хорошо сдерживают распространение вируса. Например, Тайвань, где R0 сейчас снизился до 0.3, или Сингапур, который вообще послужил примером того, как государство должно реагировать на COVID-19. Это речь не только об Азии; во Франции, например, запрещены любые мероприятия с 1000 и более участников, и в настоящее время школы закрыты в трех районах.


8. Заключение

COVID-19 – это важная социальная проблема, и мы все не только можем, но и должны приложить все усилия, чтобы уменьшить распространение болезни. Для этого:


  • Избегайте больших мероприятий и толп людей (social distancing)
  • Отменяйте культурные и прочие массовые мероприятия
  • По возможности работайте из дома
  • Мойте руки по приходу домой, а также когда выходите на улицу и проводите время вне дома
  • Старайтесь не прикасаться к лицу, особенно когда вы вне дома

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

Спасибо Сильвену Гуггеру (Sylvain Gugger) и Алексису Галлахеру (Alexis Gallagher) за обратную связь в виде ценных комментариев.

Примечания:

1 Эпидемиологи — это люди, которые изучают распространение болезней. Оказывается, что оценить такие вещи, как смертность и R0, на самом деле довольно сложно, поэтому есть целая область, которая специализируется на этом. Остерегайтесь людей, которые используют простые соотношения и статистику, чтобы рассказать вам, как ведет себя covid-19. Вместо этого посмотрите на моделирование, выполненное эпидемиологами.

2 Технически это неверно. Строго говоря, R0 относится к уровню распространения инфекции при отсутствии реакции. Но так как на самом деле это не то, что нас волнует, мы позволим себе быть немного неаккуратными в определениях.

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

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

Над переводом работали А.Огурцов, Ю.Кашницкий и Т.Габрусева.

Let's block ads! (Why?)

Умный дом: Строим графики потребления воды и электричества в Home Assistant

Каждый раз получая платежку за электричество и воду я удивляюсь — неужели моя семья стооооолько потребляет? Ну да, в ванной установлен теплый пол и бойлер, но ведь они же не кочегарят постоянно. Воду тоже вроде экономим (хотя поплескаться в ванной тоже любим). Несколько лет назад я уже подключил счетчики воды и электричества к умному дому, но на этом дело так и застряло. До анализа потребления руки дошли только сейчас, о чем, собственно, вот эта статья.

Недавно я перешел на Home Assistant в качестве системы умного дома. Одной из причин была как раз возможность организовать сбор большого количества данных с возможностью удобного построения различного рода графиков.

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

Постановка задачи

Итак, цель сегодняшнего упражнения в том, чтобы получить красивые графики потребления воды и электричества:

  • Почасовой за 2 дня
  • Посуточный за 2 недели
  • (опционально) понедельный и помесячный

В этом нас подстерегают некоторые сложности:

  • Стандартные компоненты графиков, как правило, весьма убоги. В лучшем случае можно построить линейный график по точкам.

    Если хорошо поискать, то можно найти сторонние компоненты, которые расширяют возможности стандартного графика. Для home assistant, в принципе, неплох и красив компонент mini-graph-card, но и он несколько ограничен:

    • Сложно задавать параметры столбикового графика на больших промежутках (ширина столбика задается в долях часа, а значит промежутки длиннее часа будут задаваться дробными числами)
    • Нельзя на один график добавлять различные сущности (например температуру и влажность, или столбиковый график совместить с линией)
  • Мало того, что home assistant по умолчанию использует самую примитивную базу данных SQLite (а я, рукожоп, не осилил установку MySQL или Postgres), так и данные хранятся не самым оптимальным образом. Так, например, при каждом изменении каждого даже самого мелкого цифрового параметра параметра в базу записывается огромный json размером около килобайта
    {"entity_id": "sensor.water_cold_hourly", "old_state": {"entity_id": "sensor.water_cold_hourly", "state": "3", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:05:06.897604+00:00", "last_updated": "2020-02-23T19:05:06.897604+00:00", "context": {"id": "aafc8ca305ba4e49ad4c97f0eddd8893", "parent_id": null, "user_id": null}}, "new_state": {"entity_id": "sensor.water_cold_hourly", "state": "4", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:11:11.251545+00:00", "last_updated": "2020-02-23T19:11:11.251545+00:00", "context": {"id": "0de64b8af6f14bb9a419dcf3b200ef56", "parent_id": null, "user_id": null}}}

    Датчиков у меня довольно много (температурные датчики в каждой комнате, счетчики воды и электричества), а некоторые к тому же генерируют достаточно много данных. Так например только счетчик электричества SDM220 генерирует около десятка значений каждые 10-15 секунд, а таких счетчиков я бы хотел установить штук 8. А еще есть целая пачка параметров, которые вычисляются на основе других датчиков. Т.о. все эти значения легко могут раздувать базу на 100-200 Мб ежедневно. Через неделю система будет еле ворочаться, а через месяц сдохнет флешка (в случае типичной установки home assistant на raspberry PI), а уж о хранении данных целый год и речи быть не может.
  • Если вам повезло, ваш счетчик сам умеет считать потребление. Вы в любой момент можете обратиться к счетчику и спросить который час накопленное значение потребления. Как правило все счетчики электричества у которых есть цифровой интерфейс (RS232/RS485/Modbus/Zigbee) предоставляют такую возможность.

    Хуже если устройство может просто измерять некий мгновенный параметр (например мгновенную мощность или ток), или просто генерировать импульсы каждые X ватт-часов или литров. Тогда нужно думать как и чем это интегрировать и где накапливать значение. Есть риск пропустить очередной отчет по какой либо причине, да и точность системы в целом вызывает вопросы. Можно, конечно, это все поручить системе умного дома вроде home assistant, но пункт про количество записей в базе никто не отменял, да и опрос датчиков чаще чем раз в секунду устроить не получится (ограничение архитектуры home assistant).

Подход 1


Сначала посмотрим что предоставляется home assistant из коробки. Измерение потребления за период — весьма востребованная функциональность. Разумеется, ее давным давно реализовали в виде специализированного компонента — utility_meter.

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

utility_meter:
  water_cold_hour_um:
    source: sensor.water_meter_cold
    cycle: hourly
  water_cold_day_um:
    source: sensor.water_meter_cold
    cycle: daily

Тут sensor.water_meter_cold это текущее значение счетчика в литрах, которые я получаю непосредственно от железяки по mqtt. Конструкция создает 2 новых сенсора water_cold_hour_um и water_cold_day_um, которые накапливают часовые и дневные показания, обнуляя их по истечении периода. Вот график часового аккумулятора за полдня

image

Код часового и дневного графиков для lovelace-UI выглядит так:

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

Собственно, в этом алгоритме и кроется проблема такого подхода. Как я уже упоминал, на каждое входящее значение (текущее показание счетчика на каждый следующий литр) генерируется по 1кб записи в базе. Каждый utility meter также генерирует по новому значению, которое также складывается в базу. Если я хочу собирать часовые/дневные/недельные/месячные показания, да по нескольким стоякам воды, да еще пачку электросчетчиков добавить — это будет очень много данных. Ну точнее данных то не много, но поскольку home assistant в базу пишет кучу лишней информации размер базы будет расти как на дрожжах. Боюсь даже прикидывать размер базы для понедельных и помесячных графиков.

Помимо этого utility meter сам по себе не решает поставленную задачу. График значений, которые выдает utility meter это монотонно возрастающая функция, которая сбрасывается в 0 каждый час. Нам же нужен понятный для пользователя график потребления, сколько же литров было съедено за период. Стандартный компонент history-graph такого не умеет, но нам может помочь внешний компонент mini-graph-card.

Это код карточки для lovelace-UI

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_hour_um
        group_by: hour
        hours_to_show: 48
        name: "Hourly water consumption aggregated by utility meter"
        points_per_hour: 1
        show:
          graph: bar
        type: 'custom:mini-graph-card'

Помимо стандартных настроек вроде имени сенсора, типа графика, цвета (стандартный оранжевый мне не понравился) тут важно отметить 3 настройки:
  • group_by:hour — график будет генерироваться с выравниванием столбиков по началу часа
  • points_per_hour: 1 — один столбик на каждый час
  • И самое важное, aggregate_func: max — брать максимальное значение в пределах каждого часа. Именно этот параметр и превращает пилообразный график в столбики

На ряд столбиков слева не обращайте внимания — это стандартное поведение компонента если нет данных. А данных и не было — я только пару часов назад включил сбор данных по utility meter только ради этой статьи (свой текущий подход я расскажу чуть ниже).

На этой картинке я хотел показать, что иногда отображение данных даже работает, и столбики действительно отражают правильные значения. Только вот далеко не все. Выделенный столбик за промежуток с 11 до 12 утра почему то отображает 19 литров, хотя на зубастом графике чуть выше за этот же самый период с того же самого сенсора видим потребление 62 литра. Либо баг, либо руки кривые. А вот почему отломались данные справа я пока не понял — потребление там было в норме, что также видно по зубастому графику.

В общем, правдоподобности это этого подхода мне добиться не удалось — график почти всегда показывает какую-то ересь.

Аналогичный код для дневного сенсора.

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_day_um
        group_by: interval
        hours_to_show: 360
        name: "Daily water consumption aggregated by utility meter"
        points_per_hour: 0.0416666666
        show:
          graph: bar
        type: 'custom:mini-graph-card'

Обратите внимание что параметр group_by установлен в значение interval, и рулит всем параметр points_per_hour. И в этом заключается другая проблема этого компонента — points_per_hour хорошо работает на графиках за час или менее, но отвратительно на бОльших промежутках. Так чтобы получить один столбик за один день пришлось вписать значение 1/24=0.04166666. Я уже не говорю про недельные и месячные графики.

Подход 2


Еще только разбираясь с home assistant я наткнулся на вот это видео


Товарищ собирает данные потребления с нескольких видов розеток Xiaomi. Задача у него чуть проще — просто выводить значение потребления за сегодня, вчера и за месяц. Никаких графиков не требуется.

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

От видео мы возьмем идею ручного подсчета потребления за период. У мужика считаются только значения за сегодня и за вчера, но мы пойдем дальше и попробуем нарисовать график. Суть предложенного метода в моем случае заключается в следующем.

Заведем переменную значение_в_начале_часа, в которую запишем текущие показания счетчика
По таймеру в конце часа (или в начале следующего) посчитаем разницу между текущим показанием и запомненным в начале часа. Эта разница и будет потреблением за текущий час — сохраним значение в сенсор, и в будущем будем по этому значению строить график.
Также нужно “обнулить” переменную значение_в_начале_часа записав туда текущее значение счетчика.

Все это можно сделать через ж... средствами самого home assistant.

Кода придется написать несколько больше чем в предыдущем подходе. Для начала заведем эти самые “переменные”. Из коробки у нас нет сущности “переменная”, но можно воспользоваться услугами mqtt брокера. Будем отправлять туда значения с флагом retain=true — это сохранит значение внутри брокера, и его в любой момент можно оттуда выдернуть, даже при перезагрузке home assistant. Я сделал сразу часовые и дневные счетчики.

- platform: mqtt
  state_topic: "test/water/hour"
  name: water_hour
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/hour_begin"
  name: water_hour_begin
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/day"
  name: water_day
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/day_begin"
  name: water_day_begin
  unit_of_measurement: l

Вся магия происходит в автоматизации, которая запускается каждый час и каждую ночь соответственно.
- id: water_new_hour
  alias: water_new_hour
  initial_state: true
  trigger:
    - platform: time_pattern
      minutes: 0
  action:
    - service: mqtt.publish
      data:
        topic: "test/water/hour"
        payload_template: >
          
        retain: true
    - service: mqtt.publish
      data:
        topic: "test/water/hour_begin"
        payload_template: >
          
        retain: true

- id: water_new_day
  alias: water_new_day
  initial_state: true
  trigger:
    - platform: time
      at: "00:00:00"
  action:
    - service: mqtt.publish
      data:
        topic: "test/water/day"
        payload_template: >
          
        retain: true
    - service: mqtt.publish
      data:
        topic: "test/water/day_begin"
        payload_template: >
          
        retain: true

Обе автоматизации выполняют 2 действия:
  • Вычисляют значение за интервал как разницу между начальным и конечным значением
  • Обновляют базовое значение для следующего интервала

Построение графиков в данном случае решается обычным history-graph
      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

Выглядит это так

В принципе это уже то, что нужно. Плюсом данного метода является то, что данные генерируются один раз за интервал. Т.е. всего 24 записи за сутки для часового графика.

К сожалению, общую проблему растущей базы это все равно не решает. Если я захочу график помесячного потребления, то придется хранить данные как минимум за год. А поскольку home assistant предоставляет только одну настройку длительности хранения на всю базу, то это означает что ВСЕ данные в системе придется хранить целый год. Например за год я потребляю 200 кубов воды, а значит это 200000 записей в базу. А если учесть еще и другие сенсоры, то цифра вообще неприличной становится.

Подход 3


К счастью, умные люди уже решили эту проблему написав базу данных InfluxDB. Эта база специальным образом оптимизирована под хранение time-based данных и идеально подходит для хранения значений разных сенсоров. Система также предоставляет SQL-подобный язык запросов, который позволяет выковыривать из базы значения, и потом их агрегировать различными способами. Наконец, разные данные можно хранить разное время. Например, часто меняющиеся показания вроде температуры или влажности можно хранить всего пару недель, тогда как дневные показания потребления воды можно хранить целый год.

Помимо InfluxDB умные люди также изобрели Grafana — систему рисования графиков по данным из InfluxDB. Графана умеет рисовать разные виды графиков, детально их кастомизировать, и, что самое главное, эти графики можно “воткнуть” на lovelace-UI home assistant’а.

Вдохновляться тут и тут. В статьях подробно описан процесс установки и подключения InfluxDB и Grafana к home assistant. Я же сосредоточусь на решении своей конкретной задачи.

Итак, первым делом начнем складывать значение счетчика в influxDB. Кусок конфигурации home assistant (в этом примере я буду развлекаться не только холодной, но и горячей водой):

influxdb:
  host: localhost
  max_retries: 3
  default_measurement: state
  database: homeassistant
  include:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

Отключим сохранение этих же самых данных внутреннюю базу home assistant, чтобы не раздувать ее лишний раз
recorder:
  purge_keep_days: 10
  purge_interval: 1
  exclude:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

Перейдем теперь в консоль InfluxDB и настроим нашу базу. В частности нужно настроить сколько времени будут хранится те или иные данные. Это регулируется т.н. retention policy — это похоже на базы данных внутри основной базы данных, причем каждая внутренняя база имеет свои настройки. По умолчанию все данные складываются в retention policy под названием autogen, эти данные будут хранится неделю. Я бы хотел, чтобы часовые данные хранились месяц, недельные — год, а месячные вообще никогда не удалялись. Создадим соответствующие retention policy
CREATE RETENTION POLICY "month" ON "homeassistant" DURATION 30d REPLICATION 1
CREATE RETENTION POLICY "year" ON "homeassistant" DURATION 52w REPLICATION 1
CREATE RETENTION POLICY "infinite" ON "homeassistant" DURATION INF REPLICATION 1

Теперь, собственно, главный трюк — агрегация данных с помощью continuous query. Это механизм, который автоматически запускает запрос через заданные промежутки времени, агрегирует данные по этому запросу, а результат складывает в новое значение. Разберем на примере (я пишу в столбик для удобочитаемости, но на деле мне пришлось вводить эту команду одной строкой)
CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant 
BEGIN 
  SELECT max(value) AS value 
  INTO homeassistant.month.water_meter_hour 
  FROM homeassistant.autogen.l 
  GROUP BY time(1h), entity_id fill(previous) 
END

Эта команда
  • Создает continuous query по имени cq_water_cold_hourly в базе homeassistant
  • Запрос будет выполняться каждый час (time(1h))
  • Запрос будет выгребать все данные из measurement’а homeassistant.autogen.l (литры), включая показания холодной и горячей воды
  • Агрегированные данные будут группироваться по entity_id, что создаст нам отдельные значения по холодной и горячей воде
  • Поскольку счетчик литров это монотонно возрастающая последовательность в рамках каждого часа нужно будет брать максимальное значение, поэтому агрегация будет проводится функцией max(value)
  • Новое значение будет записано в homeassistant.month.water_meter_hour, где month это имя retention policy со сроком хранения в месяц. Причем данные по холодной и горячей воде будут разбросаны в отдельные записи с соответствующим entity_id и значением в поле value

Ночью или когда никого нет дома потребления воды нет, а соответственно новых записей в homeassistant.autogen.l тоже нет. Чтобы не было пропусков значений в обычных запросах можно использовать fill(previous). Это заставит InfluxDB использовать значение прошлого часа.

К сожалению, у continuous query есть особенность: трюк fill(previous) не работает и записи просто не создаются. Причем это какая-то непреодолимая проблема, которая обсуждается уже не первый год. С этой проблемой мы разберемся позже, а fill(previous) в continuous query пусть будет — оно не мешает.

Проверим что получилось (разумеется, нужно выждать пару часиков):

> select * from homeassistant.month.water_meter_hour group by entity_id
...
name: water_meter_hour
tags: entity_id=water_meter_cold
time                 value
----                 -----
...
2020-03-08T01:00:00Z 370511
2020-03-08T02:00:00Z 370513
2020-03-08T05:00:00Z 370527
2020-03-08T06:00:00Z 370605
2020-03-08T07:00:00Z 370635
2020-03-08T08:00:00Z 370699
2020-03-08T09:00:00Z 370761
2020-03-08T10:00:00Z 370767
2020-03-08T11:00:00Z 370810
2020-03-08T12:00:00Z 370818
2020-03-08T13:00:00Z 370827
2020-03-08T14:00:00Z 370849
2020-03-08T15:00:00Z 370921

Обратите внимание, что значения в базе сохраняются в UTC, поэтому в этом списке отличаются на 3 часа — значения за 7 утра в выводе InfluxDB соответствуют значениям за 10 утра на графиках выше. Также обратите внимание, что между 2 и 5 утра записей просто нету — это та самая особенность continuous query.

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

SELECT difference(max(value)) 
FROM homeassistant.month.water_meter_hour 
WHERE entity_id='water_meter_cold' and time >= now() -24h 
GROUP BY time(1h), entity_id 
fill(previous)

Расшифрую:
  • Из базы homeassistant.month.water_meter_hour вытянем данные для entity_id='water_meter_cold' за последние сутки (time >= now() -24h).
  • Как я уже упоминал в последовательности homeassistant.month.water_meter_hour могут отсутствовать некоторые записи. Эти данные мы сгенерируем заново, запустив запрос с GROUP BY time(1h). На этот раз fill(previous) сработает как нужно, сгенерировав недостающие данные (функция возьмет предыдущее значение)
  • Самое главное в этом запросе это функция difference, которая и посчитает разницу между часовыми отметками. Сама по себе она не работает и требует агрегирующую функцию. Пускай это будет max() использованный прежде.

Результат выполнения выглядит так
name: water_meter_hour
tags: entity_id=water_meter_cold
time                 difference
----                 ----------
...
2020-03-08T02:00:00Z 2
2020-03-08T03:00:00Z 0
2020-03-08T04:00:00Z 0
2020-03-08T05:00:00Z 14
2020-03-08T06:00:00Z 78
2020-03-08T07:00:00Z 30
2020-03-08T08:00:00Z 64
2020-03-08T09:00:00Z 62
2020-03-08T10:00:00Z 6
2020-03-08T11:00:00Z 43
2020-03-08T12:00:00Z 8
2020-03-08T13:00:00Z 9
2020-03-08T14:00:00Z 22
2020-03-08T15:00:00Z 72

С 2 до 5 утра (UTC) потребления не было. Тем не менее запрос вернет одно и тоже значение потребления благодаря fill(previous), а функция difference это значение вычтет само из себя и на выходе получим 0, что собственно и требуется.

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

Я буду отображать данные по холодной и горячей воде на одном графике. Запрос точно такой же как я описал выше.

Параметры отображения задаются так. У меня это будет график линиями (lines), который идет ступеньками (stairs). Параметр Stack я объясню чуть ниже. Там ниже еще пара параметров отображения, но они не так интересны.

Чтобы добавить полученный график в home assistant нужно:

  • выйти из режима редактирования графика. Почему-то правильные настройки шаринга графиков предлагаются только со страницы дашборда
  • Нажать на треугольник возле имени графика, в меню выбрать share
  • В открывшемся окне перейти на вкладку embed
  • Убрать галочку current time range — временной диапазон мы будем задавать через URL
  • Выбрать необходимую тему. В моем случае это light
  • Скопировать получившийся URL в карточку настроек lovelace-UI
      - type: iframe
        id: graf_water_hourly
        url: "http://192.168.10.200:3000/d-solo/rZARemQWk/water?orgId=1&panelId=2&from=now-2d&to=now&theme=light"

Обратите внимание что временной диапазон (последние 2 дня) задается именно тут, а не в настройках дашборда.

Выглядит график вот так. Горячую воду я не за последние 2 дня не использовал, поэтому рисуется только график холодной воды.

Я так для себя и не решил какой график мне больше нравится, линией-ступенькой, или реальными столбиками. Поэтому просто приведу пример дневного графика потребления, только на этот раз столбиками. Запросы строятся аналогично вышеописанным. Параметры отображения такие:

Выглядит этот график так:

Так вот про параметр Stack. В этом графике столбик холодной воды рисуется поверх столбика горячей. Общая высота соответствует суммарному потреблению по холодной и горячей воде за период.

Все показанные графики — динамические. Можно навести мышкой на интересующую точку и посмотреть детали и значение в конкретной точке.

К сожалению без пары ложек дегтя не обошлось. На столбиковом графике (в отличии от графика линиями-ступеньками) середина столбика находится не в середине суток, а в 00:00. Т.е. левая половина столбика нарисована на месте предыдущего дня. Так вот графики за субботу и воскресенье нарисованы чуть левее чем синеватая зона. Пока я не придумал как это победить.

Другая проблема заключается в невозможности правильно работать с интервалами в месяц. Дело в том, что длина часа/дня/недели фиксирована, а вот длина месяца каждый раз разная. InfluxDB умеет работать только с одинаковыми интервалами. Пока моих мозгов хватило чтобы задать фиксированный интервал в 30 дней. Да, график в течении года немного поплывет и столбики не совсем точно будут соответствовать месяцам. Но поскольку мне это штука интересна просто в качестве показометра, то я с этим ок.

Решений вижу как минимум два:

  • Забить на помесячные графики и ограничиться недельными. 52 недельных столбика за год вполне неплохо смотрятся
  • Само помесячное потребление считать способом №2, а графану только для красивых графиков использовать. Вполне себе точное решение получится. Можно даже наложить графики за прошлый год для сравнения — графана и такое умеет.

Заключение


Не знаю почему, но я тащусь от такого рода графиков. Они показывают что жизнь кипит и все меняется. Вчера было много, сегодня мало, завтра будет как нибудь еще. Осталось поработать с домочадцами на тему потребления. Но даже при текущих аппетитах просто большая и непонятная цифра в платежке уже превращается в достаточно понятную картину потребления.

Несмотря на почти 20-летнюю карьеру программиста, с базами данных я практически не пересекался. Поэтому установка внешней базы данных казалось чем-то таким заумным и непонятным. Все изменила вышеупомянутая статья — оказалось что прикручивание подходящего инструмента делается в пару кликов, а со специализированным инструментом задача построения графиков становится немного проще.

В заголовке я упомянул потребление электричества. К сожалению в данный момент я не могу привести ни одного графика. Один счетчик SDM120 у меня сдох, а другой глючит при обращении по Modbus. Впрочем, на тему данной статьи это никак не влияет — графики будут строится тем же самым способом, как и для воды.

В этой статье я привел те подходы, которые испробовал сам. Наверняка есть еще какие-то способы организации сбора и визуализации данных, о которых я не знаю. Расскажите мне об этом в комментариях, мне будет очень интересно. Буду рад конструктивной критике и новым идеям. Надеюсь изложенный материал также кому-то поможет.

Let's block ads! (Why?)

Жизнь и работа в условиях национального карантина

Вступление
Не думаю, что сегодня большой новостью будет то, что в Италии карантин, который распространяется на всю территорию страны. Данный пост пишется из Эмилии Романьи, точнее её второй части, и в нем будет только моё субъективное видение того, что творится в стране и регионе и только мой субъективный опыт организации жизни и работы в условиях пандемии. С удовольствием приму советы от того, кто находится в аналогичной ситуации.

Внешний мир.
На момент написания у нас всего 14955 болеющих, 1266 умерших и 1439 тех, кто уже выздоровел.(Прошла неделя после знаменитого "бегства из Милана" и лично я жду уже в эти дни резкого увеличения на тысяч пять в сутки) Всем нам рекомендуется как можно меньше выходить во внешний мир, чтобы ограничить распространение вируса, если уж никак без выхода «в свет», то ты должен иметь с собой декларацию в которой указываешь имя, фамилию, место жительства, телефон, причину выхода из дома. Выходить разрешается только по уважительным причинам, как то работа, всякие покупки в том числе и лекарств, визиты к врачам. Полицейские проводят выборочный контроль; говорят, что это работает и кого-то там штрафуют. Подтвердить или опровергнуть это не могу, но, если говоришь, что едешь куда-то по работе, будь у верен, что проверят и если соврал, то готовься заплатить штраф в районе 200 евро.
Учебные заведения закрыты. Насколько я понимаю, часть школьников просто получают задания на день по WhatsApp и дальше как-то там организовывается процесс обучения, часть школ и лицеев с университетами используют G suite for education. Детей на улице практически нет, иногда, ближе к вечеру, можно наблюдать небольшие группки подростков лет по 15-16.
Магазины работают, и не только продовольственные. Работают ещё хозяйственные, со всякой бытовой химией и прочими необходимыми в хозяйстве вещами. Работают табачные магазинчики и газетные ларьки. Людей на улице в разы меньше чем обычно, машин тоже. Жизнь затихла. По крайней мере у меня за окном.
Редкие прохожие, в процентах этак сорока, в масках и основном это люди от 60-ти и выше. Маски у всех разные от ffp2 до обычных трёхслойных хирургических. Судя по наблюдениям, люди так и не поняли зачем и как носятся маски, потому чаще всего за ношением маски скрывается наивное желание почувствовать себя в безопасности. Про то, что как правило одной маски, даже ffp3, не достаточно что бы избежать заражения, повторятся не буду, на хабре уже достаточно статей на эту тему. Гель с антисептиком и спреи на спиртовой основе становятся тем, что никак нельзя забывать, когда куда-то выходишь. А дальше… дальше просто обходишь людей стороной, без надобности ничего не касаешься и держишь руки подальше от лица. Последнее, это самое сложное и требует неимоверного самоконтроля.
Внешний мир стал опасным, социальные связи переходят в онлайн. Такова реальность.


Работа.
Многие предприятия работают. Италия это страна мелкого и среднего бизнеса, разбавленного международными гигантами. Трудно сказать, кому сейчас тяжелее всего. У всех свои трудности с организацией работы. У мелких и предпринимателей свои трудности, у больших свои. Некоторая часть перешла на удалёнку и, опять же очень субъективно и то, что вижу, средний бизнес оказался более подготовлен, и в организационном плане и в инфраструктурном. Перевести 100 человек на удалённую работу всегда легче, чем 1000, особенно если это касается обычного предприятия, далёкого от IT. По последним предписаниям правительства, очень многие предприятия отправляют работников в отпуска. Для них это самый простой способ решить проблему заполненности офисов. Так им не надо думать о всяких VPN и RDP, менять что-то в своей инфраструктуре или покупать дополнительные решения. Такое решение очень логично: в условиях, когда уже завтра ожидается финансовый кризис и дефицит средств, вкладывать средства в инфраструктурные решения и софт может показаться не самым лучшей инвестицией. Все надеются, что карантин будет не долгим, а кризис не затянется на долго. Ошибаются? Вполне возможно. Но, это частный бизнес и тут каждый решает за себя, что и как ему лучше делать и каждый сам платит за свои ошибки. Некоторые предприятия ввели требования для посетителей быть в маске, которые раздают на входе. Очень удобно: пришел, руки гелем помыл, маску надел, пошёл дальше. В офисе ведь реально трудно держать постоянно дистанцию больше метра. Все курьеры в масках и перчатках практически с первых дней.
Что конкретно у меня.
Ещё неделю назад 50-60% времени я проводил в офисах предприятий с которыми работаю, и остальное времени в моей студии. Сегодня 100% только студия и 100% удалённая работа. Инструменты для работы у мня обычные, всем знакомые. Это RDP, RDG, VPN, SSH для доступов, Jira, Git, PyCharm, Microsoft Dynamics Nav, VSCode для всего остального. Из основного это все, перечислять мелкие сервисы и софт, используемые для специфических задач это будет слишком долго и нудно. Ну и мессенджеры, куда без них. У меня используется Telegram, Discord, Zoom. Вполне закрывают все потребности, учитывая что есть Jira с Confluence. Да, есть ещё вездесущий WhatsApp, куда без него. Три ноутбука, стационарный компьютер с двумя экранами 26` и пара Raspberry закрывают все потребности в технике, что касается студии. День начинается с переписки или короткой видеоконференции, потом работа, с созвонами и сообщениями, раз в неделю «большая видеоконференция» с обсуждением таких же глобальных вопросов и задач. Это по одному проекту. По второму все немного проще, там сейчас организовали 150 удалённых рабочих мест, и сейчас главное поддерживать что бы все работало, но это проблемы больше не мои, а сисадминов; сейчас, когда все утрясли, будем организовываться с техслужбой по конретной работе и решениям. Да, сварочные автоматы должны получать обновления firmware, не смотря на коронавирус, ну и много ещё всякого в планах и карантин не должен помешать. По крайней мере, на это надеемся.
Что беспокоит в плане работы. Я не знаю. Я не уверен. Чёрт побери, я реально боюсь даже думать выдержит ли сетевая инфраструктура провайдеров резко возросший на 75% трафик. И он продолжает расти. Школьники и студенты дома, они не только учатся, они ещё и играют онлайн, ещё и Netflix не забываем, плюс опять же учёба онлайн, плюс все те, что ушли работать удалённо со всеми видеозвонками и прочим. Пока, и только пока, вроде все работает без больших падений, кроме нескольких локальных случаев, но как-то надо становится морально готовым к тому, что в один прекрасный момент все упадёт и на долго. Пессимистично? Нет, простое знание реальности и как, что и почему работает.


Дома.
Дома все спокойно. Вошёл в дом с улицы — гель на руки, снял верхнюю одежду — помыть срочно руки. Дальше можешь расслабиться, если, конечно, не включать телевизор и не смотреть соцсети и новости онлайн. На второй неделе всеобщего… как это назвать без мата не знаю, устаёшь от информационной нагрузки. В Твиттере и всех остальных фейсбуках — коронавирус, в новостях коронавирус, на улице коронавирус, на каждом заборе коронавирус… Всё, всякие правила, что и как делать, как защитится, маски, перчатки, мыло с руками и расстояние безопасности в один метр… все это, вполне так годное и реально такое правильное становится для тебя инфомусором от которого мозг уже начинает защищаться и не замечать, игнорировать, избегать. Да, достало. Остаются книги и Netflix с Prime Video Amazon. Начал понимать почему люди смотрят сериалы. Да, расслабляет и отрывает немного от реальности. Убить немного времени и не о чем не думать — сериальчик это то, что нужно.
Дома запас еды и воды недели на полторы, плюс запас всяких консервов на ещё недельку. На больше делать запасы смысла нет. Магазины продуктовые всегда будут работать. Офлайн или онлайн, но они останутся. Некий запас, который просто позволяет не ходить каждый день или раз в два дня за едой вполне достаточен для «комфортного заточения». Чего реально не хватает, так это движения. Ежедневная вечерняя прогулка стала недоступной. Нет, с одной стороны, как бы ничего не запрещает, но с другой стороны понимаешь, что когда тебе говорят не выходить из дома без крайней необходимости, это означает не выходить из дома без крайней необходимости. Всякие там проветривания, махания руками-ногами с отжиманиями и прочая имитация физической активности не помогают. Совместно с информационным прессом отсутствие возможности просто гулять пару километров и отсутствие физической активности не добавляют оптимизма и настроения. Здоровье подсядет, вес наберётся, но это уже будем решать потом.


В заключение.
Я прошу, очень прошу: не надо пытаться считать в комментариях процент смертности и пытаться обсуждать итальянскую медицину. Среднестатистический пациент, который умирает и заносится в статистику это мужчина в возрасте от 81 до 95 лет, с букетом всех возможных патологий включая онкологию. Подхватывает Covid19, двухсторонняя пневмония, смерть или же температура 38.9, ещё нет пневмонии но обостряется все, что может обострится и, как результат, смерть. Всех их относят в одну статистику, потому как был положительный результат на вирус. Даже тех кто умер от инфаркта. Сортировать будут потом, сейчас не до этого.

Отвечу сразу на возможный вопрос:
Хожу без маски, есть одна на всякий случай, надеюсь, что не пригодится. Если мне кто-то чихнёт в лицо, то без очков маска мне не поможет, если я потрогаю все что можно и начну тереть глаза и нос, то маска мне не поможет, если не мыть рук мылом и дезраствором вне дома, то маска мне не поможет. Это реальность. Маска действительно надо там, где ты не можешь: a) держать дистанцию от людей минимум 1 метр; b) ты заражён и тебе надо обезопасить других. Для второй категории предусмотрено уголовное наказание за нарушение карантина. Вы мне можете набросать кучу пруфов о том как я не прав, и, конечно, вы будете правы. Вы будете правы до тех пор, пока не окажетесь в той же ситуации. И, если бы я жил в большом городе с большой плотностью населения, носил бы маску всегда. Но тут у нас немного другая реальность.

Пока все. Я выговорился.
Берегите себя и будьте осторожны.

Let's block ads! (Why?)