вторник, 23 декабря 2008 г.

Native Client - Rich Internet Applications от Google


Rich Internet Applications, что это такое и где применяется? Мы этим уже пользуемся или это только туманное, но светлое будущее? Попытаемся разобраться в этих вопросах, рассмотревконцепцию RIA на различных примерах. Сегодня мы установим и опробуем Google Native Client.



Это странное слово RIA

Что такое Rich Internet Applications? Если честно, так и хочется ляпнуть что-то вроде «очередной маркетинговый термин», но в данном случае я погрешу против истины. RIA — это приложения, работающие через сеть и предоставляющие клиенту ресурсы веб-сервера, но обладающие функциональностью полноценных настольных приложений. Это определение не страдает академичностью. Я его только что выдумал, но (по моему мнению) оно не хуже любого другого. По сути Rich Internet Applications (RIA), это следующая ступень эволюции от страничек, сайтов, через веб-приложения, к чему-то далёкому и полнофункциональному.
Как правила RIA приложения кроссплатформены, запускаются в браузере и не требуют какой-либо установки дополнительного на стороне клиента. В качестве примера веб-приложений, близких по идеологии к RIA можно привести Google maps, GMail или ролики YouTube,
Впервые этот термин прозвучал из уст маркетологов компании Macromedia, в теперь уже далёком, 2001-м году.
С тех пор появилось немало технологий и реализаций данной концепции. Наиболее известные из них: Adope Air, Alchemy, Flex, JavaFX, Microsoft Silverlight, XULRunner  от Mozilla Foundation
и только что появившийся Google Native Client.
При всём разнообразии подходов технологии RIA имеют некоторые общие черты, и самая главная из них — концепция песочницы («sandbox»). Как правило, любое RIA выполняется в локальной, изолированной среде, и. хотя и использует ресурсы компьютера — клиента, не может фатально влиять на его систему.
Обычно RIA приложения взаимодействуют с сервером асинхронно, не прерывая работу пользователя для получения ответа. Они имеют богатый пользовательский интерфейс и не предъявляют каких-либо особых требований к компьютерам - клиентам.

Google Native ClientQuake в браузере и другие

Понятно, что такой гигант как Google не мог стоять в стороне, от тенденции, которую сам же и создал. Первый шаг в этом направлении, замечательный инструментарий Google Gears был выпущен ещё в конце весны 2008 г, а в декабре 2008-го компания представила свою RIA технологию — Google Native Client. Её суть – запуск в браузере модулей, написанных на нативном (увы, адекватного перевода термина «native code» в голову не приходит) коде для архитектуры x86.
В отличие от JavaFX или Silverlight в этой технологии нет компиляции в байт-код и какой-либо виртуальной машины. Была создана среда выполнения, позволяющая запускать обычные, «родные», для данной платформы программы, в безопасном.
Разработчики идеально выдержали модель «песочницы»:
Во избежание взаимодействия Native Client непосредственно с операционной системой, весь код исполняется в отдельном, изолированном контейнере. Это позволяет модулю, использовать системные ресурсы, но в тоже время ограждает ОС от возможного случайного или злонамеренного повреждения [2]. В целом Native Client (NaCL), состоит из контейнера, играющего роль песочницы и среды исполнения (runtime) нативного кода. Третьим элементом выступает плагин для веб-браузера. Для коммуникации между браузером и NaCL модулем Nacl предоставляет два варианта: simple RPC интерфейс (SRPC) и давно известный Netscape Plugin Application Programming Interface (NPAPI).
Писать модули для Google Native Client предполагается на любом компилирующемся, на данной системе языке программирования.
На настоящий момент Google Native Client рассматривается как экспериментальная технология, но разве это мешает нам попробовать её в деле прямо вот сейчас?

Первое знакомство
 
скачиваем Native Client SDK со странички проекта (http://code.google.com/p/nativeclient/wiki/Downloads).
Сразу хочу заметить, что хотя технология и позиционируется как кроссплатформенная (представлены сборки SDK для Linux, Windows и Mac, а также исходный код приложения), чтобы в полной мере её опробовать, пользователям ОС Windows придется выполнить несколько больше телодвижений, а именно установить интерпретатор языка Python и возможно cygwin. Причём Phyton (это уже касается пользователей любой операционной системы) должен быть версии 2.4.x-2.5.x (на момент написания этой статьи, работа с Python 2.6 давала ошибки).

Рис 1 Структура Google Native Client
Полученный архив распаковываем в любое удобное место и рассматриваем полученный результат. На рисунке 1 показана структура Native Client SDK.
Директории common/ и tests/ содержат исходные коды примеров и тестов
директории scons-out/, site_scons/ и ite_scons_general/ содержат файлы, имеющие отношение к сборке Native Client приложений. В поддиректории scons-out/*/staging находятся скомпилированные примеры для тестирования Native Client плагина браузера.
Файлы Sconstruct, scons.bat и scons предназначены для сборки самой программы Native Client, а также примеров и тестов в различных операционных системах.
В директориях include/, intermodule_comm/, ncv/,nonnacl_util/, npapi_plugin/ и service_runtime/ содержишься исходный код ядра Native Client, в частности npapi_plugin/ содержит исходники плагина для браузера.
В tools/ - находятся исходные коды Native Client SDK
В gtest/ open source фрэймворк, для юнит-тестирования от Google.
В директориях third-party/ и native_client/third-party/ содержаться как это понятно из названия, инструменты не гугловского происхождения, в частности gcc и imagemagick и собранная версия Native Client SDK. В директории documentation/ (какая неожиданность!) документация.
Теперь, сориентировавшись можно опробовать работоспособность Native Client. Ля этого отправимся в директорию googleclient/native_client/tests/, выбираем там, к примеру, папку /life, набираем в консоли команду:
Geol@linux-jjj6:~> python run.py

                                Рис. 2 Native Client приложение «life»

И наслаждаемся результатом (рис 2). В общем, всё работает, но не затем мы всё это разворачивали, попытка увидеть ту же «жизнь» в браузере. Попытка открыть файл life.html приведёт к выдаче сообщения о незагруженном плагине. Что и разумно — мы пока ничего не ставили. Немедленно исправим эту ситуацию, тем более что в директории tests/ среди других призывно маячит папка quake/.

Устанавливаем Native Client плагин

Сначала закроем все экземпляры браузера, который мы хотим пропачить (в данном случае это рекомендуемый руководством Firefox 3).
Затем отправляемся в директорию googleclient/native_client/ и запускам команду
./scons --prebuilt firefox_install
Скрипт установки, проверив систему, разок спросит нас, продолжать ли, установит плагин и закончит свою работу сообщением вроде:

*********************************************************************
* You have successfully installed the NaCl Firefox plugin.
* As a self-test, please confirm you can run
*     /root/.mozilla/plugins/sel_ldr
* from a shell/command prompt. With no args you should see
*     No nacl file specified
* on Linux or Mac and no output on Windows.
*********************************************************************
* To test this installation also try the test links on the page
*     scons-out/nacl/staging/index.html
*********************************************************************
scons: done building targets.




Согласно документации, установка плагина на платформе Widows происходит идентично, команда установки выглядит как


.\scons --prebuilt firefox_install

но, несмотря на все усилия, мне, добиться нормального выполнения этой команды так и не удалось. Но можно пойти другим путём – необходимо скопировать из папки
\nacl\googleclient\native_client\scons-out\opt-win\staging в папку C:\Program Files\Mozilla Firefox\plugins, следующие 3 файла:
inpGoogleNaClPlugin.dll
SDL.dll
sel_ldr.exe.
и перезапустить браузер.
Теперь проверим установленный плагин. Зайдём в директорию googleclient/native_client/scons-out/nacl/staging и раскроем браузером файл index.html. Мы получим доступ к различным тестам, представляющими собой html-странички с внедрёнными скомпилированными приложениями Google Native Client (рис 3).
                               Рис. 3 Тестируем плагин


Если посмотреть исходный код такого html файла, мы увидим примерно следующую конструкцию:


Земля в иллюминаторе


                                                                             Рис. 4 Файлы примера 
 
Возвращаемся в директорию /googleclient/native_client/tests в папку earth/. (рис 4).
Как нетрудно догадаться, сценарий run.py запускает приложение, но нам это совсем не нужно. Вместо этого откроем в браузере html-страницу earth.html. и... получим то самое сообщение (рис 5). Как же так? Ведь плагин мы установили?
Рис. 5 Модуль не загружен


Дело в том, что, несмотря на наличие Native client  плагина модуль не грузиться, по той простой причине, что он не собран, не откомпилирован, а представлен только исходным кодом (файл earth.сс), на языке С++. В прочем в той же папке мы видим файл Makefile, и это позволяет надеяться, что ситуацию можно исправить. Сначала соберём и запустим Standalone приложение:

make debug run
 
После этого запуститься самостоятельное приложение, представляющее собой вращающееся изображение земного шара, а в папки примера появиться исполняемый файл — earth_debug.
Теперь соберём Native client модуль:

make release nacl

> 
Если все прошло нормально, появятся ещё два файла earth.nexe и earth_release.nexe. Можно опять открыть earth.html в браузере, и теперь картинка должна быть совсем другой (рис 6).

Рис. 6 Земля!


Теперь рассмотрим пример по сложнее. В папке googleclient/native_client/tests/xaos находятся исходники и сценарий сборки довольно известного фрактального конструктора Xaos. Правда не исходники самого, Xaos, их сборочный скрипт скачает отдельно. Собирать просто:
./xaos_tool.sh all
И, раскрыв браузером xaos.html наслаждаемся результатом (рис 7).

Рис. 7 Редактируем фракталы


На самом деле, в этом и предыдущем примере мы выступаем в роли разработчика. Конечному пользователю приложения достаются уже откомпилированные модули, и всё что ему нужно, оснастить браузер Native client плагином.
Ну а мы продолжим развлекаться. Теперь приступим к обещанной quake. Тут готового сценария нет, поэтому будем действовать в ручную.
Заходим в папку googleclient/native_client/tests/quake/, и скачиваем исходные коды игры:

Geol@linux-jjj6:~> wget http://www.libsdl.org/projects/quake/src/sdlquake-1.0.9.tar.gz

Geol@linux-jjj6:~> wget http://www.libsdl.org/projects/quake/data/quakesw-1.0.6.tar.gz
...
теперь разархивируем их:

Geol@linux-jjj6:~> tar -x --strip-components=1 -f sdlquake-1.0.9.tar.gz
...
Geol@linux-jjj6:~> tar -x -f quakesw-1.0.6.tar.gz
...

Должно образоваться множество файлов — исходников и одна директория — id1/.
Следующим шагом наложим необходимый патч из native Client:

Geol@linux-jjj6:~> patch -p1

всё, теперь можно приступать к сборке:

Geol@linux-jjj6:~> make clean nacl
Geol@linux-jjj6:~> make debug nacl
Geol@linux-jjj6:~> make release nacl

осталось открыть в браузере файл quake.html и можно гонять монстров (рис8).

 
Рис. 9 Наши победят!
И пока всё...

Да, на этом, к сожалению пока всё. К сожалению, технология пока действительно сырая, и автору не удалось последовательно написать с нуля и запустить Google Native Client приложение, не на одной платформе. Более того, на данный момент времени NaCL отказывается собираться с Python 2.6.x, браузер с установленным NaCL плагином неоднократно замечен в неадекватном поведении, некоторые тесты тупо не запускаются под платформой Windows. С другой стороны API NaCL открыт и документирован (/googleclient/native_client/scons-out/doc/html), поэтому для настоящего энтузиаста нет препятствий попробовать свои силы в написании приложений «невзирая на». Трудно сейчас сказать, насколько перспективным окажется это занятие, но интересным — наверняка.

Ссылки к статье:
Домашняя страница проекта:
http://code.google.com/p/nativeclient/
Описания архитектуры GoogleNative Client (PDF): http://nativeclient.googlecode.com/svn/trunk/nacl/googleclient/native_client/documentation/nacl_paper.pdf

Комментариев нет:

Отправить комментарий