ラベル Play の投稿を表示しています。 すべての投稿を表示
ラベル Play の投稿を表示しています。 すべての投稿を表示

2013年5月9日木曜日

Windows環境のIDEでVM(CentOS)上のPlay!をデバッグ実行する

Windows上からステップ実行とかしたいよね!
macはこの点全部ネイティブで、意識せずに開発できるからいいよね!!
VM上でX入れてIntelliJ IDEA入れて動かそうと思ったけど、やっぱりメモリやCPU無駄遣いだし重いよね!レスポンスの悪さは開発効率の悪さ!服装の乱れは心の乱れ!!








はい








なんて言うか、妙なノリだったけどまあいいや。
やった事って言っても簡単な事しかしてないんだけど。
IDEAでやろうと思ったんだけど、まず簡単そうなEclipseでやってみたよ!


Windows上で必要なモノ


  • Scalaのインストール
  • Eclipseのインストール
  • Eclipse Scala plugin(SDK)のインストール
  • 準備が整ったVM



VM上で必要なモノ


  • Scalaのインストール
  • Playのインストール
  • VMで共有フォルダの設定
  • iptablesに9999の開放を追加

手順

VM上でやる

  1. cd /{VMの共有フォルダ}/
  2. play new hogehoge してplayアプリを作る
  3. cd hogehoge
  4. play
  5. eclipse with-source=true
  6. 終わったらCTRL+Dで一旦閉じておく
  7. cp -r {playのインストールフォルダ}/play-2.X.X/ ~/{VMの共有フォルダ}/    <- li="">
  8. sudo vi /etc/sysconfig/iptables
  9. -A INPUT -m state --state NEW -m tcp -p tcp --dport 9999 -j ACCEPT
  10. ↑を追加し保存。
  11. sudo /etc/init.d/iptables restart
  12. play debug run

Windows上でやる

  1. http://scala-ide.org/ でSDKダウンロード
  2. 解凍して、Eclipseのフォルダに大体ぶちこむ。Eclipse.exeとかはいらない。フォルダだけでいい
  3. Eclipse起動
  4. Importで共有フォルダのhogehogeを読み込む
  5. ルートのhogehogeのフォルダアイコンの右上にScalaプロジェクトを示すちっちゃい「S」マークが出てればいい。或いはapp/controllers/Application.scalaのページアイコンの中にS
  6. この時点ではまだエラーが100以上出ている。VMの方でsbtが用意してくれたライブラリのディレクトリがVM上の物になっているから。これを手動で書き換える。
  7. プロジェクトのフォルダの.classpathを適当にエディタで開き、大量の
    path="/{playのインストールフォルダ}/repositoryなんちゃら~/" を
    path="C:/{共有フォルダ}/play-2.X.X/repositoryなんちゃら~/" に置き換える。
  8. 保存して、Eclipseのプロジェクトをリフレッシュ。多分これで全部消える。
  9. app/controllers/Application.scalaのdef indexのトコにブレークポイント。
  10. プロジェクトhogehoge右クリックなり上のメニューの実行>デバッグ構成(Debug Configurationだっけ?)
  11. Remote Java Applicationのトコで新規追加、ホストはVMのアドレス、ポートは9999
  12. デバッグを実行してみる
  13. 繋がったら、ブラウザとかでhttp://VMのアドレス:9000/を開く
  14. ブレークポイントで止まれば勝つる

要は、ライブラリを共有フォルダにコピっただけ。(ドヤ顔するほどのことでもない)

なので、そもそもライブラリ群をVMでインストールする際に、共有フォルダに保存するようにしてWindows上でもそこを読みに行けば良い。


で、playのIDE用ファイル吐き出しの際には常にVMの中でのディレクトリ構成に基いて作ってしまうので、ラップしたバッチファイルとかで毎度生成する毎に置き換えとかを自動化しちゃえばWindows上でわざわざ毎回書き換えなくていいので、そこまで終わってやっと完成かな…


上の手順だけだと、うっかりplay eclipseとかplay ideaとかやっただけで破損するし、依存ファイルが増える度にどのみち再生成したりするのでだるい。


結論


Windows上のIDEでコーディング、実行はVMや他のLinuxサーバー、ってな時は依存ライブラリ&Playは共有フォルダに実体を置く。VMの共有フォルダじゃなければシンボリックリンクでもいけるかな?

2013年4月17日水曜日

PlayとMongoとRedis連携試してみる


Play


Play frameworkのインストールと設定…2.1を公式からDLして適当に入れて行けるかと思ったけどなんかちょっとややこしそうなのでググってみた。

おっとけよ CentOSにPlay frameworkインストール

を参考にすすめてみる。
無事動いたブラウザから見えた。


VMWareの共有フォルダ機能を有効にしておく
@IT総合トップ > Linux & OSS > Linux Tips Index > VMwareのフォルダ共有機能を使うには
を参考にした。

VMWareの管理>仮想マシン設定>オプション>共有フォルダ
とりあえずshareってフォルダを作成

ln -s /mnt/hgfs/share share
でシンボリックリンク貼っておく

mongoDB


まずはplay関係なくScalaから使える状態に。

cd share
mkdir mongoTest
cd mongoTest

ITの波間にゆーらゆら mongodb+casbah+scala
グニャラくんのwktk運営日記 Scala + finagle + MongoDB + Herokuで2chクローンを作る(連載第2回)
mongoDB公式 1.Getting Started を参考に。


vi build.sbt

name := "mongo test"

version := "1.0.0"

scalaVersion := "2.10.0"

organization := ""

libraryDependencies += "org.mongodb" %% "casbah" % "2.5.0"


保存して
sbt




[success]

って出たのでおk


mkdir -p src/main/scala/mongo.casbah/

vi src/main/scala/mongo.casbah/Sample.scala


package mongo.casbah

object Sample extends App {
  println("Ahhhhhhh")
}


でsbt run


Ahhhhhhh

と出たのでこれもおkっぽい


早速Mongoに繋ぐ準備をしてみる


vi src/main/scala/mongo.casbah/Sample.scala

package mongo.casbah
import com.mongodb.casbah.Imports._
object Sample extends App {
        val mongoClient = MongoClient()
        val mongoDB = mongoClient("casbah_test")
        val mongoColl = mongoClient("casbah_test")("test_data")
        val newObj = MongoDBObject("foo" -> "bar", "x" -> "y", "pie" -> 3.14, "spam" -> "eggs")
        val builder = MongoDBObject.newBuilder
        builder += "L2P" -> "NOOB"
        builder += "kek" -> "bur"
        println(builder.result)
        println(newObj.get("foo"))
}


sbt run

[info] Set current project to mongo casbah test (in build file:/mnt/hgfs/share/sbt-mongo/)
[info] Running mongo.casbah.Sample
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
{ "L2P" : "NOOB" , "kek" : "bur"}
bar
[success] Total time: 4 s, completed 2013/04/17 16:56:52

とりあえずセットとゲットはできてるので良しとする。
Playとの連携はまた後ほど調べる。

Redis

Ruby Diary redisインストール(CentOS 6.2) 
を参考にしつつバージョンだけ変えて実行
wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar xzvf redis-2.6.12.tar.gz
cd redis-2.6.12.tar.gz
make
sudo make install

問題なく終了

redis-server

で起動し、

redis-cli
redis 127.0.0.1:6379>set 1 aaa
OK
redis 127.0.0.1:6379>get 1
"aaa"

動いてるのでおk

developer's diary redis 2.2.12のインストールメモ(amazon Linux)
をまるっと真似してinit.dで起動時実行設定しておく

Play-Plugin-Redis

https://github.com/typesafehub/play-plugins/tree/master/redis

README.md参照にしつつ

play new sampleApp
cd sampleApp
vi project/Build.scala

val appDependenciesのトコに

"com.typesafe" %% "play-plugins-redis" % "2.0.4"

追加して保存

vi conf/play.plugins

550:com.typesafe.plugin.RedisPlugin

と書いて保存

vi conf/application.conf

ehcacheplugin=disabled

と追加して保存

play update

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.typesafe#play-plugins-redis_2.10;2.0.4: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

と出るので、repoをチェック

http://repo.typesafe.com/typesafe/releases/com/typesafe/

一覧を見ると

play-plugins-redis_2.10/

があるのでそこを開いて見てみる

2.1-09092012-2/           13-Jan-2013 01:10    -
2.1-1-RC2/                16-Jan-2013 01:10    -
2.1-RC2/                  13-Jan-2013 01:10    -


RCは避けたいので2.1-09092012-2と言う怪しげな名前のにしてみる
vi project/Build.scala
"com.typesafe" %% "play-plugins-redis" % "2.1-09092012-2"

に修正。

play update

[error] (*:update) sbt.ResolveException: unresolved dependency: org.sedis#sedis_2.10.0;1.1.0: not found

今度はsedisが見つからんとな
ググって見るとこんな記事が見つかった。

Using Redis PubSub with Play 2.1.0

ここに書かれてる通りにresolverを追加してみる。


vi project/Build.scala
import sbt._
import Keys._
import play.Project._
object ApplicationBuild extends Build {
  val appName         = "sampleApp"
  val appVersion      = "1.0-SNAPSHOT"
  val appDependencies = Seq(
    "com.typesafe" %% "play-plugins-redis" % "2.1-09092012-2"
  )
  val main = play.Project(appName, appVersion, appDependencies).settings(
        resolvers += "org.sedis" at "http://pk11-scratch.googlecode.com/svn/trunk"
  )
}


こんな感じに。リトライ。

play update




[info] Done updating.
[success] Total time: 19 s, completed 2013/04/17 16:24:45

成功した模様。とりあえずここまで。