Русский
Русский
English
Статистика
Реклама

Chromium

Перевод Высокопроизводительная сборка мусора для C

20.06.2020 20:07:24 | Автор: admin
Мы уже писали о сборке мусора для JavaScript, о DOM, и о том, как всё это реализовано и оптимизировано в JS-движке V8. Правда, Chromium это не только JavaScript. Большая часть браузера и движок рендеринга Blink, куда встроен V8, написаны на C++. JavaScript можно использовать для работы с DOM, а на экран изменения выводятся с использованием конвейера рендеринга.

Так как граф C++-объектов, имеющих отношение к DOM, тесно связан с JavaScript-объектами, команда разработчиков Chromium пару лет назад начала использовать для управления памятью, в которой хранятся эти объекты, сборщик мусора, названный Oilpan. Oilpan это сборщик мусора, написанный на C++ и предназначенный для управления C++-памятью, которая может быть подключена к V8. Управление памятью осуществляется с использованием технологии кросс-компонентной сборки мусора. В рамках этой технологии граф связанных C++/JavaScript-объектов рассматривается как единая куча.



Этот материал является первой публикацией, посвящённой Oilpan. Здесь будет сделан обзор основных принципов, лежащих в основе данного сборщика мусора, а также C++-API Oilpan. Мы рассмотрим некоторые возможности, поддерживаемые Oilpan, расскажем о том, как устроена работа различных подсистемам сборщика мусора. Тут же мы разберём процесс конкурентного освобождения памяти, занятой объектами.

Самое интересное здесь то, что система Oilpan является частью Blink, но сейчас осуществляется её перевод в V8, где она будет представлена в форме библиотеки для сборки мусора. Цель этого всего заключается в том, чтобы облегчить доступ к C++-механизмам сборки мусора всем тем, кто встраивает в свои платформы движок V8. Кроме того, то, что Oilpan станет библиотекой, позволит пользоваться этой системой абсолютно всем заинтересованным в ней C++-программистам.

Общие сведения


В Oilpan применяется система сборки мусора, в которой используется алгоритм пометок (Mark and Sweep). Этот алгоритм предусматривает разделение процесса сборки мусора на две фазы. Первая фаза заключается в исследовании кучи, и в пометке (mark) живых объектов, которые нельзя удалять из памяти. Вторая фаза это очистка (sweep) памяти кучи, которую занимают ненужные (мёртвые) объекты.

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

В этом плане C++ от JavaScript не отличается. Правда, в отличие от JavaScript-объектов, C++-объекты статически типизированы. Они, в результате, не могут менять собственное представление во время выполнения программы. При работе с C++-объектами с применением Oilpan этот факт учитывается и предоставляется описание указателей на другие объекты (рёбра графа) с использованием паттерна Посетитель (Visitor). Базовый паттерн используемый для описания Oilpan-объектов, выглядит так:

class LinkedNode final : public GarbageCollected<LinkedNode> {public:LinkedNode(LinkedNode* next, int value) : next_(next), value_(value) {}void Trace(Visitor* visitor) const {visitor->Trace(next_);}private:Member<LinkedNode> next_;int value_;};LinkedNode* CreateNodes() {LinkedNode* first_node = MakeGarbageCollected<LinkedNode>(nullptr, 1);LinkedNode* second_node = MakeGarbageCollected<LinkedNode>(first_node, 2);return second_node;}

В этом примере Oilpan управляет LinkedNode, на что указывает то, что класс LinkedNode является наследником GarbageCollected<LinkedNode>. Когда сборщик мусора обрабатывает объект, он находит указатели на другие объекты, вызывая метод объекта Trace. Тип Member это интеллектуальный указатель, который, с синтаксической точки зрения, похож, например, на std::shared_ptr, который предоставляется Oilpan и используется для поддержания единообразного состояния при обходе графа объектов во время выполнения маркировки объектов. Всё это позволяет Oilpan точно знать о том, где именно находятся указатели, с которыми работает эта система.

Тот, кто внимательно прочитал вышеприведённый код, возможно, заметил (и, может быть, его это испугало) то, что first_node и second_node хранятся в стеке в виде обычных C++-указателей. Oilpan не задействует дополнительные абстракции для работы со стеком. Сборщик мусора, обрабатывая корневые объекты в куче, которой управляет, полагается исключительно на консервативное сканирование стека при поиске указателей. Всё это работает путём пословного перебора стека и благодаря интерпретации слов в виде указателей на сущности, находящиеся в управляемой куче. Это означает, что использование Oilpan не приводит к ухудшению производительности при доступе к объектам, размещаемым в стеке. Вместо этого нагрузка переносится на этап сборки мусора, когда осуществляется консервативное сканирование стека. Oilpan интегрирован в подсистему рендеринга и пытается откладывать запуск процедуры сборки мусора до тех пор, пока система не достигнет состояния, когда в стеке, точно, не будет ничего интересного. Так как работа веб основана на событиях, а выполнение кода производится путём обработки задач в циклах событий, в распоряжении Oilpan оказывается достаточно удобных моментов для запуска сборки мусора.

Oilpan используется в Blink, а это большая кодовая база, написанная на C++, в которой содержатся значительные объёмы зрелого кода. Благодаря этому Oilpan, кроме прочего, отличается следующими возможностями:

  • Множественное наследование с помощью миксинов и ссылок на подобные миксины (внутренние указатели).
  • Поддержка вызова сборки мусора при выполнении конструкторов.
  • Поддержание объектов из неуправляемой памяти в живом состоянии с помощью интеллектуальных указателей Persistent, которые рассматриваются как корневые сущности.
  • Коллекции, представляющие собой последовательные (например vector) и ассоциативные (например set и map) контейнеры. Возможность уплотнения данных, лежащих в основе коллекций.
  • Слабые ссылки, слабые функции и эфемерные структур данных.
  • Финализаторы методы, выполняемые перед удалением из памяти отдельных объектов.

Очистка памяти для C++


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

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

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

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

class GCed : public GarbageCollected<GCed> {public:void DoSomething();void Trace(Visitor* visitor) {visitor->Trace(other_);}~GCed() {other_->DoSomething(); // error: Finalizer '~GCed' accesses// potentially finalized field 'other_'.}private:Member<GCed> other_;};

В этом коде происходит ошибка при попытке обращения к объекту из кучи в ходе уничтожения другого объекта.

Если вас интересует вопрос уничтожения объектов, то знайте, что Oilpan даёт в распоряжение программиста коллбэки, вызываемые перед финализатором. Это позволяет реализовывать сложные схемы уничтожения объектов, когда объекту, перед уничтожением, нужен доступ к другим объектам. Подобные коллбэки создают немалую дополнительную нагрузку на систему в ходе сборки мусора. Эта нагрузка больше той, которую способны создать деструкторы. Поэтому такие коллбэки используются в Blink относительно редко.

Инкрементальная и конкурентная очистка памяти


Теперь, когда мы поговорили об ограничениях деструкторов в управляемом C++-окружении, пришло время более подробно остановиться на том, как в Oilpan реализована и оптимизирована очистка памяти.

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

В самом начале в Oilpan использовался механизм очистки памяти, реализованный по схеме stop-the-world. Это означало, что выполнение приложения в главном потоке приостанавливалось во время проведения процедуры очистки памяти.


Приостановка выполнения кода в ходе очистки памяти

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


Инкрементальная очистка памяти

При использовании инкрементального подхода фазы пометки и уничтожения объектов отделены друг от друга. При этом процедура очистки памяти разбита на несколько частей, представленных отдельными задачами, выполняющимися в главном потоке. В лучшем случае подобные задачи выполняются только во время простоя системы, что позволяет избежать их конфликта с задачами, представляющими обычные механизмы приложения. Внутренние механизмы сборщика мусора разделяют одну большую задачу по очистке памяти на небольшие задачи, это разделение основано на понятии страница. Страницы могут пребывать в двух состояниях. Одни страницы находятся в состоянии ожидания очистки (to-be-swept), а другие уже являются очищенными (already-swept). Механизмы выделения памяти учитывают только страницы, которые уже очищены, и пополняют локальные буферы выделения памяти (Local Allocation Buffer, LAB) из списка свободной памяти, в котором хранится список доступных фрагментов памяти. Для того чтобы получить память, сведения о которой есть в списке свободной памяти, приложение сначала попытается найти память, которая относится к уже очищенным страницам. Затем приложение попытается помочь системе в обработке страниц, которые ожидают очистки, воспользовавшись там, где оно пытается выделить память, системой очистки памяти. Новая память у операционной системы будет запрошена лишь в том случае, если вышеприведённые действия не привели к тому, что приложение получило нужную ему память.

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

  • Система очистки памяти обрабатывает только память мёртвых объектов, которые, по определению, недостижимы из приложения.
  • Приложение выделяет память, используя только ту память, которая принадлежит очищенным страницам. Такие страницы уже не интересуют систему очистки памяти.

Оба правила позволяют обеспечить то, что несколько сущностей не станут бороться друг с другом за один и тот же объект и его память. К сожалению, C++ сильно полагается на деструкторы, которые реализованы как финализаторы. Oilpan запускает финализаторы в главном потоке для того чтобы помочь разработчикам и исключить гонку данных в самом коде приложения. Для решения этой проблемы Oilpan планирует отложенное выполнение финализатора объекта в главном потоке. А если точнее, то всякий раз, когда конкурентная система очистки памяти сталкивается с объектом, у которого есть финализатор (деструктор), она помещает его в очередь финализации, которая будет обработана на особом этапе финализации. Код на этом этапе всегда выполняется в главном потоке, в котором, кроме того, выполняется и код приложения. Вот как, в общих чертах, выглядит схема конкурентной очистки памяти.


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

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

Результаты


Механизм фоновой очистки памяти был выпущен в сборке Chrome M78. Наш фреймворк для тестирования Chrome в условиях, приближенных к реальным, показал уменьшение времени, уходящего в главном потоке на операции, связанные с очисткой памяти, на 25-50% (в среднем на 42%). Ниже показаны результаты испытаний некоторых популярных веб-проектов.


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

То время, которое всё ещё уходит в главном потоке на очистку памяти, требуется для выполнения финализаторов. В настоящее время идёт работа по оптимизации финализаторов для типов объектов, которые часто используются в Blink. Примечательно здесь то, что все такие оптимизации проводятся за пределами кода системы очистки памяти, так как эта система, в её текущем виде, автоматически подстраивается под ситуацию при отсутствии финализаторов.

Сталкивались ли вы с проблемами производительности веб-проектов, которые вызваны системой сборки мусора Chrome?



Подробнее..

Как SpaceX пишет софт

30.11.2020 10:17:56 | Автор: admin

Даглас Хёрли и Боб Бенкен в капсуле Индевор

Компания SpaceX ведёт стремительную разработку проектов сразу по нескольким направлениям. Первая ступень ракеты Falcon 9 после запуска полезной нагрузки в космос возвращается на Землю для повторного использования, подобное тестируют для прототипов Starship. На МКС корабль Crew Dragon доставляет экипаж, готовится второе поколение грузовиков Dragon. Рой спутников связи Starlink выдаёт больше сотни мегабит в секунду для реальных пользователей открытого бета-теста.

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

Сложность космоса


14 декабря 1966 года в беспилотном испытательном запуске Союзакорабль 7К-ОК1 встал на стартовой площадке: не сработала зажигалкана одном из двигателей. Автоматика остановила последовательность действий запуска до того, как ракета успела отделиться от поверхности стартового стола. Персонал приблизился к ракете для её осмотра и оценки возможности повторного запуска. Внезапно сработала система аварийного спасения (САС) Союза. Её пороховые двигатели бережно вынесли спускаемый аппарат на высоту 700 метров и отдали его во власть парашютов, но также зажгли разлившуюся горючую жидкость системы терморегулирования приборного отсека, который остался на Земле. Верхушка ракеты загорелась. Как вспоминает Черток, память о катастрофе Неделина заставила людей покидать стартовую площадку бегом. Погиб один человек.

Выяснение причин срабатывания САС на неподвижной ракете началось ещё до тушения стартовой площадки. Во время полёта ракета постоянно сравнивает отклонения инерциальной системы отсчёта от расчётной траектории. Если разница слишком велика, то срабатывает САС. Стоящая на стартовой площадке ракета всё же движется: она вращается с Землёй, а гироскопы привязанык звёздам. При проектировании аварийных систем Земля предполагалась неподвижной. За 27 минут набежало примерно 8 градусов, и на 32 пиротехнических заряда САС поступил сигнал зажигания.

Этот баг упустили из виду даже без сложностей современных компьютеров. Сегодня электроникой управляются все критические системы любого космического аппарата. Это уже даже не самый дорогой дефис в истории зонда Маринер-1 1962 года: в современных системах пространство для ошибок исчисляется десятками, сотнями тысяч строк кода. Любой заметный сбой программного обеспечения вызывает деградацию качества работы или вовсе приводит к потере аппарата.

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


SpaceX выложила этот видеоролик с любовью к своей культуре проб и ошибок

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

Сокол на x86


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

В SpaceX игнорируют сформировавшееся щепетильное отношение к космическому оборудованию. Компания с момента основания выделялась своей любовью к относительно дешёвым компонентам. К примеру, в 2005 году журналисты сообщали, что в ракете Falcon 1 компьютеры общались по обычному кабелю Ethernet.

Как рассказывали (1, 2) инженеры SpaceX на конференции GDC 2015, на ракете Falcon 9 на каждой из ступеней установлены по три двухъядерных компьютера архитектуры x86. В каждом компьютере на каждом из двух ядер независимо друг от друга работает операционная система с полётным софтом. Также в ракете установлены микроконтроллеры архитектуры PowerPC. Они управляют разными исполнительными механизмами: двигателями, решётчатыми рулями и так далее.

Всё это оборудование объединено в систему actor-judge.

  • Почти всё выражается в традиционном для ТАУ виде контура управления: много раз в секунду с датчиков приходят данные, по ним и прошлым состояниям системы принимается решение, компьютер выдаёт сигналы устройствам.
  • Ядра выполняют вычисления независимо друг от друга. Результат работы двух ядер сравнивается. Если на обоих ядрах получился разный результат, этот инстанс команду не посылает.
  • Микроконтроллеры получают команды от трёх разных компьютеров. Микроконтроллер решает, кому из трёх верить, и выполняет команду. При рассинхронизации компьютеров контроллер положится на тот, который был самым точным в прошлом.
  • Успешный полёт Falcon 9 возможен всего с одним оставшимся компьютером из трёх.

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

Управляющие компьютеры тестируют на так называемом стенде table rocket, ракете на столе. Мозги Falcon 9 раскладывают на плоской поверхности и соединяют так, как они работают в реальной ракете. Затем специалисты запускают полный симулированный полёт, следят за поведением системы, её производительностью и возможными отказами. Во время симуляции могут отключить один из полётных компьютеров, чтобы понять, как на это ответит ракета.

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

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

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

Но для космоса многого не нужно. Сама МКС управляется процессором Intel 80386SX-20 с математическим сопроцессором 80387. Даже на момент запуска станции это был продукт десятилетней давности.

В космос в браузере


30 мая компания SpaceX впервые запустила людей на орбиту. Наконец появилась вторая опция доставки экипажа на Международную космическую станцию. С 2011 года единственным решением для этого были российские Союзы.

Аудитория онлайн-трансляции обратила внимание, насколько корабль Crew Dragon выглядел крупнее трёхместной капсулы Союза. При схожем внутреннем объёме у корабля SpaceX 4 метра диаметра против союзовских 2,2 м. SpaceX изначально рекламировала корабль как семиместный, но НАСА будет запускать на пилотируемых Драконах четырёх астронавтов.

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

Экраны Crew Dragon работают на браузерном движке Chromium, то есть интерфейсы созданы на HTML с использованием веб-компонентов, JavaScript и CSS. Внутри компании написали собственную реактивную библиотеку. Разработка интерфейсов идёт по методологии Agile с высокой планкой для покрытия юнит-тестами.


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

Ещё до первого пилотируемого запуска SpaceX опубликовала браузерный симулятор стыковки Крю Дрэгона к МКС. Симулятор начинался как хобби двух разработчиков компании. Затем его решили закончить и опубликовали для широкой публики.

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

Всё это не значит, что космический корабль летает на JavaScript. Chromium на корабле используется только как средство отрисовки элементов пользовательского интерфейса. Слой взаимодействия с полётным программным обеспечением имеет все необходимые меры резервирования и находится за пределами дисплеев, говорят сотрудники SpaceX. Бэкенд написан на C/C++.

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

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

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


Диаграмма показывает, как код на JavaScript изолирован от основных систем управления телескопа Джеймс Уэбб

Если отвлечься от опыта SpaceX, то ничего возмутительного в выборе JavaScript для космической области нет. В случае космического телескопа Джеймс Уэбб код на JS будет выполняться прямо на аппарате. Он не будет напрямую контролировать, к примеру, двигатели, он будет лишь вызывать другие программы.

Почему в космосе нет звука?


Потому что ракета летает на Linux.

Софт Falcon 9 регулярно обновляют. Почти каждый запуск ракета летит с незначительно обновлённым кодом. Хотя обновления настолько часты, базу под каждый конкретный запуск специально не адаптируют. Этим занимаются другие отделы SpaceX, которые вносят свои коррективы в полётные конфиги: задают переменные ветра в день запуска, меняют пределы отказоустойчивости и так далее.

Crew Dragon управляется операционной системой Linux с патчем PREEMPT_RT для работы в реальном времени. В SpaceX не используют какой-то стандартный сторонний дистрибутив. В компании собрали собственное ядро и связанные с ним утилиты. За годы разработки ядро почти не модифицировали. Были лишь мелкие изменения и несколько специализированных драйверов для работы с аппаратным обеспечением.

Среди используемых проектов с открытым исходным кодом загрузчик операционной системы Das U-Boot, система сборки дистрибутива Buildroot, стандартная библиотека С++ и библиотека языка C Musl. Но вообще в SpaceX используют не так много написанного вне компании софта и выбирают открытые проекты только с максимально возможным качеством.

В SpaceX тесты пишут на Python, тестируют в LabVIEW, а летают на С++. При написании в С++ используют объектно-ориентированные техники языка, хотя предпочитают сохранять всё как можно более простым.

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

Сотрудники SpaceX говорят, что в Dragon нет ИИ (вероятно, подразумеваются нейросетевые алгоритмы), хотя какое-то машинное зрение для навигации используется. Разработчики пояснили, что не исключают использование программ с машинным обучением когда-нибудь в будущем.

Starlink


Проект спутникового Интернета Starlink это ещё больше компьютеров. В каждом запуске ракета Falcon 9 выводит на орбиту 60 спутников, которые содержат более 4 тысяч компьютеров на Linux. SpaceX вывела на околоземную орбиту десятки тысяч нод на Linux и более тысячи микроконтроллеров.


Анимация показывает, как раскрывается солнечная панель спутника

Полгода назад Starlink генерировал около 5 ТБ телеметрии в сутки, и группировка стала лишь крупнее. Растёт число спутников, идёт работа над уменьшением объёма пересылаемых данных. Чтобы снизить объём данных, которые хранятся на борту и пересылаются на Землю, часть проблем диагностируются на самом устройстве.

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

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

Дублирование внутренних систем в случае спутника Starlink выполняется лишь до определённого предела. Из-за общего числа спутников отряд не заметит потери бойца. При отказе одной ноды пользователь на Земле будет подключаться к другому видимому в небе спутнику.

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

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

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

Культура разработки


Большая часть инженеров программного обеспечения SpaceX работает в Сиэтле (штат Вашингтон) и Хоторне (Калифорния), часть из офисов в Техасе.


Команда разработчиков ПО SpaceX, 2013 год

Традиционную аэрокосмическую отрасль повергает в шок и скорость разработки, и размер подразделений SpaceX. Как в 2019 году заявил (подкаст, отметка 44:00) главный директор по программному обеспечению ВВС США Николас Чайллан, там, где у государственных агентств потребовалось бы как минимум 2,5 тысячи программистов, SpaceX нанимает 50. При этом команда разработчиков пишет софт на девять разных аппаратов и проверяет код за 24 часа.

SpaceX пытается привлекать разработчиков из игровой индустрии. На GDC 2015 представители компании говорили, что у обладетелей диплома с направлением computer science навыков управления памятью нет. Неожиданно, но для космоса подходят темп работы и методы оптимизации игровых разработчиков. Как говорит Илон Маск, по сравнению с MMO стыковка двух кораблей это элементарно просто.

В рамках AMA на Реддите в 2013 году сотрудники рассказали про структуру отделов разработки программного обспечения.

  • В команде полётного программного обеспечения 7 лет назад было 35 человек. Примеры деятельности отдела: программы для ракеты Falcon 9, прототипа для отработки посадки первой ступени Grasshopper и космического корабля Dragon. Команда пишет основные компоненты для этих платформ, тестирует полётный код, разрабатывает программное обеспечение для связи и анализа данных на наземных станциях. Иногда эти сотрудники помогают в местном ЦУПе обеспечивать полёт.
  • С продуктами отдела разработки внутреннего корпоративного софта сталкиваются все сотрудники SpaceX. Основное направление внутреннее веб-приложение компании. Через него, к примеру, создают заказы на оборудование, проводят инвентаризацию и отслеживают часы работы. Для всего этого есть сторонние решения, но в SpaceX предпочитают самописную систему. Стэк разработки типичное веб-программирование начала десятых годов: C#, MVC4, EF, SQL; Javascript, Knockout, Handlebars, LESS; REST API, положительно охарактеризованный сотрудниками как super sexy.
  • В 2013 году 9 человек писали софт для полётных компьютеров, которые не летают. Чтобы управлять космическим аппаратом из современного ЦУПа, нужно передавать много данных в высокораспределённых системах. Эта команда разработчиков реализует сложные пользовательские интерфейсы со строгими требованиями.
  • Команда тестирования авионики работает с конструкторами авиационной электроники и пишет программы для тестирования аппаратного обеспечения. Такой софт обычно работает во время механических тестов в реальной среде. Цель этого отдела автоматизация поиска проблем с оборудованием.

Компания постоянно нанимает разработчиков и инженеров, и далеко не для каждой позиции нужно специальное образование. В офисах SpaceX звучит много разных акцентов, в том числе с пространства бывшего СССР. В компанию могут нанять не только обладателя американского паспорта, хотя ограничения режима контроля экспорта технологий военного назначения существуют. Для найма иностранцу потребуется вид на жительство грин-карта США. На её получение с нуля уйдёт несколько лет. Если гринка уже есть, то вопрос лишь в умении показать уровень квалификации на собеседовании.

Глава и технический директор SpaceX Илон Маск известен своей нелюбовью к 40-часовым рабочим неделям. Он неоднократно заявлял, что работает по 80120 часов в неделю. Каков поп, таков и приход. Частая жалоба на Glassdoor про SpaceX плохой баланс жизни и работы. В анонимных отзывах сотрудники и стажёры говорят про частое выгорание и ставшие нормой 12 часовые смены.
Подробнее..

Новое CSS-свойство content-visibility ускоряет отрисовку страницы в несколько раз

13.08.2020 10:12:29 | Автор: admin
5 августа 2020 разработчики Google анонсировали новое CSS-свойство content-visibility в версии Chromium 85. Оно должно существенно повлиять на скорость первой загрузки и первой отрисовки на сайте; причём с только что отрендеренным контентом можно взаимодействовать сразу же, не дожидаясь загрузки остального содержимого. content-visibility заставляет юзер-агент пропускать разметку и покраску элементов, не находящихся на экране. По сути, это работает как lazy-load, только не на загрузке ресурсов, а на их отрисовке.


В этой демке content-visibility: auto, применённый к разбитому на части контенту, даёт прирост скорости рендера в 7 раз


Поддержка


content-visibility основывается на примитивах из спецификации CSS Containment. Хотя на данный момент content-visibility поддерживается только в Chromium 85 (и считается достойным прототипирования в Firefox), спецификация Containment поддерживается в большинстве современных браузеров.

Принцип работы


Основная цель CSS Containment повысить производительность рендеринга веб-контента, обеспечивая предсказуемую изоляцию поддерева DOM от остальной части страницы.

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

Всего есть четыре типа CSS Containment, каждое выступает значением для CSS-свойства contain и может быть скомбинировано с другими:

  • size: Ограничение размера элемента гарантирует, что блок элемента может быть размещен без необходимости изучения его потомков. То есть, зная размер элемента, мы вполне можем опустить вычисление расположения его потомков.
  • layout: Ограничение выкладки не даёт потомкам повлиять на внешнее расположение других блоков на странице. Это позволяет нам потенциально опустить размещение потомков, если все, что мы хотим сделать, это расположить другие блоки.
  • style: Ограничение стилей гарантирует, что свойства, влияющие не только на его потомков, не покидают элемент (например, счетчики). Это позволяет пропустить вычисление стилей для потомков, если все, что нам нужно, это вычислить стили для других элементов.
  • paint: Ограничение покраски не позволяет потомкам отображаться за пределами своего контейнера. Ничего не будет налезать на элемент, и если он находится за границами экрана или так или иначе невидим, его потомки также будут невидимы. Это позволяет не отрисовывать потомков, если элемент уже за краями экрана.


Пропускаем рендеринг с content-visibility



Может быть непонятно, какие значения contain лучше использовать, поскольку оптимизация браузера может сработать только при правильно указанном наборе параметров. Стоит поиграться со значениями, чтобы эмпирическим путём узнать, что работает лучше всего. А лучше использовать content-visibility для автоматической настройки contain. content-visibility: auto гарантирует максимальный возможный прирост производительности при минимальных усилиях.

В автоматическом режиме свойство получает атрибуты layout, style и paint, а при выходе элемента за края экрана, получает size и перестаёт красить и проверять содержимое. Это значит, что как только элемент выходит из зоны отрисовки, его потомки перестают рендериться. Браузер распознает размеры элемента, но больше не делает ничего, пока в отрисовке не возникнет необходимость.

Пример тревел-блог


Your browser does not support HTML5 video.


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

  • Часть страницы загружается из сети вместе с необходимыми ресурсами
  • Браузер стилизует и размещает весь контент на странице, не различая контент на видимый и невидимый
  • Браузер переходит к шагу 1 до того пока не загрузит все ресурсы

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



Теперь представим, что мы поместили content-visibility: auto на каждый пост в блоге. Основная система та же: браузер загружает и рендерит части страницы. Однако, разница в количестве работы, сделанной в шаге 2. С content-visibility браузер будет стилизовать и размещать тот контент который сейчас видит пользователь (на экране). Но обрабатывая истории вне экрана, браузер будет пропускать рендеринг всего элемента и будет размещать только контейнер. Производительность загрузки этой страницы будет как если бы она содержала заполненные посты на экране и пустые контейнеры для каждого поста вне его. Так получается гораздо быстрее, выигрыш составляет до 50% от времени загрузки. В нашем примере мы видим улучшение с 232мс рендеринга до 30мс, это улучшение производительности в 7 раз.

Что нужно сделать чтобы воспользоваться этими преимуществами? Во-первых, мы разделяем контент на части:



После, мы применяем последующую стилизацию на части:

    .story {        content-visibility: auto;        contain-intrinsic-size: 1000px; /* Объяснено далее */    }


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


Определение типичного размера элемента с contain-intrinsic-size


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

К счастью, у css есть ещё одна способность, contain-intrinsic-sizе, которая предоставляет возможность определить настоящий размер элемента, если тот подвергся сжатию. В нашем примере мы устанавливаем ширину и высоту примерно 1000px.
Это означает, что он будет располагаться так, будто там один файл внутренного размера, при этом гарантируя, что div все ещё занимает место. contain-intrinsic-sizе выступает в качестве заполнителя.

Скрываем контент с content-visibility: hidden


content-visibility: hidden делает то же, что и content-visibility: auto делает с контентом вне экрана. Однако, в отличие от auto, он не начинает автоматический рендеринг контента на экране.

Сравним его с обычными способами спрятать контент элемента:

  • display: none: скрывает элемент и удаляет состояние рендеринга. Это означает что доставая элемент будет стоить той же нагрузки как и создание нового элемента.
  • visibility: hidden: скрывает элемент и оставляет состояние рендеринга. Это на самом деле не удаляет элемент из документа, так как он (и его поддерево) все еще занимает геометрическое пространство на странице и по-прежнему может быть нажат. Он также обновляет состояние рендеринга в любое время, когда это необходимо, даже если он скрыт.

content-visibility: hidden, с другой стороны, скрывает элемент, сохраняя состояние рендеринга, так что если будут необходимы какие-либо изменения, они произойдут только при показе элемента на экране.

Заключение


content-visibility и CSS Containment Spec позволяют значительно ускорять рендеринг и загрузку страниц без каких-либо сложных манипуляций, на голом CSS.
The CSS Containment Spec
MDN Docs on CSS Containment
CSSWG Drafts



На правах рекламы


Серверы для размещения сайтов это про наши эпичные! Все серверы из коробки защищены от DDoS-атак, автоматическая установка удобной панели управления VestaCP. Лучше один раз попробовать ;)

Подробнее..

Объясните, почему мой рокет-саенс бэкенд билдится пару секунд, а четыре формы на фронте полгода

09.09.2020 18:05:36 | Автор: admin

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

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

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

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

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

Но проблемы начались потому что кто-то когда-то допустил фронтендеров к разработке ПО.

Смотрите, я запускаю ноут, на нем начинает крутиться операционка, со всеми своими службами и драйверами. Дотнет, студия, райдер, плеер, почтовый клиент, FIFA18, проводник, телега. И это все 20% моей оперативы. А потом я запускаю интерпретаторы и исполнители js. 80+ % оперативы. Браузер, нода, вскод. Три приложения, которым я дал одно простое задание отрендерить формы и интерпретировать жс в них. Двумерные, простые формы, без физики.

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

Давайте так я нихрена не эксперт в производительности, я очень слабо себе представляю, как отличается программирование операционной системы от создания штуки вроде Node.js на мой дилетантский взгляд ОС решает гораздо более сложные и ресурсоемкие задачи, но хрен с ним. Нода у меня билдит код, который я написал на тайпскрипте. Но у меня ещё есть код, который я написал на сишарпе его билдит, запускает и исполняет дотнет. Почему он жрет в десятки раз меньше памяти? Дотнет что, решает более простые задачи? Или может он медленнее? Меньше функциональности? Хер там плавал.

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

У меня гигантейший бекенд проект, и к нему малюсенький фронтендик на четыре формы. Я делаю фичу вношу изменения в кодовые базы обеих проектов. Когда изменения внесены надо билдить. Я нажимаю f5 в райдере, альтабаюсь на вскод и когда вижу перед собой стройные ряды typescript кода, получаю десктопную нотификацю: "build succeed". Все.

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

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

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

  • Нужно высыпать из кофемолки среднепрожаренную бурду, которую пьет жена

  • Достать нужные зерна из специальной непроницаемой баночки,

  • Засыпать в кофемолку,

  • Выставить верный помол, включить её,

  • Тщательно промыть френч-пресс.

  • Пока чайник кипит, нужно держать френч под горячей водой чтобы холодные стенки не остудили кипяток

  • Быстро ошпарить огромное количество молотого кофе.

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

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

Прошелся по двору, вернулся на кухню. Тут запишите еще пункт:

  • Пара ложек тростникового сахара, тщательно размешиваем.

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

А билд ещё идет. Четыре формы, сынок.

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

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

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

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

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

А билд ещё идет. Четыре формы, сынок.


На правах рекламы

Эпичные серверы - это мощные серверы на базе новейших процессоров AMD EPYC. Частота процессора до 3.4 GHz. Максимальная конфигурация - 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe!

Подробнее..

Открытые клиенты Hola VPN и Opera VPN

01.05.2021 04:09:42 | Автор: admin

Предлагаю вашему вниманию два простых решения для случаев, когда нужен прокси:

  • Недоступность сетевого ресурса по разным причинам.

  • Гео-ограничения.

  • Потребность спрятать трафик от интернет-провайдера и/или исключить возможность его вмешательства в трафик.

hola-proxy

https://github.com/Snawoot/hola-proxy/

hola-proxy - это клиент для прокси-серверов Hola, который использует то же API для получения доступа к ним, что и браузерное расширение Hola VPN. Соединение с прокси-серверами защищено TLS. Приложению не требуется ни установка, ни права администратора для работы. Имеется в наличии кое-какая устойчивость к попыткам блокировок самих VPN-сервисов. В частности, в отличии от оригинального расширения, приложение успешно работает в Египте.

Отличия приложения от браузерного расширения Hola VPN:

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

  • Убраны почти все ограничения бесплатного доступа.

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

  • Есть возможность использования резидентных IP-адресов в US для того чтобы, например, смотреть американский Netflix, Hulu и другие видео-сервисы с гео-ограничениями, требующими IP-адрес, относящийся к провайдерам потребительского доступа к интернету.

  • Улучшенная устойчивость к блокировкам по сравнению с расширением (у нативного клиента чуть больше возможностей).

  • Открытый исходный код.

  • Запускается на большом ассортименте ОС и аппаратных платформ.

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

Порядок использования:

  1. Скачать отсюда, выбрав исполняемый файл для своей платформы.

  2. Запустить. Станет доступен обычный HTTP-прокси на локальном порте 8080.

  3. Настроить браузер и/или другое ПО на использование HTTP прокси-сервера по адресу 127.0.0.1:8080. Для браузера ради удобства крайне рекомендую использовать расширение SwitchyOmega (Chrome, Firefox).

Примечания:

Если требуются особые настройки (страна, тип прокси), то можно создать ярлык, указав дополнительные параметры командной строки через пробел после имени файла. Справка по параметрам: https://github.com/Snawoot/hola-proxy/#list-of-arguments

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

opera-proxy

https://github.com/Snawoot/opera-proxy/

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

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

Порядок использования:

  1. Скачать отсюда, выбрав исполняемый файл для своей платформы.

  2. Запустить. Станет доступен обычный HTTP-прокси на локальном порте 18080.

  3. Настроить браузер и/или другое ПО на использование HTTP-прокси-сервера по адресу 127.0.0.1:18080. Для браузера ради удобства крайне рекомендую использовать расширение SwitchyOmega (Chrome, Firefox).

Примечания:

Обратите внимание, что opera-proxy по умолчанию использует порт 18080, в то время как hola-proxy - 8080.

Справка по параметрам командной строки для выбора региона и других настроек: https://github.com/Snawoot/opera-proxy/#list-of-arguments

Пара слов об Android

Оба приложения работают на Android, не требуя рута. Запустить их можно с помощью любого удобного шелла (приложения-терминала). Я бы порекомендовал Qute, так как оно поддерживает автозапуск и создание ярлыков для скриптов. Для запуска нужно положить бинарь куда-то, где его можно было бы сделать исполняемым. В случае с Qute это /data/data/files/com.ddm.qute

После этого сделать бинарный файл прокси-клиента исполняемым: chmod +x /data/data/files/com.ddm.qute/*-proxy* и запустить его командой или скриптом: /data/data/files/com.ddm.qute/*-proxy*

Перенаправить весь трафик через прокси удобнее всего будет с помощью AdGuard для Android. В его настройках можно установить адрес прокси, куда нужно перенаправить трафик. Важно не забыть добавить в исключения AdGuard само приложение-шелл (в моём примере Qute). В противном случае исходящие соединения прокси будут зацикливаться в сам прокси.

Заслуживают упоминания

  • transocks - демон, который позволяет перенаправлять произвольные TCP-соединения на роутере в SOCKS- или HTTP-прокси.

  • moproxy - аналог предыдущего пункта.

  • Мой прошлый пост о некоторых преимуществах прокси по сравнению с VPN.

Пожалуй, это всё. А наверху на картинке, кстати, муравьед. Вроде бы.

Подробнее..

Перевод Движок, который смог как Chromium удалось захватить 90 рынка браузеров

09.09.2020 14:04:11 | Автор: admin

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

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

У веб-сообщества есть достаточно причин опасаться отсутствия браузерного разнообразия. После того, как Internet Explorer захватил в начале 2000-х долю 90% от рынка браузеров, для выпуска нового браузера его разработчикам потребовалась добрая половина десятилетия. В тот период развитие веба остановилось, и начали возникать проблемы с безопасностью. Из-за этого веб стал хуже, поэтому мы часто стремимся к тому, чтобы браузеры конкурировали, а не монополизировали веб.

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

Это беспокоило создателя веба Тима Бернерса-Ли. Даже в начале 90-х, когда веб был очень юным, по всему миру в процессе экспериментов разработчиков ПО начали появляться десятки браузеров. Бернерса-Ли волновало, что слишком большое количество браузеров усложнит тестирование сайтов и достижение консенсуса о способах парсинга и передачи HTML пользователям.

В 1992 году Тим Бернерс-Ли высказал своё беспокойство в списке рассылки, посвящённом гипертексту.

Никто не будет поддерживать 8 парсеров на 12 платформах, поэтому я немного обеспокоен развитием реализаций. (Да, разумеется, в то же время мне это приятно! Но я бы хотел видеть одну, может быть, две основные библиотеки (две, чтобы тестировать одну из них на наличие непротиворечивых багов), но не четыре. Мне кажется, это слишком много; будут возникать ситуации, когда небольшие тонкости работают в одной, но не в других библиотеках, потому что на поддержку каждой не хватило труда по поддержке.

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

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

Фундаментальной основой для создания разнообразной группы браузеров является развитие совершенно разных браузерных движков. Браузерный движок это программный код внутри браузера, который получает написанный вами код и рендерит его на странице. Если смотреть на более техническом уровне, то он парсит HTML, CSS и JavaScript для обработки структуры и рендеринга веб-страниц. Движок обычно включает в себя JavaScript-движок, обрабатывающий интерактивность. Чаще всего при обсуждении браузерного движка говорят и о связанном с ним JavaScript-движке, но так бывает не всегда.

До того, как разработчики браузеров начали использовать веб-стандарты, во время войн браузеров, был длившийся десяток лет период доминирования браузера Internet Explorer компании Microsoft. В Internet Explorer использовался проприетарный браузерный движок Microsoft под названием Trident. Internet Explorer распространялся бесплатно и по умолчанию был установлен на всех компьютерах с Windows. Благодаря своей скорости распространения Trident на долгие годы стал наиболее широко используемым браузерным движком.

Однако вскоре начали набирать популярность несколько более мелких браузеров с открытым исходным кодом. Самым популярным из них был Mozilla Firefox (основанный на Netscape), в котором использовался движок под названием Gecko. Немного отставала от него Opera со своим браузерным движком Presto. А небольшому сообществу полюбился браузер Konquerer с движком KHTML, имевший крошечную долю рынка браузеров.

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

Примечательно отсутствие в этом списке Apple. В 2003 году казалось, что компания совершенно упустила из виду платформу веба. Она неудачно пыталась создать собственный браузер под названием Cyberdog. Без нативного для своей ОС браузера компьютеры Apple поставлялись с Internet Explorer, который привязывал их к одному из самых серьёзных конкурентов к Microsoft.

Но затем начали циркулировать слухи, что Apple работает над новым браузером. В компанию пришло несколько ветеранов из Mozilla, от имени Apple внесших вклад в Mac-версию браузера Firefox с открытыми исходниками. А после первого провалившегося эксперимента инструменты и реализации стали намного лучше. Существовало уже много созревших решений на основе open source.

Изначально предполагалось, что Apple выберет в качестве браузерного движка Mozilla Gecko. У неё уже были нужные сотрудники и опыт работы с ним, к тому же этот движок использовался в подавляющем большинстве проектов браузеров, в том числе браузера для Mac под названием Camino, разработанного независимой командой, не относящейся к Apple. Некоторые считали, что Apple может выбрать Presto, заключив некий договор по лицензированию.

Стив Джобс завершил свою программную речь на Macworld 2003 долгожданным объявлением: Apple создаёт собственный браузер под названием Safari. И ко всеобщему удивлению, в нём будет использоваться движок из Konquerer. Не Gecko, не Presto. KHTML. Новость была громкой, и в следующие два десятилетия она изменила траекторию развития веба.


Браузер Konqueror, запущенный в среде рабочего стола KDE

Браузер Konquerer это одно из множества приложений, являющихся частью среды рабочего стола KDE для компьютеров с Linux. Строго говоря, это не операционная система, а пакет программного обеспечения, выглядящий и ведущий себя как ОС. Аббревиатура изначально расшифровывалась как Kool Desktop Environment, но потом была сокращена просто до KDE. Konquerer это одна из программ внутри KDE. А KHTML это движок, на котором работает Konquerer. Как и сам Linux, вся KDE имеет открытый исходный код, в том числе и её браузер, а сообщество разработчиков с самого основания придерживалось принципов открытого программного обеспечения.

Именно поэтому важно, что в объявлении Apple присутствовал этот слайд:


В своём объявлении о выборе KHTML Apple заявила о приверженности идеям open source. Команда разработчиков Safari пообещала по возможности вносить сделанные ею изменения в проект KHTML. При адаптировании движка Apple разбила его на две части: WebCore, занимающийся рендерингом и структурой, и JavaScriptCore, занимающийся JavaScript. Обе этих части стали проектами с открытым исходным кодом, однако система отслеживания ошибок Safari и элементы браузерного движка остались закрытыми. И всё же такой уровень прозрачности был удивителен для компании, хорошо известной охраной своих секретов.

Первая публичная версия Safari была выпущена одновременно с объявлением, в январе 2003 года. Вскоре после этого Safari начал поставляться как стандартный браузер для всех Mac. В течение одного-двух лет Safari стабильно занимала два-три процента от рынка браузеров. Этого не было достаточно, чтобы доминировать, но придавало вес команде разработчиков из Apple.

Несмотря на обещание, данное сообществу open source, разработчикам Safari поначалу оказалось сложно портировать вносимые ими изменения обратно в проект KTHML. Часть кода была специфичной для операционной системы Mac. Другие части были просто несовместимыми с существующей кодовой базой. Это привело к небольшим разногласиям между командой Apple и соавторами KHTML, длившимся пару лет.

Со временем был найден устраивающий всех компромисс. В июне 2005 года Apple объединила JavaScriptCore, Webcore и остальные компоненты браузерного движка, выпустив их как единый проект open source с публичным баг-трекером и призывом участвовать в развитии. Таким образом компания показала сообществу KHTML, что готова к сотрудничеству, сохраняя при этом независимость кода.

Проект назвали Webkit.

Критически важным оказался выбранный момент. Веб как платформа ускоренно развивался и находился на этапе Web 2.0. В целом, Web 2.0 был просто красивым маркетинговым термином, попыткой дать название росту количества сложных приложений, существующих исключительно в вебе. В него вошли два самых первых веб-приложения Google Google Maps и Gmail. В течение года Google добавила в этот список и YouTube.

В середине 2000-х годов инженеры Google пристально пригляделись к браузерам и обнаружили, что те неспособны удовлетворить потребность в создании сложных приложений. Особенно справедливо это было в отношении старых и необслуживаемых браузеров наподобие Internet Explorer (кстати, к стимулированию отказа пользователей от IE6 приложил руку и YouTube). Но основным приоритетом Google была скорость. Сооснователи компании однажды выразили желание создать веб столь же быстрый, как перелистывание бумажного журнала. Такой стала цель компании, и Google чувствовала, что даже современные браузеры типа Firefox и Safari приближались к ней недостаточно быстро.

К 2006 году компания начала строить планы по созданию собственного браузера. Она хотела иметь самый быстрый на рынке браузер. Поэкспериментировав со множеством браузерных движков, разработчики Google обратили внимание на проект Webkit, который перешёл в open source. Его код был компактным и читаемым, а ресурсоёмкость оставалась относительно низкой по сравнению с движками с богатой историей наподобие Gecko или Trident (последний в любом случае не рассматривался из-за закрытости своих исходников). Но, что самое важное, он был быстрым. Как отправная точка он был быстрее всех остальных движков.

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

Её первым шагом стало избавление от JavaScriptCore и замена его на собственный JavaScript-движок под названием V8, названный в честь мощного поршневого двигателя. Как можно понять из названия, V8 был быстрым. На момент выпуска он оказался в десять раз более производительным, чем JavaScriptCore. Он добился этой скорости благодаря работе в виртуальной машине и немного иному способу исполнения кода, делавшему его модульным и независимым от остальной части браузерного движка. Кстати, спустя пару лет эта модульность обеспечила возможность создания языка программирования Node: его разработчики взяли движок V8, избавились от браузера и поместили его на сервер.

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

В сентябре 2008 года Google официально объявил о проекте своего браузера публике. Компания совместила объявление с нердовским веб-комиксом Скотта Макклауда, в котором подробно описывались все технические подробности проекта. Браузер мог обрабатывать веб-сайты быстрее всех на рынке, а благодаря своей многопроцессной архитектуре был способен сохранять активность страниц, даже когда зависал какой-нибудь другой сайт. Это было в те времена, когда браузеры до сих пор были перегружены панелями инструментов и аддонами, а также пакетами больших компаний, в которые была включена и почта. Имя, данное Google этому проекту, тоже соответствовало концепции. В мире браузеров под понятием хром (chrome) подразумевается всё дополнительное, что окружает веб-страницу адресная строка, панели инструментов и файловые меню. Google избавилась от большинства этого хлама, поэтому и назвала браузер Google Chrome, надеясь, что ставка на простоту и производительность оправдает себя.


Фрагмент веб-комикса, с которого всё началось

Если не считать закрытого алгоритма поиска, Google многие годы делала вклад в проекты с открытым кодом и создавала новые. Поняв урок Apple, компания при разработке Chrome зашла ещё дальше. В тот же день, когда было объявлено о выпуске Google Chrome, компания сделала весь движок доступным как open-source-проект под названием Chromium. Это не просто несколько расширений для Webkit. Это не просто движок рендеринга. Открытым стало всё: Webkit, JavaScript-движок V8 и весь код самого браузера. Без особых усилий любой разработчик мог дополнить Chromium и выпустить собственный браузер. После его выпуска со многими браузерами так и случилось.

2008-й стал важным годом для веба. В том же месяце, когда был выпущен Chrome, Google показала прототип своей мобильной операционной платформы Android, собранной из нескольких проектов с открытыми исходниками. В него входила и мобильная версия Google Chrome. Это произошло чуть более года спустя официального выпуска iPhone, который поставлялся с модифицированной версией Safari. К тому времени, когда Стив Джобс приступил к безвозвратному убийству Flash и начал превращать в основной приоритет нативную платформу веба, эти устройства уже были повсюду.

То есть теперь в каждом мобильном смарт-устройстве работал Safari или Chrome. Сама Safari целиком благодаря покупкам iPhone всего за несколько лет удвоила свою долю на рынке. Популярность Chrome росла ещё быстрее. Используя Chromium, вы получали доступ к постоянно расширяющемуся списку независимых браузеров и браузерных проектов. Кроме того, Chromium стал основой языка программирования Node и фреймворка для десктопных приложений Electron.

И все эти проекты работали благодаря Webkit. За несколько лет он совершил путь от захвата небольшой доли рынка браузеров до доминирования на нём.

Такое состояние покоя было недолгим. В апреле 2013 года Google неожиданно объявила, что создаст ответвление (форк) проекта Webkit в новый движок под названием Blink. Google Chrome и проект Chromium будут переходить на этот новый движок.

У такого перехода было несколько причин, но важнейшая из них возвращает нас к вопросу многопроцессности. Несколько лет Google расширяла Webkit, чтобы добавить в свои браузеры многопроцессность, ставшую важнейшей особенностью и основанием роста производительности браузеров Chromium. В 2013 году проект Webkit должен был выпустить новую версию движка, которая улучшала в том числе и многопроцессность. Проблема заключалась в том, что её реализация стала бы совершенно другой и несовместимой с реализацией в Chrome. В нём уже использовался другой JavaScript-движок и это новое изменение слишком сильно бы отодвинуло Chromium от исходного проекта. Ядром Blink по-прежнему должен был оставаться и остаётся Webkit. Но он пойдёт по другому пути и создаст себе новый проект.

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

После этого момента браузерные движки начали исчезать.

За два месяца до выпуска Blink компания Opera объявила, что откажется от собственного движка Presto и перенесёт свой браузер на Chromium. Когда Google объявила о форке, Opera присоединилась к ней. В мае 2013 года она выпустила свой первый браузер на основе Blink.

Тем временем Microsoft многие годы придерживалась собственного движка с закрытым исходным кодом. Trident был преобразован в движок под названием EdgeHTML, созданный для браузера Microsoft Edge, впервые выпущенного в 2015 году. Но вкладывание ресурсов в разработку независимого движка оказалось слишком сложной задачей на уже заполненном рынке браузеров. В 2019 году компания объявила, что тоже переходит на Blink. С тех пор этот браузер тоже выпускается.

Потомков KHTML, то есть браузеры, имеющие движки из семейства Blink / Webkit, используют более 90% пользователей. От практического забвения до доли рынка в 90% за пятнадцать лет потрясающее достижение. И оно имело последствия.

Blink и Webkit это два разных движка, и в их исходном коде стало довольно много различий. Но они используют одинаковый подход к рендерингу веб-страниц, а бОльшая часть кода внутри проекта остаётся такой же. Это означает, что на текущем этапе, по сути, осталось две группы браузерных движков семейство Blink / Webkit и Gecko браузера Firefox. Даже если разделить Blink и Webkit, то всё равно остаётся только три.

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

Джеффри Зельдман хорошо резюмировал это в момент, когда Microsoft решила переходить на Blink:

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

С исторической перспективы траектория развития Webkit является настоящим чудом. И оно возникло благодаря открытости и поддержке сообщества. Но столь же важно поддерживать браузерное разнообразие и возможности инноваций.

В этом посте рассказано о пяти вехах истории развития веба.


  • 3 апреля 2013 года. Создание Blink как форка проекта Webkit. Движок рендеринга Blink используется в браузерах на основе Chromium, в том числе и в Google Chrome. Фундамент его кодовой базы был заложен Webkit, но он обрабатывает многопроцессные задачи и содержит JavaScript-движок V8.
  • 2 сентября 2008 года. Google выпускает собственный браузер Chrome, основной задачей которого является скорость. Его имя позаимствовано у рамки браузера, которую Google удалось значительно упростить. Всего за несколько месяцев он завоевал десятки миллионов пользователей, а в начале следующего десятилетия захватил рынок.
  • 7 июня 2005 года. Webkit Apple открывает исходный код своего браузерного движка, состоящего из двух основных компонентов: движка рендеринга WebCore и JavaScript-движка JavaScriptCore. Хотя в то время он использовался только Apple, вскоре благодаря внедрению компанией Google и применению на мобильных устройствах движок Webkit вскоре стал самым популярным.
  • 7 января 2003 года. Safari Apple выпускает свой второй браузер, и попытка оказалась успешной. Он позволил продавать компьютеры Mac с нативным браузером и завершить взаимоотношения с Internet Explorer компании Microsoft. В нём используется малоизвестный браузерный движок с открытым кодом под названием KHTML, который со временем превратится в Webkit.
  • 23 октября 2000 года. Konquerer в проект KDE включён новый браузер под названием Konquerer и выпущена его версия 2. Как и KDE в целом, Konquerer имеет открытый исходный код и поддерживается активным сообществом. Движок, лежащий в его основе, со временем станет фундаментом для Apple Safari и Google Chrome.

Источники






На правах рекламы


Наша компания предлагает безопасные серверы с бесплатной защитой от DDoS-атак. Возможность использовать лицензионный Windows Server на тарифах с 2 ГБ ОЗУ или выше, создание резервных копий сервера автоматически либо в один клик.

Используем исключительно быстрые серверные накопители от Intel и не экономим на железе только брендовое оборудование и одни из лучших дата-центров в России и ЕС. Поспешите проверить.

Подробнее..

Из песочницы Ликбез по браузерам для Windows в 2020

12.09.2020 14:11:18 | Автор: admin


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


Браузерные движки


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


Существующие движки отрисовки содержимого


  • Trident (так же известный как MSHTML) движок, ранее разрабатываемый Microsoft для браузера Internet Explorer;
  • EdgeHTML приемник Trident, ранее разрабатываемый Microsoft для браузера Legacy Edge (ранее просто Edge);
  • WebKit движок, разрабатываемый Apple для браузера Safari;
  • Blink приемник WebKit, разрабатываемый Google для браузера Chrome;
  • Gecko движок, разрабатываемый Mozilla для браузера Firefox;
  • Servo исследовательский проект Mozilla, некоторые технологии со временем перетекают в Gecko.

Существующие движки исполнения JavaScript


  • Chakra JScript движок JS, ранее разрабатываемый Microsoft для браузера Internet Explorer;
  • Chakra JavaScript приемник Chakra JScript, ранее разрабатываемый Microsoft для браузера Legacy Edge;
  • Nitro движок JS, разрабатываемый Apple для браузера Safari;
  • V8 движок JS, разрабатываемый Google для браузера Chrome;
  • SpiderMonkey движок JS, разрабатываемый Mozilla для браузера Firefox.

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


Браузеры


Chromium


Chromium это open-source ответвление браузера Chrome. Браузеры на основе Chromium составляют большую часть из всех используемых браузеров на планете Земля.
(картинка)
Обычно, браузеры на базе Chromium между собой отличаются только визуально, ведь у всех под капотом движки Blink и V8, хотя, какие-то компании пытаются привнести больше функционала в браузер, чем имеется.


ИМХО

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


Всех браузеров на основе Chromium подсчитать одному человеку вряд ли под силу, поэтому приведу список только тех, что помню:


  • Chrome в представлении не нуждается, браузер от Google;
  • ChrEdge новый браузер от Microsoft со старым названием. Поговаривают, отличается большей производительностью от Chrome. С некоторых пор предустанавливается в систему;
  • Brave браузер с повышенной безопасностью настолько, что приватный режим использует Tor;
  • Яндекс.Браузер, Opera, Vivaldi, тысячи их.

Firefox


Firefox использует движки Gecko и SpiderMonkey для своей работы. Имеет небольшое количество базирующихся на Firefox браузеров, но самый известный Tor Browser. Является единственным рубежом до полного перехода интернета на браузеры на основе Chromium.


Internet Explorer


Это любимая всеми утилита для скачивания браузеров. Как и Chrome не нуждается в представлении. До 11 версии использовал движки Trident и Chakra JScript. В 11 версии, за исключением режима совместимости, стал использовать движки Trident и Chakra JavaScript. Этот браузер ещё долго будет использоваться для всякого рода систем видеонаблюдения, поскольку имеет, почему-то, популярный в узких кругах API для расширений. В Windows 8 и Windows 8.1 имел особую модификацию движка Trident на базе WinRT для Metro режима.


(Legacy) Edge


Браузер, начавший своё существование с кодовым названием Project Spartan, являлся новым браузером от Microsoft в 2015 году, использующим движки EdgeHTML и Chakra JavaScript. Конечной целью проекта была полная совместимость с сайтами, отлично работающими в Chrome. В итоге получилось нечто своеобразное, но, очевидно, не выжившее под давлением Google.


Safari


Safari? А нет его больше, этого вашего Safari, кончился.


Нецелевое использование браузеров


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


  • Программистов на JS нечем занять;
  • На JS+HTML новичкам проще программировать;
  • Кроссплатформенность;
  • Требуется возможность отображать веб-страницы.

Приведу примеры подобного использования:


Chromium


Нынешние браузеры настолько сложны, что одному человеку создать собственный браузер не под силу (либо это должен быть гений). Они по сложности сравнимы с операционными системами! А, постойте, вот и первый кандидат на нецелевое использование Chrome OS. Да, весь пользовательский интерфейс просто модифицированный Chromium.
Однако, помимо этого, в виде CEF (Chromium Embedded Framework), Chromium используется в:


  • Игровые платформы: Steam, Epic Games Store, Battle.Net и другие;
  • Игры: GTA V, все игры от Blizzard, DOTA 2, CS GO и множество других;
  • Редакторы кода: Atom, VS Code, Visual Studio Installer(???!);
  • Программы для общения: Skype, Viber, WhatsApp, Discord, Slack и множество других;
  • Другие программы: balenaEtcher, draw.io и великое множество других.

Internet Explorer


Почти любое Win32 приложение, умеющее отображать WEB-страницы и при этом в распакованном виде занимающее меньше 60 мегабайт использует внутри Internet Explorer. Кстати, это касается не только маленьких по размеру приложений, например, Visual Studio использует Internet Explorer для отображения WEB-страниц, когда это требуется в работе IDE. Ещё существуют HTA приложения древний предшественник CEF на базе Internet Explorer. И ведь до сих пор работает.


(Legacy) Edge


Новым приложениям новые движки! Любое UWP приложение, использующее внутри отображение WEB-страниц работает на базе Edge. Не то, чтобы Microsoft запрещали использовать что-то другое, но никто просто и не старался. Так же, пока что, в предварительных сборках Windows новая клавиатура с GIF панелью тоже использует Edge для рендеринга. В будущих версиях, полагаю, перейдут на ChrEdge.


Большая картинка с клавиатурой


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


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


Prefetcher


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


Как это связано с браузерами? Идея в том, что это может смазать первый пользовательский опыт с другим браузером, например, пользуясь постоянно Chrome, имеете установленную версию Firefox. При запуске Firefox будет вести себя крайне медленно медленнее, чем ваш основной браузер. Всё потому что он запылился в глазах Prefetcher. В конечном итоге всё будет работать быстро, но первое впечатление после долгого неиспользования будет ужасным. Особенно это касается пользователей с HDD или малым количеством ОЗУ.


Области распределённой памяти


Да, звучит не очень. Но суть, в данном случае, простая если одна единица исполняемого кода требуется к исполнению больше одного раза, будь то exe или dll, то в память она загрузится лишь один раз. Поясню: если два различных приложения в ходе своей работы загрузят одну и ту же библиотеку, например, edgehtml.dll, то этот файл будет загружен в ОЗУ компьютера на самом деле только один раз, хотя, казалось бы, потребуется два или больше раз. Таким образом ОС экономит нам оперативную память.


Движки нормального человека


К чему это я? А вот дело в том, что в отличии от других браузеров, Internet Explorer и (Legacy) Edge предустановлены в систему, а их движки хранятся в папке System32. Это, в купе с API для разработки приложений, означает, что все приложения в системе, использующие данные движки будут загружать их в память только однажды. И этот принцип распространяется на все приложения.


В дополнение про UWP

У людей часто возникают проблемы с UWP приложениями, а точнее с их скоростью запуска. Всё дело в WinRT огромном наборе библиотек, при помощи которых UWP приложение взаимодействует с ОС. Если не использовать UWP приложения часто, то этот набор библиотек не будет прогружен в памяти полностью, и придётся ожидать окончания этого процесса перед использованием приложения. Но забавный факт используя два и более UWP приложения время их старта и общая производительность резко увеличиваются и часто даже превосходят Win32 программы. Исключением из этого является приложение "Фотографии" тут отдельная история, покрытая туманом.


Движки курильщика


А вот с приложениями (в том числе и браузерами) на основе Chromium это так не работает. Каждое приложение комплектует с собой собственную сборку библиотеки CEF, что, кроме раздувания размера приложения, не позволяет операционной системе иметь только одну копию dll в ОЗУ. Итого это сильно замедляет производительность при использовании множества подобных приложений. Помимо того, сам размер CEF довольно удручающий.


Microsoft Store


У многих возникает вопрос почему в Microsoft Store нет ни одного браузера(не считая нескольких кривых поделок на EdgeHTML)? Ответ, на самом деле, прост все браузеры, включая ChrEdge имеют собственную систему обновления, что прямо запрещено правилами Microsoft Store. В остальном никто никого не ограничивает.


Как удалить новый Microsoft Edge


Это не очень сложно. Для начала требуется найти папку с Microsoft Edge, она расположена по пути:
C:\Program Files (x86)\Microsoft\Edge\Application
Далее заходим в любую версию Edge и переходим в папку Installer. Полный путь может выглядеть следующим образом:
C:\Program Files (x86)\Microsoft\Edge\Application\83.0.478.58\Installer
Далее необходимо открыть командную строку от имени администратора в данной папке и выполнить следующую команду:
setup.exe --uninstall --system-level --verbose-logging --force-uninstall
Готово! Через несколько секунд этот браузер исчезнет из системы. Но при следующем же обновлении он появится снова, будте бдительны.


Заключение


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


P. S.


Администраторы Хабра, пожалуйста, почините HabraStorage в Legacy Edge! Совсем не дело.

Подробнее..
Категории: Браузеры , Chromium , Windows , Edge , Firefox

WebUSB. Прошейся из браузера

31.05.2021 12:16:05 | Автор: admin


Разработчики хромиума постоянно пилят огромное количество классных API для разных технологий и железяк. Тут и Web Share, и работа со звуком, Bluetooth, NFC, WebOTP и много чего ещё, более-менее полный список со статусами реализации можно посмотреть здесь. Но больше всего среди них впечатляет WebUSB API, о настоящих возможностях которого я узнал совсем недавно. Оказывается, с его помощью можно не только открывать странички с подключенных устройств, но и прошивать их. Это открывает новый крутейший сценарий работы со всякой мелкой электроникой.

Пара слов про WebUSB


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

WebUSB вышел в релиз в 2017 году, а в последний год его поддержка заметно выросла, так что ещё через годик он наверняка уже не будет восприниматься как какая-то диковинка. Кстати, это не полностью продукт гугла: в разработке стандарта активно участвовала Mozilla, но пока что, как и Apple, не торопится внедрять технологию в свой браузер из-за потенциальных уязвимостей. Конечно, API глубоко протестировано и запускается (очевидно) только под https, но из-за огромной мощности и количества потенциальных векторов атаки их точку зрения можно поддержать. С другой стороны, у 70% пользователей WebUSB уже давно живёт в браузере, и о критических уязвимостях пока не слышно.

Как и в большинстве новых API, WebUSB можно явно разрешить или запретить HTTP-заголовком Feature-Policy или атрибутом allow в iframe:

  Feature-Policy: fullscreen "*"; usb "none"; payment "self" https://payment.example.com

  <iframe allowpaymentrequest allow="usb; fullscreen"></iframe>

К тому же, получить доступ к списку устройств можно только через функциюnavigator.usb.requestDevice(), которая огромное модальное окно и запускается только в ответ на действие пользователя (вроде нажатия на кнопку). То есть злоумышленники не получат у вас доступ к девайсам, пока вы явно не вызовете их список и не выберете какой-нибудь вручную.



DFU


Полностью описывать механизм работы и нюансы API можно долго, и для этого есть web.dev и стандарт. Самое интересное в firmware. Так как железку, раздающую сайт, надо ещё научить это делать, разработчики, чтобы два раза не вставать, запилили возможность прошивать её прямо из браузера точнее, не сломали эту возможность :)


zhovner многим открыл глаза этим видео в том числе и мне

К USB-устройству обеспечен прямой доступ, со списком интерфейсов, VID/PID и другой информацией. Данные можно считывать и записывать управляющие команды, отслеживать состояния и так далее. Что из этого следует? Что тут же найдётся сумрачный гений, который запилит удобный инструмент, утилизирующий эти возможности! Так и появился PoC webdfu, позволяющий прошивать устройства в DFU-режиме.



DFU (Device Firmware Upgrade) это спецификация, созданная для упрощения обновления прошивки на USB-устройствах. Она поддерживается почти на всех ОС, работает в специальных программах вроде DfuSe и в оригинальной dfu-util. Как нетрудно догадаться из названия, webdfu служит драйвером USB-DFU для хрома. Он может:

  • Загружать текущую прошивку с устройства (upload)
  • Записывать новую прошивку на устройство (download)
  • Переключать устройство в режим DFU
  • Выполнять upload/download совместимо с STM'овской DfuSe

Не может:

  • Открыть устройство, если нет прав на доступ к нему или отсутствует базовый драйвер (Windows изрядно портит этим нервы)
  • Работать с файлами форматов DfuSe
  • Загружать прошивку в формате .dfu
  • Обрабатывать ошибки записи

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

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

Ссылки





На правах рекламы


Виртуальные серверы с мгновенной активацией на Linux или Windows. Сервер готов к работе через минуту после оплаты!

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru