Пользовательский интерфейс, распределение, кривые обучения и децентрализация

В первой части этой серии я утверждал, что пора убить Интернет. Оправдание: нас захлестнули атаки, и мы не можем обеспечить эту беззащитную позицию. Хотя эта точка зрения может показаться крайней, я не единственный, кто так думает. Вот слайд из презентации сотрудников Google на Blackhat 2017:

Учитывая огромное количество веб-атак, представленных на конференциях по безопасности, я бы пошел дальше; Я бы сказал, что даже опытные программисты не могут написать сложное, но безопасное веб-приложение. И я не думаю, что дополнительные меры или замена API помогут.

Итак, во второй части я обосновал необходимость новой платформы для замены Интернета, основанной на нескольких простых принципах проектирования безопасности:

  • Бинарные протоколы и форматы данных повсюду
  • Понятная и простая идентификация приложения
  • Встроенная в платформу аутентификация пользователей

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

В этой заключительной части я рассмотрю:

  • Децентрализация.
  • Пользовательские интерфейсы, дизайнеры и IDE.
  • Распространение, стриминг и мгновенный запуск.
  • Песочница и разрешения.
  • Дихотомия документ / приложение: в какой степени приложения и документы должны быть отдельными вещами?

Еще раз отмечу существующие проекты, которые можно использовать и комбинировать.

Децентрализация и распространение приложений

Во второй части я представил схему того, что я хочу, но оставил много деталей без объяснения: как вы упаковываете такое приложение? Как мы справляемся с потоковой передачей и мгновенным запуском? Как выглядит сервер? И многие читатели продолжили комментарии, спрашивающие о децентрализации, которая, конечно, становится все более важной темой, особенно в свете того, что провайдеры DNS начинают произвольно захватывать домены (как, к сожалению, это сделал Google).

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

  1. Сетевой протокол DAT - бинарный (буферы протокола).
  2. Идентификатор сайта DAT - это открытый ключ.
  3. Браузер Beaker имеет чистый пользовательский интерфейс в стиле Chrome.
  4. Beaker может просматривать сайты Dat, но также является веб-браузером, поэтому вы можете использовать его для всех ваших потребностей в просмотре. Веб-сайты с версией Dat получают кнопку в строке URL-адреса для переключения. Базовый браузер - это Blink, используемый в Chrome.
  5. Он также поддерживает разветвление сайтов, сайты, которые редактируют себя, автономную синхронизацию, обновления в реальном времени, просмотр истории сайта и встроенную поддержку Markdown, а также HTML.

Протокол DAT очень быстрый. Под капотом он основан на версионных и подписанных деревьях Меркла над потоками данных, распространяемыми P2P-сетью типа BitTorrent, но есть также дополнительная поддержка для использования HTTP-серверов, что означает, что вы можете использовать сочетание подходов для обслуживания ваших данных: DAT люди не религиозны. Просмотр сайтов DAT ничем не отличается от просмотра обычных веб-сайтов, и он поддерживает частичную загрузку, поэтому вы можете обслуживать огромные наборы данных. Изменения на сайте автоматически распространяются по P2P-сети, поэтому есть естественный способ распространять обновления для программного обеспечения, упакованного в DAT-сайт. Фактически, сеть DAT может распространять обновления в реальном времени, а Beaker может перезагружать сайты, когда они меняются… более или менее мгновенно. У них даже есть предложение по системе, подобной намерениям, как я предлагал во второй части!

Beaker является экспериментальным, и они предоставляют загрузки только для macOS. Тем не менее, то, что там написано, похоже, сделано со вкусом. Все инструменты, которые вы ожидаете и которые вам понадобятся, есть. Это проект, финансируемый некоммерческим фондом (в отличие от какого-то мошеннического ICO), поэтому он получает выгоду от постоянной разработки. Очень часто попытки создать «децентрализованную сеть» сильнее энтузиазма, чем деталей, но Бикер, похоже, не сталкивается с этой проблемой.

Несмотря на это. Beaker решает некоторые проблемы, но разработчики приложений по-прежнему придерживаются непродуктивной и подверженной инъекциям комбинации HTML, CSS и Javascript. Это начало, но можем ли мы добиться большего?

Назад в будущее пользовательского интерфейса

Поскольку сайты Dat представляют собой версионные миниатюрные файловые системы с собственной подписью, они идеально подходят для распространения модулей кода различных форм. DAT и Beaker реализованы в node.js, но следующие элементы, которые я выберу для платформы приложений NewWeb, взяты из мира Java. Вот почему во второй части я сказал, что буду использовать JVM, а не Node или Electron: запуск JavaScript на JVM работает лучше, чем наоборот, и было бы хорошо объединить DAT со слоем пользовательского интерфейса, который не является HTML5. .

(примечание: если вы не уверены, почему я хочу заменить HTML, прочтите часть первую)

Какой инструментарий пользовательского интерфейса мы могли бы выбрать, когда отбросим HTML? Их немного. Qt хорош, но очень ориентирован на C ++ и его трудно использовать из JVM. Мы могли бы использовать собственные виджеты каждой операционной системы, но тогда мы теряем расширенный стиль, который жизненно важен для создания уникальных тем пользовательского интерфейса, которые так нравятся людям. Java Swing имеет множество доступных компонентов и несколько отличных инструментов, но дизайн показывает свой возраст, в нем отсутствуют ключевые функции, а также нелегко стилизовать его.

Остается JavaFX. Он малоизвестен, но в нем есть функции, которые должен иметь современный инструментарий пользовательского интерфейса, например, визуальный дизайнер пользовательского интерфейса, рендеринг с использованием графического процессора и каскадных таблиц стилей. Он поддерживает эффекты на основе шейдеров, такие как размытие, тени, полную анимацию графа сцены с временными шкалами, переходы и подключаемые интерполяторы. Он поддерживает потоковую передачу видео H.264, имеет виджет Canvas, совместимый с API Canvas HTML5, а также сразу получает скучные элементы: полная доступность, адаптивные менеджеры компоновки, HiDPI, создание диаграмм, двунаправленные и сложные сценарии, полностью реактивный дизайн. , мультитач, печать, выбор даты, элементы управления таблицей и так далее.

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

У него есть несколько областей, в которых он отстает от HTML5: в частности, ему нужен эквивалент WebGL. Вы можете использовать OpenGL на Java, но на компьютерах с Windows часто нет хороших драйверов GL: Chrome решает эту проблему, незаметно сопоставляя WebGL с Direct3D.

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

Конечно, даже несмотря на то, что в названии этого программного обеспечения есть слово «Java», мы не должны забывать, что оно легко доступно из JavaScript, Ruby, Python, Lua, Haskell и так далее. Вот код JavaScript, который создает центральную кнопку Hello World в окне:

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

Обычный старый JavaFX - это хорошо, но все же есть один фреймворк, который стоит предложить разработчикам NewWeb: TornadoFX. Он предоставляет вещи, которые веб-разработчики хотели бы, такие как горячая перезагрузка и MVC, а также другие функции, такие как простое выполнение фоновых задач, внедрение зависимостей, автоматическая проверка формы и типобезопасный DSL для стилизации, заменяющий довольно ограниченный CSS.

Распространение, стриминг и мгновенный запуск

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

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

Это также создало проблемы, такие как большие задержки пользовательского интерфейса.

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

Хорошая новость заключается в том, что пропускная способность теперь намного меньше, чем раньше. Средняя страница теперь имеет размер 2 МБ, и вы можете уместить много кода в 2 МБ. Браузер моего приложения NewWeb изначально понимал модули. Каждый модуль будет модулем Jigsaw, сжатым с помощью pack200. Для контекста, библиотека синтаксического анализа GSON JSON таким образом занимает 37 килобайт, что меньше, чем сжатый файл CSS, который Medium использует для оформления этого блога.

Каждый модуль будет архивом DAT. Таким образом, корневой модуль приложения управляется открытым ключом через сеть P2P, которая ссылается на еще большее количество архивов, либо по хешу, либо по ключу. Широко используемые модули широко реплицируются в сети P2P, и на них можно автоматически ссылаться с помощью хэша, управляемого системами сборки и репозиториями пакетов, такими как Maven или NPM. Попытка получить доступ к классу в модуле, который еще не загружен, либо блокирует поток (если это фоновый поток), либо повторно входит в цикл пользовательского интерфейса, чтобы нарисовать анимацию загрузки поверх пользовательского интерфейса приложения. Все модули кешируются. Таким образом, интеллектуальная потоковая передача приложения в значительной степени зависит от того, чтобы модули были достаточно маленькими.

Песочница и разрешения

Какой набор разрешений есть у приложения? Пространство дизайна для разрешения приложений довольно велико. Сделаем первую попытку:

  • Разрешения связаны с открытым ключом, которым подписывается корневой модуль приложения.
  • Разрешения всегда запрашиваются через API, предоставляемые браузером приложения. Они не объявляются заранее. Браузер подтверждает пользователю, что он желает предоставить запрошенное разрешение.
  • Приложения могут запрашивать несколько областей хранения, которые соответствуют отдельным файловым системам для конкретных приложений. По умолчанию они имеют размер 25 мегабайт. Каждое приложение получает один бесплатно, не спрашивая разрешения; этого достаточно для хранения учетных данных, токенов, кода, кэшированных активов и т. д. Чтобы получить область хранения гибкого размера, приложение может запросить у пользователя имя для нее (это похоже на сохранение файла) или может запросить временную область хранения произвольно большего размера, которая предоставляется автоматически. Но они могут быть удалены браузером без предупреждения, если на диске мало места (это похоже на автоматическое удаление).
  • Приложения могут открывать произвольные сокеты на произвольных портах на произвольные серверы без ограничений.

Последнее может удивить. Интернет не позволяет приложениям делать это. И Android тоже.

Веб-приложения имеют доступ только к «веб-сокетам», у которых есть заголовок HTTP спереди. Это прискорбно; он эффективно предотвращает реализацию веб-приложениями любого сетевого протокола, согласованного за последние 30 лет. Я считаю обоснование довольно слабым - идея состоит в том, чтобы обмануть прокси, заставив их думать, что соединение является обычным веб-запросом, и поэтому у WebSockets есть различные уровни обфускации, чтобы попытаться гарантировать, что (несмотря на очень похожий вид) серверы WebSocket не работают. t отвечать на HTTP и HTTP-серверы не отвечают на запросы WebSocket, и прокси-серверы кеширования не пытаются фактически кэшировать что-либо. Прокси-пирсинг - это функция, которая нужна некоторым приложениям, а другим - нет, вероятно, потому, что они не предназначены для использования в корпоративных средах или потому что они поддерживают только SSL. Однако мы уже готовы использовать экзотические протоколы P2P с HTTP только в качестве запасного варианта, поэтому, если отдельному приложению требуется прокси-пирсинг, они могут включить библиотеку WebSockets и использовать ее таким образом.

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

Дихотомия документ / приложение

Почти там!

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

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

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

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

Заключение

Кусочки существуют. Их просто нужно собрать.

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

Протокол DAT дает нам простое представление об идентичности приложения, к которому могут быть привязаны разрешения. Это позволяет нам отделить распространение от DNS и хостинга, используя P2P-сеть, основанную на простых бинарных протоколах. Эталонную реализацию node.js можно запустить непосредственно на JVM.

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

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

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

Фреймворки автоматического обновления Google Chrome, такие как Omaha, можно использовать для поддержки браузера приложений в актуальном состоянии.

Наконец, будущая версия Corda RPC может быть поставлена ​​как отдельная библиотека, которая обеспечит простую связь клиент / сервер с возможностью передачи наблюдаемых Rx потоковых данных клиенту.

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