2012年10月

TwitterクライアントをPlayframework2+Scalaで作ってHerokuで動かした

Playframework2とScalaでちょっとしたアプリケーションを作ってみたく、Twitterクライアントを作成しました。Herokuで動かしています。
playframework2_logo Heroku | Logos

実物

Play2TwitterClient

ソースコード

githubにて公開しました。 tattyamm/Play2TwitterClient

Herokuへのデプロイ手順

Play2のアプリケーションをHerokuへデプロイする手順の詳細は以前ブログに書きましたので、そちらをご覧下さい。
Playframework2(Scala)をHerokuで動かす手順 - えんたつの記録
今回は手順の概要だけ書きます。

Herokuアプリケーションの作成。(play2clientは名前)
$ heroku create --stack cedar play2client
プロジェクトのルートディレクトリにProcfileという名前で以下のファイルを作成
web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS}
gitにcommitした状態で、Herokuにデプロイ。(herokuappはブランチ名)
$ git push heroku herokuapp:master
リアルタイムなログ確認
$ heroku logs --tail

その他技術情報

Twitter API関係
Playframework2とScalaでTwitter APIを操作する - えんたつの記録
他はPlay2のドキュメント読んでました。

感想

・とりあえず動いているが、直すべき所は多い。
・もっとライブラリ使って行く必要がありますね。util-evalやTwitter4Jなど。ここは次回以降か、もしアップグレードするならこのアプリにて。

第27回R勉強会 Tokyo.Rレポート

 行ってきました。初参加です。そもそも勉強会というものに初参加です。
 行ったからにはレポートを残そうと考えたので、勉強会中のメモをほぼそのまま公開します。なお以下の記述で「memo:」の後に書いてある事は、私向けのメモです。また、タイトルをほとんどメモってなかったのでそこはATNDのものや、適当なものをつけています。
 私自身は学生の時にRを使いその後も趣味的に利用していました。仕事でRは使っていないのですが、皆さんどういう感じでRを使っているのが気になり、勉強会に参加させて頂きました(仕事ではScala使ってます)。CodeIQの問題に興味を持ったのも、参加した大きな要因です。

リンク

第27回R勉強会@東京(#TokyoR) : ATND
第27回R勉強会@東京(#TokyoR)の座席表 - sekicoco [セキココ]
2012/10/20_第27回R勉強会@東京(#TokyoR) - Togetter
Twitter / 検索 - #tokyoR
Twitter / 検索 - #マサ斎藤
USTREAM: nifty_engineer: @nifty エンジニアサポートのチャンネルです. 会議

10分でわかるR言語入門

akiaki5516 (doradora09)さん
memo:カクテルの人

memo:基本的な使い方の部分はメモとってない。

サイト紹介
CRAN Task Views
 用途別におすすめのパッケージを表示してくれるサイト
seekR
 R言語用検索エンジン
RjpWiki
R-Chart
 Rの作図の参考、サンプル

初心者セッション

CodeIQxTokyoRコラボレーション企画
Minoda Takashi (aad34210)さん
CodeIQ中の人もいらしてた
Hiroko In Networks (millionsmile)さんはTwitterを使っています
Tokyo.RでCodeIQ問題ネタバレ解説やってきた!! - 裏CodeIQ~略してウラコ~

これの話
挑戦者求む!【R】Rではじめる統計解析 by Tokyo.R 出題者@aad34210│CodeIQ

対象はR初心者の人の問題。

memo:まだ解答受付期間内なので内容はここには書かない。いくつか知らない関数があった。

はじめてのRシリーズ
Tokyo r18
Tokyo r21 修正版
Tokyo r24 r_graph_tutorial

Rで学ぶ(逆変換法)

大仏の仮面を被ったテラモナギ (teramonagi)さん
Rで学ぶ逆変換(逆関数)法
数理物理、データ分析

乱数を撒くお仕事
乱数をどうやって作る?
 色々あるが、今回は逆変換法について話す。

[0,-1)の一様乱数
 メルセンヌツイスターならrunif()
この乱数を関数Fxで変換して、欲しい分布に従う乱数を得る。
変換により、正規分布、二項分布、指数分布などの乱数を得る。

流れ
[0,-1)の一様乱数uを取得
x=Fx^(-1)(u)  関数Fxの逆関数により変換
こうすると、xは関数Fxからの乱数になる


指数分布の乱数が欲しい
Fx(x) = 1 - e^(-λx)
この逆関数を求め、乱数uにかければ良い。
u = Fx(x)をxについて解く
x = - 1 / λ log(1-u) これを使う。
memo: こんな感じか。 hist( -1/3*log(1-runif(10000)) )

教科書
「確率分布乱数生成法」
「パターン認識と機械学習 下」
「Rによるモンテカルロ法入門」
「自然科学の統計学」


0-1の乱数を、あたり、はずれを50%ずつ出現するようにする。
[0,1]をある変換にすると、50%ずつになる。0-0.5があたり、0.5-1がはずれ。
と分けるようなものが、逆変換の部分にあたる。
0-1の数列をどこで分けるか?くじの出現確率の合計
数字を文字で書き、それをΣとかで抽象化すると、場合分けがシンプルに書ける。一般化できる。3択ではなくN択を考える。
Nの場合を書いたら、Nを無限にする。離散的だった確率P(x)を、確率密度p(x)dxに置き換えて考える。

ある問題を、Nで一般化し、そのNを無限大に飛ばすと、逆変換法になる。

金融だとデフォルトのシミュレーションするときに使うらしい(指数分布に従う乱数を使う)
逆関数が求められればこれが使えるので、逆関数が使える範囲内で計算することが多い。

ggplot2に入門してみた

Hidekazu Tanaka (holidayworking)さん

ggplot2というパッケージに入門した話。詳しい使い方説明はしない。

参考
ggplot2 の自分用メモ集を作ろう - Triad sou.
「パターン認識と機械学習 上」 PRML

例えば
通常のRのグラフも見やすくできる
gridつかって画面分割もできる

パッケージもある
ggdendro 樹形図を書ける、でもCRANから削除されてた、githubにはある。
ggmap 地図を扱える。google mapやOpenStreeetMapも。googleMapにポイント重ねたりできる。

サンプリング方法とそれに基いた分析(仮)

アヅニャン (dichika)さん

本日のテーマ
 抽出、推定、誤差評価 その1

統計数理研究所の公開講座行ってきた。その内容。
抽出 -> 推定 -> 誤差評価
それらの方法、Rのパッケージ。

問題設定
会場全員の小銭所有量を推定。
30人から5人をランダム抽出。
5人から金額が出たとする。これから全員を推定。
単純に考えれば人数で割って、全体人数でかける。
別の5人だとぶれる。(ぶれ具合:標準誤差)
母集団サイズxサンプルの標準偏差 / sqrt(サンプルサイズ) = 標準誤差
結論として、平均±標準誤差、が推定結果。
これが、抽出 -> 推定 -> 誤差評価、という流れ。

抽出法いろいろ
 無作為抽出。復元と非復元がある。
 補助変数を利用。事前に関係がある変数がわかっている場合(小銭をもっている人は、年齢によるのでは?)年齢のような連続変数を使い、連続変数に比例するように抽出する(確率比例抽出法)。カテゴリを使う場合(男女とか)の場合もある(層化抽出法)。

こういう抽出法に対応して、推定や誤差評価を変える。
なぜ?サンプルの要素1つが代表する重みが変わってくる。

Rではどうやる?
surveyパッケージ。オークランドの大学の人が作成した。
抽出法に対応した推定、誤差評価がまとめられたパッケージ。

まずsvydesignで、suvey,designオブジェクトをつくる。
層化した変数、抽出ウェイト、対象データ。
そこからsvytotalで推定すると、計算できる。

参考文献
「標本調査法入門」 コスパ
「概説標本調査法」 朝倉書店のサイトにサンプルコードあり
「社会調査演習」 実例あり。

質疑
ブートストラップで良いのでは?
あり。やってる人もいると思う。(memo:自分はブートストラップだった。母集団の事がよくわからなかったらコレになるのかなあ。)

僕の考える真の可愛い女性について(仮)

ソーシャルビッグデータサイエンティス (mikado_hito)さん
今日が誕生日
ソーシャルビッグデータサイエンティスト
情報分析する為のシステムを作っている。

最近R使っていないので、真にかわいい女性の話をします。
でも不謹慎かな...
マサ斎藤の話をします!

マサ斎藤 - Google 検索

日本人なら知っておきたいマサ斎藤
 3:VS アントニオ猪木 巌流島の戦い
 2:ヒロ斎藤は息子ではない
 1:カルピス大好き。カルピスを原液で飲んでいるのではないか?という都市伝説があった。

すみませんでした。

Rで巡回セールスマン問題 + ジオコーディング 〜それ、Rでできますよ!〜
TSP and Geocoding on R

十○茶とま○か☆マギカのキャンペーンを、ロー○ンでやっていた。
全てのおまけを集めたい。ロー○ンのみを回りたいがあちこち行くのはしんどい。

巡回セールスマン問題を解いてロー○ンを回る。

巡回セールスマン問題とは(TSP)
NP困難な問題で、組み合わせ爆発を起こしてもらい、現実的に解けなくなる。
ヒューリスティックを使って解く。

やること
1.ロー○ンの住所リストを集める
2.住所を位置情報に変換(ジオコーディング)
3.TSPを解いて経路を求める
4.地図上に経路を可視化する

1.住所取得
大量にあるので、Rcurlで扱う。

2.位置情報に変換
GoogleGeocordingAPIにより、Jsonで緯度経度を取得
JsonはRjsonで解析する。

RJson
Rcurl::curlEscapeでURLにする
json <- RCurl::getURL(URL)で取得できる。
これをパースする

3.TSPを解いて経路を求める
RにはTSPパッケージがある。
まず緯度経度のデータから、dist関数で距離行列を作る。ここからTSPオブジェクトを作り、巡回セールスマン問題を定義する。
Solve_TSP関数にアルゴリズムを指定して、TSPを解く。
結果のTOURクラスとして出てきて、そこから結果のよかったものが解。

マサのぶらり配送経路の旅(2-opt法の説明)
1.ランダムに経路を作成する
2.2辺をランダムに入れ替え、距離が改善すればそれを採用。これを繰り返す。

4.地図へ可視化
Google Static Map APIで経路を重ねる
RGoogleMapsというマッパーがある。(memo:MaxZoom関数便利そう。API直接叩くときにここ面倒。)

半年前ぐらいにブログに書いた
Rで巡回セールスマン問題 With TSP(+RGoogleMap) - Analyze IT.

おまけ
今回の無い湯だと、与えられた条件から問題解決したので対処療法的である。
問題を根本から解決するソリューションで顧客にバリューを提供したい!
解決策:ロー○ンに近く、ロー○ンが多いエリアに済めばよい。
Rで解く。

deldirとRGoogleMapで解いた。
ボロノイ図により分割して決める(memo:面積とか見ればよいかな)

まとめ
PythonやめてR使おう!

※この発表はフィクションです。

日銀のマクロ ストレステストをRで追う

TokyoR_日銀のマクロストレステストをRで追う
Dei (ActuaryDay)さん
アクチュアリー

アクチュアリーって?(生保、損保、年金のうち、以下は生保について)
保険数理
 死亡率などから保険料を決定
 資産側も考えたり
企業価値計算
 保険契約から色んなシナリオを立て将来利益のシミュレーション
 リスクの計量
リスク管理

今回の発表元ネタ
金融システムレポート。日本の金融システムの安定性を調査、評価している。
この中のマクロ ストレステスト。

ストレステストとは?
 何か凄いショックが起こっても金融システムは大丈夫か?を実際にやってみてテスト、シミュレーションする。EUとか、原発とか。
 日銀のやつでもいくつかのシナリオについてテストする。

モデル立てて、設定したリスクに対してマクロ経済へストレスがかかったとして、銀行の自己資本(Tier1)比率への影響を算出。
今回は
リスク -> 株価 (ここから左はマクロ経済指標を用いて分析)-> (こっから右は銀行ごとに分析)市場ベータ -> 株式評価損益

マクロ経済指標を用いて分析
VARモデル。Vector AutoRegressionモデル。
自分の過去の状態が現在を決める、とするモデル(memo:だと思う)
この中のどこかでショックが発生すると、過去から順番に影響が伝搬していく。
計算が面倒? -> Rパッケージのvarsで解決。
データは、RFinanceYJパッケージや、地味に取得してCSV作成。

銀行ごとに分析
市場ベータとは、ベンチマーク(TOPIXとか)に対する、ある銘柄の価格変動の指標(比率)。
さっきのVARモデルでベンチマークの変動が計算できているので、
銘柄価格x市場ベータxベンチマーク、で計算可能。
実際の作業としては、全銀行の保有銘柄を調べる為に会社が公開してる大株主の状況から逆算したり、全銀行の市場ベータを計算したりしたらしい。
今回は仮想銀行を考えて計算。各分野の代表的な株を持っているとする。
これらの計算から、ショック発生後にどのぐらいの株式評価損が出るかわかる。ではこれにどう対処するかがリスク管理。

まとめ
この量の分析を年2回出してる担当者の方乙です。

ここからLT 10min。ドラあり。

リンク

みたいなタイトル。
WADA Kazuya (wdkz)さん
サイバー系企業でデータマイニング

かぶったので飛ばすところは飛ばして。

企業がグローバル化してくると、為替も株価に影響するのでは?

企業の株価はYFinanceYJで取得
 企業コードを入れるとデータフレームで株価取得
ドル円レートは自作関数で取得
 htmlから取得
VARでモデル化

企業により、ドル円に引っ張られている会社と、そうでない会社がわかる。

単位根検定でランダムウォークでないことを確認した上で、VARにかける。

今日の各社の株価から、明日の特定企業の株価を調べるモデルができる。

Grangerの因果検定。MSBVAR::granger.test
どの変数がどの値に効いているかがわかる。

インパルス応答関数。
変数Xが変数Yの予測に効いているかどうか(±どっちに効いているか)

VARのモデリングをMCMCで行うこともできる。

RとC++と画像処理(1)

CAMMY (yuukicammy)さんはTwitterを使っています
研究職、画像処理

RとC++と画像処理 Rcppを利用。
画像から特徴量抽出 C++
解析 R
CとRをつなぐ Rcpp

RからC++を呼び出す
dll作成して、.Callで呼び出す

今回はここまで。乞うご期待。

これで終了。


お知らせ

1. R Advent Calendar 2012 : ATND
@kos59125から(本日お休み)
去年もやり、12月全部埋められた。今年もやります。

2. 年1回のイベントをやります
Rユーザー会
アカデミック寄りな会
(memo:名前見た事ある方もちらほら)
立川 数理統計研究所にて。

12月1日にJapan.Rやります。
2010年からやって、今年で3回目。
10時-18時、その後懇親会。午前中は初心者向け、午後LT。
募集中
 30minの発表
 LT大会の発表
 LTのドラを叩きたい人

Japan.Rの曲があるので流します
(去年流し忘れた)
Tokyo.Rの曲もあるので流します
作曲者:のびらP(詳細はニコニコ大百科

次回

詳細はMLにて。

ドラ:CAMMY (yuukicammy)さん

全体の感想

・勉強会に行ったのはじめてなので他の会を知らないのですが、様々な業界の人がいらっしゃっているのが面白いですね。年齢も職業もばらばらでした。
・金融データ面白い。
・パッケージほとんど使った事が無いので、今後こっちの勉強というか、どういうものがあるのか知って行く必要がありそう。

Playframework2(Scala)をHerokuで動かす手順

今回はPlayframework2とScalaで作ったアプリケーションをHerokuで動かします。Add onも試したかったので、memcachedもHerokuの無料の範囲で使用しました。

Herokuとは

Heroku | Logos
・PaaS
・Ruby、Clojure、Java(Enterprise)、Python、JavaScript(Node.js)、Scalaが動く。
・基本無料で、後から機能の追加や性能のアップが可能。
・デプロイにはgitを使う。
・AWSの上で動いている。(なのでAWS障害のときには停止した)
・Salesforce.comにより2011年に買収された。

今回の環境や条件

・Mac OS X 10.6.8
・Playframework2 + Scalaのアプリ
・アプリからmemcachedを利用する

まとめ

・手順は簡単
・Heroku向けの設定を書く必要があるが、量はあまり多く無い。
・ある程度無料で使える
・ただしAdd On追加にはクレジットカード登録が必須
・今回完成したものはこちらです。
HerokuGithubを参照してください。

Herokuを使う準備

 まずHerokuにユーザー登録を行う。Sign Upからメール認証をします。
 次にherokuコマンドを使えるようにする為、heroku toolbeltをインストールします。Heroku Toolbeltからダウンロードしたソフトをインストール($ gem install herokuでも良い。OSのバージョンアップ時には注意が必要)。

 公開鍵と秘密鍵の生成を行います。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): /Users/username/.ssh/heroku_rsa
Enter passphrase (empty for no passphrase): (パスワード)
Enter same passphrase again: (パスワード)
ここで~/.ssh/configの設定もしておいて、herokuに接続するときにこの鍵が使われるようにします。~/.ssh/configを編集。
Host heroku
User git
HostName heroku.com
IdentityFile    ~/.ssh/heroku_rsa
Port 22
TCPKeepAlive yes
IdentitiesOnly yes
秘密鍵の登録を行います。
$ ssh-add ~/.ssh/heroku_rsa
Enter passphrase for /Users/username/.ssh/heroku_rsa: 
Identity added: /Users/username/.ssh/heroku_rsa (/Users/username/.ssh/heroku_rsa)
これでHerokuに接続するための下準備は完了です。

 herokuがインストールできたか確認しつつセットアップを行います。herokuコマンドを最初に打ったときにはメールアドレスなどの入力が求められます。
$ heroku login
Enter your Heroku credentials.
Email: (アドレス)
Password (typing will be hidden): (パスワード)
Found the following SSH public keys:
1) github_rsa.pub
2) heroku_rsa.pub
3) id_rsa.pub
Which would you like to use with your Heroku account? 2 (さっきつくった鍵を指定)
Uploading SSH public key /Users/username/.ssh/heroku_rsa.pub... done
Authentication successful.
確認のためにherokuのアプリ一覧を見るコマンドを入れてみましょう。
$ heroku list
=== My Apps
stark-dawn-hogehoge
こんな感じに表示されれば完了です。

herokuの準備

herokuにアプリケーションをつくります。$ heroku createコマンドだけだと自動で名前が決定されるのですが、今回は名前を指定します。(ちなみに名前の変更は$ heroku rename 名前、というコマンドです)
$ heroku create --stack cedar checktrend
Creating checktrend... done, stack is cedar
http://checktrend.herokuapp.com/ | git@heroku.com:checktrend.git
Git remote heroku added
この時点でheroku側にwelcomeページが作成されている事を確認しましょう。

ここでAddOnを導入します。今回はMemcacheを使います。(ほんとはRedis To Goを導入したかったのですが、Play側の設定が上手く行かなかった)。無料の5MBプランを使用するので、以下のコマンドを実行。
$ heroku addons:add memcache:5mb
Adding memcache:5mb on checktrend... failed
 !    Please verify your account to install this add-on
 !    For more information, see http://devcenter.heroku.com/categories/billing
 !    Verify now at https://heroku.com/verify
失敗です。Verifyしないとだめなようです。調べてみると、無料でもAdd Onの使用にはクレジットカード登録が必要だそうです。なのでdashboardなどからクレカ登録を済ませてから再度コマンドを実行します。
$ heroku addons:add memcache:5mb
Adding memcache:5mb on checktrend... done, v2 (free)
Use `heroku addons:docs memcache:5mb` to view documentation.
追加できました。確認しましょう。
$ heroku addons
=== checktrend Configured Add-ons
memcache:5mb
追加されているのが確認できました。

Play2のアプリをHeroku向けに書き換える

 Play2のプロジェクトのルートディレクトリにProcfileという名前で以下の内容を作ります。
web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS}

 次にmemcached向けの設定を行います。memcachedをPlay2から使う方法はこのブログでも紹介したことがありますのでそちらを参照してください。このmumoshu/play2-memcachedを使います。
 memcachedの接続先のサーバー情報はapplication.confに記述します。ここにHerokuの環境変数を使っ設定を書くようです。playframeworkのドキュメントに書いてありました。「my.key = ${?MY_KEY_ENV}」という形式だそうです。しかしこのように書くのだと考えていたのですが上手く行きません。その時はこの内容をapplication.confに追記しました。
# memcached
# デフォルトのEhCachePluginを無効にします
ehcacheplugin=disabled
# memcachedの設定
#memcached.host="${?MEMCACHE_SERVERS}:11211"
#memcached.user=${?MEMCACHE_USERNAME}
#memcached.password=${?MEMCACHE_PASSWORD}
環境変数からの設定が上手くいかないので、接続先サーバーを直接指定します。まずこのコマンドで環境変数を確認します。
$ heroku config --app checktrend
=== checktrend Config Vars
JAVA_OPTS:                    -Xmx384m -Xss512k -XX:+UseCompressedOops
MEMCACHE_PASSWORD:            uwaaaaaaaa
MEMCACHE_SERVERS:             nantoka.host
MEMCACHE_USERNAME:            memcachedusername
PATH:                         .sbt_home/bin:/usr/local/bin:/usr/bin:/bin
REPO:                         /app/.sbt_home/.ivy2/cache
SBT_OPTS:                     -Xmx384m -Xss512k -XX:+UseCompressedOops
この中からmemcachedに関係しそうなものをメモしておきます。そしてこの値を直接application.confに書き込みます。
# memcached
# デフォルトのEhCachePluginを無効にします
ehcacheplugin=disabled
# memcachedの設定
memcached.host="nantoka.net:11211"
memcached.user="username"
memcached.password="password"


デプロイ

gitにアプリケーションを登録します。
$ git init
$ git add .
$ git commit -m "init"
これをherokuにpushすることでデプロイができます。
$ git push heroku master
なおこのコマンドはデフォルトではローカルのmasterブランチをデプロイします。ブランチを指定したい場合は、次のように書く必要があります。 herokuに任意のブランチをpushするにはこのようにしてください。これはherokuappというブランチをデプロイする場合の例です。
$ git push heroku herokuapp:master 
大量にログが表示され、最後の方で「http://checktrend.herokuapp.com deployed to Heroku」などと表示されていれば成功です。動いたか実際に見てみましょう。ブラウザからURLを開いても良いですし、以下のコマンドでもブラウザが開きます。
$ heroku open

これで動作確認をすれば全て完了です。私のアプリはこのように動いています。
Twitter Trends Available
ここでログも確認しましょう。課金していないので最新のものだけがこのように表示されていきます。
$ heroku logs
2012-10-08T09:44:26+00:00 heroku[router]: Blank App -> GET checktrend.herokuapp.com/ dyno= queue= wait= service= status=200 bytes=
2012-10-08T09:44:26+00:00 heroku[router]: Blank App -> GET checktrend.herokuapp.com/favicon.ico dyno= queue= wait= service= status=200 bytes=
2012-10-08T10:06:23+00:00 heroku[api]: Add redistogo:nano add-on by メアド
2012-10-08T10:06:23+00:00 heroku[api]: Release v2 created by メアド
(以下略)


必要に応じてやること

Herokuは1時間アクセスが無いとIdle状態に入り、その後アクセスしたときに30秒ほどページ表示までかかります。頻繁にアクセスしないページの場合、1時間おきにアクセスするよう、Herokuのschedulerをセットしておきましょう。
HerokuのDynoが寝ないようにする #heroku - Qiita

ログを見る

 リアルタイムにログを見たい場合はこうします
$ heroku logs --tail
現在はこのコマンドを使うのにadd-on入れる必要はありません。またこのコマンドは直近のある程度の量しか見る事ができません。それ以上使いたい場合はHerokuに課金する必要があるらしいです。

 ログを収集、解析見る為のAdd onもHerokuは提供しています。この2つが使われている例を見たので、とりあえず両方入れてどちらかを選べば良いのではないでしょうか。ここはあまり調査をしていません。
Loggly
$ heroku addons:add loggly:mole
Papertrail
$ heroku addons:add papertrail:choklad


その他コマンド

psコマンドも用意されています。
$ heroku ps
=== web: ``
web.1: created 2012/10/08 19:06:23 (~ 1h ago)

サーバー上でplayコマンドを実行することができます。
$ heroku run sbt play
(大量のログは略)
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0.2, http://www.playframework.org

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[TwitterProxy] $ 
この状態ではPlayのコマンドが使用できるので、例えばtestコマンドも実行できます。

herokuのアップデートはこのように行います。
$ heroku update


参考

Getting Started with Scala on Heroku | Heroku Dev Center 第3回 クラウドプラットフォーム「Heroku」の活用 | Think IT
HerokuでWebアプリ開発を始めるなら知っておきたいこと (1)無料のスペック - アインシュタインの電話番号☎
無料のPaaS、HerokuでPlay frameworkを使ったWebアプリケーションを動かす | クラスメソッド開発ブログ
play2.0 on herokuでmemcachedを使う #Memcached #heroku #Scala #Play - Qiita
第4回 Herokuのアドオンと外部サービスを活用しよう | Think IT
$HOME/.ssh/configを活用していますか? — ディノオープンラボラトリ
HerokuでSSH公開鍵(public key)を登録する方法(と削除して再登録する方法) | ID-Blogger
heroku用の鍵設定を~/.ssh/configとかに書いてログインできるようにする。 | かなりすごいブログ
play2.0 on herokuでmemcachedを使う #Memcached #heroku #Scala #Play - Qiita

補足情報:redisの場合(失敗したが途中までの記録)

play2側の設定がわからず途中で断念しました。その手前までの記録です。
$ heroku addons:add redistogo:nano
Adding redistogo:nano on checktrend... done, v2 (free)
Use `heroku addons:docs redistogo:nano` to view documentation.
追加できました。確認しましょう。
$ heroku addons
=== checktrend Configured Add-ons
redistogo:nano

 次はredisの設定です。ドキュメントを見ていきましょう。これによるとredisの接続先URLはREDISTOGO_URLという環境変数に格納されるようです。
 このプロジェクトで使っているredisについては過去にまとめました。使っているのはこのプラグインです。このドキュメントによると、redisの接続先はapplication.confにredis.hostを追記すればよさそうです。
 環境変数により設定ができるようなので、application.confに以下の行を追記すれば良いようです。なおこの環境変数が無かった場合これは無視されるので、ローカルでの場合とコードを書き換える必要はありません。
redis.host=${?REDISTOGO_URL}
 これで準備できたのでデプロイを行っても、どうしてもredisに接続できないという内容や、hostの指定が間違っているというエラーになります。例えばこういうのです。
Caused by: com.typesafe.config.ConfigException$Parse: application.conf: 49: Expecting end of input or a comma, got ':' (if you intended ':' to be part of the value for 'redis.host', try enclosing the value in double quotes, or you may be able to rename the file .properties rather than .conf)
検索した感じだとこのStack Overflowぐらいしか近そうなケースが見つからず、redis.hostには何を設定するのか、他に方法があるのかなど対処法がまだわかりません。

Playframework2(Scala)でmemcachedを使う

 Play2でmemcachedを使うにはどうすれば良いか調べたらStack Overflowに質問がありました。これによるとmumoshu/play2-memcachedが使えるらしいです。公式でも紹介されていますね。これを試してみました。
 今回作成したプロジェクトはこちらです。
tattyamm/Play2MemcachedSample

準備

まずmemcachedをbrewでインストール。
$ brew install memcached
You can enable memcached to automatically load on login with:
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/Cellar/memcached/1.4.13/homebrew.mxcl.memcached.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist

If this is an upgrade and you already have the homebrew.mxcl.memcached.plist loaded:
    launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist
    cp /usr/local/Cellar/memcached/1.4.13/homebrew.mxcl.memcached.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist

Or start it manually:
    /usr/local/bin/memcached

Add "-d" to start it as a daemon.
memcachedを起動します。
/usr/local/bin/memcached

今回の為のプロジェクトをplayアプリをScalaで作成し、InteliJで読み込めるようにします。
$ play new Play2MemcachedSample
$ cd Play2MemcachedSample
$ play idea


Play2からmemcachedを使う準備

Build.scalaにいくつか追加します。
import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

  val appName = "Play2MemcachedSample"
  val appVersion = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
    "com.github.mumoshu" %% "play2-memcached" % "0.2.1-SNAPSHOT"
  )

  val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
    // Add your own project settings here
    resolvers += "Sonatype OSS Snapshots Repository" at "http://oss.sonatype.org/content/groups/public",
    resolvers += "Spy Repository" at "http://files.couchbase.com/maven2" // required to resolve `spymemcached`, the plugin's dependency.
  )

}
conf/に新しくplay.pluginsというファイルを新規作成し、以下の内容を書きます。
5000:com.github.mumoshu.play2.memcached.MemcachedPlugin
application.confに以下の内容を追記します。
# デフォルトのEhCachePluginを無効にします
ehcacheplugin=disabled
# memcachedのアドレスとポートを指定します
memcached.host="127.0.0.1:11211"

Play2からmemcachedを使う

準備ができたら、通常のCache APIとほぼ同じように扱う事ができます。Application.scalaに以下のように書いて試してみました。
package controllers

import play.api._
import cache.Cache
import play.api.mvc._
import play.api.Play.current

object Application extends Controller {

  def index = Action {

    // set
    try {
      Cache.set("item.key", "item.value")
    } catch {
      case _ => println("Cacheをsetするとこでエラーのはずだが、memcachedを起動していなくてもここに来ない")
    }

    // setにキャッシュの有効期限を秒で指定できる。
    try {
      Cache.set("item.key2", "item.value2", 30)
    } catch {
      case _ => println("Cacheをsetするとこでエラーのはずだが、memcachedを起動していなくてもここに来ない")
    }

    // get 方法1
    //   方法1と2のどちらのように値を決めても良い。
    val valueFromCache1: Option[String] = Cache.getAs[String]("item.key")
    println(valueFromCache1.getOrElse("item.keyがなかった"))

    // get 方法2
    val valueFromCache2: String = Cache.getOrElse[String]("item.key") {
      "item.keyがなかった"
    }
    println(valueFromCache2)

    // get キーが存在しない場合の挙動
    val valueFromCache3: String = Cache.getOrElse[String]("hogehogeohoge") {
      "item.keyがなかった(正常)"
    }
    println(valueFromCache3)

    Ok(views.html.index("Your new application is ready."))
  }

}
コンソールを確認すると、上手く扱えている事がわかります。

キーの削除はCache APIの方法ではなく次のように行います。
play.api.Play.current.plugin[MemcachedPlugin].get.api.remove("keyToRemove")
なお、memcachedの中身を確認するときは$ telnet localhost 11211で接続し、キーを指定するならget keynameで値を取り出すことができます。

 使ってみた上での注意点は、memcachedが起動していなくてもCache.setなどで例外が発生しないことです。例外が出ず気づきにくいので注意したいところ。
 これでmemcachedがPlay2のCache APIとして使えるようになりました。redis同様に自然に使う事ができて非常に便利なプラグインですね。

サンプルプロジェクト

githubに置きました。一応テストも書いています。
tattyamm/Play2MemcachedSample

参考

mumoshu/play2-memcached
Mac OS X LionでMemcachedをインストール | ましましブログ
playframework 2.0 - play framework 2.0 support memcached? - Stack Overflow
Scalacache ・ playframework-ja/Play20 Wiki
memcache_logo

ScalaとPlayframework2で作成したアプリケーションのJenkinsでの管理

 Scalaで書いたPlayframework2のアプリケーションをJenkinsで管理する為に行った事をまとめました。今回はGithubを使いソースコード管理するケースを想定しています。Github上でソースコードが更新されたかを監視し、自動でテスト(sbt test)を行います。Jenkinsの勉強として行った事の記録です。間違いがあればご指摘お願いします。
 なお、Jenkinsのインストール方法はこちらにまとめました。
さくらVPS(CentOS6.3)へJenkinsをインストールして認証つけてURLを変更する - えんたつの記録
jenkins_logo

プラグインのインストール

 Jenkinsのプラグイン管理画面から、「sbt plugin」と「Git Plugin」と「Github Plugin」にチェックを入れ、「ダウンロードして再起動後にインストール」をクリック。
 「プラグインのインストール/アップグレード」の画面になるので、「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックを入れて放置します。
 再起動が完了したら、プラグイン管理画面から、目的のプラグインがインストール済みの状態になっているかを確認しましょう。

設定

 システムの設計の中に、今回インストールしたプラグインに対応する設定を行います。
 「sbt」の「sbt launch jars」で、「Name」と「Path」を設定します。Nameは適当に、Pathにはsbt-launch.jarの場所を示します。今回は /usr/lib/sbt/0.11.3/sbt-launch.jar にあるので、そこを指定。Nameは0.11.3とでもしておきます。

ジョブの作成

・トップページの「新規ジョブ作成」をクリック。
・ジョブ名を入れ、「フリースタイル・プロジェクトのビルド」にして次へ。
・リポジトリURLを設定します。Gitプラグインを入れたので、「ソースコード管理システム」の中に「Git」という選択肢があります。ここの「Repository URL」にgit cloneなどで使うURLを入力。
・ビルドの設定を行います。「ビルド」から「ビルド手順の追加」の中の「Build using sbt」を選択。このように編集します。
JVM Flags
-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss16M

sbt Flags
-Dsbt.log.noformat=true   (デフォルトのまま)

Actions
compile test publish-local
・いつビルドするかを設定します。「ビルド・トリガ」の「SCMをポーリング」にチェックを入れ、適切な時間を設定します。「* * * * *」とすると1分毎になり、「15 * * * *」なら15分毎になります。ほんとはWebhookにしたかったのですが上手く行かなかったので、今回は1分前に設定しました。
・テスト結果のレポートを出力するために、「ビルド後の処理」の「JUnitテスト結果の集計」の「テスト結果XML」を「target/test-reports/*.xml」にする。

 これで定期的にJenkinsがGithubを見に行き、更新があったらtestを行い、結果を記録してくれます。

メモ

・Play1系には対応したプラグインが存在しますが、Play2系にはまだ対応したプラグインはまだありません。

これとは別の方法によるもの(github hook)

Github Hooks for Jenkins Continuous Integration
・Jenkins側でシステム設定を開き、「GitHub Web Hook」の「Override Hook URL」にチェックを入れるとWebhookするためのURLがわかる。
・github側ではWebHook URLsに先程のWebhookするためのURLを入れる。
・そうすると、github側でプロジェクトが更新されるとJenkinsが自動的に動作するようになります。
今回はこの方法では通りませんでした。原因調査中。Digest認証だろうか。

参考

Configuring Jenkins plugin for SBT | Cake Solutions Team Blog
JenkinsでPlay Frameworkのプロジェクトを扱う - ひとりWEB開発日記
第二回Jenkins勉強会でLTしてきました - 複雑系スパゲティソース(はてな版)
Testing Rails apps with Jenkins - komagata

Playframework2とScalaでTwitter APIを操作する

Playframework2からOauthログインしてTwitter APIを操作するサンプルアプリです。githubにてソースコードは公開しています。
tattyamm/Play2TwitterSample

手順

1.Oauthログインの為に、Twitterのページへリダイレクトさせる
2.Twitter側で認証してもらったらアプリケーションにリダイレクトされ戻ってくる
3.ここでAccess TokenとAccess Token Secretを取得する
4.これを使ってTwitter APIにアクセスする

準備

playアプリをScalaで作成し、InteliJで読み込めるようにします。
$ play new Play2TwitterSample
$ cd Play2TwitterSample
$ play idea
また、Twitter DevelopersからTwitterアプリを登録し、Cunsumer KeyとConsumer Secretを取得し、必要なら書き込み権限を与えておきましょう。この時、Callback URLはhttp://localhost:9000/authとは設定できないようなので、http://192.168.0.1:9000/authのように自分のローカルなIPを記述しておきます。

Oauthログイン

Oauthログイン方法はこちらに記載されています。また、ここで使われているセッションについてのURLも参考にして下さい。
ScalaOAuth ・ playframework-ja/Play20 Wiki
ScalaSessionFlash ・ playframework-ja/Play20 Wiki
このコードではこのような事が行われています。
0.サイト上でTwitterログインボタンが押されたら、http://localhost:9000/authに飛ばす処理があったと想定。
1.http://localhost:9000/authにアクセスがあると、authenticateメソッドが呼ばれる(routes側の設定)。
2.Twitterからの認証済みのリダイレクトだった場合は、その内容からAccess TokenとAccess Token Secretを取得し、セッションに入れておく。
3.Twitterからの認証済みのリダイレクトでない場合は、Twitterにリダイレクトを行ってユーザーにログインしてもらう。

こちらのコードのほぼコピーですが、これに補足する形でサンプルアプリケーション全体を作成してみました。githubにて公開しています。
tattyamm/Play2TwitterSample

Twitter APIを操作

通常のHTTPリクエストはこのように行いPromiseを取得します。
WS.url("http://mysite.com").get()
今回はOauthで認証された状態でアクセスしたいので、signメソッドにOAuthCalculatorを渡して使用します。consumerKey,consumerSecret,accessToken,accessTokenSecretはあらかじめ取得した状態でこのようにリクエストしPromiseを取得します。
val oauthCalculator = OAuthCalculator(ConsumerKey(consumerKey, consumerSecret), RequestToken(accessToken, accessTokenSecret))
val resultPromise = WS.url(url).sign(oauthCalculator).get()
ここから取得した値を取り出す場合はこのようになります。
val oauthCalculator = OAuthCalculator(ConsumerKey(consumerKey, consumerSecret), RequestToken(accessToken, accessTokenSecret))
val resultPromise = WS.url(url).sign(oauthCalculator).get()
val resultBody = resultPromise.await.get.body
一般的に非同期通信が基本になると思います。そのようにする場合はこうなります。
Async {
  WS.url(url).sign(oauthCalculator).get().map { response =>
    Ok(views.html.index(response.body))
  }
}
こんな感じで値を取り出し、あとはjsonを解釈すれば完成です。全体像はgithubを見て下さい。なお今回はOauthログインする事がテーマだった為、jsonのパースは行っていません。

補足、コメント

・play.api.libs.ws.WSを使います。私がやった時にplay.libs.WSと混同してしまい時間がかかりました。

参考

OAuthプロトコルの中身をざっくり解説してみるよ - ( ꒪⌓꒪) ゆるよろ日記
ScalaWS ・ playframework-ja/Play20 Wiki
ScalaOAuth ・ playframework-ja/Play20 Wiki
ScalaSessionFlash ・ playframework-ja/Play20 Wiki

Playframework2でHTTPリクエストを行う

インターネット上にあるjsonやxmlやhrmlなどのコンテンツを取得する時にどのように書けば良いかのメモです。非同期、同期、Oauthについてまとめます。play.api.libs.ws.WSをimportしてから使って下さい。

非同期

Async {
  WS.url(url).get().map { response =>
    Ok(views.html.index(response.body))
  }
}

同期

val resultBody = WS.url(url).get().await.get.body

Oauth付き非同期

signメソッドの有無だけが違います。
val oauthCalculator = OAuthCalculator(ConsumerKey(consumerKey, consumerSecret), RequestToken(accessToken, accessTokenSecret))
Async {
  WS.url(url).sign(oauthCalculator).get().map { response =>
    Ok(views.html.index(response.body))
  }
}

Oauth付き同期

val oauthCalculator = OAuthCalculator(ConsumerKey(consumerKey, consumerSecret), RequestToken(accessToken, accessTokenSecret))
val resultPromise = WS.url(url).sign(oauthCalculator).get()
val resultBody = resultPromise.await.get.body

参考

ScalaWS · playframework-ja/Play20 Wiki
ScalaAsync · playframework-ja/Play20 Wiki

Playframework2からredisを操作する(Play2へのプラグインインストール方法)

redis_log
 Playframeworkにはredisを扱う方法がプラグインとして提供されています。今回はPlayframework2のCache APIとしてredisを利用できるようにするプラグインを導入する方法を通して、Playframework2へのプラグイン導入方法をまとめます。

 CentOSへのredisインストール方法はこちらにまとめました。なおMacの場合はHomebrewが入っているなら$ brew install redisでインストールできます。
さくらVPS(CentOS6.3)へのredisインストールとchkconfigへの登録 - えんたつの記録
 Play2にはモジュールという形で機能を追加することができ、今回は以下のプラグインを使用します。
play-plugins/redis at master · typesafehub/play-plugins

 また、今回作成したサンプルアプリはgithubにて公開しています。
tattyamm/Play2RedisSample

手順

1.playアプリの作成
2.プラグインの導入
3.sbtでプラグインを読み込ませる
4.redisプラグインの使い方

playアプリの作成

適当な名前でScalaのPlayアプリケーションを作成します。play newコマンドにてScalaの新規プロジェクトを作成しましょう。
$ play new Play2RedisSample
とりあえずInteliJで読み込むために、sbtでideaコマンドを実行します。
$ cd Play2RedisSample
$ play idea


プラグインの導入

InteliJでプロジェクトを開き、以下のファイルを編集します。

・project/Build.scala
appDependenciesに以下を追加します。
"com.typesafe" %% "play-plugins-redis" % "2.0.2"
こうなります。
import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "Play2RedisSample"
    val appVersion      = "1.0-SNAPSHOT"

    val appDependencies = Seq(
      // Add your project dependencies here,
      "com.typesafe" %% "play-plugins-redis" % "2.0.2"
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here      
    )

}

・conf/play.plugins
confディレクトリにplay.pluginsという名前で新しいファイルを作成し、優先度とプラグインクラスを記述します。
550:com.typesafe.plugin.RedisPlugin


そしてプラグインを読み込ませ、InteliJにも読み込ませます。
$ play
$(playのプロンプトで) reload
$(playのプロンプトで) update
$(playのプロンプトで) idea

実行できるか確認しておきましょう。この段階ではエラーが出なければ良いでしょう。
$(playのプロンプトで) idea

(最初試行錯誤していた時はsedisも必要なのかと思ってBuild.scalaのappDependenciesに"org.sedis" %% "sedis" % "1.0.1"を書き、mainにresolvers += "Sedis repository" at "http://guice-maven.googlecode.com/svn/trunk"を追加し、sedisの為にjedisが必要かと思いBuild.scalaのappDependenciesに"Redis.clients" % "jedis" % "2.0.0"を追加した。結局不要だった。)

redisプラグインの使い方

play2のCache APIの仕組みが使えます。redisへのsetとgetを試してみましょう。app/controllers/Application.scalaを編集します。(よく理解していないのですが、play.api.Play.currentが必要です。)
package controllers

import play.api.mvc.{Controller, Action}
import play.api.Play.current
import play.api.cache.Cache

object Application extends Controller {

  def index = Action {

    // set
    try {
      val valueSet = Cache.set("item.key", "item.value")
    } catch {
      case _ => println("Cache.setでエラー")
    }

    // get 方法1
    //   方法1と2のどちらのように値を決めても良い。
    //   ただしkeyが無い場合playには警告が出る。([warn] application - could not deserialize key:item.key ex:java.lang.NullPointerException)
    val valueFromCache1: Option[String] = Cache.getAs[String]("item.key")
    println(valueFromCache1.getOrElse("item.keyがなかった"))

    // get 方法2
    val valueFromCache2: String = Cache.getOrElse[String]("item.key") {
      "item.keyがなかった"
    }
    println(valueFromCache2)


    Ok(views.html.index("Your new application is ready."))
  }

}
コンソールに適当な結果が表示されれば問題ありません。redis-cliコマンドからから「keys *」でredisに値が入っているか確認しておきましょう。これでPlayframework2にredisプラグインを導入することで、Cache API経由でredisを操作することができました。

補足

・confに設定として記述できるのは以下の値です。
redis.host デフォルト:localhost
redis.port デフォルト:6379
redis.timeout デフォルト:2000
redis.password デフォルト:null
・redisの他の機能を使う必要があればJedisやSedisを直接使う必要がありそうです。
・なおPlayframeworkのCache APIはデフォルトでEHCacheが使用されます。
・今回作成したサンプルはgithubで公開しています。
tattyamm/Play2RedisSample

コメント

簡単な内容となりましたが、右も左もわからぬうちはこういう情報が欲しく、適切な調べ方もわからず苦労しました。

参考

・プラグイン導入に関するドキュメント
始める sbt - プラグインの使用
・このプラグインのgithubリポジトリと基本的なドキュメント
play-plugins/redis at master · typesafehub/play-plugins · GitHub
・プラグインの導入方法
Play framework 2.0 での自作プラグイン - Scala版 - なんとなくな Developer のメモ
・playのキャッシュについて
Scalacache · playframework-ja/Play20 Wiki
・モジュールの使い方
言葉をポッケに持ち歩こう: PlayframeworkのPDFモジュール
・サンプル
play-plugins/redis/sample/project/Build.scala at master · typesafehub/play-plugins · GitHub
・sedisも入れる必要があるみたいな事が書いてあるらしいが、今回サンプルをつくった時には要求されなかった
[2.0] Redis Plugin - Google グループ
・memcachedの場合
Play! framework 概要 Tipsもあるよ! - ikeike443のブログ
・MySQLの場合
lambda me : Play2からMySQLにつなぎたい - Playframework2
このサイトは
 Webアプリケーション開発のことや、iPhone・Android向けアプリ開発の話題がメインです。技術情報を取り扱っています。
 管理:えんたつ。twitter: @tattyamm
mimage
カテゴリ別アーカイブ
RSS
リンク
プログラミング本
アプリを作る時などに読んだ本
iPhoneプログラミングUIKit詳解リファレンス iPhoneプログラミングUIKit詳解リファレンス Android Layout Cookbook アプリの価値を高める開発テクニック パーフェクトPHP (PERFECT SERIES 3) JavaプログラミングBlack Book 2nd Edition (Black Bookシリーズ)
表記
当サイトではGoogle Analyticsを使用しております。詳細はこちらを御覧ください