Татикома
Татикома (яп. タチコマ Татикома) — вымышленный разумный колёсно-шагающий робот-танкетка из вселенной аниме и манги «Призрак в доспехах».
Комментарии с хабра: https://habr.com/ru/post/452054/
Изображение отсюда: Татикома
Татикома (яп. タチコマ Татикома) — вымышленный разумный колёсно-шагающий робот-танкетка из вселенной аниме и манги «Призрак в доспехах».
Комментарии с хабра: https://habr.com/ru/post/452054/
Изображение отсюда: Татикома
Мы много пишем о серьезных вещах из мира ЦОДов: о требованиях к дата-центрам, сертификации, устройстве инженерных систем. Но в наше напряженное время хочется постов и для пользы, и для настроения. Сегодня предлагаю по-новому взглянуть на такую сложную штуку, как сертификация дата-центра по стандарту Tier от Uptime Institute. Объясню требования к резервированию на пиве.
Стандарт Uptime Institute оценивает дата-центр и присваивает ему один из 4 уровней: Tier I, Tier II, Tier III и Tier IV. Чем выше уровень, тем лучше дата-центр должен продумать страховку от разных рисков, например: если оборудование выйдет из строя или отключится электричество.
Резервирование – и есть такая страховка на всякий случай. Для разного уровня Tier нужен разный уровень резервирования: N + 1, N + 2, 2N или 2(N + 1). N – это минимальное количество оборудования, без которого ЦОД не сможет работать. Отмечу, что для резервирования важен не только запас по количеству оборудования, но и запасные пути дистрибуции: кабели питания, трассы, трубопроводы и так далее. Об этом мы тоже поговорим.
Итак, представим, что мы не в дата-центре, а в обычной квартире. Вечером нам будет нужно 2 бутылки пива. Две бутылки пива – это N.
Как с этой точки зрения выглядит резервирование по стандартам Tier:
Tier 0: Знаем, что нужно 2 бутылки, но заведомо обманываем себя и покупаем одну.
Тут комментировать нечего: сами дураки.
Tier I. Покупаем ровно 2 бутылки пива. Вроде все хорошо, но если одна бутылка разобьется или окажется просроченной, то пива нам не хватит.
В ЦОДе это бы значило, что никакого резервного оборудования нет. Любая поломка – и работа остановится.
Tier II. Мы научены горьким пивом опытом и покупаем 3 бутылки пива, с запасом. Это уже вид резервирования N+1.
Мы молодцы, зарезервировали пиво, но несем все 3 бутылки в одном пакете. Мы не зарезервировали пути дистрибуции: если пакет порвется, мы потеряем все пиво.
В ЦОДе это выглядит так: у нас уже есть резервный элемент, например, запасной кондиционер.
Но если мы запитаем его от одного источника, то не сможем застраховать этот кондиционер от перебоев питания.
Tier III. Нам нужно зарезервировать как сами бутылки, так и пути дистрибуции. Как это сделать?
Первый вариант: покупаем два пакета, вставляем один в другой и несем! Хороший, проверенный вариант, а главное – надежный. Пиво разобьется с меньшей вероятностью. Например, если его выбить из руки.
В дата-центре это бы значило, что у нас есть запасной кондиционер и к нему подведены 2 источника элекропитания.
Второй вариант: покупаем 4 бутылки и 2 пакета, в каждый кладем по 2 пива. Это резервирование 2N. Один пакет берем в одну руку, второй в другую. Вариант сверхнадежный, тут даже на Tier IV замахиваемся, но, к сожалению, дорогой.
В таком ЦОДе дублируется все: есть 2 основных источника питания от разных трансформаторов, каждый из них продублирован резервным источником питания от дизель-генераторных установок, кондиционеров в 2 раза больше, чем нужно, и у каждого есть 2 блока питания от разных лучей, и так далее.
Можем сделать чуть дешевле: купить только 3 бутылки пива, но 2 пакета, и сложить пакеты друг в друга. Один порвется – ничего страшного.
Tier IV. Тут у нас появляется новое страшное слово, практически проверка – не много ли пива выпито. Попробуйте выговорить с первого раза: компартментализация путей дистрибуции!
Для ЦОД это бы значило, что на всех участках трассы, трубопроводы, кабели питания должны идти разными путями, настолько разными, что хоть пожар, хоть потоп, хоть страшный экскаватор.
Так и у нас с нашим ценным грузом: хоть пожар, хоть злая собака, хоть гопники за углом.
Тут нужна помощь друга. Каждый из вас должен зайти в разные магазины, купить по 4 бутылки, распределить их по две штуки в разные пакеты, взять в разные руки и пойти разными путями. Встретиться можно только в квартире. Что бы ни случилось, вы все равно вечером получили свой необходимый N.
Как это будет в ЦОДе: два трансформатора, 2 ДГУ, 2 ИБП – и все это в разных помещениях, и кабели питания идут разными путями, защищенными, как кортеж президента.
Сложно? А может быть еще сложнее: модный нынче уровень резервирования 3/2
(есть еще и 6/5, но его нужно объяснять на более крепких напитках).
Зовем третьего друга, у каждого по бутылке в каждой руке, еще одна – в рюкзаке за плечами. Хоть пакеты не нужно покупать, и то хорошо. Каждый идет разными дорогами из разных магазинов, и не дай бог пути пересекутся. Для чего это нужно? Допустим, у одного человека разбились все три бутылки, и он вернулся домой грустный. Два друга справились с задачей, и у вас на троих осталось 6 – ровно столько, сколько нужно!
Таким образом мы экономим на общем количестве, но усложняем процесс распределения мощности между потребителями. Ведь, если собрались втроем, как тут остановиться на двух и правильно распределить на всех… Но это уже совсем другая история.
Честно стырено с хабра
Исследователи из Лаборатории социальной робототехники Йельского университета изучали, как собаки реагируют на команды роботов. Для эксперимента пригласили добровольцев, чьи собаки знают команду «сидеть». Тестировали умную колонку и маленького робота.
Сначала изучили три разных ситуации взаимодействия собак с их хозяевами: а) хозяева были вместе с собаками; б) хозяева общались с питомцами с помощью интерактивных видео в реальном времени; в) общение через динамики. Через динамики – хуже всего.
Ниже ссылка на источник, где есть видео эксперимента.
https://habr.com/ru/news/t/502016/Что такое Jest?
Как указано на домашней странице проекта:
Jest — это восхитительная среда тестирования JavaScript с упором на простоту.И действительно, Jest очень простой. Он не требует дополнительных настроек, легкий в понимании и применении, а так же имеет довольно хорошую документацию. Отлично подходит для проектов использующих Node, React, Angular, Vue, Babel, TypeScript и не только.
Установка.
Для установки Jest в ваш проект выполните:
npm install --save-dev jest
Если вы используете yarn:
yarn add --dev jest
После установки можете обновить секцию scripts вашего package.json:
“scripts” : {
“test”: “jest”
}
С помощью такого простого вызова мы уже можем запустить наши тесты (на самом деле jest потребует существование хотя бы одного теста)
npm install jest --global
И соответственно для yarn:
yarn global add jestl
После этого вы можете использовать jest непосредственно из командной строки.
При помощи вызова команды jest --init в корне проекта, ответив на несколько вопросов, вы получите файл с настройками jest.config.js. Или можно добавить конфигурацию прямиком в ваш package.json. Для этого добавьте в корень json ключ «jest» и в соответствующем ему объекте можете добавлять необходимые вам настройки. Сами опции мы разберем позже. На данном этапе в этом нет необходимости, поскольку jest можно использовать «сходу», без дополнительных конфигураций.
Первый тест
Давайте создадим файл first.test.js и напишем наш первый тест:
//first.test.js
test('My first test', () => {
expect(Math.max(1, 5, 10)).toBe(10);
});
И запустим наши тесты с помощью npm run test или непосредственно командой jest (если он установлен глобально). После запуска мы увидим отчет о прохождении тестов.
<b>PASS</b> ./first.test.js
✓ My first test (1 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.618 s, estimated 1 s
Давайте «сломаем» наш тест и запустим jest повторно:
//first.test.js
test('My first test', () => {
expect(Math.max(1, 5, 10)).toBe(5);
});
Как мы видим, теперь наш тест не проходит проверки. Jest отображает подробную информацию о том, где возникла проблема, какой был ожидаемый результат, и что мы получили вместо него.
Теперь давайте разберём код самого теста. Функция test используется для создания нового теста. Она принимает три аргумента (в примере мы использовали вызов с двумя аргументами). Первый — строка с названием теста, его jest отобразит в отчете. Второй — функция, которая содержит логику нашего теста. Также можно использовать 3-й аргумент — таймаут. Он является не обязательным, а его значение по умолчанию составляет 5 секунд. Задаётся в миллисекундах. Этот параметр необходим когда мы работаем с асинхронным кодом и возвращаем из функции теста промис. Он указывает как долго jest должен ждать разрешения промиса. По истечению этого времени, если промис не был разрешен — jest будет считать тест не пройденным. Подробнее про работу с асинхронными вызовами будет в следующих частях. Также вместо test() можно использовать it(). Разницы между такими вызовами нету. it() это просто алиас на функцию test().
Внутри функции теста мы сначала вызываем expect(). Ему мы передаем значение, которое хотим проверить. В нашем случае, это результат вызова Math.max(1, 5, 10). expect() возвращает объект «обертку», у которой есть ряд методов для сопоставления полученного значения с ожидаемым. Один из таких методов мы и использовали — toBe.
toBe() - подходит, если нам надо сравнивать примитивные значения или является ли переданное значение ссылкой на тот же объект, что указан как ожидаемое значение. Сравниваются значения при помощи Object.is(). В отличие от === это дает возможность отличать 0 от -0, проверить равенство NaN c NaN.
toEqual() — подойдёт, если нам необходимо сравнить структуру более сложных типов. Он сравнит все поля переданного объекта с ожидаемым. Проверит каждый элемент массива. И сделает это рекурсивно по всей вложенности.
test('toEqual with objects', () => {
expect({ foo: 'foo', subObject: { baz: 'baz' } })
.toEqual({ foo: 'foo', subObject: { baz: 'baz' } }); // Ок
expect({ foo: 'foo', subObject: { num: 0 } })
.toEqual({ foo: 'foo', subObject: { baz: 'baz' } }); // А вот так ошибка.
});
test('toEqual with arrays', () => {
expect([11, 19, 5]).toEqual([11, 19, 5]); // Ок
expect([11, 19, 5]).toEqual([11, 19]); // Ошибка
});
toContain() — проверят содержит массив или итерируемый объект значение. Для сравнения используется оператор ===.
const arr = ['apple', 'orange', 'banana'];
expect(arr).toContain('banana');
expect(new Set(arr)).toContain('banana');
expect('apple, orange, banana').toContain('banana');
toContainEqual()— проверяет или содержит массив элемент с ожидаемой структурой.
expect([{a: 1}, {b: 2}]).toContainEqual({a: 1});
toHaveLength()— проверяет или свойство length у объекта соответствует ожидаемому.
expect([1, 2, 3, 4]).toHaveLength(4);
expect('foo').toHaveLength(3);
expect({ length: 1 }).toHaveLength(1);
toBeNull() — проверяет на равенство с null.
toBeUndefined() — проверяет на равенство с undefined.
toBeDefined() — противоположность toBeUndefined. Проверяет или значение !== undefined.
toBeTruthy() — проверяет или в булевом контексте значение соответствует true. Тоесть любые значения кроме false, null, undefined, 0, NaN и пустых строк.
toBeFalsy() — противоположность toBeTruthy(). Проверяет или в булевом контексте значение соответствует false.
toBeGreaterThan() и toBeGreaterThanOrEqual() — первый метод проверяет или переданное числовое значение больше, чем ожидаемое >, второй проверяет больше или равно ожидаемому >=.
toBeLessThan() и toBeLessThanOrEqual() — противоположность toBeGreaterThan() и toBeGreaterThanOrEqual()
toBeCloseTo() — удобно использовать для чисел с плавающей запятой, когда вам не важна точность и вы не хотите, чтобы тест зависел от незначительной разницы в дроби. Вторым аргументом можно передать до какого знака после запятой необходима точность при сравнении.
const num = 0.1 + 0.2; // 0.30000000000000004
expect(num).toBeCloseTo(0.3);
expect(Math.PI).toBeCloseTo(3.14, 2);
toMatch() — проверяет соответствие строки регулярному выражению
expect('Banana').toMatch(/Ba/);
toThrow() — используется в случаях, когда надо проверить исключение. Можно проверить как сам факт ошибки, так и проверить на выброс исключения определенного класса, либо по сообщению ошибки, либо по соответствию сообщения регулярному выражению
function funcWithError() {
throw new Error('some error');
}
expect(funcWithError).toThrow();
expect(funcWithError).toThrow(Error);
expect(funcWithError).toThrow('some error');
expect(funcWithError).toThrow(/some/);
not — это свойство позволяет сделать проверки на НЕравенство. Оно предоставляет объект, который имеет все методы перечисленные выше, но работать они будут наоборот.
expect(true).not.toBe(false);Давайте напишем пару простых тестов. Для начала создадим простой модуль, который будет содержать несколько методов для работы с окружностями.
expect({ foo: 'bar' }).not.toEqual({});
function funcWithoutError() {}
expect(funcWithoutError).not.toThrow();
// src/circle.jsДалее добавим тесты:
const area = (radius) => Math.PI * radius ** 2;
const circumference = (radius) => 2 * Math.PI * radius;
module.exports = { area, circumference };
// tests/circle.test.jsВ этих тестах мы проверили результат работы 2-х методов — area и circumference. При помощи метода toBeCloseTo мы сверились с ожидаемым результатом. В первом случае мы проверили или вычисляемая площадь круга с радиусом 5 приблизительно равна 78.54, при этом разница с полученым значением (оно составит 78.53981633974483) не большая и тест будет засчитан. Во втором мы указали, что нас интересует проверка с точностью до 1 знака после запятой. Также мы вызвали наши методы без аргументов и проверили результат с помощью toBeNaN. Поскольку результат их выполнения будет NaN, то и тесты будут пройдены успешно.
const circle = require('../src/circle');
test('Circle area', () => {
expect(circle.area(5)).toBeCloseTo(78.54);
expect(circle.area()).toBeNaN();
});
test('Circumference', () => {
expect(circle.circumference(11)).toBeCloseTo(69.1, 1);
expect(circle.circumference()).toBeNaN();
});
Разберём ещё один пример. Создадим функцию, которая будет фильтровать массив продуктов по цене:
// src/productFilter.jsИ добавим тест:
const byPriceRange = (products, min, max) =>
products.filter(item => item.price >= min && item.price <= max);
module.exports = { byPriceRange };
// tests/product.test.jsВ этом тесте мы проверяем результат работы функции byRangePrice. Сначала мы проверили соответствие длины полученного массива ожидаемой — 2. Следующая проверка требует, чтобы в массиве находился элемент — { name: 'tomato', price: 26 }. Объект в массиве и объект переданный toContainEqual — это два разных объекта, а не ссылка на один и тот же. Но toContainEqual сверит каждое свойство. Так как оба объекта идентичные — проверка пройдет успешно. Далее мы используем toEqual для проверки структуры всего массива и его элементов. Методы toBeGreaterThanOrEqual и toBeLessThanOrEqual помогут нам проверить price первого и второго элемента массива. И, наконец, вызов not.toContainEqual сделает проверку, не содержится ли в массиве элемент — { name: 'orange', price: 38 }, которого по условию там быть не должно.
const productFilter = require('../src/producFilter');
const products = [
{ name: 'onion', price: 12 },
{ name: 'tomato', price: 26 },
{ name: 'banana', price: 29 },
{ name: 'orange', price: 38 }
];
test('Test product filter by range', () => {
const FROM = 15;
const TO = 30;
const filteredProducts = productFilter.byPriceRange(products, FROM, TO);
expect(filteredProducts).toHaveLength(2);
expect(filteredProducts).toContainEqual({ name: 'tomato', price: 26 });
expect(filteredProducts).toEqual([{ name: 'tomato', price: 26 }, { name: 'banana', price: 29 }]);
expect(filteredProducts[0].price).toBeGreaterThanOrEqual(FROM);
expect(filteredProducts[1].price).toBeLessThanOrEqual(TO);
expect(filteredProducts).not.toContainEqual({ name: 'orange', price: 38 });
});
Источник: https://habr.com/ru/post/502302/
Знаете, у меня, как у человека сведущего в сфере информационных технологий всегда попа болела на тему бесплатных антивирусов, но это уже прям что то интересное. Статья из Хабра:
"Что если я Вам скажу, что единственной функцией одного из компонентов антивирусного ПО, имеющего доверенную цифровую подпись, является сбор всех Ваших учетных данных сохраненных в популярных Интернет-браузерах? А если я скажу что ему без разницы в чьих интересах их собирать? Наверное подумаете что я брежу. А давайте посмотрим как на самом деле?
Разбираемся
Живет себе и здравствует такая антивирусная компания как Avira GmbH & Co. KG. Выпускает различные продукты связанные с информационной безопасностью. В ассортименте даже есть бесплатные продукты для домашнего использования.
Установим себе интереса ради бесплатную версию, посмотреть что умеет продукт немецких коллег. Пробегаем взглядом по интерфейсу – ничего необычного. Не находим никакого упоминания еще одного из продуктов компании – Avira Password Manager.
А давайте заглянем в компонент с ничем не привлекающим внимание именем «Avira.PWM.NativeMessaging.exe»? Он скомпилирован для платформы .NET и никак не обфусцирован, поэтому загружаем его в dnSpy и свободно изучаем код программы.
Программа консольная и она ожидает команд в стандартном потоке ввода. Главная функция при помощи «Read» считывает данные с потока, проверяет формат и передает команду в функцию «ProcessMessage». Та же, в свою очередь, проверяет что переданная команда является "fetchChromePasswords" или "fetchCredentials" (хотя какая разница если дальнейшее поведение одинаковое?) и тогда начинается самое интересное – вызов функции «RetrieveBrowserCredentials». Интересно даже… что может делать функция с таким именем?
Да ничего необычного, просто собирает в один список все учетные записи пользователя, сохраненные им при работе с Интернет-браузерами «Chrome», «Opera» (на базе Chromium), «Firefox» и «Edge» (на базе Chromium) и возвращает данные в виде JSON-объекта.
Ну а затем выводит собранные данные в консоль:
Суть проблемы:
1. Компонент собирает пользовательские учетные данные;
2. Компонент не верифицирует вызывающую программу (например, по наличию у неё цифровой подписи самого производителя);
3. Компонент имеет «доверенную» цифровую подпись и не вызывает подозрение у других производителей антивирусного ПО;
4. Компонент работает как отдельное приложение.
По данной проблеме был заведен CVE-2020-12680.
Об этой проблеме мною 07.04.2020 было направлено письмо в адрес support@avira.com и info@avira.com с полным описанием. Ответных писем, включая от автоматических систем не поступало. Спустя месяц описываемый компонент всё так же распространяется в дистрибутиве Avira Free Antivirus."
Прескриптум: Полностью текст вставить не получилось, его много, поэтому тут начало статьи, а дальше ссылка. В случае блокировки статьи на Хабре (а такое уже было) выложу сохраненный pdf
...
https://habr.com/ru/post/501256/
На Хабре уже есть материалы, углубляющиеся в некоторые технические стороны крушений последнего самолета Boeing. Эта драматическая статья рассказывает, что к этим крушениям привело.
Почти за два десятка лет до того, как система MCAS компании Boeing погубила два новых самолета 737 MAX, Стэн Соршер знал, что все более токсичная обстановка в его компании приведет к какой-то катастрофе. «Культура безопасности», которая долго была предметом гордости, стремительно вытеснялась, по его словам, «культурой финансовой херни, культурой группового мышления».
Соршер, физик, проработавший в компании Boeing более двух десятилетий и возглавлявший там переговоры о создании профсоюза инженеров, стал одержим культурой управления. Он сказал, что ранее не представлял, что смелая новая управленческая каста Boeing создаст такую глупую и вопиюще очевидную проблему, как MCAS (Maneuvering Characteristics Augmentation System; система улучшения характеристик маневрирования, как ее окрестила горстка разработчиков ПО). В основном его беспокоило, что сокращение доли рынка будет уменьшать продажи и численность сотрудников, то есть то, что не дает спать по ночам постиндустриальным американским профсоюзным лидерам. В какой-то степени, однако, он все это предвидел; он даже показал, как убытки от запрета полетов самолета перекроют краткосрочные экономии от аутсорсинга в одном из своих докладов, который никто не читал, еще в 2002 году.
...
Не, ну какая рукотворность? Что за бред? Думал я, когда впервые услышал гипотезу о том, что Ковид-19 вызван то ли лабораторной утечкой, то ли вообще целенаправленной биоатакой. И каждый раз просто отмахивался от этих домыслов, когда они в очередной раз доплывали до меня в бурном потоке коронавирусного инфошума. Ну подумаешь, есть в Ухане институт вирусологии, мало ли.
В какой-то момент отмахиваться уже пришлось аргументированно, потому что сторонники рукотворности начали обосновывать свои тезисы о возможной искусственной природе вируса доводами из молекулярной биологии, и тут уже хотелось в пух и прах разбить их конспирологию холодными научными фактами. Уж если не как авторы статьи в Nature (казалось мне), то хотя бы как уважаемый мной Панчин.
И вот тут, в погоне за доводами против рукотворности вируса, меня и заразил вирус сомнений. В чём, собственно, причина сомнений? В том, что чем глубже погружаешься в деятельность коронавирусологов за последние 15–20 лет, тем лучше понимаешь, что создание ровно таких химер как CoV2 у них было обыденным делом. А CoV2 — это очевидная химера, основанная на летучемышином штамме RaTG13, у которого в шиповидном белке место связывания с рецептором (RBM) заменено с летучемышиного на панголиний, и вдобавок врезан особый участок из 4-х аминокислот, создавший furin cleavage site, который, как ранее выяснили вирусологи, значительно расширяет «репертуар» вируса в плане того, в чьи клетки он может проникать. Скорее всего, именно благодаря этому новому фуриновому сайту, новый мутант и сумел перескочить с исходных носителей на людей.
С учётом тех высот, которых сегодня достигла генная инженерия, синтетически собрать CoV2 по вышеописанной методике не составило бы труда даже начинающему специалисту. Ведь вирусологи, включая руководителя коронавирусного направления в Уханьском институте вирусологии Ши Чжэнли, такими вещами уже неоднократно занимались — как заменой RBM у одного вида вируса на RBM из другого (вот работа группы Ши Чжэнли от 2007 года), так и добавлением нового фуринового сайта, способного дать специфичному к одному виду животных коронавирусу возможность начать использовать рецептор ACE2 других видов.
Полную статью копировать сюда, почти тоже самое что постить войну и мир на пикабу, кому интересны аргументы и доводы ссылка на пост на хабре https://habr.com/ru/post/497956/