2011年10月22日土曜日

Nylon

Nylonとは何か?

MeSHの開発に当たり,すべての機能を盛り込んだシステムとして開発すると,その後の変更作業が地獄と化すことが分かっています.そこで,e-Learningシステムを,個々の機能ごとに分割して開発し,統合する仕組みが必要となりました.その際,単にiframeなどで統合するのではなく,個別の機能を融合しつつ統合する仕組みが望まれました.今回は,その仕組として開発されたNylonについて説明します.

具体的に何が困るのか?

MeSHで目指しているWebによるリアルタイムe-Learningを実現することは,node.jsとsocket.ioのおかげで用意になりました.しかし,全ての機能を盛り込んだシステム(=モノリシックなシステム)を開発すると,機能追加や変更が面倒です.どこにバグが潜んでいるかヒヤヒヤです.

では,リアルタイムe-Learningを実現する機能をバラバラに見ていきましょう.まずは,スライド表示位があります.スライドを表示すると,そこにペンで書き込みしたくなります.そうすると,説明している姿を動画に残して,その動画に合わせてスライドやペンを再現したくなります.または,学生のペンによる書き込みを残しておくとか,「重要」などのマーキングもしたくなります.さらに,シミュレータについてもリアルタイムで操作情報を配信したり,後の自学自習に生かしたくなります.

これらの機能を融合しつつ統合することはできないでしょうか?そこで生まれたのがNylonという考え方です.具体的には,様々なモジュール単位で開発を行いつつ,モジュール間の動作を制御するイベント情報をやり取りするフレームワークです.

EventEmitter

ベースとなるヒントは,node.jsのソースコードに隠されていました.それを発見したのは当時学生だったi君です.どの様な仕組みかと言うと,個々のオブジェクト毎にキーワードとコールバック関数を定義する仕組みです.これにより,イベント駆動型のサーバ記述を実現しています.この仕組はEventEmitterと名付けられています.

EventEmitterをベースに,Webブラウザ上で動作する複数のモジュール間の通信を,共通するイベントマップで制御して,モジュール同士の「ゆるい」結合を実現したのがNylonです.Nylonとは,i君いわく,mesh(網目の織物)を実現するための素材から連想したとのことです.筆者は「モジュール同士を紡ぐ人工的な素材」と再定義しています.
ここで言うモジュールですが,Webブラウザ上で動作するモジュール + Webサーバサイドのモジュール + WebWorkersのモジュール + iframeに読み込まれたモジュール + Webサーバを通じて別のWebブラウザ上で動作するモジュールなどを含みます.

つまり,これまで面倒だった,Webブラウザ間の通信や,WebWorkersのworker側とメイン側の通信などを統一的に扱うことを可能とするフレームワークです.

Nylonの動作イメージ

obj_a, obj_b, guiの3つのオブジェクトがあり,これらが協調動作する様子を簡単に説明します.guiは,Webブラウザ上のボタンなどから制御されるオブジェクトと仮定します.obj_aはイベントとして,"A"を受け取り何らかの処理を行います.同様にobj_bはイベントとして,"B"を受け取り何らかの処理を行います.guiはAボタンが押されたらイベント"A"を送信します.同様にBボタンが押されたらイベント"B"を送信します.さらにCボタンが押されたらイベント"A"とイベント"B"を送信します.(プログラム中では"A|B"と表記)これらの動作を図にすると以下のようになります.
このように,キーワードをイベントとして送受信し合う仕組みがNylonです.この,「キーワードだけで動作する」というゆるい仕組みなので,モジュールのアップデートにも柔軟に対応できます.

Nylonの動作範囲と実際のプログラミング

先の例では,Webブラウザ内のモジュールを連想しますが,実際にはこれらのイベントを中継する仕組みも開発しています.現在のところ,WebWorkersによるworkerとの通信と,Webブラウザ同士の通信が実現されています.つまり,チャット(ピクトチャット含む)やカードゲーム,動画像の同期などに利用することが可能です.

実際のプログラミングで使用するメソッドはたったの2つで,onとemitです.onはキーワードとコールバック関数を定義するメソッドで,emitはキーワードと(必要があれば)パラメータを送信するメソッドです.例えば上の図の状況を定義する場合には以下のような記述となります. たったこれだけの記述でobj_a,obj_b,gui間のイベント処理が実現します.

次に,Webサーバを中継点として,Webブラウザ同士で上記のイベントをやり取りする場合のプログラミングについて説明します.キーワードは「broadcast」です.イベントキーワードに「broadcast」が入っていた場合,Webサーバを通じて同時に接続しているWebブラウザ上のオブジェクトに通知されます.実際には以下のようになります. ボタンが押された際の送信キーワードに「broadcast」を加えるだけで,Webブラウザ同士の通信を実現できます.この場合,接続しているどのWebブラウザ上でも良いのでボタンをクリックすると,各Webブラウザ上の該当する処理が実行されます.言い忘れましたが,キーワードは「|(パイプ記号)」で繋げることで,いくつでも指定できます.

Nylonはhttps://github.com/sudahiroshi/Nylon2で公開中です.
今後,何回かに分けてNylonについて説明していきます. このエントリーをはてなブックマークに追加

1 件のコメント:

Hà Tuấn Đạt さんのコメント...



Đây mới là mục đích của Vương Lâm. Hắn dung hợp xuất ra linh hồn Vấn Đỉnh cũng không phải để chiến đấu, mà hắn muốn dựa vào thực lực Vấn Đỉnh để tăng tốc độ chạy trốn.

Trường thương phá không bay đến đánh lên đầu quyền Thác Sâm. Một tiếng nổ “Ầm!” vang lên, trên trường thương xuất hiện những vết nứt, chỉ trong nháy mắt đã vỡ tan.
Cơ thể Thác Sâm cũng chưa hề di chuyển, hắn lạnh lùng nhìn lướt về phương xa nơi Vương Lâm biến mất, khóe miệng lộ ra một nụ cười tàn nhẫn. Hắn vung tay chộp một cái vào hư không, miệng quát lên một tiếng:
dong tam mu lậu cho thuê nhà trọ cho thuê nhà trọ nhạc sàn cực mạnh tư vấn pháp luật qua điện thoại công ty luật ở hà nội số điện thoại tư vấn pháp luật dịch vụ thành lập doanh nghiệp
-Trở về!

Một vòng xoáy thật lớn lập tức xuất hiện trên bầu trời. Nó chậm rãi chuyển động, phát ra một luồng hấp lực lớn đến mức khó tin tràn ngập trời đất. Vương Lâm đang tháo chạy, lập tức không thể khống chế được cơ thể mà điên cuồng quay lại. Gần như chỉ trong nháy mắt hắn đã quay trở về bên ngoài Thác Sâm trăm trượng.

-Ta nói rồi! Ngươi chạy không thoát được đâu!

コメントを投稿