ixixixixixixi

ixixiのblogです. twitterは@ixixi

Shinyを使って、RだけでWebアプリケーション

Shinyを使うと、Rだけで分析Webアプリケーションが作れる.

http://www.rstudio.com/shiny/

サーバ側の処理も、ブラウザのuiも、Javascript/HTML/CSSを書かずとも、Rで書ける.

Shinyのインストールは、Rのコンソールで、

options(repos=c(RStudio='http://rstudio.org/_packages', getOption('repos')))
install.packages('shiny')

をするだけ。

Shinyアプリの最小構成は、以下のようになる.

~/shinyapp
|-- ui.R (ブラウザ側の処理)
|-- server.R (サーバ側の処理)

.Rの2つを実装する必要がある.

例えばこんな感じになる.(tutorialの例より)

ui.R

library(shiny)
# ランダムな分布のplotをするアプリのUI定義
shinyUI(pageWithSidebar(

  # アプリタイトル
  headerPanel("Hello Shiny!"),

  # サンプルの数を設定するスライドバー
  sidebarPanel(
    sliderInput("obs", 
                "Number of observations:", 
                min = 0, 
                max = 1000, 
                value = 500)
  ),

  # サーバで生成されたplotを表示
  mainPanel(
    plotOutput("distPlot")
  )
))

server.R

library(shiny)
# ランダムな分布を生成・プロットするサーバロジックの定義
shinyServer(function(input, output) {

  # reactivePlotは、inputが変わったら自動で再実行される、
  # 出力typeはplot(画像)なFunction
  output$distPlot <- reactivePlot(function() {
    # 乱数を生成する
    # rnorm(n)は、正規分布に従う乱数をn個生成するfunction
    dist <- rnorm(input$obs)
    # ヒストグラムをplotする
    hist(dist)
  })
})

この2つのファイルを作ったら、Rのコンソールで実行

> runApp("~/shinyapp")

Listening on port 8100

HttpのWebServerが立ち上がる.

ブラウザのhttp://localhost:8100/を確認すると(自動で開く)、

f:id:ixixixi:20121110143834p:plain

という風に、Webアプリケーションが実行されているのが分かる.

スライドバーをドラッグすると、自動でグラフが再描画される.

consoleに入らずに実行するには

R -e "shiny::runApp('~/shinyapp')"

Shiny自体はRStudioに依存はしておらず、任意のRの環境(R console,Rgui for windows等)で実行出来る. なのでもちろん、任意のRのライブラリが使える.

RStudio IDEのサーバ版を使って開発、そのままWebアプリ化~なんてのがやりやすいから、サーバ版のRStudioとの相性は良さそう.

タイトルでは「Rだけで」と書いたけど、ui.Rを使わずにhtmlで書くことも出来る.

「Rは書けるけど、Webアプリ開発には詳しくない」という人たち(統計屋さんとか)でも気軽にこういうのが作れるようになったのは良いですね.

Cloudantでお手軽CouchDB & Fluentdと連携

■Fluent meetup in Tokyo 

最近Fluentdが盛り上がってますね.

先週のFluentd meetup in Japanというイベントでは、参加希望者180人以上、Ust視聴者累計500人以上と、相当な盛り上がりです.

ここではFluentdの紹介はしませんが、Fluentd本体については,作者の@frsyukiさんの資料が、Fluentdのプラグインについては@repeatedlyさんの資料がとても分かりやすくて素晴らしいです.

私も、去年あたりからfluentdのプラグインのfluent-plugin-couchという、fluentdでデータをCouchDBへ流すプラグインを書いていたので、Fluentd meetup in Tokyoの最後の枠で発表させて頂きました.

 Fluentd meetupのイベント主催はmongodb-jp主催の@doryokujinさんだったということもあってか、参加者にMongoユーザが多かったですね.

セッションで、「MongoDBとは~」という説明無くMongoDBとFluentdの連携させる話が幾つか紹介されていましたが,殆どの参加者は平気なように見えました.

一方でCouchDBについては、プラグインの紹介以前に、CouchDBを触ったことのある方が相当少ない印象でした.

(実際、発表の中で、「CouchDBに触ったことのある方」と「MongoDBを触ったことのある方」に挙手していただいたのですが、120名ぐらい中、Couchに触れた事のある方は6~7名程度、MongoDBに触れたことのある方は50~60名程度と、圧倒的な差でした.)

 

そこで、個人的にはもっとCouchDBも触って欲しいなぁと思っているので、簡単に(多分2分ぐらいで)CouchDBを使う方法を紹介してみます.

ちゃんと検証するなら、Amazon EC2やオンプレミス環境でCouchDBをinstallして使うのも良いですが「試しにCouchDBに触れてみたい」のであれば、server/instanceの管理も不要で、料金もゼロ、installすら不要で使えるCloudantのCouchDBホスティングサービスが個人的にはオススメです.

  • Cloudant社は、Y Combinator社の投資を受けたデータベースプラットホームの会社です。CouchDBホスティングサービスや分析サービスの他にもBigCouchというApache CouchDBをforkしたプロジェクト(CouchDBにauto-shardingやクラスタ機能を統合拡張したもの)を進めていたりします.

 

■CloudantのCouchDBを使う

さて、では実際に登録から始めてみましょう.

cloudantのサイトに行きます

https://cloudant.com/

f:id:ixixixi:20120212001139p:plain

右上のSign Upから,新規登録画面へ.

プランの選択があります.

f:id:ixixixi:20120212001031p:plain

どのプランも30日のFree Trialができますが、クレジットカード情報の入力すら不要である無料のOxgenプランを選んでおきましょう.

250MBの容量と、月50万回のrequestが無料で使えます.

Sign Upしましょう. 

f:id:ixixixi:20120212001226p:plain

UsernameはホストされるCouchDBのドメイン名になります.

アカウント情報を入力しましょう.

f:id:ixixixi:20120212001651p:plain

規約を読んだらSign Upで登録完了.

そのまま自動的にログイン後の画面に移ります.

f:id:ixixixi:20120212001722p:plain

これでもうCouchDBが使えるようになりました.

 

CouchDBはRESTfullなDBですが、ホストされているCouchDBのURLは真ん中の 「Your URL」と表示されている https://{登録アカウント名}.cloudant.com です.
f:id:ixixixi:20120212002327p:plain

ここまで2分も掛からなかったのでは無いでしょうか.

 
 
折角なので、少しだけWebの管理画面を触ってみましょう.
最初は、documentを入れる単位であるdatabaseは勿論ありません.

画面の上の方に、「databaseが何も無いのでまず1つ最初に作ってね」と表示されています.

f:id:ixixixi:20120212002453p:plain

試しに"hello"というdatabaseを作ってみましょう.

database名を入れてcreateするだけです.

f:id:ixixixi:20120212003054p:plain

これでhelloというdatabaseが出来ました.

databaseのURL(databaseに対してRESTでリクエストを投げる先)は、

https://{登録アカウント名}.cloudant.com/hello

です. 

f:id:ixixixi:20120212003147p:plain

また、Cloudantの管理画面以外にも、CouchDBビルトインのGUI(Futon)も見ることが出来ます. 

https://{登録アカウント名}.cloudant.com/_utils

がそのURLです.

「CloudantのCouchDB」ではなく素の「Apache CouchDB」を扱うのでしたら、こちらの画面を見ることが多いかも知れません.

f:id:ixixixi:20120212004128p:plain 

作ったdatabaseに対して操作をするにはどうすれば良いでしょうか.

これも同じく管理画面からもできますが、CouchDBはRESTfullなので、curlで全ての操作が出来ます.

実は、親切なことに画面の下の方にサンプルが書いています. 

f:id:ixixixi:20120212003044p:plain

基本的に、登録したアカウント名とパスワードのBASIC認証curlすれば 良いということですね.

(※Database毎に、アカウント名/パスワード代わりに使えるAPI Keyというものを発行してPermission設定をすることも出来ます.)

ここまで来たら,もう普通のCouchDBとして好きに扱えるので,

CouchDBそのものに対するcurlでの操作については,

下記入門記事や

http://www.atmarkit.co.jp/fdb/rensai/09_couchdb/02/couchdb01.html

CouchDB-jpで公開されているCouchDB: The Definitive Guideの翻訳

http://couchdb-jp.github.com/couchdb-guide/editions/1/ja/

等を読むと良いでしょう.非常に扱いやすいRESTfullなインタフェースです.  


■fluent-plugin-couchを使ってドキュメントをfluentdで流し込んでみる

fluentdのinstallは済んでいるものとします. 

$ gem install fluent-plugin-couch

これだけでfluent-plugin-couchのinstallは終了します.

では、このpluginを使って,先に使えるようにしたCloudantのCouchDBを使う様にに設定しましょう.

fluent.confに 

<match couch.**>
    type couch
    database hello
    host {アカウント名}.cloudant.com
    port 443
    protocol https
 
    user {アカウント名}
    password {パスワード}
 
    flush_interval 5s
</match> 

と書いて、fluentdを起動.

$ fluentd -c fluent.conf &

起動したら、標準入力をfluentdに流すfluent-catを使ってJSONメッセージを流します.

$ echo '{"message":"Hello Couch World!"}' | fluent-cat couch.doc

flush_intervalに5秒を設定したので、5秒以内にCouchDBの"hello"databaseにドキュメントが格納されます.

では、DocumentがCouchDBの"hello" databaseに入ったことを確認してみましょう.

$  curl -k -X GET 'https://{アカウント名}:{パスワード}@{アカウント名}.cloudant.com/hello/_all_docs'

と打つと、

{"total_rows":1,"offset":0,"rows":[
{"id":"7f3c2976786c09222735ef2c8f630520","key":"7f3c2976786c09222735ef2c8f630520","value":{"rev":"1-a4b14dac5db8e4f764aef016e42bc41b"}}
]}

というようなJSONが返ってきます. database内に格納されているdocumentの数を表す"total_rows"の値が1になっているので、databaseにdocumentが挿入されています.

  • document IDとkeyは、CouchDBのデフォルトのinsertの動きでは自動採番されるようになっています.明示的に指定することも出来るのですが、pluginの動作としては自動採番としています. 挿入時のkeyに使用するフィールドを指定出来るようにすることは、今後の機能拡張対象です.

中身を見る時には、documentのIDを指定して、

$   curl -k -X GET 'https://{アカウント名}:{パスワード}@{アカウント名}.cloudant.com/hello/7f3c2976786c09222735ef2c8f630520'

とすれば、

{"_id":"7f3c2976786c09222735ef2c8f630520","_rev":"1-a4b14dac5db8e4f764aef016e42bc41b","message":"Hello Couch World!","etime":"2012-02-11T17:04:56Z"}

という風に、documentの中身のJSONが返ってきます.

WebUIのFutonで見ることもできます. (Cloudantの管理画面でも見れますが.)

https://cloudant.com/futon/database.html?{アカウント名}%2Fhello

f:id:ixixixi:20120212022545p:plain

documentのKeyをクリックすれば、documentの中身を見ることができます.

f:id:ixixixi:20120212022633p:plain

勿論、中身はJSONです.

(どちらの画面でも、Value/Souce領域をクリックするとそのままドキュメントの編集もできます.)

f:id:ixixixi:20120212022718p:plain 

今回のテーマは、お手軽にCloudantのCouchDBの環境を手に入れる&Fluentdからデータを流しこむ準備までなので、具体的な集計・解析の例まで紹介しませんでした.

その内、CouchDBを使ったリアルタイム集計の話などするかも知れません. 

 

Time to relax!