...

суббота, 23 марта 2019 г.

[Из песочницы] Микроэлектроника для школьников от самого истока

Несколько лет назад довелось мне попробовать свои силы в заманивании пытливых отроков в разработку микроэлектроники. А дальше было, как в известной пословице: «Коготок увяз — птичке пропасть!» Остановиться уже не смог. Хочу поделиться с общественностью этим опытом, возможно, другие инженеры-электронщики тоже захотят устроить что-то подобное. Грамотнее народ – лучше жизнь.

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

image

А дальше после подобного занятия со школьниками и преподавателями уже в лагере Goto Camp возникла идея дать попробовать детям самим собрать на макетке разнообразные «запчасти» для процессоров и пощупать их вживую. Благо в лагере среди разнообразных программистов было и логово робототехников, у которых можно было разжиться микросхемами, проводами, светодиодами и кнопками. Такой подход в тысячу раз лучше, чем разглядывать схемы и диаграммы на бумаге. Увидеть своими глазами, как нолики и единицы бегают внутри схемы, потыкать в логические вентили пальцем — что может быть надежнее для освоения материала. А то они программируют свои микроконтроллеры, как черные ящики, вообще не представляя, что у тех внутри шуршит. И даже ПЛИСы не решат задачу сделать электронику наглядной. Ну, написал ребенок на Verilog'е логическую функцию, ну, закачал ее через программатор внутрь — результат тот же, вся логика скрыта в недрах микросхемы. Поэтому — только вентили. А еще лучше — транзисторы.

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

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

В лагере был устроен опрос, есть ли желающие посетить уже не лекцию, а семинар с лабораторкой на тему работы внутренностей цифровых чипов. Нашлась дюжина отважных пятнадцатилетних, которым не страшно было попробовать понять материал, который, между прочим, на третьем курсе института обычно рассказывают. Сразу было ясно, что из изложения надо к черту исключить ТТЛ, ЭСЛ и прочие замшелые типы логики, которыми профессура конопатит мозг студням. Только КМОП, только мейнстрим! На свой страх и риск включил туда объяснения принципов работы МОП-транзисторов в цифровых схемах. Но без физики полупроводников и прочих ужасов.

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

Дети так ловко схватывали материал, после объяснений и примеров смело выходили к доске, установленной прямо на лужайке под открытым небом, и рисовали по таблицам истинности вентили на транзисторном уровне — это было прекрасно. Потом вместе на этих вентилях мы «изобрели» сумматор, дешифратор и мультиплексор. А после этого — тадам! — преподаватель и добрый волшебник Алексей вынес макетки с результатами наших с ним телемучений. Это вызвало некоторый ажиотаж среди слушателей — можно потрогать руками то, что только что рисовалось на доске фломастерами, и понажимать кнопки, наблюдая за переключением светодиодов на выходах. Лучшая реплика при этом была: «Ааааа, теперь я понял, куда подевались почти все провода из лаборатории!»

После этого дети задали много вопросов по электронике. На них мне, к счастью, хватило квалификации ответить. Кроме одного: «А где почитать про то, что вы рассказывали?» А ведь и негде. Старые советские книжки, по которым мы паяли свои цветомузыки и радиоприемники, устарели с точки зрения «цифры». Институтские буквари своими формулами отобьют всякое желание изучать электронику. Есть прекрасная книжка Харрисов, но там нет экспериментов на макетке. Есть отличные наборы компонентов с макетками, но там обычно нет подробных объяснений, как все эти устройства работают. Опять пришлось уезжать с чувством, как будто что-то не доделал.

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

Вот, например, игра «кто быстрее» на двух МОП-транзисторах:

image

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

А вот это — вентиль XOR (исключающее ИЛИ) на дюжине транзисторов:

image

А вот это D-триггер, срабатывающий по уровню (триггер-защелка). На нем прекрасно отрабатываются идеи запоминания и хранения данных:

image

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

image

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

image

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

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

Let's block ads! (Why?)

[Перевод] Потоки Redis как чистая структура данных

Новая структура данных Redis 5 под названием «потоки» (streams) вызвала живой интерес в сообществе. Как-нибудь я поговорю с теми, кто использует потоки в продакшне, и напишу об этом. Но сейчас хочу рассмотреть немного другую тему. Мне начинает казаться, что многие представляют потоки неким сюрреалистичным инструментом для решения ужасно трудных задач. Действительно, эта структура данных *также* осуществляет обмен сообщениями, но будет невероятным упрощением считать, что функциональность Redis Streams ограничена только этим.

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


Если хотите записать ряд структурированных элементов данных и думаете, что БД будет здесь излишеством, можете просто открыть файл в режиме append only и записать каждую строку как CSV (Comma Separated Value):
(open data.csv in append only)
time=1553096724033,cpu_temp=23.4,load=2.3
time=1553096725029,cpu_temp=23.2,load=2.1

Выглядит просто. Люди делали это давным-давно и до сих пор делают: это надёжный шаблон, если знать, что к чему. Но какой будет эквивалент в памяти? В памяти становится возможной гораздо более продвинутая обработка данных, и автоматически снимаются многие ограничения файлов CSV, такие как:
  1. Трудно (неэффективно) выполнять запросы диапазона.
  2. Слишком много избыточной информации: в каждой записи почти одинаковое время, а поля дублируются. В то же время удаление данных сделает формат менее гибким, если я хочу переключиться на другой набор полей.
  3. Смещения элементов — это просто смещение байтов в файле: если мы изменим структуру файла, смещение станет неправильным, поэтому здесь нет реальной концепции первичного идентификатора. Записи по сути невозможно представить как-то однозначно.
  4. Не имея возможности сбора мусора и не переписывая лог нельзя удалить записи, а только пометить их как невалидные. Переписывание логов обычно отстой по нескольким причинам, желательно его избегать.

В то же время такой лог CSV по-своему хорош: нет фиксированной структуры, поля могут меняться, его тривиально генерировать и он довольно компактен. Идея с потоками Redis заключалась в том, чтобы сохранить достоинства, но преодолеть ограничения. В результате получается гибридная структура данных, очень похожая на сортированные наборы Redis: они *выглядят как* фундаментальная структура данных, но для получения такого эффекта используют несколько внутренних представлений.
Потоки Redis представлены в виде дельта-сжатых макроузлов, связанных базисным деревом. В результате можно очень быстро искать случайные записи, получать диапазоны, удалять старые элементы и т. д. В то же время интерфейс для программиста очень похож на CSV-файл:
> XADD mystream * cpu-temp 23.4 load 2.3
"1553097561402-0"
> XADD mystream * cpu-temp 23.2 load 2.1
"1553097568315-0"

Как видно из примера, команда XADD автоматически генерирует и возвращает идентификатор записи, который монотонно увеличивается и состоит из двух частей: <time>-<counter>. Время в миллисекундах, а счётчик увеличивается для записей с одинаковым временем.

Итак, первая новая абстракция для идеи CSV-файла в режиме append only заключается в использовании звёздочки в качестве аргумента ID для XADD: так мы бесплатно получаем с сервера идентификатор записи. Этот идентификатор полезен не только для указания на определённый элемент в потоке, он также связан со временем добавления записи в поток. Фактически, с помощью XRANGE можно выполнять запросы диапазона или извлекать отдельные элементы:

> XRANGE mystream 1553097561402-0 1553097561402-0
1) 1) "1553097561402-0"
   2) 1) "cpu-temp"
      2) "23.4"
      3) "load"
      4) "2.3"

В этом случае я использовал одинаковый ID для начала и конца диапазона, чтобы идентифицировать один элемент. Однако я могу использовать любой диапазон и аргумент COUNT для ограничения количества результатов. Точно так же нет необходимости указывать для диапазона полные идентификаторы, я могу просто использовать только unix-время, чтобы получить элементы в заданном диапазоне времени:
> XRANGE mystream 1553097560000 1553097570000
1) 1) "1553097561402-0"
   2) 1) "cpu-temp"
      2) "23.4"
      3) "load"
      4) "2.3"
2) 1) "1553097568315-0"
   2) 1) "cpu-temp"
      2) "23.2"
      3) "load"
      4) "2.1"

На данный момент нет необходимости показывать вам другие возможности API, для этого есть документация. Пока давайте просто сосредоточимся на этом шаблоне использования: XADD для добавления, XRANGE (а также XREAD) для извлечения диапазонов (в зависимости от того, что вы хотите сделать), и давайте посмотрим, почему потоки настолько мощны, чтобы называть их структурой данных.

Если хотите узнать больше о потоках и API, обязательно почитайте учебник.


Несколько дней назад мы с другом, который начал изучать Redis, моделировали приложение для отслеживания местных теннисных кортов, игроков и матчей. Способ моделирования игроков совершенно очевиден, игрок — это небольшой объект, поэтому нам нужен только хеш с ключами типа player:<id>. Дальше вы сразу поймёте, что нужен способ отслеживать игры в конкретных теннисных клубах. Если player:1 и player:2 сыграли между собой и player:1 выиграл, мы можем отправить в поток следующую запись:
> XADD club:1234.matches * player-a 1 player-b 2 winner 1
"1553254144387-0"

Такая простая операция даёт нам:
  1. Уникальный идентификатор матча: ID в потоке.
  2. Нет необходимости создавать объект для идентификации матча.
  3. Бесплатные запросы диапазона для постраничного просмотра матчей или просмотра матчей на определённую дату и время.

До появления потоков нам бы пришлось создавать сортированный набор по времени: элементами сортированного набора будут идентификаторы матчей, которые сохраняются в другом ключе в качестве хеш-значения. Это не только больше работы, но и больше памяти. Гораздо, гораздо больше памяти (см. ниже).

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


Приведённый выше пример использования — это не просто более цельный шаблон программирования. Расход памяти в потоках настолько отличается от старого подхода с сортированным набором + хеш для каждого объекта, что теперь начинают работать некоторые вещи, которые раньше вообще было невозможно реализовать.

Вот статистика по объёму памяти для хранения миллиона матчей в конфигурации, представленной ранее:

Сортированный набор + хеш = 220 МБ (242 RSS)
Потоки                    = 16,8 МБ (18.11 RSS)

Разница больше, чем на порядок (а именно, в 13 раз). Это означает возможность работать с задачами, которые раньше были слишком дорогостоящими для выполнения в памяти. Теперь они вполне жизнеспособны. Магия заключается в представлении потоков Redis: макроузлы могут содержать несколько элементов, которые очень компактно закодированы в структуре данных под названием listpack. Эта структура позаботится, например, о кодировании целых чисел в двоичной форме, даже если они являются семантически строками. Кроме того, мы применяем дельта-компрессию и сжимаем одинаковые поля. Тем не менее, сохраняется возможность искать по ID или времени, потому что такие макроузлы связаны в базисном дереве, которое также разработано с оптимизацией по памяти. Всё вместе это объясняет экономное использование памяти, но интересная часть заключается в том, что семантически пользователь не видит никаких деталей реализации, делающих потоки настолько эффективными.

Теперь давайте посчитаем. Если я могу хранить 1 миллион записей примерно в 18 МБ памяти, то я могу хранить 10 миллионов в 180 МБ и 100 миллионов в 1,8 ГБ. Всего с 18 ГБ памяти у меня может быть 1 миллиард элементов.


Важно отметить, что пример выше с теннисными матчами семантически *очень отличается* от использования потоков Redis для временных рядов. Да, логически мы всё ещё регистрируем какое-то событие, но есть фундаментальное различие. В первом случае мы ведём лог и создаём записи для рендеринга объектов. А во временных рядах просто измеряем нечто происходящее снаружи, что на самом деле не представляет объект. Вы можете сказать, что это различие тривиально, но это не так. Важно понять идею, что потоки Redis можно использовать для создания небольших объектов с общим порядком и присвоения идентификаторов таким объектам.

Но даже самый простой вариант использования временных рядов, очевидно, это огромный прорыв, потому что до появления потоков Redis был практически бессилен тут что-либо сделать. Характеристики памяти и гибкость потоков, а также возможность ограничения capped-потоков (см. параметры XADD) — очень важные инструменты в руках разработчика.


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

Let's block ads! (Why?)

Критическая уязвимость имплантированных устройств жизнеобеспечения дает злоумышленникам возможность управлять ими

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

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

Для обслуживания и проверки работы девайсов используются специализированные устройства. В больницах применяется модель под названием CareLink Programmer, в домашних условиях — MyCareLink Monitor.

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

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

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

Пока что исследователи проводили лишь proof-of-concept атаку, просто для демонстрации возможностей, о которых говорится в исследовании. Правда, для этого необходим физический доступ к управляющему устройству — MyCareLink или CareLink. Если доступ есть, то самым невинным действием может быть получение пользовательских данных, сохраненных на устройстве. При желании можно перепрошить девайс, о чем говорилось выше.

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

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

К слову, оба контрольных устройства находятся под управлением кастомной версии Linux. Пароли, которые позволяют получить root-доступ к этим гаджетам, хранится в виде MD5 хэша, который можно расшифровать без всякого труда. По словам исследователей, 8-значный пароль, дающий доступ к этой системе, можно взломать даже при помощи обычного ноутбука и базы пар паролей/логинов от сервиса RockYou, выложенных в общем доступе 10 лет назад.

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

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

Let's block ads! (Why?)

[Из песочницы] Синтез как один из методов улучшения производительности PostgreSQL

Философское вступление


Как известно, существует всего два метода для решения задач:
  1. Метод анализа или метод дедукции, или от общего к частному.
  2. Метод синтеза или метод индукции, или от частного к общему.

Для решения проблемы “улучшить производительность базы данных” это может выглядеть следующим образом.
Анализ — разбираем проблему на отдельные части и решая их пытаемся в результате улучшить производительности базы данных в целом.

На практике анализ выглядит примерно так:

  • Возникает проблема (инцидент производительности)
  • Собираем статистическую информацию о состоянии базы данных
  • Ищем узкие места(bottlenecks)
  • Решаем проблемы с узких мест

Узкие места базы данных — инфраструктура (CPU, Memory, Disks, Network, OS), настройки(postgresql.conf), запросы:

Инфраструктура: возможности влияния и изменения для инженера — почти нулевые.

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

Запросы к базе данных: единственная область для маневров.

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

Лирическое вступление или зачем все это надо


Как происходит процесс решения инцидентов производительности, если производительность базы данных не мониторится:

Заказчик -”у нас все плохо, долго, сделайте нам хорошо”
Инженер-” плохо это как?”
Заказчик –”вот как сейчас(час назад, вчера, на прошлой деле было), медленно”
Инженер – “а когда было хорошо?”
Заказчик – “неделю (две недели) назад было неплохо. “(Это повезло)
Заказчик – “а я не помню, когда было хорошо, но сейчас плохо “(Обычный ответ)

В результате получается классическая картина:

Кто виноват и что делать?


На первую часть вопроса ответить легче всего — виноват всегда инженер DBA.

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

Возникает первый вопрос — что мониторить?

Путь 1. Будем мониторить ВСЁ

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

В результате получается куча графиков, сводных таблиц, и непрерывные оповещения на почту и 100% занятость инженера решением кучи одинаковых тикетов, впрочем, как правило со стандартной формулировкой — “Temporary issue. No action need”. Зато, все заняты, и всегда есть, что показать заказчику — работа кипит.

Путь 2. Мониторить только то, что нужно, а, что не нужно, не нужно мониторить


Можно мониторить, чуть по-другому- только сущности и события:
  • На которые инженер DBA может влиять
  • Для которых существует алгоритм действий при возникновении события или изменения сущности.

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

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

Итак, возникает два взаимосвязанных вопроса:

  • какой запрос считается тяжелым
  • как искать тяжелые запросы.

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

Переходим ко второму вопросу — как искать и затем мониторить тяжелые запросы ?

Какие возможности для мониторинга запросов есть в PostgreSQL?


По сравнению с Oracle, возможностей немного, но все-таки кое-что сделать можно.

PG_STAT_STATEMENTS


Для поиска и мониторинга тяжелых запросов в PostgreSQL предназначено стандартное расширение pg_stat_statements.

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

Целевые столбцы pg_stat_statements для построения системы мониторинга:

  • queryid Внутренний хеш-код, вычисленный по дереву разбора оператора
  • max_time Максимальное время, потраченное на оператор, в миллисекундах

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

Как используется pg_stat_statements для мониторинга производительности PostgreSQL


Для мониторинга производительности запросов используется:
На стороне целевой базы данных — представление pg_stat_statements
Со стороны сервера и базы данных мониторинга — набор bash-скриптов и сервисных таблиц.

1 этап — сбор статистических данных


На хосте мониторинга по крону регулярно запускается скрипт который копирует содержание представления pg_stat_statements с целевой базы данных в таблицу pg_stat_history в базе данных мониторинга.

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

2 этап — настройка метрик производительности


Основываясь на собранных данных, выбираем запросы, выполнение которых наиболее критично/важно для клиента(приложения). По согласованию с заказчиком, устанавливаем значения метрик производительности используя поля queryid и max_time.

Результат — старт мониторинга производительности


  1. Мониторинговый скрипт при запуске проверяет сконфигурированные метрики производительности, сравнивая значение max_time метрики со значением из представления pg_stat_statements в целевой базе данных.
  2. Если значение в целевой базе данных превышает значение метрики – формируется предупреждение (инцидент в тикетной системе)

Дополнительная возможность 1


История планов выполнения запросов

Для последующего решения инцидентов производительности очень хорошо иметь историю изменения планов выполнения запросов.

Для хранения истории используется сервисная таблица log_query. Таблица заполняется при анализе загруженного лог-файла PostgreSQL. Поскольку в лог-файл в отличии от представления pg_stat_statements попадает полный текст с значениями параметров выполнения, а не нормализованный текст, имеется возможность вести лог не только времени и длительности запросов, но и хранить планы выполнения на текущий момент времени.

Дополнительная возможность 2


Continuous performance improvement process

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

Для этого нужно ввести дополнительные метрики производительности:

  • За последние дни
  • За базовый период

Скрипт выбирает запросы из представления pg_stat_statements в целевой базе данных и сравнивает значение max_time со средним значением max_time, в первом случае за последние дни или за выбранный период времени(baseline), во-втором случае.

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

А при чем тут синтез ?


В описанной подходе, как и предполагает метод синтеза — улучшением отдельных частей системы, улучшаем систему в целом.
  • Запрос выполняемый базой данных – тезис
  • Измененный запрос – антитезис
  • Изменение состояние системы — синтез

Развитие системы


  • Расширения собираемой статистики добавлением истории для системного представления pg_stat_activity
  • Расширение собираемой статистики добавлением истории для статистики отдельных таблиц участвующих в запросах
  • Интеграция с системой мониторинга в облаке AWS
  • И еще, что-нибудь можно придумать…

Let's block ads! (Why?)

IETF одобрили ACME — это стандарт для работы с SSL-сертификатами

IETF одобрили стандарт Automatic Certificate Management Environment (ACME), который поможет автоматизировать получение SSL-сертификатов. Расскажем, как это работает.


/ Flickr / Cliff Johnson / CC BY-SA

Зачем понадобился стандарт


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

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

Одобренный IETF протокол ACME (спецификация RFC8555) должен автоматизировать и стандартизировать процесс получения сертификата. А исключение человеческого фактора поможет повысить надежность и безопасность верификации доменного имени.

Стандарт является открытым, и внести вклад в его разработку могут все желающие. В репозитории на GitHub опубликованы соответствующие инструкции.

Как это работает


Обмен запросами в ACME происходит по HTTPS с помощью JSON-сообщений. Для работы с протоколом необходимо установить на целевой узел ACME-клиент, он генерирует уникальную пару ключей при первом обращении к CA. Впоследствии они будут использоваться для постановки подписи на всех сообщениях клиента и сервера.

Первое сообщение содержит контактную информацию о владельце домена. Оно подписывается закрытым ключом и вместе с открытым ключом отправляется серверу. Он проверяет подлинность подписи и, если все в порядке, начинает процедуру выдачи SSL-сертификата.

Чтобы получить сертификат клиент должен доказать серверу факт владения доменом. Для этого он совершает определённые действия, доступные только собственнику. Например, центр сертификации может сгенерировать уникальный токен и попросить клиента разместить его на сайте. Далее, CA формирует веб- или DNS- запрос для извлечения ключа из этого токена.

К примеру, в случае с HTTP ключ из токена необходимо поместить в файл, который будет обслуживаться веб-сервером. При DNS-верификации сертификационный центр будет искать уникальный ключ в текстовом документе DNS-записи. Если всё в порядке, сервер подтверждает, что клиент прошел валидацию и CA выпускает сертификат.


/ Flickr / Matt Batchelor / CC BY

Мнения


По словам IETF, ACME будет полезен администраторам, которым приходится работать с несколькими доменными именами. Стандарт поможет связать каждый из них с нужными SSL.

Среди достоинств стандарта эксперты также отмечают несколько механизмов безопасности. Они должны гарантировать, что SSL-сертификаты выдаются только настоящим владельцам доменов. В частности, для защиты от DNS-атак применяется набор расширений DNSSEC, а для защиты от DoS стандарт ограничивает скорость выполнения отдельных запросов — например, HTTP для метода POST. Сами разработчики ACME рекомендуют для повышения безопасности добавлять энтропию к DNS-запросам и выполнять их из нескольких точек сети.

Похожие решения


Для получения сертификатов также применяют протоколы SCEP и EST.

Первый был разработан в Cisco Systems. Его целью было упростить процедуру выдачи цифровых сертификатов X.509 и сделать её максимально масштабируемой. До появления SCEP этот процесс требовал активного участия сисадминов и плохо масштабировался. Сегодня этот протокол является одним из наиболее распространённых.

Что касается EST, то он позволяет PKI-клиентам получать сертификаты по безопасным каналам. Он применяет TLS для передачи сообщений и выпуска SSL, а также для привязки CSR к отправителю. Кроме того, EST поддерживает методы эллиптической криптографии, что создает дополнительный уровень защиты.

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

Дополнительные посты из нашего корпоративного блога:

Let's block ads! (Why?)

[Перевод] Управление ЖК-матрицей F-51543NFU-LW-ADN / PWB51543C-2-V0 (от ленточной библиотеки)

И снова привет, Хабр! Сделав перевод статьи об управлении ЖК-модулем с драйвером, но без собственного видео-ОЗУ, я решил перевести ещё одну публикацию на ту же тему. Здесь модуль уже попроще, монохромный, но «оживить» его не менее интересно.


Дисплей, с которым собирается работать автор, взят из старой ленточной библиотеки. Контроллер не сохранился, но поиск чего-либо связанного с «263645-001» показал, что там был ПЛИС. Считается, что непосредственно управлять такими ЖК-модулями от Arduino и т.п. невозможно, нужно промежуточное звено — контроллер серии SEDxxxxx, который не «дружит» с макетными платами, а входов имеет больше, чем сам модуль. Но это не так. Вот целых четыре аналогичных проекта:

На ATmega8515
На нём же
На PIC
На ESP32

А некоторые вообще управляют от восьмиразрядных AVR VGA-мониторами…

В общем, у автора всё получилось, ПО под лицензией MIT — здесь.


Чтобы убедиться, что всё работает, надо сначала попробовать вывести однобитное растровое изображение из флеш-памяти микроконтроллера. Для получения отрицательного напряжения взяты три «Кроны», на вывод V0 подано напряжение с делителя, в качестве которого применён подстроечный резистор. И вот на экране — Ленна:

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


Но от видео-ПЗУ толку мало, а 9600 байт для видео-ОЗУ в Arduino нет. На помощь приходит текстовый режим, при котором ПЗУ знакогенератора и видео-ОЗУ вместе взятые имеют меньший объём, чем видео-ОЗУ при графическом режиме. На эту тему сторонники РК и «Специалиста» могут ломать копья бесконечно.

Короткий пример на языке ассемблера AVR:

...
lpm r24, Z  
;----------            (CL2 rising edge)
out %[data_port], r24
ld r30, X+
swap r24;              (CL2 rising edge)
out %[data_port], r24
lpm r24, Z
;----------            (CL2 rising edge)
out %[data_port], r24
...

Для модуля F-51543NFU-LW-ADN / PWB51543C-2-V0 автор применил:

Arduino на AVR с тактовой частотой в 16 МГц (проверено на Uno, Leonardo и клоне, аналогичном ProMicro).

Источник отрицательного напряжения. У автора это — нестабилизированный DC-DC преобразователь A0524S-1W с развязкой входа и выхода. Подойдут также преобразователи на MC34063 (эту микросхему найти очень просто — достаточно разобрать самую дешёвую USB-зарядку для прикуривателя) или MAX749. Стабилизация не требуется, диапазон допустимых напряжений по этому входу у применённого здесь модуля достаточно широк. Номинал — минус 24 В, максимум — минус 30 относительно общего провода и 35 между Vdd и Vee. Потребляемый ток составит 6 мА.

Два N-канальных МОП-транзистора с управлением логическими уровнями. Автор применил IRL530n, запас, конечно, большой, зато точно не перегорят. Один транзистор управляет подсветкой, другой — источником отрицательного напряжения.

Подстроечный резистор на 250 кОм для подачи напряжения на вход V0. Выставить, чтобы на подвижном контакте было -16.8 В при температуре в +25 °C. Это из даташита, а так, конечно, такая точность не нужна.

Несколько 10-килоомных резисторов для подтягивания вниз.

Макетка и перемычки.

Что бы теперь такого сделать? QR-часы? Спросим котэ:

Котэ предлагает реализовать симуляцию какого-нибудь распространённого ЖКИ с контроллером. Чтобы к этому Arduino можно было подключить другое, «думающее», что работает с дисплеем на HD44780, только большим.


Берём пример с EGA и VGA — там при работе в текстовом режиме сделано именно так. Только здесь знаков поместилось всего 64, но хоть так всё в ОЗУ влезло, в отличие от графического режима. Правда, основной цикл событий замедлило, зато можно попробовать тайловую графику:


В Arduino на AVR столько ОЗУ нет, и точка. Даже в Mega. 320x240 даже при одном бите на пиксель — это уже 9600 байт. Всего для четырёх полутонов потребуется вдвое больше. С внешним ОЗУ, например, 23LC512 в режиме SQI можно попробовать реализовать что-то похожее на DMA, но проще и выгоднее переделать всё на ESP32, где и статического ОЗУ больше, и DMA легче делается.

Если вы хотите просто подключить такой дисплей к ПК через USB, можно попробовать применить для этого ATmega32u4 — ресурсов хватит даже для градаций яркости (при помощи FRC, о том, что это такое, рассказано в моём предыдущем переводе). Но не у «меги», используемой как преобразователь интерфейсов, а у ПК, который будет сам сканировать ЖКИ на лету со скоростью в 5.4 мегабит в секунду.

Когда модуль ещё стоял в ленточной библиотеке, там и GUI, и градации яркости — всё было.

Обновления будут. А пока…

И это — не фотомонтаж, а результат управления с ПК. А мы перейдём с Hackaday.io на GitHub — там в README.md ещё много интересного.


FLM — First Line Marker — маркер первой строки, может также называться FRAME, VSYNC, и т.п.
CL1 — Row latch pulse — импульс записи строки, может также называться. LOAD, HSYNC, и т.п.
CL2 — Pixel shift clock — импульс смены пикселя, может также называться. CP (change pixel), и т.п.
M — чередующийся сигнал, благодаря которому пиксели управляются переменным напряжением, может также называться BIAS (смещение), и т.п.
D0-D3 — четырёхразрядная параллельная шина данных.
Выводы общего провода, питания подсветки (например, VLED±), питания модуля (VEE и V0)

Не пренебрегайте даташитами. Модуль может требовать другое отрицательное напряжение, или оно может оказаться положительным, или преобразователь может быть встроенным. Может отличаться логика, например, при единице на CL1 не будет реакции на CL2. Может быть другая подсветка (CCFL (осторожно, инвертор «кусач») вместо светодиодов), или на плате не указана цоколёвка, тогда без даташита её точно не узнать. Наугад что-либо подключать нельзя.


Передать строку кусками по четыре бита, запись производится по спаду на линии CL2. Передав строку, записать её по спаду на линии CL1 (ага, всё-таки, чуть-чуть ОЗУ в модуле есть — на одну строку). Следующая строка будет выбрана автоматически. Передав весь кадр, вернуться в начало при помощи сигнала FLM. В даташите на LC79401 есть пример. Запись производить с достаточной скоростью, импульсы на CL1 подавать равномерно. Контроллер чуть замешкался — экран некрасиво мигнул.

После каждого кадра менять логический уровень на входе M на противоположный, чтобы пиксели управлялись переменным напряжением. Иначе дисплей портится:

Эту операцию можно не доверять микроконтроллеру, а поставить счётный триггер. Входом на FLM, выходом на M — в общем, понятно.

Пример для вывода изображения из флеш-памяти (см. начало статьи) называется в этом репозитории clglcd_simple

Как уже было сказано, проделать то же самое с ОЗУ в Arduino на AVR невозможно — его не хватит, поэтому…


Согласно даташиту, можно передавать данные по четырёхразрядной шине и «дёргать» CL2 с частотой до 6 МГц. Поэтому можно быстро-быстро передать строку, потом микроконтроллер немного порешает другие задачи, а как таймер ему «скажет» — он «дёрнет» CL1 и повторит цикл.

При генерации знаков для горизонтального разрешения в 320 пикселей всё это удаётся проделывать за 20 мкс (320 пикслей /4 бита = 80 импульсов, CL2 «дёргаем» с частотой в 4 МГц). На остальные задачи остаётся 39.5 мкс. CL1 «дёргаем» каждые 59.5 мкс и получаем частоту кадров в 70 Гц. Ну, там ещё процедурв обработки прерываний будут и прочее, в общем, микроконтроллер будет занят управлением дисплеем 45% времени. «Целых» 45 или «всего» 45? Наверное, второе: перезаписать данные в видео-ОЗУ можно достаточно быстро.

Хотите, чтобы микроконтроллер тратил меньше времени на управление индикатором, и больше на другие задачи? Можно уменьшить частоту кадров до 50 Гц, можно разогнать микроконтроллер до 20 МГц. При любом из этих способов между проуедурами обработки прерываний пройдёт больше тактов.

Таймер сравнения выхода переключает линию CL2 через каждые четыре тактовых импульса со скважностью в 50%. Одновременно данные поступают на выходы порта PORTB, подключённые к четырёхразрядной шине данных модуля таким образом, что смена их происходит в момент нарастания уровня на CL2, а в момент спада они остаются неизменными. Конечно, без ассемблера такое не проделать:

...
  lpm r24, Z 
  ;----------            (CL2 rising edge)
  out %[data_port], r24
  ld r30, X+
  swap r24;              (CL2 rising edge)
  out %[data_port], r24
  lpm r24, Z
  ;----------            (CL2 rising edge)
  out %[data_port], r24
  ...

8 тактов — и переданы четыре полубайта. А что именно передавать — зависит от того, какой символ находится в соответствующей ячейке видео-ОЗУ, какие именно пиксели, соответствующие этому символу, надо передать из ПЗУ знакогенератора, и что хранится в соответствующих ячейках этого ПЗУ.

Самое неудобное здесь — необходимость останавливать таймер ровно через 80 импульсов. Некоторые таймеры, например Timer4 в 32u4, так не могут.

Для получения сигнала, подаваемого на линию CL1, автор применил другой вывод микроконтроллера, предназначенный как для таймера, так и для быстрого ШИМ. Что из этого применено здесь, понятно. Переключается он каждые 952 такта. Или если считать после делителя тактовой частоты на 8 — получается через каждые 119 импульсов. В этот момент запускается процедура обработки прерывания и заставляет микроконтроллер подать на линии управления новые данные, которые потребуются при следующем импульсе на CL1. Ну а уровень на линии M меняется с вдвое меньшей частотой. И ЖКИ не портится. Все сигналы вместе выглядят так:

Знакогенератор состоит из 256 символов — хватит для 866, KOI-8R или 1251. В видео-ОЗУ помещается 40хN символов, где N — количество строк, зависящее от высоты символа. Ширина символа — всегда 8 пикселей, а высота может быть 6, 8, 10, 12, 15, 16. Чем она меньше, тем меньше требуется ПЗУ для знакогенератора и больше видео-ОЗУ. При шрифте 8х8 (40 символов на 30 строк) надо 1200 байт ОЗУ и 2048 байт ПЗУ. При шрифте 8х16 (на этом модуле смотрится лучше всего) ОЗУ надо 600 байт, а ПЗУ — 4096. От переводчика: можно шрифт хранить в виде 8х8, а по вертикали масштабировать вдвое программно, и обойтись 600 байтами ОЗУ и 2048 — ПЗУ. Чтобы хранить в ПЗУ несколько шрифтов, нужно держать адрес начала шрифта не в константе, а в переменной, но выводить текст сразу несколькими шрифтами не получится, если, конечно, не менять этот адрес на лету процедурой обработки прерывания прямо во время передачи пикселей в дисплей.

Шрифт хранится так: сначала верхние строки всех 256 символов, потом на одну строку ниже, и так далее. В папке misc репозитория есть скрипт на Python, который автоматически преобразует TTF-шрифт в файл заголовка clglcd_font.h с массивом PROGMEM в необходимом формате. Классические пиксельные шрифты под CC-BY-SA 4.0 можно взять здесь.


Но на этот раз с подробностями. Знакогенератор в ОЗУ, как указано выше, вмещает всего 64 знака, их можно обозначить номерами от 0 до n либо от 255-n до 255. Хранятся они аналогично: верхние строки всех символов, затем следующие, и так далее. Только выровнено всё это с учётом того, что знаков не 256, а 64. Для знаков размером 8х16 пикселей потребуется 16*64=1024 байта. В репозитории есть пример работы со знакогенератором в ОЗУ.

Если задействовать одновременно оба знакогенератора — 256-символьный в ПЗУ и 64-символьный в ОЗУ, придётся смириться с тем, что не только останется меньше ОЗУ, но и уменьшится скорость передачи данных о строках в модуль — вместо 8 тактов загрузки двух полубайтов потребуется 12, то есть, не 20 мкс, а 30, а вместо 45% времени на управление ЖКИ уйдёт 60.


Как указано выше, в этом случае микроконтроллер работает просто преобразователем интерфейсов. Потребуется ATmega32u4, а что как делать, описано здесь.

Так вот что это за четырёхпроводной шлейф — от резистивного сенсора, оказывается.


Как указано выше, потребуется отрицательное напряжение, которое в первых опытах можно снять с трёх «Крон», а потом собрать преобразователь, например, на MAX749. Сигналы управления питанием, а также сигнал DISPOFF (это сигнал инверсный, модуль включён при единице) подтянуть резисторами вниз. Во время прошивки и сброса микроконтроллера появление там логических единиц недопустимо.

Отрицательное напряжение подавать после напряжения +5В, а логическую единицу на линию DISPOFF — когда на линиях управления уже присутствуют данные: хотя бы одна единица на шине данных, единица на CL1. Иначе может выйти из строя модуль.

Входы D0-D3 подключить к выходам одного и того же порта микроконтроллера, например, Px4-Px7, при этом, выходы Px0-Px3 использовать в качестве GPIO нельзя. Можно назначить им другие функции, например, использовать их как выходы таймеров, последовательного интерфейса, и т.п. Если вы используете их как входы, будьте осторожны: встроенные подтягивающие резисторы могут переключаться произвольно, если их не отключить (PUD — pull-up disable).

Вход M — на выход таймера сравнения или ШИМ.

Вход CL1 — на другой выход того же таймера.

Вход CL2 — на выход другого таймера сравнения.

FLM — на любой цифровой выход.

DISPOFF — на любой другой цифровой выход.

Остальное зависит от того, как вы запитываете модуль. Автор предпочитает управлять подсветкой и Vee по отдельности.


Поместить в скетч файлы clglcd.h and clglcd.cpp

Сделать резервную копию файла clglcd_config.h и отредактировать его с учётом того, что куда подключено, а также того, какие функции вам нужны: знакогенератор в ОЗУ, и т.п. Внимание, в коде указаны не названия выводов Arduino, а названия выводов микроконтроллера согласно даташиту. Названия выходов теймеров сравнения расшифровываются так: например, 2,B — это OC2B, что на Arduino Uno соответствует PD3. В примерах приведены варианты подключения, которые заработали у автора.

Сгенерировать файл шрифта clglcd_font.h Python-скриптом в папке misc (см. выше).

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

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

Добавить в скетч код, который будет что-нибудь делать, например, принимать текст по последовательному порту и отображать.


Обновлять дисплей надо постоянно, чем занимаются процедуры обработки прерываний. Если прерывания прекратятся более чем на 30 мкс, дисплей начнёт моргать, а если более чем на 60 мкс при единице на линии FLM — он может выйти из строя. Если надо прекратить прерывания надолго, сначала выключайте дисплей сигналом DISPOFF (повторяю, это сигнал инверсный, модуль включён при единице). Конечно, если он будет выключаться на две секнуды каждый раз, когда надо обработать данные от датчика влажности и температуры, это мало кому понравится, но лучше уж так, чем испортить модуль. Ещё лучше поручить всё остальное отдельному микроконтроллеру. Особенно недопустим обмен информацией тем же самым микроконтроллером с устройствами, работающими по протоколу 1-wire, и адресными светодиодами. Клоны Arduino Pro Micro достаточно недороги, чтобы купить два.
Зато будут прекрасно работать аппаратно реализованные интерфейсы: последовательные порты, шина I2C, SPI в ведущем режиме. В ведомом — только если ведущее устройство допускает периодическое «отваливание» ведомого на 25-35 мкс. Конечно же, всё ещё зависит от того, сколько «ног» осталось не занято после подключения дисплея.

USB на 32u4 работает отлично, если не опрашивать конечную точку управления слишком часто (медленный код процедуры обработки прерывания). Драйвер CDC и его API оказались достаточно быстрыми.

Далее в файле README.md на GitHub повторён перечень аналогичных проектов, такой же, как на странице проекта на Hackaday.io

Спасибо за внимание!

Let's block ads! (Why?)

Откуда берут фотографии для тестирования систем распознавания лиц


Аннотированная фотография из набора данных Diversity in Faces от IBM

Недавно компания IBM подверглась критике за то, что для обучения нейросетей без разрешения взяла общедоступные фотографии с фотохостинга Flickr и других сайтов, куда пользователи выкладывают свои снимки. Формально всё по закону — все фотографии опубликованы под лицензией Creative Commons — но люди чувствуют дискомфорт из-за того, что ИИ обучается на их лицах. Некоторые даже не знали, что их сфотографировали. Как известно, для съёмки человека в общественном месте не нужно спрашивать у него разрешения.
Как сообщалось в СМИ, компания IBM использовала примерно 1 миллион частных фотографий с Flickr для обучения своей системы распознавания лиц. Но потом выяснилось, что на самом деле IBM не копировала фотографии с Flickr, эти снимки являются частью набора данных YFCC100M из 99,2 млн фотографий, доступных для обучения нейросетей. Эту базу составила ещё Yahoo, бывший владелец Flickr.

Оказывается, что история с IBM — только вершина айсберга. Здесь компания совершенно случайно попала под раздачу, а на самом деле фотографии пользователей давно используются для обучения самых разных систем, это уже стало общепринятой практикой: «Наше исследование показало, что правительство США, исследователи и корпорации использовали изображения иммигрантов, детей, подвергшихся насилию, и мёртвых людей для тестирования своих систем распознавания лиц», — пишет издание Slate. Оно особо подчёркивает, что подобную деятельность практикуют даже правительственные агентства, такие как Национальный институт стандартов и технологий (National Institute of Standards and Technology, NIST).

В частности, в рамках NIST действует программа Facial Recognition Verification Testing (FRVT) для стандартизированного тестирования систем распознавания лиц, разработанных сторонними компаниями. Эта программа позволяет оценивать все системы одинаковым образом, объективно сравнивая их друг с другом. В некоторых случаях за победу в конкурсе присуждаются денежные призы до $25 тыс. Но и без денежного вознаграждения высокая оценка в тесте NIST — мощный стимул для коммерческого успеха компании-разработчика, потому что на эту систему сразу обратят внимание потенциальные клиенты, а оценку A+ можно упоминать в пресс-релизах и рекламных материалах.

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

Расследование Slate показало, что набор данных NIST включает следующие фотографии:


Многие снимки сделаны сотрудниками Министерства внутренней безопасности (DHS) в общественных местах, при этом в процессе фотосъёмки прохожих сотрудники DHS выдавали себя за туристов, которые фотографируют окрестности.

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

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

Набор данных с фотографиями детей используется, по крайней мере, с 2016 года. Согласно документации для разработчиков, он включает в себя «фотографии детей в возрасте от младенца до подростка», где большинство снимков демонстрируют «принуждение, насилие и сексуальную активность». Эти изображения считаются особенно сложными для распознавания из-за большей изменчивости положения, контекста и т. д.

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

Журналисты также обращают внимание на «предвзятость» набора данных с преступниками Multiple Encounter Dataset. Хотя чернокожие составляют всего 12,6% населения США, в базе фотографий преступников их 47,5%, из-за чего ИИ тоже может обучиться предвзятости и стать расистом.

Let's block ads! (Why?)

Архитектура Intel Gen11 GPU и дискретная видеокарта от Intel


Дискретная видеокарта начального уровня Intel Graphics Xe, официальный анонс состоялся 20 марта на игровой конференции GDC 2019

Компания Intel опубликовала документацию на графические процессоры Gen11 с описанием, чем они будут отличаться от предыдущего поколения. Ожидается, что архитектура Intel Gen11 станет основой для будущей архитектуры дискретной видеокарты Xe, поэтому описанные здесь технологии можно рассматривать как предварительный просмотр по крайней мере некоторых функций, которые реализуют в этих видеокартах. Пока что о будущих видеокартах Intel ничего не рассказывала, только показала несколько фотографий (или рендеров).

Архитектура процессора Intel Core, системы на кристалле (SoC) и кольцевой системы внутренних соединений (Ring Interconnect)

Исторически сложилось так, что графические процессоры Intel среднего уровня GT2 для настольных компьютеров и некоторые мобильные чипы уступали по производительности чипам от AMD. В таких сравнениях Intel исторически получала преимущество за счёт более мощного процессора по сравнению c APU, производными от микроархитектуры AMD Bulldozer. Теперь ситуация изменилась. Ryzen обладает гораздо более эффективным процессорным ядром, а мобильные процессоры AMD Ryzen гораздо более конкурентоспособны с Intel. Поэтому последней необходимо что-то предпринимать, в том числе решать проблему с производительностью GPU.


Детальная блок-схема Gen11

По технической документации сложно судить о производительности Gen11. Но некоторые специалисты считают, что Intel сможет гораздо эффективнее конкурировать с AMD. По крайней мере эффективнее, чем когда-либо прежде.

В новой архитектуре Intel GT2 предусмотрено 64 блока исполнения команд (EU, execution unit) по сравнению с 24 блоками в процессорах класса Skylake. Это значительное расширение ресурсов на чипе должно улучшить общую производительность по сравнению с предыдущим поколением. В таблице ниже приведены сравнительные характеристики графических подсистем Gen9 и Gen11.


Ключевые метрики Gen9 и Gen11

Исходя из технических характеристик, производительность вычислений в Gen11 вырастет примерно в 2,67 раза, как и пропускная способность для текстур (texture sampling). Пропускная способность блоков растровых операций (ROP) удвоилась, как и количество тестов high-Z за такт.

Кэш L3 увеличился в четыре раза, а пропускная способность GPU на запись удвоилась до 64 байт на такт. Пропускная способность памяти при использовании DDR4 должна остаться такой же, но поддержка LPDDR4 теоретически допускает более высокие тактовые частоты.

Кэш последнего уровня используется совместно GPU и CPU, чтобы сократить трафик с перемещением данных. Блоки видеодекодера улучшены для уменьшения битрейта. Они позволяют осуществлять одновременное декодирование нескольких потоков 4K и 8K. Добавлена поддержка адаптивной синхронизации и улучшенное декодирование HD-видео.

Теперь у GPU общая локальная память, которая не блокирует доступ к кэшу L3 при чтении. Intel утверждает, что это снижает задержку и повышает эффективность «атомарных операций».


Иерархия памяти на уровне микросхемы SoC и её максимальная теоретическая пропускная способность

Intel утверждает, что значительно улучшила общую пропускную способность памяти в Gen11.

В документации описано две новых технологии, которые Intel реализовала в графическом ускорителе:

  • грубое затенение пикселей (Coarse Pixel Shading, CPS);
  • затенение по позиции (Position Only SHading, POSH).

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


Кадр из игры Citadel 1 в разрешении 2560×1440 (слева pixel rate 1×1, а справа 2×2). Хотя грубое затенение пикселей уменьшает количество вызовов шейдеров, на дисплее с высокой плотностью пикселей практически нет заметной разницы. Для сравнения показано также масштабированное изображение без применения сглаживания, в разрешении 1280×720

Уменьшение количества вызовов пиксельного шейдера экономит энергию и повышает производительность, то есть частоту кадров, на 20-40%.


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

Конвейер POSH запускает позиционный шейдер параллельно с основным приложением, что обычно позволяет генерировать результат намного быстрее, сказано в документации. Это часть системы рендеринга по позиции тайлов (Position Only Tile-Based Rendering, PTBR).

В целом, Gen11 станет значительным обновлением для процессоров Intel. Первые два поколения AMD Ryzen Mobile конкурировали со слабой графикой Skylake. Третьему поколению Ryzen Mobile APU, когда бы оно ни вышло, придётся конкурировать с гораздо более мощным чипом Intel, пишет издание ExtremeTech.

Let's block ads! (Why?)

Власти Евросоюза оштрафовали Google на $1,7 млрд за блокировку рекламы конкурентов

По мнению чиновников из Еврокомиссии, Google намеренно подавляла конкуренцию в сфере онлайн-рекламы. В частности, компания запрещала рекламировать услуги конкурентов через свой сервис AdSense. Это противоречит европейским законам, и теперь компания заплатит $1,7 млрд штрафа.

Что случилось


Еврокомиссар по вопросам конкуренции Маргрете Вестагер (Margrethe Vestager) заявила, что Google препятствовала «честной конкуренции и инновациям», пользуюясь своим доминирующим положением на рынке онлайн-поиска и цифровой рекламы.

Это уже третий по счету антимонопольный штраф, наложенный на поискового гиганта. В июле 2018 года регуляторы из Брюcселя и холдинг Alphabet согласовали штраф в $5 млрд за злоупотребления лидирующим положением мобильной ОС Android.

Google заставляла производителей смартфонов предустанавливать собственные продукты – поиск, карты, браузер Chrome, а также Play Store. Впоследствии компания дала пользователям возможность выбирать приложения при начальной настройке смартфона.

Еще раньше, в 2017 году Google была оштрафована на $2,7 млрд из-за ограничений в функциональности модуля онлайн-шопинга в поисковой системе.

Реакция инвесторов


Несмотря на крупный штраф, инвесторы Google не особенно обеспокоены ситуацией – акции компании выросли на 2% в день публикации новости. Рыночная капитализация Google в тот же день увеличилась почти на $17 млрд.

Фактор штрафа от Евросоюза был полностью нивелирован релизом нового проекта – видеостриминга для геймеров Stadia. Этот проект может серьезно изменить ситуацию на рынке онлайн-игр.

Евросоюз против технологических компаний


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

Кроме того, еврокомиссар пообещала изучить жалобу стримингового сервиса Spotify в адрес Apple. По мнению Spotify, корпорация из Купертино долгие годы вела нечестную конкуренцию, например, запрещала Siri и Homepod запускать Spotify, отклоняла приложение сервиса и угрожала удалить его из AppStore.

Также Вестагер сообщила о планах изучить потенциально «антиконкурентное» поведение Facebook.

Другие материалы по теме финансов и фондового рынка от ITI Capital:


Let's block ads! (Why?)

[Из песочницы] Прошивка ZXHN H118N от Дом.ру без пайки и программатора

Здравствуйте!

Достал из пыльного чулана Очень понадобился ZXHN H118N от Дом.ру.

Проблема в его куцей прошивке, которая завязана на провайдере дом.ру (ЭрТелеком), где можно ввести только логин и пароль PPPOE для подключению к интернету.

Этого функционала хватит для домохозяйки, но не для меня.

Поэтому будем перепрошивать этот роутер!

Первая сложность в том, что перепрошивать его тоже нельзя. Дом.ру позаботились об этом основательно. Можно только на прошивки Дом.ру. Но вот в старой прошивке дом.ру, до которой можно откатиться (даунгрейд), в ней есть возможность залить оригинальную версию прошивки ZTE.

1. Вводим в адресной строке 192.168.0.1/html/menu.html далее жмем любой иероглиф — покажет заводскую вебку.

2. Переходим на страницу «Management»

3. Вкладка «Firmware Upgrade»

4. Сначала прошиваем прошивкой от DOMRU — DOMRU__ZXHN+H118NV2.0.1d_E04_OV.img (Старая прошивка дом.ру с возможностью апгрейда).

5. После прошивки роутер получает IP — 192.168.0.1. Но через WEB морду зайти не дает. Можно только через TELNET — User: root Pass: root (это кому интересно).

6. Нажатием кнопки резет, переводим его в дефолтное состояние.

6.1. Возможно роутер поменяет адрес на 192.168.1.1, а так же в настройках вашего устройства, подключенного к роутеру нужно прописать вручную реквизиты
IP 192.168.1.2
Mask 255.255.255.0
Шлюз 192.168.1.1
Без этого по адресу 192.168.1.1 меня перебрасывало на страницу 404

7. Появляется доступ к WEB с user: admin pass: admin

8. Далее с пункта 4. ТОлько прошиваем оригинальной прошивкой взятой из архива — ZXHN+H118NV2.0.1d_E04_OV.img

9. доступ к WEB с user: admin pass: admin

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

Let's block ads! (Why?)

Адаптируем AutoMapper под себя

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

Мне не нравится дублирование в MapFrom при широких проекциях.

CreateMap<Pupil, PupilDto>()
 .ForMember(x => x.Name, s => s.MapFrom(x => x.Identity.Passport.Name))
 .ForMember(x => x.Surname, s => s.MapFrom(x => x.Identity.Passport.Surname))
 .ForMember(x => x.Age, s => s.MapFrom(x => x.Identity.Passport.Age))
 .ForMember(x => x.Number, s => s.MapFrom(x => x.Identity.Passport.Number))

Я бы хотел переписать так:

CreateMap<Pupil, PupilDto>()
 .From(x=>x.IdentityCard.Passport).To()

ProjectTo

AutoMapper умеет строить маппинг как в памяти, так и транслировать в SQL, он дописывает Expression, делая проекцию в DTO по правилам, которые вы описали в профайлах.

EntityQueryable.Select(dtoPupil => new PupilDto() {
                    Name = dtoPupil.Identity.Passport,
                    Surname = dtoPupil.Identity.Passport.Surname})

80% процентов маппинга, который приходится писать мне — маппинг который достраивает Expression из IQueryble.

Это очень удобно:

public ActionResult<IEnumerable<PupilDto>> GetAdultPupils(){

 var result = _context.Pupils
                      .Where(x=>x.Identity.Passport.Age >= 18 && ...)
                      .ProjectTo<PupilDto>().ToList();
 return result;
}

В декларативном стиле мы сформировали запрос к таблице Pupils, добавили фильтрацию, спроецировали в нужный DTO и вернули клиенту, так можно записать все read методы простого CRUD интерфейса.И все это будет выполнено в на уровне базы данных.

Правда, в серьезных приложениях такие action'ы вряд-ли будут удовлетворять клиентов.


Минусы AutoMapper'a

1) Он очень многословен, при "широком" маппинге приходится писать правила, которые не умещаются на одной строчке кода.

Профайлы разрастаются и превращаются в архивы кода, который один раз написан и изменяется только при рефакторинге наименований.

2) Если использовать маппинг по конвенции, теряется лаконичность наименования
свойств в DTO:

public class PupilDto
{
  // Сущность Pupil связана один к одному с сущностью IdentityCard
  // IdentityCard один к одному с Passport
  public string IdentityCardPassportName { get; set; }
  public string IdentityCardPassportSurname { get; set; }
}

3) Отсутствие типобезопасности

1 и 2 — неприятные моменты, но с ними можно смириться, а вот с отсутствием типобезопасности при регистрации смириться уже сложнее, это не должно компилироваться:

// Name - string
// Age - int
ForMember(x => x.Age, s => s.MapFrom(x => x.Identity.Passport.Name)

О таких ошибках мы хотим получать информацию на этапе компиляции, а не в run-time.

С помощью extention оберток устраним эти моменты.


Пишем обертку

Почему регистрация должна быть написана таким образом?

CreateMap<Pupil, PupilDto>()
 .ForMember(x => x.Name, s => s.MapFrom(x => x.Identity.Passport.Name))
 .ForMember(x => x.Surname, s => s.MapFrom(x => x.Identity.Passport.Surname))
 .ForMember(x => x.Age, s => s.MapFrom(x => x.Identity.Passport.Age))
 .ForMember(x => x.House, s => s.MapFrom(x => x.Address.House))
 .ForMember(x => x.Street, s => s.MapFrom(x => x.Address.Street))
 .ForMember(x => x.Country, s => s.MapFrom(x => x.Address.Country))
 .ForMember(x => x.Surname, s => s.MapFrom(x => x.Identity.Passport.Age))
 .ForMember(x => x.Group, s => s.MapFrom(x=>x.EducationCard.StudyGroup.Number)) 

Вот так намного лаконичнее:

CreateMap<Pupil,PupilDto>()
// маппинг по конвенции
// PassportName = Passport.Name, PassportSurname = Passport.Surname
.From(x => x.IdentityCard.Passport).To()
// House,Street,Country - по конвенции
.From(x => x.Address).To()
// первый параметр кортежа - свойство DTO, второй - сущности 
.From(x => x.EducationCard.Group).To((x => x.Group,x => x.Number));

Метод To будет принимать кортежи, если понадобится указать правила маппинга

IMapping<TSource,TDest> это интерфейс automaper'a в котором определены методы ForMember,ForAll()… все эти методы возвращают возвращают this (Fluent Api).

Мы вернем wrapper чтобы запомнить Expression из метода From

public static MapperExpressionWrapper<TSource, TDest, TProjection> 
                                 From<TSource, TDest, TProjection>
(this IMappingExpression<TSource, TDest> mapping, 
 Expression<Func<TSource, TProjection>> expression) => 
 new MapperExpressionWrapper<TSource, TDest, TProjection>(mapping, expression);

Теперь программист написав метод From сразу увидит перегрузку метода To, тем самым мы подскажем ему API, в таких случаях мы можем осознать все прелести extension методов, мы расширили поведение, не имея write доступ к исходникам автомаппера


Типизируем

Реализация типизированного метода To сложнее.

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

Когда в моей практике встречается подобная задача, я сразу смотрю в сторону Roslyn, не хочется писать множество однотипных методов и заниматься Copy Paste, их проще сгенерировать.

В этом нам помогут generic'и. Нужно сгенерировать 10 методов c различным числом generic'ов и параметров

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

Сложность в том, что даже для 3 параметров нам придется генерировать 64 различные перегрузки, а при использовании generic всего 1:

IMappingExpression<TSource, TDest> To<TSource, TDest, TProjection,T,T1, T2, T3>(
this MapperExpressionWrapper<TSource,TDest,TProjection> mapperExpressionWrapper,
(Expression<Func<TDest, T>>, Expression<Func<TProjection, T>>) arg0,
(Expression<Func<TDest, T1>>, Expression<Func<TProjection, T1>>) arg1,
(Expression<Func<TDest, T2>>, Expression<Func<TProjection, T2>>) arg2,
(Expression<Func<TDest, T3>>, Expression<Func<TProjection, T3>>) arg3)
{
   ...
}

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

Проблема в другом, ReSharper не подхватит столько перегрузок и просто откажется работать, вы лишитесь Intellisience и подгрузите IDE.

Реализуем метод принимающий один кортеж:

public static IMappingExpression<TSource, TDest> To
 <TSource, TDest, TProjection, T>(this 
 MapperExpressionWrapper<TSource,TDest,TProjection> mapperExpressionWrapper,
(Expression<Func<TDest, T>>, Expression<Func<TProjection, T>>) arg0)
{  // регистрация по конвенции
   RegisterByConvention(mapperExpressionWrapper);
   // регистрация по заданному expreession
   RegisterRule(mapperExpressionWrapper, arg0);
   // вернем IMappingExpression,чтобы далее можно было применить 
   // любые другие extension методы
   return mapperExpressionWrapper.MappingExpression;
}

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

Регистрировать лямбду типа Expression<Func<TSource,object>> нельзя, тогда AutoMapper будет сопоставлять все свойства DTO типу object

private static void RegisterByConvention<TSource, TDest, TProjection>(
MapperExpressionWrapper<TSource, TDest, TProjection> mapperExpressionWrapper)
{
  var properties = typeof(TDest).GetProperties().ToList();
  properties.ForEach(prop =>
  {
 // mapperExpressionWrapper.FromExpression = x=>x.Identity.Passport
 // prop.Name = Name
 // ruleByConvention Expression<Func<Pupil,string>> x=>x.Identity.Passport.Name
  var ruleByConvention = _cachedMethodInfo
     .GetMethod(nameof(HelpersMethod.GetRuleByConvention))
     .MakeGenericMethod(typeof(TSource), typeof(TProjection), prop.PropertyType)
     .Invoke(null, new object[] {prop, mapperExpressionWrapper.FromExpression});

  if (ruleByConvention == null) return;

   //регистрируем
   mapperExpressionWrapper.MappingExpression.ForMember(prop.Name,
        s => s.MapFrom((dynamic) ruleByConvention));
  });
}

RegisterRule получает кортеж, который задает правила маппинга, в нем нужно "соединить"
FromExpression и expression, переданный в кортеж.

В этом нам поможет Expression.Invoke, EF Core 2.0 не поддерживал его, более поздние версии начали поддерживать. Он позволит сделать "композицию лямбд":

Expression<Func<Pupil,StudyGroup>> from = x=>x.EducationCard.StudyGroup;
Expression<Func<StudyGroup,int>> @for = x=>x.Number;
//invoke = x=>x.EducationCard.StudyGroup.Number;
var composition = Expression.Lambda<Func<Pupil, string>>(
                Expression.Invoke(@for,from.Body),from.Parameters.First())

Метод RegisterRule:

private static void RegisterRule<TSource, TDest, TProjection, T
(MapperExpressionWrapper<TSource,TDest,TProjection> mapperExpressionWrapper,
(Expression<Func<TDest, T>>, Expression<Func<TProjection, T>>) rule)
{
 //rule = (x=>x.Group,x=>x.Number)
 var (from, @for) = rule;
 // заменяем интерполяцию на конкатенацию строк
 @for = (Expression<Func<TProjection, T>>) _interpolationReplacer.Visit(@for);
//mapperExpressionWrapper.FromExpression = (x=>x.EducationCard.StudyGroup)
 var result = Expression.Lambda<Func<TSource, T>>(
       Expression.Invoke(@for, mapperExpressionWrapper.FromExpression.Body),
       mapperExpressionWrapper.FromExpression.Parameters.First());
 var destPropertyName = from.PropertiesStr().First();

  // result = x => Invoke(x => x.Number, x.EducationCard.StudyGroup)
  // можно читать, как result = x=>x.EducationCard.StudyCard.Number
 mapperExpressionWrapper.MappingExpression
     .ForMember(destPropertyName, s => s.MapFrom(result));
}

Метод To спроектирован так, чтобы его легко было расширять при добавлении параметров-кортежей. При добавлении в параметры еще одного кортежа, нужно добавить еще один generic, параметр, и вызов метода RegisterRule для нового параметра.

Пример для двух параметров:

IMappingExpression<TSource, TDest> To<TSource, TDest, TProjection, T, T1>
(this MapperExpressionWrapper<TSource,TDest,TProjection>mapperExpressionWrapper,
(Expression<Func<TDest, T>>, Expression<Func<TProjection, T>>) arg0,
(Expression<Func<TDest, T1>>, Expression<Func<TProjection, T1>>) arg1)
{
  RegisterByConvention(mapperExpressionWrapper);
  RegisterRule(mapperExpressionWrapper, arg0);
  RegisterRule(mapperExpressionWrapper, arg1);
  return mapperExpressionWrapper.MappingExpression;
}

Используем CSharpSyntaxRewriter, это визитор который проходится по узлам синтаксического дерева. За основу возьмем метод с To с одним аргументом и в процессе обхода добавим generic, параметр и вызов RegisterRule;

public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
{
  // Если это не метод To
  if (node.Identifier.Value.ToString() != "To") 
        return base.VisitMethodDeclaration(node);
  // returnStatement = return mapperExpressionWrapper.MappingExpression;
  var returnStatement = node.Body.Statements.Last();
  //beforeReturnStatements: 
  //[RegisterByConvention(mapperExpressionWrapper),
  // RegisterRule(mapperExpressionWrapper, arg0)]
  var beforeReturnStatements = node.Body.Statements.SkipLast(1);
  //добавляем вызов метода RegisterRule перед returStatement
  var newBody = SyntaxFactory.Block(
        beforeReturnStatements.Concat(ReWriteMethodInfo.Block.Statements)
       .Concat(new[] {returnStatement}));
  // возвращаем перезаписанный узел дерева
  return node.Update(
                node.AttributeLists, node.Modifiers,
                node.ReturnType,
                node.ExplicitInterfaceSpecifier,
                node.Identifier,
                node.TypeParameterList.AddParameters
                 (ReWriteMethodInfo.Generics.Parameters.ToArray()),
                node.ParameterList.AddParameters
                 (ReWriteMethodInfo.AddedParameters.Parameters.ToArray()),
                node.ConstraintClauses,
                newBody,
                node.SemicolonToken);
        }

В ReWriteMethodInfo лежат сгенерированные синтаксические узлы дерева, которые необходимо добавить. После этого мы получим список, состоящий их 10 объектов с типом MethodDeclarationSyntax (синтаксическое дерево, представляющее метод).

На следующем шаге возьмем класс, в котором лежит шаблонный метод To и запишем в него все новые методы используя другой Visitor, в котором переопределим VisitClassDeclatation.

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

public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
  {
      //todo refactoring it
      return node.Update(
                node.AttributeLists,
                node.Modifiers,
                node.Keyword,
                node.Identifier,
                node.TypeParameterList,
                node.BaseList,
                node.ConstraintClauses,
                node.OpenBraceToken,
                new SyntaxList<MemberDeclarationSyntax>(ReWriteMethods),
                node.CloseBraceToken,
                node.SemicolonToken);
        }

В конце концов мы получим SyntaxNode — класс с добавленными методами, запишем узел в новый файл.Теперь у нас появились перегрузки метода To принимающие от 1 до 10 кортежей и намного более лаконичный маппинг.


Точка расширения

Посмотрим на AutoMapper, как на нечто большее. Queryable Provider не может разобрать достаточно много запросов, и определенную часть этих запросов можно выполнить переписав по-другому. Вот тут в игру вступает AutoMapper, extension'ы это точка расширения, куда мы можем добавить свои правила.

Применим visitor из предыдущей статьи заменяющий интерполяцию строк конкатенацией в методе RegusterRule.В итоге все expression'ы, определяющие маппинг из сущности, пройдут через этот visitor, тем самым мы избавимся от необходимости каждый раз вызывать ReWrite.Это не панацея, единственное, чем мы можем управлять — проекция, но это все-равно облегчает жизнь.

Также мы можем дописать некоторые удобные extention'ы, например, для маппинга по условию:

CreateMap<Passport,PassportDto>()
.ToIf(x => x.Age, x => x < 18, x => $"{x.Age}", x => "Adult")

Главное не заиграться с этим и не начать переносить сложную логику на уровень отображения
Github

Let's block ads! (Why?)

56 миллионов евро штрафов — итоги года с GDPR

Опубликованы данные о суммарном размере штрафов за нарушения регламента.



/ фото Bankenverband PD

Кто опубликовал отчёт о размере штрафов


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

Первые штрафы по GDPR были невысокими из-за неготовности компаний к вступлению регулирования в силу. В основном нарушители регламента платили не более нескольких сотен тысяч евро. Однако общая сумма взысканий оказалась довольно внушительной — почти €56 млн. В отчёте EDPB привёл и другую информацию о «взаимоотношениях» ИТ-компаний и их клиентов.

О чём говорится в документе и кто уже заплатил штраф


За время действия регламента европейские регуляторные органы открыли около 206 тысяч дел о нарушении безопасности персональных данных. Почти половина из них (94 622) — по жалобам частных лиц. Граждане ЕС могут написать заявление о нарушениях в процессе обработки и хранения их персональных данных и обратиться в национальные регуляторные органы, после чего дело будут расследовать в юрисдикции определенной страны.
Главные темы, с которыми были связаны жалобы европейцев, — нарушение прав субъекта ПД и прав потребителей, а также утечки персональных данных.

Ещё 64 864 дела открыли по уведомлению об утечке данных от компаний-виновников происшествия. Точно неизвестно, сколько из дел завершились штрафами, но в сумме нарушители заплатили €56 млн. По словам экспертов по ИБ, большую часть этой суммы придётся выплатить Google. В январе 2019 года французский регуляторный орган CNIL вынес ИТ-гиганту штраф в €50 млн.

Разбирательство по этому делу длилось с первого дня действия GDPR — жалобу на корпорацию подал австрийский борец за защиту данных Макс Шремс (Max Schrems). Причиной недовольства активиста стали недостаточно точные формулировки в согласии на обработку персональных данных, которое пользователи принимают при создании аккаунта с Android-устройств.

До дела ИТ-гиганта штрафы за несоблюдение GDPR были значительно ниже. В сентябре 2018 года €400 тысяч заплатила португальская больница за уязвимость в системе хранения мед. записей, а €20 тысяч — немецкое чат-приложение (логины и пароли клиентов хранились в незашифрованном виде).

Что говорят эксперты о регламенте


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

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

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


/ фото Bankenverband CC BY-ND

Что дальше


Эксперты считают, что ИТ-компаниям пока рано расслабляться. Вероятнее всего, в будущем размеры штрафов за несоблюдение GDPR увеличатся.

Первая причина — частые утечки данных. Согласно статистике из Нидерландов, где о нарушениях хранения ПД сообщали и до GDPR, за 2018 год число уведомлений об утечках выросло в два раза. По словам эксперта по защите данных Гая Банкера (Guy Bunker), о новых нарушениях GDPR становится известно почти ежедневно, и поэтому в ближайшем будущем регуляторы станут относиться к провинившимся компаниям жёстче.

Вторая причина — окончание действия «мягкого» подхода. В 2018 году штрафы были крайней мерой — в основном регуляторы стремились помочь компаниям защитить данные клиентов. Однако уже сейчас в Европе рассматривается несколько дел, которые могут привести к крупным штрафам по GDPR.

В сентябре 2018 года масштабная утечка данных произошла в British Airways. Из-за уязвимости в платёжной системе авиакомпании хакеры получили доступ к данным кредитных карт клиентов на протяжении пятнадцати дней. По оценкам, от взлома пострадали 400 тысяч частных лиц. Специалисты по информационной безопасности ожидают, что авиакомпания может выплатить первый максимальный штраф в Великобритании — он составит €20 млн или 4% годового оборота корпорации (смотря какая сумма окажется больше).

Ещё один претендент на крупное финансовое наказание — Facebook. Ирландская комиссия по защите данных открыла против ИТ-гиганта десять дел из-за разных нарушений GDPR. Наиболее крупное из них произошло в прошлом сентябре — уязвимость в инфраструктуре социальной сети позволила хакерам получить токены для автоматического входа в систему. От взлома пострадали 50 млн пользователей Facebook, 5 млн из которых оказались жителями ЕС. Согласно изданию ZDNet, только эта утечка данных может обойтись компании в миллиарды долларов.

В итоге стоит быть готовыми к тому, что в 2019 году GDPR покажет свою силу, а регуляторные органы перестанут «закрывать глаза» на нарушения. Вероятнее всего, громких дел о нарушениях регламента в будущем станет только больше.



Посты из Первого блога о корпоративном IaaS:
О чем мы пишем в нашем Telegram-канале:

Let's block ads! (Why?)

[Из песочницы] На работу на велосипеде. Еще одно мнение


Внимание! Это не автор поста!

Вступление


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

Все начиналось прозаично. Однажды, теплым мартовским днем 2016 года, где-то между извилин подогретого первыми солнечными лучами мозга, появился зуд. Я вспоминал детство. Не вообще всё, а те моменты, когда я катил на велосипеде. Это было давно и последние годы моим основным транспортом до работы была электричка, метро и ноги. И я предложил жене купить по велосипеду. Так мы стали обладателями двух MTB (в простонародье «горных») аппаратов типа «Хардтейл». В начале были легкие покатушки по городу и парку «Лосиный остров». С каждым разом было интересно заехать в невиданные ранее уголки города и ближайшего пригорода. Тогда я и не думал, что так просто можно ездить на работу. Но такие мысли однажды появились. Я смотрел карту, видел там «Лосиный остров», он манил. И я поддался. Бумажная просека стала для меня откровением. Асфальтовая дорога в лесу. Так я доехал от Королёва до парка «Сокольники», а там было рукой подать до метро «Добрынинская», где я тогда и работал. И началось. За прошедшее время и тысячи километров появился некий опыт и мнение, которым я и постараюсь поделиться.

Что выбрать


Велосипедов много не бывает. Это вы поймете если появится увлечение. Так как здесь мы рассматриваем больше вариант катания на работу, то можно не обращать внимания на специфические их виды, оставив, IMHO, такие варианты:
  • MTB. Т. н. «горный» велосипед. Бывает только с амортизационной вилкой спереди (хардтейл), либо может иметь еще и амортизатор для заднего колеса («двухподвес»). Если на вашем пути нет безумного количества корней, глубокой грязи, ужасающего вида асфальта, то он вам не нужен. Если имеется только небольшой участок (два, три) с такими условиями, то он вам все равно не нужен. Мало того что адекватно работающие амортизаторы (они бывают разных типов) стоят довольно серьезных денег, их также надо квалифицированно обслуживать. А еще это лишний вес, о чем будет отдельная глава.
  • Шоссейный. Отличается от MTB иной геометрией рамы, отсутствием амортизации, и другим рулем (баран), который дает большую вариативность хватов, добавляя комфорта. Изначальная его стихия — асфальтовые дороги, но с ним совершенно ничего не случится от легкого и небольших участков среднего бездорожья. Считаю его оптимальным выбором.
  • Синглспид, в запущенных случаях фикс. Берите, если хочется потратить минимум денег, но имейте ввиду, что не стоит на этом типе ездить излишне динамично, у данных видов одна скорость (фиксированная передача), поберегите свои колени. Фикс отличается от синглспида отсутствием свободного вращения колеса отдельно от педалей. То есть если вращается колесо, то приходится вращать и педали. Это может быть травмоопасным, особенно на спуске с горки. Из плюсов вижу только пониженный вес и механику пониженной сложности.
  • Велосипед с планетарной втулкой. Очень хороший вариант для тех, кому по-максимуму просто ездить. Без попытки достичь каких-то высоких результатов. Прекрасен спрятанной внутрь втулки заднего колеса «коробкой передач», позволяющей переключаться даже стоя на месте (например для легкого старта, если забыл заранее скинуть передачу). Не менее весомым плюсом является упрощение цепного привода. Всего две шестерни, как на синглспидах, более прочная и износостойкая цепь. Надежность, простота и увеличение интервалов обслуживания. Иногда цепной привод можно заменить на ременной, что дает возможность вспоминать о трансмиссии примерно почти никогда.

Масса велосипеда


А тут много мнений, давайте разбираться. В принципе, чем легче велосипед, тем лучше, но существует некий предел, за которым возрастание цены за такой аппарат становится очень большим, а снижение массы очень маленьким. Также многие компоненты сверхлегкого (и сверхдорогого) класса имеют ограничение на максимальный вес ездока (обычно около 70-80 килограмм). Наиболее важна масса колес. Ведь колеса — это маховик, который вам надо будет раскручивать при каждом ускорении, а эти ускорения у вас будут постоянно. И чем легче этот маховик, тем приятнее вам. Вес рамы и других компонентов не так важен, но, согласитесь, довольно глупо иметь хорошие и легкие колеса и «чугунную», тяжелую раму. Все должно быть оптимально и сбалансировано. Лично для себя считаю оптимальными массу MTB менее 12 кг и массу шоссейника менее 9 кг. Но, повторюсь, не стоит гнаться за минимумом, особенно в начале своего велопути. Важно понимать, что движется не велосипед сам по-себе. Движется система из велосипедиста и велосипеда. Их массы сложены, и чем она больше, тем меньше влияния оказывает масса самого велосипеда. Неправы будут и те, кто считает что велосипед в 20 кг не сильно отличается от 12 кг. У меня есть MTB и шоссейник, так вот, когда я пересаживаюсь между ними, то ощущаю огромную разницу в динамичности и легкости, конечно, не в пользу первого. А разница эта всего около 6 кг, поэтому резюме: не пренебрегайте массой велосипеда, более легкий вариант подарит вам больше удовольствия и комфорта, но и не возводите ее в культ, помните, что самое важное — это масса колес, остальное менее ценно.

Материалы


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

Производитель


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

Сколько скоростей? Зачем так много?


Во времена рассвета 3й системы (трех звезд спереди) количество скоростей в велосипеде могло достигать 33. Много, да не совсем так. Реально из этого количества используется (обычно) не более трети. Что нам важно? Важно передаточное соотношение в трансмиссии. И в варианте с 33 скоростями было много «дублирующих», практически одинаковых передаточных соотношений, которые почти не использовались. Во многоскоростной трансмиссии велосипеда при обычном катании не рекомендуется сильно перекашивать цепь (например ставить ее на переднюю и заднюю самые большие звезды) — это ведет к повышенному износу всех элементов трансмиссии. Таким образом убывает еще несколько скоростей из нашего набора. В итоге получается что из 33 возможных вариантов установки цепи можно использовать 8-12 разумных. На настоящий момент 3 звезды спереди в новых велосипедах я не видел, на MTB даже существует тенденция к переходу на одну ведущую переднюю звезду, что позволяет избавиться от переднего переключателя, а на шоссейном велосипеде пока оптимально 2 ведущих звезды. Также в топовых наборах трансмиссии все чаще можно увидеть 12 скоростные варианты (имеется ввиду количество звезд сзади). Для MTB это позволяет увеличить диапазон передаточных соотношений, а для шоссеров уменьшить ступеньки при переходе между звездами (иногда случается что на текущей передаче слишком высокий каденс (частота педалирования), а на следующей, хоть он и ниже, но тяжеловато крутить).

Изначально я не планировал писать про выбор велосипеда, но, видя повальное катание народа на MTB, не смог удержаться. Исторически сложилось что после падения железного занавеса на территории экс-СССР первыми появился именно этот тип велосипедов, став, апостериори, «значением по-умолчанию» при выборе новичков. Хотя, в большинстве случаев, не являясь оптимальным. Обратите свое внимание на другие виды. И, особенно, на шоссейные.

Я хочу на велосипеде на работу, но у меня нет душа!


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

Одежда


Настоятельно рекомендую специализированную велоформу. При этом шорты использовать с т. н. «памперсом» — специализированной вшитой в область промежности вкладкой. Ее основное предназначение заключается в отводе влаги от контакта с кожей, что предотвратит появление разных неприятностей в виде натирания. Бонусом идет легкая амортизация задницы. Спецодежда очень удобна, к ней быстро привыкаешь, и обратно возвращаться уже нет никакого желания. Однажды я поехал домой в джинсах. Это были страдания — очень неудобно после нормальной велоформы. И очень нужны перчатки. Лучше с полноценными, не обрезанными пальцами. Сколько раз я был благодарен своим за спасение от приличных ссадин! Если ваши руки потеют в таких, то существуют хорошо вентилируемые, но, тем не менее, полноразмерные модели. Велошорты же рекомендую с лямками — это удобнее (ничего не сползает).

Шлем


На одном из перекрестков, ожидая светофор, водитель авто спросил меня про шлем. Мол зачем он мне. Я снял и показал царапины на нем от небольших падений, этого объяснения ему хватило. Про большие скорости говорить не будем, там все понятно, войны часто идут про низкие, до 20 км/ч. «Я успею выставить руки». Успеешь. Выставишь. А однажды, гарантированно, не успеешь. Я падал на разных скоростях, шлем нужен. Кстати, его положено менять после инцидентов, даже если нет видимых повреждений, но мало кто так делает.

Седло


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

Нужно выяснить расстояние между этими костями, для чего существуют разные способы, многие из которых отлично показаны на ютьюбе. К полученному значению надо добавить около 20 мм и выбирать седло с примерно аналогичной шириной. Оно должно быть достаточно жесткое, но не «деревянное». И первую неделю, скорее всего, вы будете к нему привыкать, вам, возможно, будет довольно больно. Но вы берите и садитесь, вскоре все наладится и будет замечательно. Я так начинал 3 сезона подряд, а потом проехал на одной из популярных моделей, и влюбился в нее. Купил, но еще полноценно не катал. Рекомендую попробовать седла с вырезом, лично мне понравилось.

Посадка


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

Если становится скучно


Мне кажется, что невозможно быть в велосообществе, и не услышать слово Strava. Я не стал исключением, я его слышал. Но первые 700 километров моей современной веложизни обходились как-то без нее. Но любопытство пересилило. Оказывается, это целый мир, где ты можешь встретить единомышленников, сокатальцев, узнать, кто же это такой резвый со свистом обогнал тебя сегодня вечером, пока ты думал что быстрее тебя нужно поискать! И, иногда, встретить свою судьбу, да, девушки тоже пользуются этой соцсетью.
И девушки, что характерно, могут!



И не только велосипедистки, еще бегуньи и любительницы других видов спорта. Но больше всего меня привлекла возможность заочных соревнований. Strava позволяет записывать каждую вашу поездку, причем не только GPS трек, но и скорость, а также другие параметры, в зависимости от установленных на велосипед датчиков. И делиться ими. Также любой может выделить участок пути, сделать его публичным (или закрытым — только для себя), и устроить заочные соревнования. Любой, проехавший по этому участку, будет заноситься в таблицу согласно достигнутой средней скорости. Довольно мотивирующая и интересная штука. Так я познакомился с несколькими хорошими людьми, сделал свои поездки интереснее!

Апгрейд. Если страсть как хочется улучшить свой велосипед


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

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

Где-то в тот же момент я перешел на контактные педали. Это когда на специальную велообувь прикручивается т. н. шип, позволяющий жестко пристегнуть ногу к педали. Поворотом ноги пяткой наружу можно отстегнуться. С тех пор я не катал больше на классических педалях, так как плюсов слишком много, а минусов мало. Это и повышенная эффективность педалирования (появляется возможность не только давить на педаль, но и тянуть ее на обратном ходе) и фиксация стопы на педали, а ведь сколько раз у меня срывалась нога с обычных топталок! Да, в контактной обуви перед остановкой надо выстегнуться, по началу падения бывают (обычно на нулевой скорости), но очень быстро появляется условный рефлекс. А иногда ты выстегиваешь одну ногу, а падать начинаешь в сторону другой — это тоже забавно. Но эти минусы слишком ничтожны чтобы отбрасывать контактные педали со счета.

Следующий апгрейд самый дорогой, возможно неразумный для уровня MTB которым я владею, но я с детства питаю слабость к различным сервоприводам. Вобщем была установлена система переключения передач с электроприводом. Это когда между селектором передач на руле и самим переключателем идут не тросики, а провода. И переключение происходит при помощи электрического сервопривода. И да, теперь мне приходится иногда (примерно раз в 1000-1500 км) заряжать аккумулятор этой системы в велосипеде. Но я очень доволен ее работой! Очень! Все быстро, четко, с возможностью автоматического переключения переднего переключателя в зависимости от положения заднего.

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

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

Особенно запомнилась покупка рамы и колес.

Самое правильное время для покупки велотоваров — это зима. В ноябре 2017 на одном из европейских интернет магазинов я обнаружил неплохие велорамы. Сделал заказ и оплатил. Я ждал несколько дней, наконец получив письмо с сожалениями о невозможности выполнить заказ. Это было фиаско, я немного поругался, но, естественно, это не помогло. Мне вернули деньги. Обратно в рубли. На двойной конвертации я потерял около 5000 рублей. Я был зол, очень зол, но время шло, рама была нужна, а в этом магазине появилась скидка на еще более лучшую раму. Со скрипом в душе я ее оплатил, а на следующий день поехал растамаживать ее во Внуково. Потому что отправили ее UPS'ом, что модно, быстро, но имеет последствия. Я не хотел платить таможенному брокеру и выполнил все процедуры самостоятельно, обогатив наше государство на несколько тысяч рублей. А через неделю цена на эту раму упала примерно на 300 британских фунтов. Я негодовал, и с помутненным разумом написал в магазин что я расстроен. Не только упавшей ценой, но и предыдущим их косяком с пересортицей. В ответ я получил письмо с купоном на 350 фунтов на следующую покупку, которую я и сделал. Это оказались колеса. Хорошие, приятные колеса, которые мне очень нравятся, сейчас они стоят в 2 раза дороже той суммы, что я за них отдал тогда. Ловите распродажи!


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

Есть два но:

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


Но помните, что бы вы не делали, вас настигнет фраза «It never gets easier, you just go faster!»

Еда и питье


Еда не имеет особого значения при ваших покатушках на небольшие расстояния, но возрастает ее роль, стоит отъехать от дома подальше. Расписывать этапы метаболизма не буду, скажу лишь что нужна глюкоза. Определенные ее запасы (в виде гликогена) имеются в самих мышцах и используются для быстрого получения энергии. Далее к процессу подключается печень, ну и по окончании гликогена и в этом хранилище в дело вступают запасы жира. Беда в том что последний процесс не быстрый и есть шансы не успеть получить топливо в нужном количестве. А это называется гипогликемия (в простонародье Бонк). Я имел удовольствие попасть в такую ситуацию, благо до дома оставалось немного. Ощущения бренности бытия, ненависти ко всему, абсолютная вялость любого движения, вероятность туннельного зрения и затуманивания сознания — вот эти вот все приятные вещи прилагаются. Надо срочно съесть сладкого, поэтому берите быстрые углеводы в дальний путь. Хорошо идут шоколадные батончики, бананы, орехи и т. п.
А вода нужна! Я при поездках на работу (расстояние около 23-24 км) не беру, но вот дальше обязательно. В движении, да на солнце, человек испаряет с себя уйму влаги, а она ой как нужна всему организму, в том числе коленным суставам, в которых начинает терять свойства «смазочная» жидкость, что очень и очень плохо в перспективе. Хорошо помню свою поездку Королёв — Углич — Рыбинск (308 км). Вода кончилась за 60 км до Углича и я страдал. Но выпросил у местных литр, на котором и доехал до города. Но это сказалось на организме, и от Углича до Рыбинска было очень не очень! Вобщем без воды плохо!

Инструмент


На новый сезон купил себе инструментальную бутылку во флягодержатель. В ней запасная камера, мининасос и монтажки. Ну и неплохо взять специальный велосипедный мультитул. В моем шоссейнике не быстросъемные оси, поэтому без шестигранника колесо не снять. В принципе считаю это необходимым минимумом. В прошлом году ездил без этого набора, что дало мне возможность прогуляться вдоль всей Бумажной просеки до МКАД. И все бы ничего, но моя шоссейная резина была повреждена, так как жесткие борта ободов прилично потерли торцы покрышки, пока я катил велосипед со спущенным задним. Зело неприятно, резина не копеечная.

Инциденты


Бывало разное:
  • Один раз я ехал домой. Скорость примерно 35, я в думах. Вижу впереди девочка едет в том же направлении. Добавил бокового интервала, почти догнал. И тут она делает рулем влево, хорошо так делает, уверенно, чувствуется опыт. В принципе окончилось все хорошо. На девочке, мне и велосипедах царапин нет, я получил опыт полетов и пачку выводов. Теперь я очень опасаюсь детей, будучи на велосипеде. Нет, я и раньше опасался, ну тут-то прямо совсем опасаюсь, чего и вам крайне рекомендую
  • Собаки. Я от них уезжаю, так как могу. Кто не может — возите балончик к примеру, если ваш путь пролегает в местах потенциально особаченных. Собаки очень мотивируют на скоростные рекорды
  • Однажды я ехал по проезжей части. Навстречу по тротуару (хороший такой, широкий тротуар) шел незнакомец. И я бы не помнил его так хорошо, если бы он на сделал шаг прямо мне под колеса. Да, с тротуара на проезжую часть. Нет, там не было пешеходного перехода. Нет, он не смотрел на меня, он оглядывался назад в этот момент. Опасайтесь незнакомцев, они, иногда, внезапны
  • Дождь. Вы едете такие, наслаждаетесь. В лужах отражаются деревья. Это и красиво и плохо. Вы не видите что под лужами. Один мой приятель так въехал на 33 км/ч. Ямка была небольшая, но достаточная. И ездил он по этой дороге более тысячи раз. Аккуратнее, не повторяйте ошибок, в таких условиях снижайте скорость, старайтесь по лужам не ездить. Кстати, под дождем ездить не страшно. У вас есть два варианта. Первый — купить хорошую экипировку (в дождевиках вы сопреете!) и она вас будет какое-то время защищать, но не бесконечно. Второй — как можно быстрее вымокнуть. Потом становиться весело и безразлично — нисколечки не вру. И возите в кармане полиэтиленовый пакетик. В него вы завернете свой телефон, так как ему безразлично не будет.
  • Дорожная разметка. Она скользкая если сырая. Очень! Я на малой скорости один раз буквально дотронулся до тормоза, после чего стремительным домкратом. Легкая грязь на асфальте, а также песок работает аналогично. К спору о шлемах. Тот же самый товарищ поворачивал в парке налево. Асфальт был просто мокрый, но дело не в нем. Накануне работники парка замалевали черной краской что-то в этом месте на нем. Абсолютно незаметно, но очень скользко.
  • Внезапно открывающиеся двери припаркованных авто. Ну это классика! Запишите себе алгоритм повышенной осторожности на подкорку.
  • Ну и простые перепалки с автомобилистами. Есть и хорошие люди. Остановились, подняли утерянную сумку, соскользнувшую с велосипеда, догнали и вручили. И есть другие, в меня, например, натурально плевали через полосу, да такое бывало. В любом случае, на дороге будьте предельно осторожны и много вертите головой.

Окончание


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

Let's block ads! (Why?)