Scalaに引き続きLiftのテスト
・Mavenが入っていると簡単
mvn archetype:generate -U -DarchetypeGroupId=net.liftweb -DarchetypeArtifactId=lift-archetype-basic -DarchetypeVersion=1.0 -DremoteRepositories=http://Scala-tools.org/repo-releases -DgroupId=demo.helloworld -DartifactId=helloworld -Dversion=1.0
で雛形からなにやらダウンロードしてくれる
・helloworld というフォルダがプロジェクトになっているので、ここへ移動して jetty で起動する
cd helloworld
mvn jetty:run
で、 http://localhost:8080 へアクセスすると、Liftの初期画面が表示される
はじめからユーザ管理とかついているので、sign upでアカウントを作るとユーザ画面が表示される!
速度はなかなかいい感じ
初期はH2Databaseでファイルに保存されてます。
LiftにはMVCでいうControllerの部分が明示的に存在しない
ではどうするのかというと、Viewをメインに考えてSnippetをいうものを使う
Snippetはパーツみたいな感じで、Viewにタグでぺたぺた貼り付けるという感じ、、、であってるかな |-`)
サンプルプロジェクトでは、HelloWorldというSnippetが入っている
src/webapp/index.html内の
<p><lift:helloWorld.howdy /></p>
という部分でスニペットを読んでいる
スニペットの中身は
def howdy = <span>Welcome to helloworld at {new _root_.java.util.Date}</span>
という事なので、画面上には
Welcome to helloworld at Sat Dec 26 16:43:00 JST 2009
と表示されているわけだ!スゲー!
・せっかくなんでスニペットを作ってみる
def sample = <span>日本語テスト 1+1={1+1}</span>
index.htmlへタグを追加
<p><lift:helloWorld.sample /></p>
表示されました!
日本語テスト 1+1=2
ですが、残念な事にSnippetのHotDeployに対応していません・・・
と思ったらやっぱりみんな同じことを考えているようです。
JavaRevelってのとmvn scala:ccを使って実現しています。
・Liftにあるpom.xml(Jettyの設定ファイル)にある scanIntervalSeconds を 0 にする。
・MAVEN_OPTS=“-noverify -javaagent:/path/javarebel.jar” を設定する
・mvn jetty:run して、別のコンソールから同じフォルダで mvn scala:cc する
で、自動的にscalaファイルがコンパイルされて、JavaRebelがリロードしてくれます。
でもやっぱりフレームワークで吸収してほしいなぁ
そこらへんはGrailsの方が便利ですね
カスタム検索
2009年12月26日土曜日
Scalaはじめました
勉強会でScalaの紹介があったので、聞きながら試してみた
・Scalaのダウンロード
http://www.scala-lang.org/downloads からMac版をダウンロード
適当な場所に解凍して bin/scala を実行
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
・とりあえずハワロ!
scala> println("Hello World!")
Hello World!
・このままじゃ面白くないので、ファイルにして実行
hello.scala
println("Hello World!")
[yossy@yossy-MacBook]# scala hello.scala
Hello World!
・順調なので、クラスを作ってみる
object HelloWorld {
def main(args: Array[String]) {
if(args.length > 0) {
println("Hello "+args(0)+"!")
} else {
println("usage: HelloWorld {yourname}")
}
}
}
scalac hello.scala
でクラスファイルが出来る(コンパイル遅い気がする)
・クラスファイルを実行
[yossy@yossy-MacBook]# scala -cp . HelloWorld
usage: HelloWorld {yourname}
[yossy@yossy-MacBook]# scala -cp . HelloWorld yossy
Hello yossy!
classファイルだけど、scalaのライブラリが必要なのでそのままjavaで使えるわけではない。この辺はgroovyと同じです。
MVCフレームワークのLiftってのがあるので今度はそれを試してみようかなぁ
・Scalaのダウンロード
http://www.scala-lang.org/downloads からMac版をダウンロード
適当な場所に解凍して bin/scala を実行
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
・とりあえずハワロ!
scala> println("Hello World!")
Hello World!
・このままじゃ面白くないので、ファイルにして実行
hello.scala
println("Hello World!")
[yossy@yossy-MacBook]# scala hello.scala
Hello World!
・順調なので、クラスを作ってみる
object HelloWorld {
def main(args: Array[String]) {
if(args.length > 0) {
println("Hello "+args(0)+"!")
} else {
println("usage: HelloWorld {yourname}")
}
}
}
scalac hello.scala
でクラスファイルが出来る(コンパイル遅い気がする)
・クラスファイルを実行
[yossy@yossy-MacBook]# scala -cp . HelloWorld
usage: HelloWorld {yourname}
[yossy@yossy-MacBook]# scala -cp . HelloWorld yossy
Hello yossy!
classファイルだけど、scalaのライブラリが必要なのでそのままjavaで使えるわけではない。この辺はgroovyと同じです。
MVCフレームワークのLiftってのがあるので今度はそれを試してみようかなぁ
2009年12月14日月曜日
前回の続き
・データとURI
データには一意のURIが割り当てわれます。
http://127.0.0.1/${dbName}/${id}
このURIにたいしてRESTする事でDBの操作を行う事が出来ます。
・データの作成
curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"name":"bar"}'
{"ok":true,"id":"a89c8812a6f9e83f7b8e1848287de338","rev":"1-62bc3c4d01e43ee9d0cead8cd7c76041"}
UUIDを指定してデータを入れるのですが、UUIDを作成する手段がない場合は、Couchから取得する事も出来ます。
curl -X GET http://127.0.0.1:5984/_uuids
{"uuids":["a89c8812a6f9e83f7b8e1848287de338"]}
・リビジョン
CouchDBでは、データが更新されると自動的に履歴が残ります。
_revというフィールドに設定される頭の数字がリビジョン番号になります。
先程のデータを更新してみます。
curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"name":"bar2nd"}'
{"error":"conflict","reason":"Document update conflict."}
おっと、エラーです。
更新する際は、対象のリビジョンを指定する必要があります。
curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"_rev":"1-62bc3c4d01e43ee9d0cead8cd7c76041","name":"bar2nd"}'
{"ok":true,"id":"a89c8812a6f9e83f7b8e1848287de338","rev":"2-e3faaaf677273de632db3e628147558e"}
revが2になりました。
Futonから確認するとわかりますが、すべてのリビジョンでの情報を保持しています。
古いリビジョン情報は、CompactDBや、Replicationしたタイミングで消去されるようです。
(残す方法はないのかな・・・)
長くなりそうなので一旦ここまで・・・
・データとURI
データには一意のURIが割り当てわれます。
http://127.0.0.1/${dbName}/${id}
このURIにたいしてRESTする事でDBの操作を行う事が出来ます。
・データの作成
curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"name":"bar"}'
{"ok":true,"id":"a89c8812a6f9e83f7b8e1848287de338","rev":"1-62bc3c4d01e43ee9d0cead8cd7c76041"}
UUIDを指定してデータを入れるのですが、UUIDを作成する手段がない場合は、Couchから取得する事も出来ます。
curl -X GET http://127.0.0.1:5984/_uuids
{"uuids":["a89c8812a6f9e83f7b8e1848287de338"]}
・リビジョン
CouchDBでは、データが更新されると自動的に履歴が残ります。
_revというフィールドに設定される頭の数字がリビジョン番号になります。
先程のデータを更新してみます。
curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"name":"bar2nd"}'
{"error":"conflict","reason":"Document update conflict."}
おっと、エラーです。
更新する際は、対象のリビジョンを指定する必要があります。
curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"_rev":"1-62bc3c4d01e43ee9d0cead8cd7c76041","name":"bar2nd"}'
{"ok":true,"id":"a89c8812a6f9e83f7b8e1848287de338","rev":"2-e3faaaf677273de632db3e628147558e"}
revが2になりました。
Futonから確認するとわかりますが、すべてのリビジョンでの情報を保持しています。
古いリビジョン情報は、CompactDBや、Replicationしたタイミングで消去されるようです。
(残す方法はないのかな・・・)
長くなりそうなので一旦ここまで・・・
MapReduce系DB CouchDBを試してみた その1
いわゆるNoSQLデータベースというやつ、プチGoogleみたいでおもしろそう。
オフィシャルを参考に
・インストール
Macなら、MacPortsで一発簡単
sudo port install couchdb
Windowsは非公式なバイナリパッケージがあるみたい
・自動起動設定
sudo launchctl load -w /opt/local/Library/LaunchDaemons/org.apache.couchdb.plist
・動作確認
curl http://127.0.0.1:5984
{"couchdb":"Welcome","version":"0.10.0"}
バージョン情報もJSON返し :)
・すべてのDBを表示する
curl -X GET http://127.0.0.1:5984/_all_dbs
(curl -X はメソッド(GET,POST,PUT,DELETE)指定)
[] 何も作ってないので空の配列がかえってくる
・DBの作成
curl -X PUT http://127.0.0.1:5984/baseball
{"ok":true}
確認
curl -X GET http://127.0.0.1:5984/_all_dbs
["baseball"]
・もっかいやってみる
curl -X PUT http://127.0.0.1:5984/baseball
{"error":"file_exists","reason":"The database could not be created, the file already exists."}
もうあるから作れんよ、と
・DBの削除
curl -X DELETE http://127.0.0.1:5984/baseball
{"ok":true}
確認
curl -X GET http://127.0.0.1:5984/_all_dbs
[]
・管理画面
実はインストールした時点で管理ツール(Futon)も一緒に入っている
http://127.0.0.1:5984/_utils/
で管理画面が表示されたらOK
Futonへのアクセスはlocalhostではなく、127.0.0.1を使う方が良いらしい
FutonからDBを作ったり、データを登録したりも可能
とりあえずここまで、次回はMapReduceでデータの取得とか
GrailsもCouchDBPluginがあるのでこれもテストしたい
オフィシャルを参考に
・インストール
Macなら、MacPortsで一発簡単
sudo port install couchdb
Windowsは非公式なバイナリパッケージがあるみたい
・自動起動設定
sudo launchctl load -w /opt/local/Library/LaunchDaemons/org.apache.couchdb.plist
・動作確認
curl http://127.0.0.1:5984
{"couchdb":"Welcome","version":"0.10.0"}
バージョン情報もJSON返し :)
・すべてのDBを表示する
curl -X GET http://127.0.0.1:5984/_all_dbs
(curl -X はメソッド(GET,POST,PUT,DELETE)指定)
[] 何も作ってないので空の配列がかえってくる
・DBの作成
curl -X PUT http://127.0.0.1:5984/baseball
{"ok":true}
確認
curl -X GET http://127.0.0.1:5984/_all_dbs
["baseball"]
・もっかいやってみる
curl -X PUT http://127.0.0.1:5984/baseball
{"error":"file_exists","reason":"The database could not be created, the file already exists."}
もうあるから作れんよ、と
・DBの削除
curl -X DELETE http://127.0.0.1:5984/baseball
{"ok":true}
確認
curl -X GET http://127.0.0.1:5984/_all_dbs
[]
・管理画面
実はインストールした時点で管理ツール(Futon)も一緒に入っている
http://127.0.0.1:5984/_utils/
で管理画面が表示されたらOK
Futonへのアクセスはlocalhostではなく、127.0.0.1を使う方が良いらしい
FutonからDBを作ったり、データを登録したりも可能
とりあえずここまで、次回はMapReduceでデータの取得とか
GrailsもCouchDBPluginがあるのでこれもテストしたい
登録:
投稿 (Atom)