Slideの使い方

説明キーコマンド
次ページ ->
前ページ <-
フルスクリーン f
ワイドスクリーン w
元に戻る esc
ハイライト h
メモ(ライトボックス) p

Agenda

  • 自己紹介
  • 会社紹介
  • ATLとNode.JS
  • Node(脳DE).js
  • DEMO
  • 感想
  • 今後の展開について
  • お知らせ

自己紹介

/@tatakaba

  • 2004年〜2011年某ポータルサイト会社
    • 検索関連(Geo関連の検索エンジン等)
    • Webサイト開発(フレームワーク開発等)
    • Log集計システム開発
  • 2011/09〜2012/09リクルート
    • (入社3ヶ月後に分社化のお知らせ orz...)
  • 2012/10〜リクルートテクノロジーズ
    • Hadoop関連業務
    • リアルタイムWeb
    • 脳波データを利用したアプリケーション開発
    • 近距離データ通信などを利用したアプリ開発

会社紹介

2012/10/01 設立

Recruit Technologies

リクルートテクノロジーズ

10月1日より、リクルートの1グループ会社として設立

社内での愛称は、R-TECHといいます

ミッション

      Description
    • 業界をかせるレベルで
    • テクノロジーの開拓と、ビジネスの実装を実現

    ビックデータおなじみHadoopとか

    検索のエンジンで有名なSolrとか

リクルートグループ
IT・ネットマーケティングを支えてます!!
Description

ATL

Advanced Technology Lab

R-TECHの2年後3年後にモノになる先端技術を追求

たとえば・・・

  • 真剣に脳波に取り組んでみたり
  • 音声でハードを操作してみたり
  • リアルタイムに分析してみたり
  • 新しい近距離データ通信に取り組んでみたり
アイデアを形に変えていきます!!

R-TECHで一緒に働くエンジニア募集!!

gihyoさんでATLの紹介記事を連載中

技術評論社
http://gihyo.jp/design/serial/01/atl

ATLとNode.js

ATLでは、色々なシーンで利用。例えば・・・

  • リアルタイムリコメンド
  • 未来の会議室
  • 米谷UI
  • 脳波データシステム
ATLは、リアルタイムなWebを実現する為、
Node.jsを積極的に利用してます。

脳DE.js

necomimi

脳波データとは??

専用のヘッドバンドを装着する事で脳波の電流をデータとして取得。取得できるデータは、

  • Blink:まばたき
  • 集中:集中
  • リラックス:リラックス
  • δ(デルタ)波:爆睡!! Zzz
  • θ(シータ)波:うっかりMACを枕に寝落ち ( ゚ ρ ゚ )ボー 
  • α(アルファ)波:誰にも邪魔されず、プログラミング ( ^ω^)
  • β(ベータ)波:・・・出社 (´・ω・`)ショボーン
  • γ(ガンマ)波:コンパイルが通らなくてイライラ (´・д・`)
  • 詳しい情報は、技術評論社(http://gihyo.jp)

これらのデータを組み合わせて、
脳波でスロットカーを動かしてみた。
脳波??スロットカー??
( ゚д゚)ポカーン ・・・。
R-TECHでは、脳波データを利用して
O2Oの取り組みを検討してます。
色々な脳波データを分析することで
新たな発見が見つかるかもしれない??
今回は、取組みの一環として、脳波データ
利用してスロットカーを動かしてみました。
DEMO
余談ですが・・・

Neurosky SDK

Description
http://www.neurosky.com/

Sample

// B3Bandとのbluetooth接続
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter == null) {
// エラー処理
}else {
/* create the TGDevice */
tgDevice = new TGDevice(bluetoothAdapter, handler);
if(tgDevice == null){
Log.w("EEGReader", "BrainBand not available");
}
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {

switch (msg.what) {
//集中データ
case TGDevice.MSG_ATTENTION:
	tgData.attention(msg.arg1);
	break;
// リラックスデータ
case TGDevice.MSG_MEDITATION:
	tgData.meditation(msg.arg1);
	break;
// 瞬きデータ
case TGDevice.MSG_BLINK:
	tgData.blink(msg.arg1);
	break;

			}
		}
};

集中やリラックスの数値データは、thinkgear独自アルゴリズム
なので・・・・・

ガン○ムとか

Description

○ヴァとか

Description
みたいに、敵をイメージしたらミサイルが飛ぶとか
動け」と念じたら動くものではありません。 m(_ _)m

サーバ構成

ハードウェア構成図

利用ライブラリ

ライブラリ

Node.js0.8.110.8系を利用
webrtc.io0.0.23WebRTCを手軽に実装できるライブラリ
mongoose3.2.1nodeからmongoDBを操作できるライブラリ
Express.js2.5.1お手軽Webアプリケーションフレームワーク
NET1.0.0sokect通信ライブラリ
TypeScript0.8.0MS製静的型付け言語。今回は、お試しで使ってみた
cheerio0.10.1jqueryの記述でHTMLのスクレイピングができる
WebRTC

まずWebRTCって

WebRTCとは、Web Real-Time Communicationsの略

  • Javascript上でカメラ(Video)やマイク(Audio) が利用できる
  • STUNサーバを利用することで、ブラウザでビデオチャットができる。
Description
今回は、webrtc.ioというライブラリで、実装。

webrtc.io

  • webrtcのやり取りをまとめてくれたモジュール
  • Client:webrtc.io.js
    • WebSocket
    • StreamAPI
    • STUNサーバ接続
    • P2P接続
  • Server:require('webrtc.io')
    • 他のクライアントの接続情報を伝える(WebSocket)

webrtc.io(Client)

  <script>
  // クライアント
  // 接続処理 roomパラメータにチャットルーム的な利用ができる。
  rtc.connect("ws://hostname",room)
  // これは、addStreamの処理
  rtc.on('add remote stream'),function(stream,socketid) {
  	console.log("プレイヤーが追加されたよ!");
  	rtc.attachStream(stream,"player2");
  }
  // 自分でイベントも追加できる
  rtc._socket.send(JSON.stringify({
  "eventName" : "getRanking" ,
  "data" : {
  	"id" : "3b94e0d58684f028842edfe21358e36a"
  }
 }));
  // サーバからの受信した時の処理を記述
  rtc.on('recvRanking',function(data){
  	console.log("サーバから受信されたよ!")
  	/* 受けっとたデータを処理する。 */
  });
  </script>

webrtc.io(Server)

 
 //鯖も接続したよ〜。
 webRTC.rtc.on('connect', function(rtc) {
    console.log('Hello');
  
 });
 //鯖も切断された時に行う処理。
 webRTC.rtc.on('disconnect', function(rtc) {
    console.log('Bye!');
  
 });
 // eventNameがクライアント側のコールバック
webRTC.rtc.on('getRanking',function(data,socket) {
 soc.send(JSON.stringify({
 	"eventName": "recvRanking",
 	"data": {
 		"results" : res,
 		}

 	});
);
// 接続状況を確認
WebRTC.rtc.getSocket(socket.id);
mongooseとMongo2.2

Mongoose

Description
  • NodeからMongoDBをO/R Mapperチックに利用できる
  • Mongo Shellに近いかたちで実装できる
http://mongoosejs.com/index.html

MongoDB

もはや説明不要のスキーマレスなドキュメントDB

JSON(BSON)形式でデータを格納するのでJavascriptとの相性もGood!

空間インデックスマルチクラスタなど機能も豊富!

Sample


> db.minds.findOne({player_id : "player1"});
{
        "entryID" : "91c612f23502e57fb032f4aaed692d19",
        "_id" : ObjectId("5090c5ad5a5f3e2d330000cf"),
        "blink" : 46,
        "attention" : 23,
        "meditation" : 60,
        "poor_signal" : 0,
}

Mongo2.2.xの主な新機能

  • Aggregation FrameWork
  • 並列処理の強化
  • Replica Setsのリードノードの選択
  • Tagを使用したSharding
  • Time To Live Collections

詳しくは、第三回丸の内MongoDB参照:http://www.slideshare.net/syokenz/mongo-db2-2newfeatures

Aggregation Frameworkを使ってみたかったのでMongo2.2で実装

aggregation Framework

ラップタイムのランキングを取得したい場合

   /* SQLならこんな感じ */
SELECT id,sum(rap_time) as time , count(id) as rap 
from Car group by id limit 10;

これまでは、Map/Reduce処理を実装するが、
Aggregation Frameworkを利用すると・・・

Sample

db.aggregate(
//where句みたいなもの
{$match: {$or ["player_id" : player_id1},{"player_id" : player_id2}]}}
//AS句みたいなもの
{$project : {"entry_id" : 1 ,"player_id" : 1 ,"lap_time" : 1}},
//groupby区とselect区みたいなもの
{$group : {"player_info": {"entry_id" : "$entry_id"},
                  "time" : {"$sum" : "$lap_time"},
                  "lap" : {"$sum" : 1} },
//orderby区みたいなもの
{$sort : {"id" : 1}},
//limit区みたいなもの
{$limit : 10},
function(err,res) {// データを受けっとた時の処理}
);
  	
http://www.typescriptlang.org/

TypeScript

  • MSがOSSとして公開
  • 静的型付け
  • クラス
  • 名前空間
  • javascriptにコンパイルしてくれる!(CoffeeScriptやDartライク)
  • CoffeeScriptやDartよりも、Javascriptに近い
  • 今回は、サーバ側で使ってみる!!

Sample

npm install -g typescript
//Classがかける!!
class Hello {
	constructor(public greeting:string){
	}
	display() {
		console.log("こんにちは" + this.name + "!!");
	}
}
var hello = new Hello("tatakaba");
hello.display();

tsc hello.ts --out hello.js

Sample

// コンパイル後のJavascript
var Hello = (function () {
    function Hello(name) {
        this.name = name;
    }
    Hello.prototype.display = function () {
        console.log("こんにちは! " + this.name + "さん");
    };
    return Hello;
})();
var hello = new Hello("tatakaba");
hello.display();
//コンパイル後、直接Node.js環境で起動ができる
tsc hello.ts -e
こんにちは! tatakabaさん

Nameスペースもある!!

//名前空間もある
module Saying {
export class Hello {
    constructor( private name : string ){}
    display(){
      console.log( "こんにちは! " + this.name + "さん" );
    }
    }
    }
//コンパイル後
var Saying;
(function (Saying) {
    var Hello = (function () {
        function Hello(name) {
            this.name = name;
        }
        Hello.prototype.display = function () {
            console.log("こんにちは! " + this.name + "さん");
        };
        return Hello;
    })();
    Saying.Hello = Hello;    
})(Saying || (Saying = {}));

var hello = new Saying.Hello("tatakaba");
hello.display();
  	
感想

webRTC

  • ブラウザのサポート状況は、これから(IEは、まだ検討段階)
  • ブラウザのヴァージョンを上げると仕様が変わってたりとか・・・
  • Chrome(23系)からだとWebkitPeerConnection00 => webkitRTCPeerConnectionへ
  • webrtc.ioがwebkitRTCPeerConnectionの実装がされてなかった。(Ver:0.0.2-3)
  • 最初は、自作してたので使ってればよかった・・・と後から思ったり(´・ω・`)
  • とりあえず、実装したのでpull requestしようかな
  • けど、ブラウザの新しい可能性

MongoとMongoose

    Description
    • 今さらですが、MongoDBとJavascriptは楽に実装できてお手軽
    • aggregation Frameworkを使うと集計も簡単になるしますます便利!!

TypeScript

    • 周辺のツールが出てくればもっと流行ると思われる(今は、vim,emacs,vs)
    • javascriptに似てるので学習コストも下がりそう?
    • 今回は、サンプルを拡張した程度の実装だったのでもう少し色々と試していきたい
    • リリースしたばかりなので、もう少しウォッチしたいと思います。

今後の展開

NodeJS利用事例は少ないですが・・・
今後、積極的に利用していく予定です!
たとえば、
動画配信とか
ログシステムとか
もちろん脳波でも

リクルートグループリアルタイムWebを実現!

お知らせ

CodeIQ共同企画

リクルートテクノロジーズのHPから「リクルート」を抽出してみよう!!

当選者発表に関して

15時頃にR-TECHのブースに張り出す予定です。

まだ、間に合いますので皆さんもチャレンジしてみて下さい。

http://bit.ly/VL4tGA

Description

エンジニア調査に協力下さい。

  • http://goo.gl/fxJgi
  • http://goo.gl/zTWR2

2つのエンジニア調査に答えて頂いた、
先着20名amazonギフトカード

R-TECHのブースで担当者にIDを伝えて下さい!!

Thank You!!