Shinyを使って、RだけでWebアプリケーション
Shinyを使うと、Rだけで分析Webアプリケーションが作れる.
サーバ側の処理も、ブラウザの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/を確認すると(自動で開く)、
という風に、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のサイトに行きます
右上のSign Upから,新規登録画面へ.
プランの選択があります.
どのプランも30日のFree Trialができますが、クレジットカード情報の入力すら不要である無料のOxgenプランを選んでおきましょう.
250MBの容量と、月50万回のrequestが無料で使えます.
Sign Upしましょう.
UsernameはホストされるCouchDBのドメイン名になります.
アカウント情報を入力しましょう.
規約を読んだらSign Upで登録完了.
そのまま自動的にログイン後の画面に移ります.
これでもうCouchDBが使えるようになりました.
ここまで2分も掛からなかったのでは無いでしょうか.
画面の上の方に、「databaseが何も無いのでまず1つ最初に作ってね」と表示されています.
試しに"hello"というdatabaseを作ってみましょう.
database名を入れてcreateするだけです.
これでhelloというdatabaseが出来ました.
databaseのURL(databaseに対してRESTでリクエストを投げる先)は、
https://{登録アカウント名}.cloudant.com/hello
です.
また、Cloudantの管理画面以外にも、CouchDBビルトインのGUI(Futon)も見ることが出来ます.
https://{登録アカウント名}.cloudant.com/_utils
がそのURLです.
「CloudantのCouchDB」ではなく素の「Apache CouchDB」を扱うのでしたら、こちらの画面を見ることが多いかも知れません.
作ったdatabaseに対して操作をするにはどうすれば良いでしょうか.
これも同じく管理画面からもできますが、CouchDBはRESTfullなので、curlで全ての操作が出来ます.
実は、親切なことに画面の下の方にサンプルが書いています.
基本的に、登録したアカウント名とパスワードのBASIC認証でcurlすれば 良いということですね.
(※Database毎に、アカウント名/パスワード代わりに使えるAPI Keyというものを発行してPermission設定をすることも出来ます.)
ここまで来たら,もう普通のCouchDBとして好きに扱えるので,
下記入門記事や
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
documentのKeyをクリックすれば、documentの中身を見ることができます.
勿論、中身はJSONです.
(どちらの画面でも、Value/Souce領域をクリックするとそのままドキュメントの編集もできます.)
今回のテーマは、お手軽にCloudantのCouchDBの環境を手に入れる&Fluentdからデータを流しこむ準備までなので、具体的な集計・解析の例まで紹介しませんでした.
その内、CouchDBを使ったリアルタイム集計の話などするかも知れません.
Time to relax!