...

суббота, 11 мая 2019 г.

[Из песочницы] Пишите меньше кода

Хайп по Svelte после недавнего релиза 3 версии фреймворка всё-таки имеет место быть, чему свидетельствуют сильно возросшее комьюнити и огромное количество вопросов как в официальном чате, так и в нашем рускоязычном telegram-канале. Всё больше разработчиков украдкой или всерьёз присматриваются к этой технологии и задумываются о её применении в своих новых проектах. Для этих разработчиков и всех прочих интересующихся темой максимально эффективного написания кода, Rich Harris, автор и идеолог фреймворка, опубликовал статью о том, как Svelte помогает разработчику минимизировать усилия при создании современных реактивных web-приложений, перевод которой я и предлагаю ниже.

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

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

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

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


Читаемость кода — это важно

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

for (let i = 0; i <= 100; i += 1) {
    if (i % 2 === 0) {
        console.log(`${i} — чётное`);
    }
}

… во что-то неудобоваримое:

for (let i = 0; i <= 100; i += 1) if (i % 2 === 0) console.log(`${i} — чётное`);

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


Да, я говорю о Svelte

Сокращение объёма кода, который нужно писать, является очевидным преимуществом Svelte. Чтобы проиллюстрировать это, давайте посмотрим на очень простой компонент, реализованный на React, Vue и Svelte. Сначала, версия Svelte:

<script>
    let a = 1;
    let b = 2;
</script>

<input type="number" bind:value={a}>
<input type="number" bind:value={b}>

<p>{a} + {b} = {a + b}</p>

Посмотреть в действии

Как мы сделаем то же самое в React? Скорее всего, это будет выглядеть примерно так:

import React, { useState } from 'react';

export default () => {
    const [a, setA] = useState(1);
    const [b, setB] = useState(2);

    function handleChangeA(event) {
        setA(+event.target.value);
    }

    function handleChangeB(event) {
        setB(+event.target.value);
    }

    return (
        <div>
            <input type="number" value={a} onChange={handleChangeA}/>
            <input type="number" value={b} onChange={handleChangeB}/>

            <p>{a} + {b} = {a + b}</p>
        </div>
    );
};

И, наконец, в Vue:

<template>
    <div>
        <input type="number" v-model.number="a">
        <input type="number" v-model.number="b">

        <p> +  = </p>
    </div>
</template>

<script>
    export default {
        data: function() {
            return {
                a: 1,
                b: 2
            };
        }
    };
</script>

Иначе говоря, требуется 442 символа в React и 263 символа в Vue, чтобы достичь чего-то, что в Svelte занимает 145 символов. Версия React буквально в три раза больше!

Подсчёт символов я выполнил путем копирования кода в буфер обмена и запуском команды pbpaste | wc -c в терминале

Такая сильная разница скорее исключение — из моего опыта, компонент React обычно примерно на 40% больше, чем его эквивалент на Svelte. Давайте теперь взглянем на особенности Svelte, которые позволяют компактнее излагать наши идеи.


Элементы верхнего уровня

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

В Vue разметка должна быть размещена внутри элемента <template>, который, на мой взгляд тут лишний.


Привязки

В React мы должны самостоятельно обрабатывать события полей ввода вроде <input>:

function handleChangeA(event) {
    setA(+event.target.value);
}

Это не просто весьма скучная конструкция, занимающая место на экране, это ещё и дополнительная часть кода, где могут появиться ошибки. Концептуально, значение текстового поля привязано к значению a и наоборот, но это отношение не выражено чётко — вместо этого у нас есть два тесно связанных, но физически отдельных фрагмента кода (обработчик события и свойство value={a}). Кроме этого, мы должны помнить, что необходимо принудительно привести строковое значение в числовое с помощью оператора +, иначе 2 + 2 будет равно 22 вместо 4.

Как и в Svelte, у Vue есть свой способ выразить привязку — атрибут v-model, но, и тут мы должны быть внимательны и использовать v-model.number, несмотря на то, что берём значение из <input type="number">.


Стейт

В Svelte обновление локального состояния компонента происходит с помощью простого оператора присваивания:

let count = 0;

function increment() {
    count += 1;
}

В React, мы используем хук useState:

const [count, setCount] = useState(0);

function increment() {
    setCount(count + 1);
}

Тут сильно больше постороннего шума — оба фрагмента кода выражают одну и ту же концепцию, но во втором случае было использовано на 60% больше символов. Поэтому, когда вы читаете такой код, вам придётся приложить гораздо больше усилий, чтобы понять замысел автора.

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


Забудем про шаблонный код

Это лишь малая часть возможностей Svelte, которые помогают с минимальными усилиями создавать UI приложения. Есть ещё много других — например, реактивные объявления, которые по своей сути выполняют работу функций useMemo,useCallback и useEffect из React без лишнего многословного шаблонного кода (который при этом сильно нагружает сборщик мусора созданием инлайновых функций и массивов при каждом изменении состояния приложения).

Как? Мы выбрали путь, позволяющий обойти ограничения среды выполнения в браузере. Поскольку Svelte — это компилятор, мы не привязаны к особенностям JavaScript: мы можем создавать метод разработки компонентов как нам нравится, а не приспосабливать его к семантике языка. Как это ни парадоксально, но с таким подходом код становится более идиоматическим. Например, мы используем переменные естественным путём, а не через прокси или хуки, при этом получая значительно более производительные приложения.


Полезные ссылки

Документация на русском по Svelte 3
Учебник на русском по Svelte 3
Примеры на русском по Svelte 3
Русскоязычный канал Telegram

Let's block ads! (Why?)

[Из песочницы] Неявные (implicit) параметры и преобразования в Scala

Пробежавшись по предыдущим статьям на Хабре, тыц и тыц так и не удалось в быстром режиме понять, что делает неявность (implicit) в Scala. Попробуем разобраться вместе.

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

Например, мы могли бы написать функцию для преобразования из Float в Int(FloatToInt) и, вместо того, чтобы вызвать эту функцию явно, компилятор бы сделал это вместо нас неявно:

def double(value: Int) = value * 2
implicit def FloatToInt(value: Float):Int = value.toInt
println(double(2.5F))


Запутанно? Давайте обо всём по порядку.
Итак, сегодня мы рассмотрим две категории implicit, а именно:
  • Неявные параметры (implicit parameters, values). Они являются автоматически переданными компилятором значениями, объявленными через implicit.
  • Неявное преобразование (implicit conversion). При несовпадении типа ожидаемого параметра с входящим параметром компилятор ищет любой метод в области видимости, отмеченный implicit и с нужными в данной ситуации ожидаемым параметром и входящим параметром и автоматически его передаёт.

Неявный параметр


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

Например, такая функция, принимающая на вход неявный параметр value и удваивающая его:

def double(implicit value: Int) = value * 2


Без неявного параметра упадёт с ошибкой:
def double(implicit value: Int) = value * 2
println(double) // error: could not find implicit value for parameter value

С переданным явно параметром сработает:
def double(implicit value: Int) = value * 2
println(double(3))  // 6

С неявным параметром это будет выглядеть так:
def double(implicit value: Int) = value * 2
implicit val multiplier = 2
println(double) // 4

Но нужно быть аккуратным:
def double(implicit value: Int) = value * 2
implicit val multiplier = 2
implicit val multiplier2 = 1 
println(double) // error: ambiguous implicit values

И напоследок пример с передачей в качестве неявного параметра def:
def double(implicit value: Int) = value * 2
val cappucinoLarge: Boolean = false
implicit def cappucinoPrice: Int = if (cappucinoLarge) 200 else 100
println(double) // 200

Т.е. в итоге у нас получится
double(cappucinoPrice())

Примечания по синтаксису:

def func1(implicit value1: Int)                          // value1 неявно
def func2(implicit value1: Int, value2: Int)             // value1 и value2 неявны
def func3(value1: Int, implicit value2: Int)             // ошибка компиляции
def func4(value1: Int)(implicit value2: Int)             // только value2 неявно
def func5(implicit value1: Int)(value2: Int)             // ошибка компиляции
def func6(implicit value1: Int)(implicit value2: Int)    // ошибка компиляции


Неявное преобразование


Возвращаясь к примеру из Float в Int:
def double(value: Int) = value * 2
implicit def FloatToInt(value: Float):Int = value.toInt
println(double(2.5F))


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

Теперь, надеюсь, стало понятнее. Всем успехов в освоении Scala!

Let's block ads! (Why?)

Возвращаем девочке птицелет. RTFM по определению пластмасс в домашних условиях

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

Если, дорогой читатель, у тебя никогда в жизни не возникал за вопрос "что, черт побери, это за пластмасса такая?", то можешь статью не читать :). Вниманию же всех остальных — очередная статья из серии "положи в закладки!". Сегодня у нас тема — "Определение пластмасс в домашних условиях" и я продолжаю wikipedia-ровать Хабр полезной информацией, которая осталась у меня после выполнения моих научно-технических проектов. Сегодня под кат смело могут идти экологи, биотехнологи, мастера полимерных производств, инженеры по переработке пластмасс и все, кому приходилось сортировать пластики, клеить пластики, паять пластики — автолюбители, самодельщики и все заинтересованные лица. Традиционно — минимум FUN-а, максимум информации, полнее русскоязычную мануалку по пластикам просто не найти, "я гарантирую это" :)
… И наконец-то руки дошли вспомнить советский детский роман 1966 года, в котором практических рекомендаций ребенку "которому нравится химия" гораздо больше чем в современных белорусских учебниках химии вместе взятых.


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

Фактически, с понятием анализа пластмасс впервые я столкнулся еще в глубоком детстве, когда прочитал книгу Владимира Киселева "Девочка и птицелет" (если что, издательство "Детская литература", Москва, 1966 (!)). Очень чистый и светлый роман, и что главное, с ядреными для ребенка лабораторными подходами. Больше всего мне запомнился эпизод с перегонкой органического стекла, который я еще упомяну по тексту статьи...


Про разложение PMMA в детской книге

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

Анализ и "обратная разработка" полимеров — дело сложное, неблагодарное и в бытовых условиях достаточно сложно реализуемое. В зависимости от типа пластика и присутствующих в нем функциональных добавок может понадобится как минимум ИК-Фурье спектрометр (как заметил в моей статье про растворители для пластмасс читатель CactusKnight "хотя бы простейший ИК-Фурье спектрометр, на котором за 30 секунд можно получить спектры пластмасс"), а лучше ЯМР, масс-спектрометрия, рентгенофазовый анализ или что похлеще. Естественно, учитывая стоимость подобного оборудования (и наличие специально обученного персонала), становится ясно, что удовольствие это не из дешевых. Но дело в том, что чаще для многих практических целей часто достаточно определить, к какому классу пластмасс относится неизвестный образец, без анализа на пластификаторы, наполнители и т.п. (хотя от них очень часто зависят важные свойства пластика). Для этого можно и нужно использовать простые методы, которые, по большому счету, даже не требуют специальных химических знаний. Говоря про ограничения, помимо уже упомянутых добавок, можно упомянуть и анализ сложных сополимеров и смесей полимеров. Такие вещи очень сложно идентифицировать без привлечения серьезных инструментальных способов анализа.


Вводно о пластмассах

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

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



Термопласты и реактопласты

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

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

Отдельно можно отметить эластичные, резиноподобные эластомеры, состоящие из относительно слабо сшитых макромолекул. Жесткую структуру такие материалы приобретают в процессе вулканизации. Из-за сшитой структуры эластомеры не плавятся при нагревании вплоть до температуры, которая незначительнониже температуры их разложения. В отличие от химически сшитых эластомеров, вроде химического каучука, сшивка в так называемых термопластичных эластомерах ("резины для 3D принтеров) происходит посредством физических взаимодействий между макромолекулами. При нагреве силы физического взаимодействия между молекулами цепи уменьшаются, так что эти полимеры становятся обычными термопластами. При охлаждении, когда физическое взаимодействие между молекулами становится более сильным, материал снова ведет себя как эластомер. В таблице ниже перечислены наиболее важные характеристики упомянутых групп полимерных материалов. Однако следует помнить, что пигменты, пластификатор и различные наполнители (например, сажа или стекловолокно) приводят к значительным отклонениям от этих свойств. Поэтому не всегда возможно идентифицировать полимерные материалы только на основе этих критериев. Плотности даны для ориентира и представляют собой грубые приближения с акцентом на твердые монолитные материалы (потому что вспененные пластики разительно по плотности отличаются от пластиков монолитных).


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

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


С чего начать ?

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


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


Цифровые коды для пластиков по IUPAC

Если опознавательных знаков не найдено — переходим к физическим испытания. Сначала — самые простые


Идентификация пластика по плотности

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

Плотность используемой жидкости измеряется с помощью ареометра (повсеместно распространенные спиртометры — вариация ареометра с разметкой шкалы в объемных процентах спирта).



Ареометр для электролита/тосола

В качестве модельных жидкостей можно использовать водные растворы
хлорида цинка или хлорида магния. Если плотности ниже 1 г/см3 подойдут смеси метанола/этанола с водой. Ограничение при флотационном методе: образец не должен растворяться/набухать в жидкости; образец должен полностью смачиваться; на образце должны полностью отсутствовать пузырьки воздуха.

Важно отметить, что сажа, стекловолокно и другие наполнители могут сильно влиять на показатель плотности. Например, плотность могут варьироваться в зависимости от содержания наполнителя от 0,98 г/см3 (полипропилен вес. 10% талька) до 1,71 г/см3 (полибутилентерефталат, содержащий вес. 50% стекловолокна). Вспененные полимеры вообще нет смысла оценивать по параметру плотности, там один воздух.

В простейшем случае, если отсутствуют точные методы определения плотности, можно погрузить исследуемый образец в метанол (плотность при 20 °C = 0,79 г/см3), воду (1 г/см3), насыщенный водный раствор хлорида магния (1,34 г/см3) или насыщенный водный раствор хлорида цинка (2,01 г/см3). Далее смотрим на поведение кусочка пластмассы в жидкости, тонет он или всплывает. Это говорит о том, больше его плотность или меньше, чем плотность жидкости, в которую он погружен. Для приготовления 1 литра насыщенного раствора нужно примерно 1575 г хлорида цинка или 475 г хлорида магния. Доводим отвешенную заранее соль водой до 1 л раствора и растворяем при постоянном перемешивании. Предвидя вопрос "а где взять реактивы?" — отвечу цитатой из все того же романа "Девочка и птицелет":


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

Детям этим, в 1966 году было гораздо сложнее чем тебе, %username% :)

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


Плотности полимеров

Помимо плотности, еще одним недеструктивным методом исследования может служить температура плавления.


Температура плавления

Как уже упоминалось выше, плавятся только пластики с линейной структурой макромолекулярных цепей. Сшитые "жесткие" пластики размягчения не наблюдается вплоть до температуры при которой происходит термическая деструкция. Соответственно, этот признак может с некоторыми оговорками подсказать, что перед нами находится отвержденный реактопласт. В целом температуры плавления (и, кстати, температуры стеклования тоже) являются достаточно характерным указателем на конкретный тип полимера. Правда точку стеклования практически нереально определить в домашних условиях, требуется серьезное оборудование (ДТА там всякое, измерение модуля упругости и т.п.). Зато температуру плавления можно более или менее точно измерить, как — смотреть ГОСТ 33454-2015. Один из самых удобных вариантов — т.н. столик Кофлера, который дает точность до 2-3 °C. Если термостола нет и не предвидится — каждый придумывает способы в меру своей изобретательности, есть прецедент с плавлением кусочка пластмассы на стеклянной ампуле со ртутью ртутного же термометра :) (прим. мое — только для сильных духом парней, с крепкой рукой и надежной горелкой, остальным настоятельно не рекомендуется к повторению)


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


Данные по отстутствующим в таблице полимерам можно попробовать поискать в книге A. Krause, A. Lange, M. Ezrin Plastics Analysis Guide. Если с этим вариантом ничего не получается — пришло время переходит к "тяжелой артиллерии".


Цвет пламени и запах

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

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


Что в запахе горелой пластмассы тебе моем...

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



Пиролиз

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


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



Еще один вариант индикаторной бумаги

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


Последний экзамен...

И вот наконец, дорогой читатель, если ты дочитал до конца статьи, то можешь смело считать себя прошедшим курс "молодого полимерщика" и запросто пользоваться алгоритмами идентификации пластиков, вроде представленного ниже (картинка кликабельна).


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

Cергей Бесараб (Siarhei V. Besarab)

P.S.: при работе с полимерами и поиске информации о свойствах оных я пользуюсь базами MatWeb: Online Materials Information Resource, Polymer Properties Database, AZOM Materials Information, MatMatch и конечно же справочниками, приведенными в списке используемой литературы. Чего и вам желаю! :)


ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

He, J., Chen, J., Hellwich, K., et al. (2014). Abbreviations of polymer names and guidelines for abbreviating polymer names (IUPAC Recommendations 2014). Pure and Applied Chemistry, 86(6), pp. 1003-1015.
Выдрина Т.С. Методы идентификации полимеров Екатеринбург, 2005
A. Krause, A. Lange, M. Ezrin Plastics Analysis Guide. Hanser Publishers, 1983.
Bark, L. S., Allen, N. S. Analysis of Polymer Systems. Applied Science Publishers Ltd., London, 1982.
Compton, T. R. Chemical Analysis of Additives in Plastics, 2 nd ed. Pergamon, Oxford, New York, 1977.
Ullmann's Polymers and Plastics: Products and Processes: Wiley-VCH
Haslam, J., Willis, H. A., Squirrel, D. C. M. Identification and Analysis of Plastics, 2 nd ed. Butterworth, London, 1972
Mitchell, J. Jr. Applied Polymer Analysis and Characterization. Hanser Publishers, Munich, Vienna, 1987.
Dietrich B. Methods for Identification of Plastics. Hanser
Schröder, E., Müller, G., Arndt K.-F. Polymer Characterization. Hanser Publishers, Munich, New York, 1989.
Verleye, G. A. L., Roeges, N. P. G., De Moor, M. O. Easy Identification of Plastics and Rubber. Rapra Technology Ltd., Strawbury, 2001.

Let's block ads! (Why?)

Как работает сжатие в объектно-ориентированной архитектуре памяти

Команда инженеров из MIT разработала объектно-ориентированную иерархию памяти для более эффективной работы с данными. В статье разбираемся с тем, как она устроена.


/ PxHere / PD

Как известно, рост производительности современных CPU не сопровождается соответствующим снижением задержки при обращении к памяти. Разница в изменении показателей от года к году может доходить до 10 раз (PDF, стр.3). Как результат — возникает бутылочное горлышко, которое не дает в полной мере пользоваться имеющими ресурсами и замедляет обработку данных.

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

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

Как устроена технология


В основе решения лежат три технологии: Hotpads, Zippads и алгоритм сжатия COCO.

Hotpads — это программно-управляемая иерархия сверхоперативной регистровой памяти (scratchpad). Эти регистры называются пэдами (pads) и их три штуки — от L1 до L3. В них хранятся объекты разных размеров, метаданные и массивы указателей.

По сути, архитектура представляет собой систему кэшей, но заточенную для работы с объектами. Уровень пэда, на котором находится объект, зависит от того, как часто его используют. Если один из уровней «переполняется», система запускает механизм, аналогичный «сборщикам мусора» в языках Java или Go. Он анализирует, какие объекты используется реже остальных и автоматически перемещает их между уровнями.

Zippads работает на основе Hotpads — архивирует и разархивирует данные, которые поступают или покидают два последних уровня иерархии — пэд L3 и основную память. В первом и втором пэдах данные хранятся в неизменном виде.

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

Для сжатия объектов применяется алгоритм COCO (Cross-Object COmpression), о котором мы расскажем далее, хотя система способна работать и с Base-Delta-Immediate или FPC. Алгоритм COCO представляет собой разновидность разностного сжатия (differential compression). Он сравнивает объекты с «базовыми» и удаляет повторяющиеся биты — см. схему ниже:

По словам инженеров из MIT, их объектно-ориентированная иерархия памяти на 17% производительнее классических подходов. Она гораздо ближе по своему устройству к архитектуре современных приложений, поэтому у нового метода есть потенциал.

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

Наши дополнительные ресурсы и источники:

«Как мы строим IaaS»: материалы о работе 1cloud

Эволюция архитектуры облака 1cloud
Услуга объектного хранилища в 1cloud

Потенциальные атаки на HTTPS и способы защиты от них
Чем похожи и чем различаются подходы Continuous Delivery и Continuous Integration
Как защитить сервер в интернете: опыт 1cloud

Let's block ads! (Why?)

Разработчик популярного Linux-дистрибутива планирует выйти на IPO и заняться «облаком»

К публичному размещению акций готовится Canonical — компания-разработчик Ubuntu. Она планирует развиваться в сфере облачных вычислений.



/ фото NASA (PD) — Марк Шаттлворт на МКС

Разговоры об IPO Canonical идут с 2015 года — тогда о возможном публичном размещении акций заявил основатель компании Марк Шаттлворт (Mark Shuttleworth). Цель IPO — привлечь средства, которые помогут Canonical разрабатывать продукты для облака и корпоративных IoT-систем.

Например, компания планирует уделять большее внимание технологии контейнеризации LXD и ОС для IoT-гаджетов Ubuntu Core. Такой выбор направления развития обусловлен бизнес-моделью компании. Canonical не продаёт лицензии и зарабатывает на B2B-услугах.

К IPO Canonical начала готовиться в 2017 году. Чтобы стать более привлекательной для инвесторов, компания прекратила разработку неприбыльных продуктов — оболочки рабочего стола Unity и мобильной ОС Ubuntu Phone. Также Canonical стремится повысить годовую выручку — с $110 до $200 млн. Поэтому сейчас компания пытается привлечь больше корпоративных клиентов. Для этого был представлен новый пакет услуг — Ubuntu Advantage for Infrastructure.

Canonical не требует отдельной платы за обслуживание частей инфраструктуры на основе разных технологий — OpenStack, Ceph, Kubernetes и Linux. Стоимость услуг рассчитывается исходя из числа серверов или виртуальных машин, а в пакет входит техническая и юридическая поддержка. По расчётам Canonical, такой подход поможет их клиентам экономить.

Еще одним из шагом по привлечению заказчиков стало продление срока поддержки Ubuntu с пяти до десяти лет. По словам Марка Шаттлворта, более долгий жизненный цикл операционной системы важен для финансовых организаций и телекомов, которые в сравнении с другими компаниями реже переходят на новые версии ОС и ИТ-сервисов.

Действия Canonical помогли сделать Ubuntu популярнее среди таких «консервативных» организаций и усилить позиции компании-разработчика на рынке облачных решений. Старания компании могут окупиться уже скоро. Существует вероятность, что публичное размещение акций Canonical произойдёт уже в 2020 году.

Что с этого рынку


Аналитики считают, что с переходом в статус публичной Canonical сможет стать полноценным конкурентом Red Hat. Последняя разработала и внедрила принципы монетизации open source технологий, которыми сейчас пользуется и Canonical.

Долгое время другим компаниям с похожей бизнес-моделью не удавалось вырасти до размеров Red Hat. По масштабам она значительно обгоняет Canonical — одна только ежегодная прибыль Red Hat превышает всю выручку компании-разработчика Ubuntu. Однако эксперты полагают, что средства от IPO помогут Canonical вырасти до размеров компании-конкурента.

У разработчика Ubuntu есть преимущество перед Red Hat. Canonical — независимая компания, которая даёт корпоративным клиентам возможность выбрать любую облачную среду для развёртывания приложений. Red Hat же скоро станет частью IBM. Хотя ИТ-гигант обещает сохранить независимость дочерней организации, существует вероятность, что Red Hat будут продвигать публичное облако IBM.


/ фото Bran Sorem (CC BY)

Также ожидается, что IPO поможет Canonical закрепиться на рынке IoT и периферийных (edge) вычислений. Компания разрабатывает новые продукты на основе Ubuntu, которые помогут объединить edge-устройства с облачными средами в одну гибридную систему. Пока это направление не приносит прибыли Canonical, однако Шаттлворт считает его перспективным для будущего компании. Развить технологии для IoT помогут средства от IPO — Canonical сможет выделить больше ресурсов на разработку edge-продуктов.

Кто еще выходит на IPO


В апреле 2018 года часть своих акций на бирже разместила компания Pivotal. Она разрабатывает платформу Cloud Foundry для развёртывания и мониторинга приложений в публичных и частных облачных средах. Большая часть Pivotal находится в собственности Dell: ИТ-гиганту принадлежит 67% акций компании и решающая роль в принятии решений.
Размещение ценных бумаг на бирже должно было помочь Pivotal расширить свое присутствие на рынке облачных услуг. Компания планировала потратить вырученные деньги на разработку новых продуктов и привлечение в качестве клиентов крупнейших мировых компаний. Ожидания Pivotal оправдались — после продажи акций ей удалось увеличить доход и количество корпоративных заказчиков.

Ещё одно IPO на рынке должно состояться в ближайшее время. В апреле этого года заявление на размещение акций подал стартап Fastly, который предлагает платформу для периферийных вычислений и решение для балансировки нагрузки для дата-центров. Средства от IPO компания потратит на продвижение на рынке edge-вычислений. Fastly надеется, что инвестиции помогут ей стать более заметным игроком в сфере услуг для ЦОД.

Что дальше


По оценке (статья под paywall'ом) Wall Street Journal, акции технологических B2B-организаций могут быть интереснее, чем ценные бумаги в B2C-секторе ИТ. Поэтому IPO в B2B-сегменте обычно привлекают внимание серьезных инвесторов.

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



О чем мы пишем в нашем Telegram-канале:

Let's block ads! (Why?)

Что важно, а что — срочно?

Матрица Эйзенхауэра – очень известный метод определения приоритетов. Например, в знаменитой книге Стивена Кови «Семь навыков высокоэффективных людей» матрице посвящена целая глава.

Матрица – это инструмент расстановки приоритетов задач. Придумал ее, говорят, 34-й президент США Дуайт Эйзенхауэр. Определять приоритеты с помощью матрицы просто и эффективно.

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

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

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

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

Начнем со срочности, т.к. она приоритетнее важности.

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

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

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

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

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

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

Важно уметь разделять понятия «срочность» и «срок выполнения». Срок, так или иначе, есть у любой задачи, даже если он не обозначен. Тут я немного забегаю вперед, о сроках будет рассказано в другой раз, но хочу, чтобы вы поняли: наличие срока – это не срочность. Равно как и приближение срока – это не срочность.

Срочность задачи никак не соотносится со сроком ее исполнения. Например, срок выполнения задачи может вообще быть не типа «дата», а «как можно быстрее, блин!». Т.е., формально, срока-то никакого нет. А задача, тем не менее, срочная. Или срок у задачи может быть — завтра, но все понимают, что ее поставил человек, которому решение нафиг не нужно — он по первой же просьбе перенесет срок на любую дату. Или система так устроена, что без указания срока задачу нельзя внести.

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

Теперь о важности. Вернемся к классику – Стивену Кови. Он обозначил важными те задачи, которые на будущее. Достаточно простое, хоть и не совсем понятное определение. Попробуем расшифровать.

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

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

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

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

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

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

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

Технически это очень просто. Достаточно добавить к задаче два поля – срочность и важность, и упорядочить по ним очередь. Например, рассчитав приоритет выполнения задачи в виде цифры. Если задача срочная, то добавляем 2 условных единицы, если важная – 1 условную единицу.

Итого, не важная и не срочная задача будет иметь приоритет, равный нулю. Срочная и не важная – 2. Не срочная и важная – 1. Срочная и важная – 3. Теперь упорядочиваем список задач по убыванию рассчитанного приоритета, и получаем результат – правильную последовательность, которая отражает нашу стратегию.

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

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

Решений у этой проблемы несколько.

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

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

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

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

Резюме

  • Матрица Эйзенхауэра – это простой инструмент определения приоритетов;
  • Приоритет регулируется двумя признаками – срочность и важность;
  • Срочная задача – та, потери от невыполнения которой высоки;
  • Важная задача – та, которая влияет на будущее;
  • Срочность приоритетнее важности;
  • Бывают задачи не срочные и не важные;
  • Приоритеты работают только при осознанном определении срочности и важности.

Let's block ads! (Why?)

Об одном физическом факультете

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

Подход


Мне кажется, что «плохих» учеников — меньшинство. Много преподавателей, не умеющих заинтересовывать в своем предмете студентов. Много университетов, не сумевших подобрать правильный подход к процессу обучения. Мне повезло попасть на факультет, где собраны замечательные преподаватели, являющиеся действующими учеными. Они могут погрузить аудиторию в атмосферу области своей работы, и это очень захватывает. Помимо преподавателей, мне очень нравится система обучения на факультете. Точнее так, она мне подходит. Есть много споров об эффективности Болонской системы образования и четырех сессий в год, я считаю, что тут надо определить, что подходит конкретно Вам. Я же хочу рассказать об одном большом (для меня) преимуществе конкретно моего факультета. Это лабораторные.
Во-первых, под практикум выделен целый учебный день. С 10.30 до 16.30. Хотя большинство учеников засиживается до 6-7 вечера, а кто-то, наоборот, может уйти пораньше. В этом плане нет строгости, кому-то удобнее выполнить всю практическую часть, а анализом заниматься дома, кто-то стремиться закончить с работой как можно скорее. Преподаватель толерантен к любому решению студента.
Во-вторых, по каждой лабораторной работе производиться отчет. В первом модуле (модуль == семестр в школе) студентов учат оформлять научные работы. Нам показали, как работать с LibreOffice, с LaTex, с GNUPlot и с Labview. Рассказали также о требованиях к оформлению статьи. Выбор, чем пользоваться, стоит за студентом, никто не будет ругать и за Word с Excel. Лично я предпочитаю обрабатывать данные в Python (иногда грешу Origin, если времени не хватает) и техать. Отчет можно сдавать в бумажном виде, можно отправлять в формате PDF на почту преподавателя.
В-третьих, помимо отчетов каждый ученик обязан один раз за семестр выступить с докладом. Доклад предусматривает устную защиту работы с презентацией. Тут, на самом деле, можно проявить креативность. Можно рассказать чуть больше о теории и применении какого-то оборудования, можно вдаться в подробности сделанного практикума. Преподаватель и слушающие студенты задают вопросы. Получается мини-конференция.

Оборудование


В кабинетах для лабораторных работ можно найти всевозможные крепежные элементы, нитки, микроконтроллеры и датчики (для желающих работать с LabView), измерительные приборы. Тут допускается полный полет фантазии. Лично мне очень нравится такая атмосфера, не люблю рамки. Основное оборудование также впечатляет. Мне больше всего запомнились работы с пневматическими ружьями, тепловизорами (Testo 865) и вакуумными машинами. В конце обзора привожу несколько фото.

О плюсах и минусах факультета


Помимо лабораторных работ из достоинств можно отметить преподавательский состав (многие преподают также в МГУ или на Физтехе), совершенно оригинальный курс предметов (отступление в механику сплошных сред, метод перевалов на приближенных аналитических методах, например), отзывчивость сотрудников. Группа студентов все-таки мнение одного студента не приоритет всегда может о чем-то попросить руководство, и в большей части ситуаций руководство помогает. Например, для нас организовали студенческую комнату с пуфиками, диванчиком, столами, досками и шкафами, чтобы можно было учиться и расслабляться в университете. Наш курс уже дважды посещал институты РАН (ИКИ и ИФП). Преподаватели готовы внести изменения в программу, если какая-то тема слишком сложная или, наоборот, легкая.
Конечно, недостатки тоже имеются. Как известно, проблемы для всех иногородних учеников Вышки заключается в длинной дороге до общежития (факультет находится на Курской, а общага — в Дубках или в Одинцово). Также факультету всего три года, определенно стоит корректировать программу. Например, введение в механику сплошных сред в конце первого семестра бралось штурмом, пока на математических методах мы только учились работать с матрицами (можно было бы заняться решением дифференциальных уравнений). В то же время, как я выше уже упоминала, учителя готовы подстраиваться под пожелания студентов, и мне кажется, что в скором времени проблемы с нескоррелированной программой исчерпаются. Еще многие люди считают, что в университете с названием «Высшая Школа Экономики» технарные направления не могут быть развиты. Хотя ФКН и Матфак уже который год подряд опровергают этот стереотип. Правда, это уже мелочи.
Вот такой вот получился обзор от студента-первокурсника. Задавайте вопросы, с радостью отвечу на все уместные.
Фото с лаб

Let's block ads! (Why?)

Новый HTML-элемент от Google призван заменить фреймы

На конференции разработчиков I/O 2019 компания Google представила новую технологию под названием «порталы», которая призвана обеспечить новый способ загрузки и навигации по веб-страницам.

По словам Google, «порталы» работают с помощью нового HTML-тега под названием <portal>. Этот тег работает аналогично классическим тегам <iframe>, позволяя веб-разработчикам вставлять удалённый контент на свои страницы.
По сути, <portal> — это более продвинутая и современная версия <iframe>. Самая главная разница в том, что <portal> позволяет перемещаться внутри контента, который внедрён на страницу извне, а <iframe> не позволяет этого по соображениям безопасности.

Более того, <portal> может переписывать URL в адресной строке браузера, то есть этот тег полезнее в качестве инструмента навигации. Опять же, <iframe> на такое не способен.

Вот таблица со сравнением <portal> и <iframe>, из презентации Google.


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

Например, когда пользователь просматривает новостной сайт и заканчивает чтение страницы, то есть доходит до нижней её части, то ссылки на «похожие статьи» будут встроены в качестве порталов. Зачем веб-разработчику оформлять их таким образом? Преимущество использования порталов по сравнению с классическими ссылками заключается в том, что содержимое внутри порталов может быть предварительно загружено и предварительно отрендерено с загрузкой всего дерева DOM, то есть оно отобразится мгновенно.

Эту функцию впервые анонсировали на саммите Chrome Dev в ноябре прошлого года, но теперь порталы поддерживаются в последней версии Chrome Canary для Android, Mac, Windows, Linux и Chrome OS.


Правда, по умолчанию она пока отключена. Чтобы её включить в Chrome Canary, следует активировать флаг порталов в настройках chrome://flags/#enable-portals.

На данный момент только Chrome поддерживает эту технологию, другие браузеры пока не выразили интереса. Но если у вас подходящий браузер, то можно поэкспериментировать с порталами на демо-странице. Там указываете адрес любой страницы, сайт сгенерирует ссылку в формате <portal src="..."></portal> — вы можете перейти по ней и оценить, насколько быстро осуществляется переход на предварительно отрендеренную страницу.

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

Внедрив этот тег в свой браузер, Google подала его на утверждение в WCIG. Если разработчики других браузеров поддержат инициативу (а что им остаётся в условиях фактической монополии Chrome), то технология может стать новым стандартом, заменив привычные фреймы. Порталы позволяют пользователю смотреть/слушать внедрённый контент, а затем легко переходить на его исходную страницу, где можно оставлять комментарии или открывать другие страницы.

Более подробную техническую информацию о порталах см. в черновике стандарта WICG и документации Google.

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

Let's block ads! (Why?)

Что слышно в радиоэфире? Радиолюбители/Ham radio

Привет Хабр.

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

Как и в первых частях, упор будет делаться на «цифру» и на то, как устроена обработка сигналов. Для приема и декодирования сигналов мы также будем пользоваться голландским онлайн-приемником websdr и программой MultiPSK.

Для тех, кому интересно как это работает, продолжение под катом.

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

Частотные диапазоны


Радиоэфир весьма активно используется служебными и вещательными станциями, поэтому радиолюбителям выделены определенные частотные диапазоны, чтобы они не мешали другим. Этих диапазонов довольно много, от сверхдлинных волн на 137КГц до СВЧ на 1.3, 2.4, 5.6 или 10ГГц (подробнее можно посмотреть здесь). В общем, каждый может выбрать, в зависимости от интересов и технической оснащенности.

С точки зрения простоты приема, наиболее доступными являются частоты с длинами волн 80-20м:
— Диапазон 3,5 МГц (80 м): 3500-3800 кГц.
— Диапазон 7 МГц (40 м): 7000-7200 кГц.
— Диапазон 10 МГц (30 м): 10100-10140 кГц.
— Диапазон 14 МГц (20 м): 14000-14350 кГц.
На них можно настроиться как с помощью вышеупомянутого онлайн-приемника, так и со своего личного, если он может принимать в режиме боковой полосы (LSB, USB, SSB).
Теперь, когда все готово, посмотрим, что там можно принять.

Голосовая связь и азбука Морзе


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

Раньше для получения позывного нужно было даже сдать экзамен по приему сигналов Морзе, сейчас это вроде осталось только для первой, высшей, категории (отличаются они в основном, только максимальной допустимой мощностью). Мы же будем декодировать сигналы CW с помощью CW Skimmer и Virtual Audio Card.

Радиолюбители используют укороченный код (Q-код), в частности, строка CQ DE DF7FF означает общий вызов всем станциям от радиолюбителя DF7FF. Каждый радиолюбитель имеет свой позывной сигнал, префикс которого образуется от кода страны, это достаточно удобно т.к. сразу понятно откуда вещает станция. В нашем случае позывной DF7FF принадлежит радиолюбителю из Германии.

Что касается голосовой связи, то с ней никаких сложностей нет, желающие могут послушать самостоятельно на websdr. Когда-то во времена СССР не все радиолюбители имели права проводить радиосвязи с иностранцами, сейчас таких ограничений нет, и дальность и качество связи зависит только от качества антенн, аппаратуры и терпения оператора. Для тех кто заинтересуется, почитать подробнее можно на радиолюбительских сайтах и форумах (cqham, qrz), мы же перейдем к цифровым сигналам.

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

RTTY


Достаточно старый вид связи, использующий частотную модуляцию. Сам метод называется FSK (Frequency Shift Keying) и заключается в формировании битовой последовательности путем смены частоты передачи.

image

Данные кодируются быстрым переключением между двумя частотами F0 и F1. Разница dF = F1 — F0 называется разносом частот, и может быть равна, например, 85, 170, или 452Гц. Второй параметр — это скорость передачи, которая тоже может быть разной, и составлять например, 45, 50 или 75 бит в секунду. Т.к. у нас есть две частоты, то нужно определиться какая будет “верхней”, какая “нижней”, этот параметр обычно называется “инверсия”. Вот эти три значения (скорость, разнос и инверсия) полностью определяют параметры RTTY-передачи. В практически любых программах декодирования можно найти эти настройки, и подобрав даже “на глаз” эти параметры, можно декодировать большинство таких сигналов.

Когда-то связи в RTTY были более популярны, но сейчас, зайдя на websdr, я не услышал ни одного сигнала, так что пример декодирования привести сложно. Желающие могут послушать самостоятельно на 7.045 или 14.080МГц, более подробно про телетайп было написано в первой части статьи.

PSK31/63


Другой вид связи — фазовая модуляция, Phase Shift Keying. Здесь меняется не частота, а фаза, на графике это выглядит примерно так:

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

Само кодирование относительно просто — в BPSK31 сигналы передаются со скоростью 31.25 бод, изменение фазы кодирует «0», отсутствие изменения фазы «1». Кодирование символов можно посмотреть в Википедии.

Визуально на спектре сигнал BPSK виден как узкая линия, и на слух слышен как довольно чистый тон (чем он в принципе и является). Услышать сигналы BPSK можно например, на 7080 или 14070МГц.

Интересно отметить, что по и в BPSK и в RTTY по «яркости» линии можно судить силе сигнала и о качестве приема — если какая-то часть сообщения пропадает, то в этом месте сообщения будет «мусор», но общий смысл сообщения часто остается все равно понятным. Оператор сам может выбирать, на какой сигнал навестись чтобы его декодировать. Поиск новых и слабых сигналов от дальних корреспондентов сам по себе довольно-таки интересен. В отличие от этого, следующие протоколы гораздо более автоматизированы, и практически не требуют участия человека. Хорошо это или плохо, вопрос философский, но определенно можно сказать, что какая-то часть ham radio spirit в таких режимах определенно утрачена.

FT8/FT4


Для декодирования следующего типа сигналов нужно установить программу WSJT. Сигналы FT8 передаются с помощью частотной модуляции из 8 частот со сдвигом всего в 6.25Гц, так что сигнал занимает полосу всего лишь в 50Гц. Данные в FT8 передаются «пакетами» длительностью около 14 секунд, так что точная синхронизация времени компьютера довольно актуальна. Прием почти полностью автоматизирован — программа декодирует позывной, силу сигнала.

В новой версии протокола FT4, который появился недавно на днях, длительность пакета уменьшена до 5с, используется 4-тоновая модуляция при скорости передачи 23бод. Ширина занимаемой полосы сигнала составляет примерно 90Гц.

WSPR


WSPR — это протокол, специально ориентированный на прием и передачу слабых сигналов. Это сигнал, передающийся со скоростью всего лишь 1.4648 бод (да, лишь чуть больше 1 бита в секунду). Для передачи используется частотная модуляция (4-FSK) с разносом частот 1.4648Гц, так что ширина полосы сигнала всего лишь 6Гц. Передаваемый пакет данных имеет размер 50 бит, к нему также добавляются биты коррекции ошибок (non-recursive convolutional code, constraint length K=32, rate=1/2), в итоге общий размер пакета равен 162бит. Эти 162бит передаются примерно за 2 минуты (кто-то еще будет жаловаться на медленный интернет?:).

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

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

image

Кстати, присоединиться к приему WSPR может любой желающий, даже без радиолюбительского позывного (для приема он не требуется) — достаточно приемника и программы WSPR, причем все это может работать даже автономно на Raspberry Pi. Система интересна как с научной точки зрения, так и для экспериментов с аппаратурой и с антеннами. К сожалению, по плотности приемных станций Россия ушла недалеко от Судана, Египта или Нигерии, так что новые участники всегда полезны — есть возможность быть первым, и одним приемником можно «накрыть» территорию в тысячу км.

Весьма интересным и довольно-таки сложным, является передача WSPR на частотах выше 1ГГц — стабильность частоты приемника и передатчика тут является довольно-таки критичной.

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

Заключение


Если кому-то захотелось тоже попробовать свои силы, то это не так уж сложно. Для приема сигналов можно воспользоваться либо классическим (Tecsun PL-880, Sangean ATS909X и пр), либо SDR-приемником (SDRPlay RSP2, SDR Elad). Далее, достаточно установить программы, как показано выше, и можно изучать радиоэфир самостоятельно. Цена вопроса составляет 100-200$ в зависимости от модели приемника. Можно также воспользоваться онлайн-приемниками и вообще ничего не покупать, хотя это все же не так интересно.

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

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

Let's block ads! (Why?)

3CX V16 Update 1 Beta — новые возможности чата и Call Flow Service для программного управления вызовами

После недавнего выпуска 3CX v16 мы уже подготовили первое обновление 3CX V16 Update 1 Beta. В нем реализованы новые возможности корпоративного чата и обновленный сервис Call Flow Service, который совместно со средой разработки Call Flow Designer (CFD) позволяет создавать сложные голосовые приложения на C#.

Обновленный корпоративный чат


Коммуникационный виджет 3CX Live Chat & Talk продолжает активно разрабатываться. В обновлении Update 1 виджет «висит» независимо от переходов между страницами и вкладками. Теперь посетители могут путешествовать по вашему сайту, оставляя окно чата доступным для немедленного общения.

Интересные возможности появились и в сервисе корпоративного чата 3CX.

Теперь для сообщений доступны следующие действия (a):

  • End chat session — завершить чат с пользователем 3CX (или посетителем сайта).
  • Block anonymous user — блокирование пользователя (IP-адрес) от входящих сообщений и звонков.
  • Delete — удалить чат.
  • Archive — архивировать чат (перенести в папку Архив) и удалить из интерфейса веб-клиента. В дальнейшем появятся новые функции, связанные с архивированием чатов.
  • Transfer — выбрать добавочный номер 3CX (другого пользователя) и передать ему дальнейшее общение. Удобно при общении с посетителями сайта, если нужно передать начатый разговор другому специалисту.

Также при входящем чате у пользователя всплывает уведомление, в котором можно быстро ответить на сообщение (b).

Если сообщение пришло с сайта через виджет 3CX Live Chat & Talk, теперь доступен ряд новых возможностей.

  1. Входящее сообщение приходит в интерфейс веб-клиента 3CX как от пользователя WebVisitor для быстрой идентификации.
  2. Если сообщение приходит в Очередь операторов,  автоматически создается чат-группа, в которую добавляются все операторы этой Очереди. Операторы видят переписку с клиентом и вместе могут отвечать ему до тех пор, пока кто-то из них не продолжит общаться с клиентом индивидуально. Со стороны посетителя сайта этот чат виден как беседа с одним оператором с именем Sender name, указанном в конфигурации виджета.
  3. В верхнем правом меню доступны иконки быстрых действий, описанных ранее — Archive, Forward, Take.
  4. Действие Take позволяет одному из операторов Очереди «забрать» групповой чат с посетителем сайта себе и продолжить персональное общение. Если в виджете настроена возможность звонков, у посетителя появляется кнопка Call, нажав на которую он может продолжить общение голосом или с видео.

Также в чате добавлены интуитивно понятные иконки дискуссий. Они позволяют быстро различить чаты с посетителями сайта и коллегами (пользователями АТС). Еще одна удобная функция — ответить на E-mail. Оператор может кликнуть на e-mail посетителя и ответить ему уже после завершения чата. Адрес посетителя можно получить онлайн или через офлайн-форму.

Демонстрация всех этих функций представлена в этом видеоролике.


Сервис Call Flow Service и среда разработки Call Flow Designer


3CX v16 Update 1 Beta включает новый сервис 3CX Call Flow Apps Service. Он поддерживает новые голосовые приложения 3CX, написанные на C#. Существующие приложения могут быть конвертированы и доработаны в новом Call Flow Designer. Сервер приложений одинаково хорошо работает на 3CX v16 для Debian / Raspbian Linux и Windows. В ближайшее время в него будет добавлен полноценный REST API для управления вызовами и соответствующая документация.

Подробнее о конвертировании существующих приложений 3CX можно узнать в этом видеоролике.


Полный журнал изменений в 3CX v16 Update 1 Beta.

Установка обновления


Установка обновления делается в интерфейсе управления 3CX в разделе Updates (Обновления). Обратите внимание — после установки обновления выполняется конвертирование базы данных существующих чатов. В это время чат недоступен в приложениях 3CX.

Вы также можете скачать полный дистрибутив 3CX v16 Update 1 Beta для Windows или Linux:

Let's block ads! (Why?)

[Перевод] Почему открытые прошивки важны для безопасности

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

Уровни привилегий


В типичном стеке у вас различные уровни привилегий.
  • Кольцо 3. Приложения: минимальное привилегий, за исключением песочницы в пользовательском пространстве, которая ещё больше ограничена.
  • Кольцо 0. Ядро: ядро операционной системы, в случае ОС с открытым исходным кодом вы видите его код.
  • Кольцо −1. Гипервизор: мониторинг виртуальных машин (VMM), создаёт и запускает виртуальные машины. В гипервизорах с открытым исходным кодом, таких как Xen, KVM, bhyve и другие, вы видите код.
  • Кольцо −2. Режим управления системой (SMM), ядро UEFI: проприетарный код, подробнее об этом ниже.
  • Кольцо −3. Движок управления: проприетарный код, подробнее об этом ниже.

Отрицательные кольца указывают на уровни с привилегиями больше, чем у нулевого.
Из вышесказанного ясно, что в кольцах от −1 до 3 у нас есть возможность использовать программное обеспечение с открытым исходным кодом, в значительной степени видеть и контролировать его. Для уровней ниже кольца −1 у нас меньше контроля, но ситуация улучшается благодаря разработке open source прошивок и сообществу.

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

Кольцо −2. SMM, ядро UEFI


Это кольцо управляет всеми ресурсами CPU.

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

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

Кольцо −3. Движок управления


Самое привилегированное кольцо. В случае Intel (x86) это Intel Management Engine. Эта система может незаметно включать узлы и перезаписывать диски, ядро запускает Minix 3, а также веб-сервер и весь сетевой стек. Получается, что благодаря этому Minix — самая популярная операционная система на десктопах. В движке управления много функций. Вероятно, мне потребуется целый день, чтобы перечислить их. Если хотите, есть многоресурсов для более подробного изучения.

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

У них всех есть эксплоиты


Никого не должно удивлять, что в кольцах −2 и −3 есть уязвимости. Когда их находят, это действительно ужасно. Просто для примера, хотя вы можете поискать и другие примеры самостоятельно, но в веб-сервере Intel Management Engine был баг, о котором разработчик не знал семь лет.

Как можно улучшить ситуацию?


NERF: нерасширяемая уменьшенная прошивка


NERF — это то, над чем работает сообщество. Цель состоит в том, чтобы сделать прошивку менее способной причинить вред и сделать её действия более заметными. Они стремятся удалить все компоненты среды выполнения, но пока в Intel Management Engine это трудно сделать. Зато можно убрать оттуда веб-сервер и IP-стек. Разработчики также хотят удалить IP-стек UEFI, другие драйверы и убрать функцию самопрошивки Intel Management/UEFI.

me_cleaner


Проект для очистки Intel Management Engine до минимально необходимой функциональности (на GitHub).

u-boot и coreboot


u-boot и coreboot — прошивки с открытым исходным кодом. Они обрабатывают инициализацию микросхем и DRAM. В хромбуках используются обе, coreboot на x86, а u-boot на остальных. Это один из этапов, как они проверяют загрузку.

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

linuxboot


Linuxboot обрабатывает драйверы устройств, сетевой стек и предоставляет многопользовательскую многозадачную среду. Он построен на Linux, так что одно ядро может работать на нескольких платах. Linux уже достаточно проверен и за кодом многие следят, так как он довольно широко используется. Лучше использовать открытое ядро с большим числом «контролёров», чем два с половиной других ядра, разные и закрытые. Это означает, что мы уменьшаем поверхность атаки за счёт меньшего количества вариантов кода и полагаемся на открытый исходный код. Linux повышает надёжность загрузки, заменяя слабо протестированные драйверы прошивки драйверами Linux с усиленной защитой.

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

u-root


u-root — это набор инструментов golang userspace и загрузчик. Он используется как initramfs для ядра Linux в linuxboot.

Говорят, стек NERF уменьшил время загрузки в 20 раз. Но это статья по безопасности, так что давайте вернёмся к безопасности…

Стек NERF улучшает видимость многих компонентов, которые ранее были совсем проприетарными. Однако на устройствах остаётся ещё много других прошивок.

Что насчёт других прошивок?


Нам нужны открытые прошивки для контроллера сетевого интерфейса (NIC), твёрдотельных накопителей (SSD) и базового контроллера управления (BMC).

В проекте Open Compute ведётся определённая работа над на прошивкой NIC 3.0. Будет интересно посмотреть, что у них получится.

Для BMC есть как OpenBMC, так и u-bmc. Я немного писала о них в предыдущей статье.

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

Корни доверия


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

Похоже, каждое облако и каждый вендор предлагают собственный корень доверия. У Microsoft есть Cerberus, у Google — Titan, у Amazon — Nitro. Похоже, они предполагают явное доверие к проприетарному коду (код, который мы не видим). Это оставляет странное ощущение. Не лучше ли было использовать полностью открытый код? Тогда мы можем без сомнений проверить, что собранный из исходников код — тот же самый, который работает на оборудовании везде, где установлена прошивка. Затем мы можем проверить, что машина находится в правильном состоянии, не сомневаясь, что она уязвима или с бэкдором.

Это заставляет задуматься, что же используют в качестве корня доверия небольшие облачные провайдеры, такие как DigitalOcean или Packet. Я спросила об этом в Twitter, но не получила достойного ответа…


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

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

Отказоустойчивость прошивки платформы


Однако у производителей микросхем, похоже, особый взгляд. У Intel есть технология отказоустойчивости платформы Platform Firmware Resilience, а у Lattice — Platform Firmware Resiliency. Они, похоже, больше сосредоточены на руководящих принципах NIST по отказоустойчивости прошивки платформы.

Я попыталась спросить в интернете, кто это использовал, но получила мало откликов, поэтому, если вы используете устройства с технологией Platform Firmware Resiliency, дайте мне знать!


Из лекции OCP об инновациях в прошивках Intel кажется, что Platform Firmware Resilience (PFR) от Intel и Cerberus идут рука об руку. Корпорация Intel использует PFR для воплощения принципов аттестации Cerberus. Спасибо @msw за разъяснение.

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

Как помочь


Надеюсь, вы получили некоторое представление о том, какие проекты существуют для разработки прошивок с открытым исходным кодом и насколько это важно! Если хотите помочь, пожалуйста, расскажите другим. Попробуйте использовать платформы с открытыми компонентами. Хромбуки — отличный пример, а также компьютеры Purism. Можете спросить своих поставщиков, что они делают для выпуска прошивки с открытым исходным кодом и обеспечения безопасности оборудования с корнями доверия. Счастливого ботана! :)

Let's block ads! (Why?)