R でスマホの加速度センサーデータ処理
を試してみた
        第25回 Tokyo.R LT 発表資料

          アドファイブ(株)代表取締役 CEO
                      礒部正幸
背景と動機
●   人と会う → 連絡先を交換 → Facebook!
●   ユーザ ID を検索するの面倒くさい

    → FB 連絡先の交換をもっと手軽にしたい



●   赤外線や Bluetooth を使うのは機種依存
●   HTML5 を使って Web アプリで作りたい

    → 加速度センサーをうまく使ってお互いを認識したい!

           ビジネスコネクションを、よりスムーズに!

                 ※ ナンパツールではありません。
イメージ




2台のスマホを重ねて振る


   動きの一致判定
  アルゴリズムが必要          センサーの時系列データをサーバに記録
       ↓             → ペアになっていない
    (現在未完成)           データ同士からペアを
                      見つけられるか?
 アルゴリズム開発支援環境は
R+MongoDB で簡単に作れる!
                     (※グラフは開発中のものなので
                      既にペアのデータが表示されてる)
システム構成
                                                   サーバ

        Facebook
        ID 名                   Apache / Perl
                    ①
  ブラウザ
                                        ②
                   JSON
  HTML5 の
                                 MongoDB
 加速度センサ            FB ID 名
API(Javascript)


                                   ③               3次元
                                               ④
                                                   折れ線
                                                   グラフ
                             rmongodb       rgl


 スマホ


                                                    開発用 PC
プログラム: Javascript@ スマホ
window.addEventListener(
    "devicemotion",
    function(e){
        aCount++;
        var x = e.accelerationIncludingGravity.x;
        var y = e.accelerationIncludingGravity.y;
        var z = e.accelerationIncludingGravity.z;
        var ad = { x:x, y:y, z:z };
       // 中略
       sendToServer(bData);
    }, true);

function sendToServer(v) {
   var req = new XMLHttpRequest();
   req.open('POST','http://jiot.net/715/ajax/'+yourRole+'/'+yourName);
   req.onreadystatechange = function() {
     if (req.readyState==4) {
         lab3.text = req.responseText;
     }
   }
   req.setRequestHeader("content-type","application/x-www-form-urlencoded");
   var json = JSON.stringify(v);
   req.send("json="+escape(json));
}
プログラム: Perl@ サーバ
use MongoDB;
use JSON qw/encode_json decode_json/;


my $connection = MongoDB::Connection->new; # localhost
my $database = $connection->match;
my $collection = $database->evs;


# Perl/Dancer を使用


( 略)


post '/715/ajax/:role/:name' {
 my $role = params->{'role'};
 my $name = params->{'name'};
 my $json = params->{'data'};
 my $time=time();


 my $data=decode_json($json);
 $collection->insert({role=>$role,name=>$name,time=>$time,data=>$data});


 // この辺でセンサーデータを分析する処理が入る
 if ( マッチングに成功した ) {
   redirect 'FB の ID 名を交換して表示するページ ';
 }
};
プログラム: R@ 開発用 PC
  library(rmongodb)
                                                     } else {
  library(rgl)
                                                         col='red';
  mongo <- mongo.create('jiot.net')
                                                         x<-lapply(data,function(a) {-a[[1]]})
  one <- function() {
                                                         y<-lapply(data,function(a) {a[[2]]})
   cur <- mongo.find(mongo, 'match.evs')                 z<-lapply(data,function(a) {-a[[3]]})
   add=F
                                                     }
   while (mongo.cursor.next(cur)) {
                                                     plot3d(x,y,z,type="l",col=col,add=add)
    e <- mongo.cursor.value(cur)                     add=T
    role <- mongo.bson.value(e,"role")
                                                 }
    data <- mongo.bson.value(e,"data")
                                                 mongo.cursor.destroy(cur)
    if (role==1) {                           }
      col='blue';
      x<-lapply(data,function(a) {a[[1]]})
      y<-lapply(data,function(a) {a[[2]]})
      z<-lapply(data,function(a) {a[[3]]})
                                             role <- 値

{ role: 値 , name:”hoge”, time: 値 ,           x <- [ 1番目の x, 2番めの x,...]
 data:[{x: 値 ,y: 値 ,z: 値 },                  y <- [ 1番目の y, 2番めの y,...]
        {x: 値 ,y: 値 ,z: 値 }, … ] }           z <- [ 1番目の z, 2番めの z,...]
demo
まとめ
◯ 不定型なセンサーデータは JSON にして
MongoDB に流しこむとスキーマ不要で便利
◯ R から MongoDB に直接つないでグラフ描画
は簡単
◯ アルゴリズム開発環境として R+MongoDB は
使える
△ R で開発したアルゴリズムを元のアプリ上に
実装しなおすところをどうするかは課題
ご静聴ありがとうございました!
●   アドファイブ株式会社のご紹介                    お気軽に連絡ください!
                                  ( FB 友だち申請は即承認します)
    ★ 仕事の面白さ                       Facebook: masayuki.isobe.14
                                   Twitter: @chiral
      * 純粋なテックベンチャーです              E-mail: isobe@adfive.net

      * 最新のアドテクノロジーを開発し、

         広告代理店や販路/営業部隊を持った企業とアライアンスを組んで収益化

        * オーディエンスデータの分析、コンテンツマッチアルゴリズムの開発、

         クリエイティブの動的生成、アトリビューションモデルと指標の可視化、

      などおもしろテーマがもりだくさん

    ★ 弊社事業の特徴

    - 電子書籍、スマート TV 、 Web カーナビなど新しい Web メディア上の広告に注力

    - デジタルマーケティング担当者にメディアを横断した統合 PR プランニングを提供

    - 数理&コンピュータサイエンス&ビジネスの融合させて未来を開拓することが指名

Tokyo r 25_lt_isobe

  • 1.
    R でスマホの加速度センサーデータ処理 を試してみた 第25回 Tokyo.R LT 発表資料 アドファイブ(株)代表取締役 CEO 礒部正幸
  • 2.
    背景と動機 ● 人と会う → 連絡先を交換 → Facebook! ● ユーザ ID を検索するの面倒くさい → FB 連絡先の交換をもっと手軽にしたい ● 赤外線や Bluetooth を使うのは機種依存 ● HTML5 を使って Web アプリで作りたい → 加速度センサーをうまく使ってお互いを認識したい! ビジネスコネクションを、よりスムーズに! ※ ナンパツールではありません。
  • 3.
    イメージ 2台のスマホを重ねて振る 動きの一致判定 アルゴリズムが必要 センサーの時系列データをサーバに記録 ↓ → ペアになっていない (現在未完成) データ同士からペアを 見つけられるか? アルゴリズム開発支援環境は R+MongoDB で簡単に作れる! (※グラフは開発中のものなので  既にペアのデータが表示されてる)
  • 4.
    システム構成 サーバ Facebook ID 名 Apache / Perl ① ブラウザ ② JSON HTML5 の MongoDB 加速度センサ FB ID 名 API(Javascript) ③ 3次元 ④ 折れ線 グラフ rmongodb rgl スマホ 開発用 PC
  • 5.
    プログラム: Javascript@ スマホ window.addEventListener( "devicemotion", function(e){ aCount++; var x = e.accelerationIncludingGravity.x; var y = e.accelerationIncludingGravity.y; var z = e.accelerationIncludingGravity.z; var ad = { x:x, y:y, z:z }; // 中略 sendToServer(bData); }, true); function sendToServer(v) { var req = new XMLHttpRequest(); req.open('POST','http://jiot.net/715/ajax/'+yourRole+'/'+yourName); req.onreadystatechange = function() { if (req.readyState==4) { lab3.text = req.responseText; } } req.setRequestHeader("content-type","application/x-www-form-urlencoded"); var json = JSON.stringify(v); req.send("json="+escape(json)); }
  • 6.
    プログラム: Perl@ サーバ useMongoDB; use JSON qw/encode_json decode_json/; my $connection = MongoDB::Connection->new; # localhost my $database = $connection->match; my $collection = $database->evs; # Perl/Dancer を使用 ( 略) post '/715/ajax/:role/:name' { my $role = params->{'role'}; my $name = params->{'name'}; my $json = params->{'data'}; my $time=time(); my $data=decode_json($json); $collection->insert({role=>$role,name=>$name,time=>$time,data=>$data}); // この辺でセンサーデータを分析する処理が入る if ( マッチングに成功した ) { redirect 'FB の ID 名を交換して表示するページ '; } };
  • 7.
    プログラム: R@ 開発用PC library(rmongodb) } else { library(rgl) col='red'; mongo <- mongo.create('jiot.net') x<-lapply(data,function(a) {-a[[1]]}) one <- function() { y<-lapply(data,function(a) {a[[2]]}) cur <- mongo.find(mongo, 'match.evs') z<-lapply(data,function(a) {-a[[3]]}) add=F } while (mongo.cursor.next(cur)) { plot3d(x,y,z,type="l",col=col,add=add) e <- mongo.cursor.value(cur) add=T role <- mongo.bson.value(e,"role") } data <- mongo.bson.value(e,"data") mongo.cursor.destroy(cur) if (role==1) { } col='blue'; x<-lapply(data,function(a) {a[[1]]}) y<-lapply(data,function(a) {a[[2]]}) z<-lapply(data,function(a) {a[[3]]}) role <- 値 { role: 値 , name:”hoge”, time: 値 , x <- [ 1番目の x, 2番めの x,...] data:[{x: 値 ,y: 値 ,z: 値 }, y <- [ 1番目の y, 2番めの y,...] {x: 値 ,y: 値 ,z: 値 }, … ] } z <- [ 1番目の z, 2番めの z,...]
  • 8.
  • 9.
    まとめ ◯ 不定型なセンサーデータは JSONにして MongoDB に流しこむとスキーマ不要で便利 ◯ R から MongoDB に直接つないでグラフ描画 は簡単 ◯ アルゴリズム開発環境として R+MongoDB は 使える △ R で開発したアルゴリズムを元のアプリ上に 実装しなおすところをどうするかは課題
  • 10.
    ご静聴ありがとうございました! ● アドファイブ株式会社のご紹介 お気軽に連絡ください! ( FB 友だち申請は即承認します) ★ 仕事の面白さ Facebook: masayuki.isobe.14 Twitter: @chiral   * 純粋なテックベンチャーです E-mail: isobe@adfive.net   * 最新のアドテクノロジーを開発し、 広告代理店や販路/営業部隊を持った企業とアライアンスを組んで収益化 * オーディエンスデータの分析、コンテンツマッチアルゴリズムの開発、   クリエイティブの動的生成、アトリビューションモデルと指標の可視化、  などおもしろテーマがもりだくさん ★ 弊社事業の特徴 - 電子書籍、スマート TV 、 Web カーナビなど新しい Web メディア上の広告に注力 - デジタルマーケティング担当者にメディアを横断した統合 PR プランニングを提供 - 数理&コンピュータサイエンス&ビジネスの融合させて未来を開拓することが指名