第1回 Build Insider OFFLINE に行ってきた

6月8日は「<htmlday> 2013」ということで日本各地でWeb関連のイベントが行われたそうですよ。

ということで私はその中のひとつ「 第1回 Build Insider OFFLINE」に参加して来ました。(途中から参加なのでキーノートとランチは出来なかったけど・・。)

よりよい開発を目指すためのプロセス・ツール活用

まず最初に聞いたのがこのセッション。中村薫さんによる開発プロセスに関する自身の事例や、利用しているマイクロソフトのTFSというソフトウェアを通して感じたことを聞かせてもらいました。

Team Foundation Server - Wikipedia

TFS(Team foundation Server)しっている人と言われて、会場の8割くらい?が手をあげていたので、アウェイ感半端無かった。マイクロソフト関連のアプリケーション開発ってぜんぜんやったことないので、初耳でしたよ・・・。

TFSがどういうものかというと、私の理解によるとRedmineとJenkinsとGitが一つになったようなやつです。また、ローカルな環境にインストールして使えるTeam foundation Serverと、クラウドサービスとして展開しているTeam foundation Service(どっちもTFSなので分かりにくい)があるようで、中村さんはほとんど、TFService(クラウドの方)を使っているということでしたね。クラウドの利点である離れた場所にいる人と開発を行うってところで威力を発揮しているみたいでした。

印象に残ったのは、TFServiceは3週間毎にリリースを行なっているということ。マイクロソフトみたいな巨大な企業でさえアジャイルなプロセスが実践できているんだから、会社の規模が大きからできないよねって言い訳は出来ないよねって。なるほどねーと思いました。

Backbonejs

次に聞いたのMVCフレームワークのBackbornejsです。LINEの清水大輔さんによるセッションでした。

  • 資料はこちら

BackboneとはMV*(MVCとかMVVMとかのこと)アプリを作るためのフレームワークというかライブラリって感じらしい。フルスタックなAngularJSと違って、もっと軽量で自由度が高いそう。
また、MVCフレームワークの人気度調査では1位になっているらしい(http://caliper.io/blog/2013/Javascript-Framework-Popularity/)でもGoogleトレンドでみたらAngularJSに負けてたってことでしょんぼり。

Backbonejsは他のJSライブラリと組み合わせて使うことが一般的で、jQuery, zepto(LINEではこれをよく使っているらしい)、Ender、underscore.js, json2.jsなどをよく使っているみたい。

Backbonejsを使うと、DOMからビジネスロジックが分離されることになるのでテストが書きやすくなるらしい。jQueryだけで作っているJavaScriptのテストってすごいやりにくかったりするので、これはいいね。

AngularJS

次は金井健一さんによるAngularJSについてのセッション。

AngularJSの得意なこととして

  • CRUD系アプリケーション
  • 管理ページ・マイページ
  • 1ページで完結するアプリケーション(最近のMVCではふつう)

苦手なこととして

  • モバイル向けアプリケーション(ファイルサイズが大きい。フルスタックなので。通信コストとか)
  • ゲームなどのグラフィックの扱い(でもhttp://bombermine.com/のゲームのフレームとかステータス表示とかで使っているみたい)

モバイルは苦手みたいですが、最近タッチイベントとかスワイプイベントとか取れるようになってモバイル対応も始まっているようです。金井さんの希望としては、モバイルでは機能を少なくして、ライブラリのサイズを小さくして貰えたら、ということでした。ただ、サイズが大きくてもダウンロード型のアプリでライブラリを含めるのはありかな、ということです。

Knockout.jsとは

次は、沢渡真雪さんのKnockout.jsというライブラリのおはなし。

特徴としては

Observable

Observableとは値を監視可能な形にラップする仕組みだそうで。

  • ko.observable
  • ko.observableArray
  • ko.computed

の3つがあり、次のように使うみたい。(因みに以下は動かして見てないので、雰囲気だけ感じてください)

var value = 1; // valueが変更されたことを知るのは難しいので・・

// まず、こうしてvalueを監視可能なオブジェクトにラップします。
var value = ko.observable(1);
var value2 = value(); // value()というGetterができてる
value(1.048596); // 値をセットする(Setterができている)

// 次に、通知を受け取れるようにsubscribeでリスナーを登録します
value.subscribe(function(newvalue) { alert(newValue); });

// この状態で、valueに値をセットすると
value(30); // 変更されたことを受け取って、上で登録した関数が実行されます(30という値がalertで表示される)

// つぎに、ko.computedでobservable同様の監視可能なオブジェクトを作る。
var value3 = ko.computed(function() {
  return value() + value2();
});

// computedなやつもsubscribe可能なので、次のようにできる
value3.subscribe(function(newValue) {
  alert(newValue);
});

// ということで、依存関係を自動で追跡して更新・通知してくれる!

あと、DOMとのバインディングの機能もありますということで、これはサンプルをメモれなかったので、後で自分で試してみようかと・・。

リアルタイムWeb最前線〜Socket.IO & SignalR徹底解説

最後に聞いたのが、芝村達郎さん(26歳)のWebSocketのライブラリであるSocket.IOとSignalRのセッション。

Windowsの人はSignalR使って、それ以外のMacとかLinuxとかの人はSocket.IO使えばいいじゃん、ということでした。

  • 資料はこちら

Socket.IOの特徴としては

SignalRの特徴としては

  • ASP.NET上で動作する
  • マルチスレッドモデル
    • SignalRの方がパフォーマンスはでる
    • Socket.IOは複数のサーバを用意してコア数分動かす必要がある
  • Taskベースの非同期処理ができて開発しやすくなった
  • RPC感覚で処理をかける
  • 対応トランスポート
    • Websocket(WS2012+.NET4.5の場合だけ動く)
    • Server-Sent Events
    • Forever Frame
    • Long Polling
  • クライアント

スケールアウトが非常に難しいらしいです。単純にサーバを増やしただけではスケールしなくて、誰がどのサーバにつながっているかを管理する必要があるということでした。そこで、メッセージングサーバを使って、誰がどこにつながっているかを管理するんですが、それにはRedisやAzureサービスバスとかを使うのだそうです。これはSocket.IOとSignalRとで異なった対応方法が必要になり、以下の様な感じになるみたいです。

Socket.IO

  • 接続情報をメモリではなく外部ストレージに保存して共有(Redisを使えば)
  • 接続情報はメモリに持っている。どのクライアントがどのサーバにつないでいるかを持っている。
  • ・RedisStore
  • ・SbStore(※接続情報の共有はできない)

SignalR

  • そもそも接続情報もってない
  • 情報共有はせず、メッセージングに投げっぱなし
  • ・ SignalR.Redis
  • ・ SignalR.ServiceBus


開発のヒントとして

  • 通信頻度を下げてリソースの消費を抑える
    • 1000台のクライアントが同時接続しているとき、1クライアントが1つメッセージを送ったら1000クライアント分データを送らないといけないなど。
    • underscore.jsのthrottle/debounceを使って通信量を抑えるとか
  • ビューの更新にデータバインディング可能なライブラリを利用する
    • AngularJSとかKnockout.jsとか使う

開発をして思ったこと

  • リアルタイム性を活かせるアプリを考えることが難しい
    • チャットに変わる何かを考えたい(チャットはもういい!)
    • プッシュ通信と、クライアントの同時接続製を活かすことを考える
  • スケールアウトは難しい
    • データの同期、トランザクション数など普通のWebアプリよりパフォーマンスに関して考慮する必要がある
    • SignalRはスケールアウト時のメモリリークで長期間悩まされた(今は一応解決してみるみたい)

まとめ

今回は、興味があったけど、まだ試してないものなど色々あったので、これを機にに実践・導入していこうかなと。特に、JSのMVCフレームワークは必須な感じですね。これがないとテストどうするのって感じ・・・。
ということで、色々興味深い話が聞けました。また来年もはあると思うので(きっと)、楽しみにしてます。