SlideShare a Scribd company logo
1 of 21
Rで作るWebアプリ rApache編
                ~featuring ROKURO~

        2012/05/26
        Tokyo.R#23
          和田 計也

サイバー系
サイバー系


     はじめに



     ※この発表は個人の
     見解であり、所属す
     る組織の公式見解で
     はありません。

2012/5/26                1
サイバー系


     自己紹介

  和田 計也(@wdkz)
         静岡県袋井市出身




  サイバー系企業でデータマイニングエンジニア職
         最近は大きなグラフの仕事してます



  前職はバイオベンチャー
         バイオマーカ探索してた
         学生時代は枯草菌の研究




2012/5/26                            2
サイバー系


     初めに



                   夏野剛
   R2.0 2004/10    DoCoMo2.0
                   2007/04



   Tim O'Reilly
   Web2.0 2005




                   T Nakagawa, et al.
                   RoKuRo2.0
   John Schwartz
                   2012/05
   BI2.0 2007/05



2012/5/26                                       3
サイバー系


     アメーバピグで遊んでみた




2012/5/26                   4
サイバー系


     ろくろを回すWebアプリをつくる

    最初に
             別にブラウザ上でろくろ回さなくても良くね?とか言わない

    概要
               rApache
               RookとrApacheの関係
               RookアプリのrApacheへのデプロイ
               ろくろ回し




2012/5/26                                       5
サイバー系


     準備

   ##Ubuntu 12.04上で構築しました
   #Rのインストール
   sudo apt-get install r-base r-base-dev

   #Rookライブラリのインストール
   sudo R
   install.packages(“Rook”, lib=“/usr/local/lib/R/site-library”)

   #rglライブラリのインストール
   sudo apt-get build-dep r-cran-rgl
   sudo R
   install.packages(“rgl“, lib=“/usr/local/lib/R/site-library”)



2012/5/26                                                                 6
サイバー系


     準備

   ##Ubuntu 12.04上で構築しました
   #Apache関連のモジュールインストール
   sudo apt-get install apache2-mpm-prefork apache2-
     prefork-dev

   #rApache(mod_R)のインストール
   wget http://www.rapache.net/rapache-1.1.20.tar.gz
   tar xzvf rapache-1.1.20.tar.gz
   cd rapache-1.1.20
   ./configure
   make
   sudo make install



2012/5/26                                                      7
サイバー系


     rApacheを動かしてみる
   ##Ubuntu 12.04上で構築しました
   #mod_Rモジュールのインポート設定
   vi /etc/apache2/mods-enabled/r.load
   #↓のように1行書く
   LoadModule R_module /usr/lib/apache2/modules/mod_R.so

   #rApache(mod_R)の設定
   vi /etc/apache2/mods-enabled/r.conf
   #↓のように3行書く
   <Location /RApacheInfo>
       SetHandler r-info
   </Location>

   #apacheにRモジュールを追加
   sudo a2enmod r

   #apache再起動
   sudo /etc/init.d/apache2 reload

2012/5/26                                                          8
サイバー系


     rApacheでthe world
   ##Ubuntu 12.04上で構築しました
   #rApache(mod_R)の設定
   vi /etc/apache2/mods-enabled/r.conf

   #↓のように4行書く
   <Location /world>       cat(“<html><body><h1>the world</h1></body></html>”)
     SetHandler r-handler
     SetFileHandler /home/wdkz/world.r
   </Location>

   #apache再起動
   sudo /etc/init.d/apache2 reload




2012/5/26                                                                        9
サイバー系


     RookとrApacheの整理

                     Rook                 rApache
            一言       簡単にWebアプリ作れるよ        Apache上でR動かすよ
            対応OS     Win, MacOSX, Linux   MacOSX, Linux
            インストール   CRAN                 wget configure make
                                          make install
            特長       お手軽                  信頼のApache
            欠点       Webサーバがとにかくよく落 何かと面倒
                     ちる
            最後に      何て読むの?               Rookをデプロイ出来る!
            作者




2012/5/26                                                       10
サイバー系


     (おさらい)RookによるWebアプリ
     Rook.holiday <- function(env) {
       source("holiday.R")
       req = Rook::Request$new(env)                                                          入力formとか結果表示
       res = Rook::Response$new()                                                            はhtmlで力業で書く
       res$write('いつ?:¥n')
       res$write('<form method="POST">¥n')
       res$write('<input type="text" name="xdim" value="2012">¥n')
       res$write('<input type="submit" name="Go", value="holiday">¥n</form>¥n<br>')
       if (!is.null(req$POST())) {
          y <- req$POST()[["xdim"]] #テキストフォームの入力値を取得
          holidays <- holiday(y)         #holiday関数の結果を取得
          res$write("<p>")
          if(length(holidays)==1){
                    res$write(as.character(holidays))
                    }else if(is.matrix(holidays)){
                    for(i in 1:nrow(holidays)){
                       res$write(paste(as.character(holidays[i,1]), "<br>¥n", sep=""))
                    }
                    }else{
                    for(i in 1:nrow(holidays)){
                        res$write(paste(as.character(holidays[i,1]), " | ",
                                                  as.character(holidays[i,2]), "<br>",sep=""))
                    }
          }
          res$write("</p>")
       }
       res$finish()
     }
2012/5/26                                                                                                   11
サイバー系


     (おさらい)RookによるWebアプリ

   Rook内蔵Webサーバ起動部分
  holiday.start <- function(){
            s <<- Rhttpd$new() #グローバル領域に変数を作成
             #前ページで定義したRook.holiday関数にholidayと名付けて
            s$add(app = Rook.holiday, name = “holiday”)
            s$start()
            s$browse(“holiday”) #Rook.holiday関数を呼び出す
  }




      これで、デフォルトブラウザが起動する




2012/5/26                                                     12
サイバー系


     rApacheにRookアプリをデプロイする
     #rApache(mod_R)の設定
     vi /etc/apache2/mods-enabled/r.conf
     #↓のように4行書く URL
                               先ほどのRook.holiday関数を定義した
     <Location /holiday>       ファイル名がholiday.R
      SetHandler r-handler
      RFileEval /home/wdkz/holiday.R:Rook::Server$call(Rook.holiday)
     </Location>
                                                  html表示させる関数名


     #apache再起動
     sudo /etc/init.d/apache2 reload




2012/5/26                                                              13
サイバー系


     ろくろ回し全容
本当はやりたかったこと                   出来上がったもの

                                              ろくろ
            画像        ろくろ      画像             パラメータ
            ファイル      パラメータ    ファイル


                                         rglパッケージのplot3d,
       rglパッケージのplot3d,                  writeWebGL
       writeWebGL                        で静的にろくろ生成
       で動的にろくろ生成




        ブラウザ上で回す(WebGL)       ブラウザ上で回らない(WebGL)

2012/5/26                                                   14
サイバー系


     (参考)ろくろ描写部分
x <- y <-100:100
f <- function(x,y){x^2+y^2}
z <- outer(x,y,f)
z[which(z>(max(x)^2))] <- NA              ここら辺、強引にz軸座標決めてる
for(i in 1:ncol(z)){
 z[which(max(z[,i],na.rm=TRUE)==z[,i]),i] <- max(z, na.rm=TRUE)
}
for(i in 1:nrow(z)){
    z[i,which(max(z[i,],na.rm=TRUE)==z[i,])] <- max(z, na.rm=TRUE)
}                    バックグラウンドの透過度MAX
bg3d(alpha=0)
persp3d(z, col="green", xlab="", ylab="", zlab="", axes=FALSE, box=FALSE,
    aspect=c(1,1,0.9), texture="ameba_s.png")
writeWebGL(width=500, height=500)
                                       テクスチャを入れる
            WebGLを書き出す

                                                                  緩募:
                                                                  回転体の
                                                                  生成方法

2012/5/26                                                                       15
サイバー系


     html部分_Rookで書いてます
rokuro.html <- function(env){
   req <- Rook::Request$new(env)                  ここら辺で入力フォーム書いてる
   res <- Rook::Response$new()
   res$write('<form name="form1", method="POST" enctype="multipart/form-data">¥n')
   res$write('<input type="file" name="data">¥n<br><br>¥n')
   res$write('お前は今まで食ったパンの枚数を覚えているのか:¥n')
   res$write('<input type="submit" name="Go", value="Rokuro!">¥n</form>¥n<br>¥n')
   if(!is.null(req$POST())){
            f.name <- req$POST()[[“data”]]$tempfile #POSTの値取得
            res <- Rook::Response$new() #新しい画面に
            f.name2 <- strsplit(paste(f.name, ".jpg", sep=""), "/")
            f.name2 <- f.name2[[1]][length(f.name2[[1]])]
            full.name2 <- paste("/tmp/", f.name2, sep="")
            file.copy(from=f.name, to=full.name2)
            pic.size <- read.jpeg(full.name2)#入力画像の縦横値取得
            f.rename <- paste(as.integer(Sys.time()), “.html”, sep=“”)#適当なファイル名
            write.rokuro(f.rename, full.name2, dim(pic.size)[1], dim(pic.size)[2])#WebGL出力
            res$write(paste(‘<meta http-equiv=“Refresh” content=“0; URL=’, s$full_url(‘pic’),
   ‘/‘, f.rename, ’”>’, sep=‘’))#WebGLのページにリダイレクト
   }
   res$finish()
}

2012/5/26                                                                                       16
サイバー系


     ろくろアプリ(Rook)をrApacheにデプロイする
     #rApache(mod_R)の設定
     vi /etc/apache2/mods-enabled/r.conf
     #↓のように4行書く URL
                              先ほどのRook.holiday関数を定義した
     <Location /rokuro>       ファイル名がholiday.R
      SetHandler r-handler
      RFileEval /home/wdkz/rokuro.R:Rook::Server$call(rokuro.html)
     </Location>
                                                 html表示させる関数名


     #apache再起動
     sudo /etc/init.d/apache2 reload




2012/5/26                                                                17
サイバー系


     ろくろDemoない




            注:ろくろはマウスで
              グリグリやって回す



2012/5/26                     18
サイバー系


     今回の反省点

   ろくろの描写も都度都度したかった
             mod_RからX11が使えなくて、plot3d → writeWebGLコ
              ンボが動的に使えなかった            緩募:
                                       mod_Rから
                                       X11使う方法
   ろくろを回したかった
             rglのspin3dなら、R上なら回るんだけどwriteWebGLで
              WebGLに書きだしても自動で回らない (2012/05/26現在)
   ろくろというか、ノッポさんの帽子になっちゃった
             手抜きしすぎたな




2012/5/26                                             19
サイバー系


     (まとめ)RをWebアプリ化するには

   ①Rでサクサクっとスクリプトを書く
             ↓
   ②RookでサクサクっとWebアプリ化
             ↓
   ③rApacheにサクサクっとデプロイ




                             で
            ろくろを回そうとしてみた話おしまい。
2012/5/26                      20

More Related Content

What's hot

initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
Takashi Takizawa
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
airtoxin Ishii
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
max747
 
Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704
HommasSlide
 
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
真乙 九龍
 

What's hot (20)

initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
 
Introduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and DracutIntroduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and Dracut
 
systemdを始めよう
systemdを始めようsystemdを始めよう
systemdを始めよう
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
Puppetのススメ
PuppetのススメPuppetのススメ
Puppetのススメ
 
Zabbix2.0.3の新機能と変更点
Zabbix2.0.3の新機能と変更点Zabbix2.0.3の新機能と変更点
Zabbix2.0.3の新機能と変更点
 
Hello, systemd
Hello, systemdHello, systemd
Hello, systemd
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704
 
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 
Ilstudy001_20110806
Ilstudy001_20110806Ilstudy001_20110806
Ilstudy001_20110806
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
バックアップに一番いいファイルシステムを頼む
バックアップに一番いいファイルシステムを頼むバックアップに一番いいファイルシステムを頼む
バックアップに一番いいファイルシステムを頼む
 
linux基礎_新卒エンジニア勉強会20130404
linux基礎_新卒エンジニア勉強会20130404linux基礎_新卒エンジニア勉強会20130404
linux基礎_新卒エンジニア勉強会20130404
 

Viewers also liked

この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜
Takahiro Inoue
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
Prunus 1350
 

Viewers also liked (9)

可視化周辺の進化がヤヴァイ~rChartsを中心として~
可視化周辺の進化がヤヴァイ~rChartsを中心として~可視化周辺の進化がヤヴァイ~rChartsを中心として~
可視化周辺の進化がヤヴァイ~rChartsを中心として~
 
はじめてのShiny
はじめてのShinyはじめてのShiny
はじめてのShiny
 
RとWeb API
RとWeb APIRとWeb API
RとWeb API
 
インターン成果報告
インターン成果報告インターン成果報告
インターン成果報告
 
rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現
 
この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜
 
データ可視化勉強会
データ可視化勉強会データ可視化勉強会
データ可視化勉強会
 
深層学習フレームワーク Chainer の開発と今後の展開
深層学習フレームワーク Chainer の開発と今後の展開深層学習フレームワーク Chainer の開発と今後の展開
深層学習フレームワーク Chainer の開発と今後の展開
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
 

Similar to RでつくるWebアプリ~rApache編~

Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3
Sea Mountain
 
Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4
Taku Unno
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
emasaka
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
hiro345
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
Kiwamu Okabe
 
Spring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーションSpring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーション
Toshiaki Maki
 

Similar to RでつくるWebアプリ~rApache編~ (20)

Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
Sinatra and heroku for mac
Sinatra and heroku for macSinatra and heroku for mac
Sinatra and heroku for mac
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
Spring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーションSpring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーション
 

More from Kazuya Wada (10)

オンラインTVサービスの分析事例
オンラインTVサービスの分析事例オンラインTVサービスの分析事例
オンラインTVサービスの分析事例
 
DeployR使ってみた話
DeployR使ってみた話DeployR使ってみた話
DeployR使ってみた話
 
道玄坂Lt#2 wdkz
道玄坂Lt#2 wdkz道玄坂Lt#2 wdkz
道玄坂Lt#2 wdkz
 
ハイレゾの話
ハイレゾの話ハイレゾの話
ハイレゾの話
 
Shiny-Serverあれこれ
Shiny-ServerあれこれShiny-Serverあれこれ
Shiny-Serverあれこれ
 
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkzデータサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
 
R-3.0.0でGLM
R-3.0.0でGLMR-3.0.0でGLM
R-3.0.0でGLM
 
JuliaでGLM
JuliaでGLMJuliaでGLM
JuliaでGLM
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~
 
Rでウォーリを探してみた
Rでウォーリを探してみたRでウォーリを探してみた
Rでウォーリを探してみた
 

RでつくるWebアプリ~rApache編~

  • 1. Rで作るWebアプリ rApache編 ~featuring ROKURO~ 2012/05/26 Tokyo.R#23 和田 計也 サイバー系
  • 2. サイバー系 はじめに ※この発表は個人の 見解であり、所属す る組織の公式見解で はありません。 2012/5/26 1
  • 3. サイバー系 自己紹介  和田 計也(@wdkz)  静岡県袋井市出身  サイバー系企業でデータマイニングエンジニア職  最近は大きなグラフの仕事してます  前職はバイオベンチャー  バイオマーカ探索してた  学生時代は枯草菌の研究 2012/5/26 2
  • 4. サイバー系 初めに 夏野剛 R2.0 2004/10 DoCoMo2.0 2007/04 Tim O'Reilly Web2.0 2005 T Nakagawa, et al. RoKuRo2.0 John Schwartz 2012/05 BI2.0 2007/05 2012/5/26 3
  • 5. サイバー系 アメーバピグで遊んでみた 2012/5/26 4
  • 6. サイバー系 ろくろを回すWebアプリをつくる  最初に  別にブラウザ上でろくろ回さなくても良くね?とか言わない  概要  rApache  RookとrApacheの関係  RookアプリのrApacheへのデプロイ  ろくろ回し 2012/5/26 5
  • 7. サイバー系 準備 ##Ubuntu 12.04上で構築しました #Rのインストール sudo apt-get install r-base r-base-dev #Rookライブラリのインストール sudo R install.packages(“Rook”, lib=“/usr/local/lib/R/site-library”) #rglライブラリのインストール sudo apt-get build-dep r-cran-rgl sudo R install.packages(“rgl“, lib=“/usr/local/lib/R/site-library”) 2012/5/26 6
  • 8. サイバー系 準備 ##Ubuntu 12.04上で構築しました #Apache関連のモジュールインストール sudo apt-get install apache2-mpm-prefork apache2- prefork-dev #rApache(mod_R)のインストール wget http://www.rapache.net/rapache-1.1.20.tar.gz tar xzvf rapache-1.1.20.tar.gz cd rapache-1.1.20 ./configure make sudo make install 2012/5/26 7
  • 9. サイバー系 rApacheを動かしてみる ##Ubuntu 12.04上で構築しました #mod_Rモジュールのインポート設定 vi /etc/apache2/mods-enabled/r.load #↓のように1行書く LoadModule R_module /usr/lib/apache2/modules/mod_R.so #rApache(mod_R)の設定 vi /etc/apache2/mods-enabled/r.conf #↓のように3行書く <Location /RApacheInfo> SetHandler r-info </Location> #apacheにRモジュールを追加 sudo a2enmod r #apache再起動 sudo /etc/init.d/apache2 reload 2012/5/26 8
  • 10. サイバー系 rApacheでthe world ##Ubuntu 12.04上で構築しました #rApache(mod_R)の設定 vi /etc/apache2/mods-enabled/r.conf #↓のように4行書く <Location /world> cat(“<html><body><h1>the world</h1></body></html>”) SetHandler r-handler SetFileHandler /home/wdkz/world.r </Location> #apache再起動 sudo /etc/init.d/apache2 reload 2012/5/26 9
  • 11. サイバー系 RookとrApacheの整理 Rook rApache 一言 簡単にWebアプリ作れるよ Apache上でR動かすよ 対応OS Win, MacOSX, Linux MacOSX, Linux インストール CRAN wget configure make make install 特長 お手軽 信頼のApache 欠点 Webサーバがとにかくよく落 何かと面倒 ちる 最後に 何て読むの? Rookをデプロイ出来る! 作者 2012/5/26 10
  • 12. サイバー系 (おさらい)RookによるWebアプリ Rook.holiday <- function(env) { source("holiday.R") req = Rook::Request$new(env) 入力formとか結果表示 res = Rook::Response$new() はhtmlで力業で書く res$write('いつ?:¥n') res$write('<form method="POST">¥n') res$write('<input type="text" name="xdim" value="2012">¥n') res$write('<input type="submit" name="Go", value="holiday">¥n</form>¥n<br>') if (!is.null(req$POST())) { y <- req$POST()[["xdim"]] #テキストフォームの入力値を取得 holidays <- holiday(y) #holiday関数の結果を取得 res$write("<p>") if(length(holidays)==1){ res$write(as.character(holidays)) }else if(is.matrix(holidays)){ for(i in 1:nrow(holidays)){ res$write(paste(as.character(holidays[i,1]), "<br>¥n", sep="")) } }else{ for(i in 1:nrow(holidays)){ res$write(paste(as.character(holidays[i,1]), " | ", as.character(holidays[i,2]), "<br>",sep="")) } } res$write("</p>") } res$finish() } 2012/5/26 11
  • 13. サイバー系 (おさらい)RookによるWebアプリ  Rook内蔵Webサーバ起動部分 holiday.start <- function(){ s <<- Rhttpd$new() #グローバル領域に変数を作成 #前ページで定義したRook.holiday関数にholidayと名付けて s$add(app = Rook.holiday, name = “holiday”) s$start() s$browse(“holiday”) #Rook.holiday関数を呼び出す } これで、デフォルトブラウザが起動する 2012/5/26 12
  • 14. サイバー系 rApacheにRookアプリをデプロイする #rApache(mod_R)の設定 vi /etc/apache2/mods-enabled/r.conf #↓のように4行書く URL 先ほどのRook.holiday関数を定義した <Location /holiday> ファイル名がholiday.R SetHandler r-handler RFileEval /home/wdkz/holiday.R:Rook::Server$call(Rook.holiday) </Location> html表示させる関数名 #apache再起動 sudo /etc/init.d/apache2 reload 2012/5/26 13
  • 15. サイバー系 ろくろ回し全容 本当はやりたかったこと 出来上がったもの ろくろ 画像 ろくろ 画像 パラメータ ファイル パラメータ ファイル rglパッケージのplot3d, rglパッケージのplot3d, writeWebGL writeWebGL で静的にろくろ生成 で動的にろくろ生成 ブラウザ上で回す(WebGL) ブラウザ上で回らない(WebGL) 2012/5/26 14
  • 16. サイバー系 (参考)ろくろ描写部分 x <- y <-100:100 f <- function(x,y){x^2+y^2} z <- outer(x,y,f) z[which(z>(max(x)^2))] <- NA ここら辺、強引にz軸座標決めてる for(i in 1:ncol(z)){ z[which(max(z[,i],na.rm=TRUE)==z[,i]),i] <- max(z, na.rm=TRUE) } for(i in 1:nrow(z)){ z[i,which(max(z[i,],na.rm=TRUE)==z[i,])] <- max(z, na.rm=TRUE) } バックグラウンドの透過度MAX bg3d(alpha=0) persp3d(z, col="green", xlab="", ylab="", zlab="", axes=FALSE, box=FALSE, aspect=c(1,1,0.9), texture="ameba_s.png") writeWebGL(width=500, height=500) テクスチャを入れる WebGLを書き出す 緩募: 回転体の 生成方法 2012/5/26 15
  • 17. サイバー系 html部分_Rookで書いてます rokuro.html <- function(env){ req <- Rook::Request$new(env) ここら辺で入力フォーム書いてる res <- Rook::Response$new() res$write('<form name="form1", method="POST" enctype="multipart/form-data">¥n') res$write('<input type="file" name="data">¥n<br><br>¥n') res$write('お前は今まで食ったパンの枚数を覚えているのか:¥n') res$write('<input type="submit" name="Go", value="Rokuro!">¥n</form>¥n<br>¥n') if(!is.null(req$POST())){ f.name <- req$POST()[[“data”]]$tempfile #POSTの値取得 res <- Rook::Response$new() #新しい画面に f.name2 <- strsplit(paste(f.name, ".jpg", sep=""), "/") f.name2 <- f.name2[[1]][length(f.name2[[1]])] full.name2 <- paste("/tmp/", f.name2, sep="") file.copy(from=f.name, to=full.name2) pic.size <- read.jpeg(full.name2)#入力画像の縦横値取得 f.rename <- paste(as.integer(Sys.time()), “.html”, sep=“”)#適当なファイル名 write.rokuro(f.rename, full.name2, dim(pic.size)[1], dim(pic.size)[2])#WebGL出力 res$write(paste(‘<meta http-equiv=“Refresh” content=“0; URL=’, s$full_url(‘pic’), ‘/‘, f.rename, ’”>’, sep=‘’))#WebGLのページにリダイレクト } res$finish() } 2012/5/26 16
  • 18. サイバー系 ろくろアプリ(Rook)をrApacheにデプロイする #rApache(mod_R)の設定 vi /etc/apache2/mods-enabled/r.conf #↓のように4行書く URL 先ほどのRook.holiday関数を定義した <Location /rokuro> ファイル名がholiday.R SetHandler r-handler RFileEval /home/wdkz/rokuro.R:Rook::Server$call(rokuro.html) </Location> html表示させる関数名 #apache再起動 sudo /etc/init.d/apache2 reload 2012/5/26 17
  • 19. サイバー系 ろくろDemoない 注:ろくろはマウスで グリグリやって回す 2012/5/26 18
  • 20. サイバー系 今回の反省点  ろくろの描写も都度都度したかった  mod_RからX11が使えなくて、plot3d → writeWebGLコ ンボが動的に使えなかった 緩募: mod_Rから X11使う方法  ろくろを回したかった  rglのspin3dなら、R上なら回るんだけどwriteWebGLで WebGLに書きだしても自動で回らない (2012/05/26現在)  ろくろというか、ノッポさんの帽子になっちゃった  手抜きしすぎたな 2012/5/26 19
  • 21. サイバー系 (まとめ)RをWebアプリ化するには ①Rでサクサクっとスクリプトを書く ↓ ②RookでサクサクっとWebアプリ化 ↓ ③rApacheにサクサクっとデプロイ で ろくろを回そうとしてみた話おしまい。 2012/5/26 20