|
|
|
|
Play framework の1.1がリリースされました。また各モジュールの安定性も増し、いよいよ全体的に実用レベルになってきた感があるので、RoR経験者の視点から現時点でのplayの状況および利用方法をまとめます。
追加するplayモジュール
|
% wget http://download.playframework.org/releases/play-1.1.zip % unzip play-1.1.zip |
展開すると play-1.1/ ができるので、そこにパスを通す。(play-1.1/playが実行するplayコマンドになる)
% play install scala % play install scalate |
どちらもconfirmされるので、yで。インストール内容は、先程のplayインストールディレクトリ下のmodules/に展開されるだけなので、手動でDL&展開してもよい。(firewallでproxyが必要な環境下の場合など)
% play new foo --with scala,scalate |
でfooというアプリケーション(ディレクトリ名もfoo)が作成される。と同時にwithで指定したモジュールが有効になり、conf/application.confに設定が追加される。具体的には、
module.scalate=${play.path}/modules/scalate-0.7.2
...
scalate=ssp |
といった内容になり、この設定を熟知していれば、withを使わずに作成して、configをいじっても同じ状態にできる。しかし、withの場合は設定ファイルの追加に加えて初期ファイルの配置も行ってくれるので、やっぱりwithでやるのがよい。具体的な初期ファイルは、scalateの場合であればapp/views/default.ssp(layout.rhtmlに相当)等が配置される。以下、その辺の詳細設定を行う。
Scalateライブラリ(1.3.1)では以下の4種類の形式をサポートしているが、
scalateのファイル形式
|
% vi conf/application.conf scalate=scaml |
% vi app/controllers.scala
object Application extends ScalateController {
def index = render()
} |
デフォルトのレイアウトファイル(default.ssp)はssp用なので、scaml用のレイアウトを新規作成する。
% vi app/views/default.scaml
-@ var body: String
-@ var title: String = "タイトル"
%html
%head
%title= title
%body
!= body |
あとは、indexアクション用のビューファイルを作成すればOK。
% vi app/views/Application/index.scaml Hello Scaml |
% play run |
runで9000ポートで起動する。
% w3m http://localhost:9000/ Hello Scaml |
% vi conf/application.conf http.port=3000 |
% play run --%prod |
プロダクションモードで起動すると毎回ソースファイルを見ないのでレスポンスが速くなる。また、prodは予約語ではなくコンフィグファイルの中で利用されている(モードの)識別子に過ぎないので、自由に変更できる。デフォルトのモードの識別子はdevであり、例えばdevでファイルのリロードを行わないようにするには、以下のように設定する。
% vi conf/application.conf %dev.application.mode=prod |
「%(モード名).」を付けると、各変数に対してそのモード特有の値を設定できる。また、ここのprodはプロダクションモードを意味する値(予約語)なのが若干紛らわしい。
次回は play scala + scaml の詳しい使い方です。
scala> import org.neo4j.graphdb.{Node,DynamicRelationshipType}
scala> val love = DynamicRelationshipType.withName("Love") |
rm -rf /tmp/neo1 |
import org.neo4j.kernel.EmbeddedGraphDatabase
import org.neo4j.graphdb.{Node,DynamicRelationshipType}
val db = new EmbeddedGraphDatabase("/tmp/neo1")
val tx = db.beginTx
// 舞波
val maiha = db.createNode
maiha.setProperty("name", "舞波")
// 岡井ちゃん
val okai = db.createNode
okai.setProperty("name","岡井")
// Love
val love = DynamicRelationshipType.withName("Love")
maiha.createRelationshipTo(okai, love)
tx.success
tx.finish
db.shutdown |
Love [舞波] ---> [岡井] |
| 現在のDB内のグラフ(想像) |
import org.neo4j.kernel.EmbeddedGraphDatabase
import scala.collection.JavaConversions._
val db = new EmbeddedGraphDatabase("/tmp/neo1")
val n1 = db.getNodeById(1) |
scala> n1.getRelationships foreach(println) Relationship[0] |
scala> val r = n1.getRelationships head r: org.neo4j.graphdb.Relationship = Relationship[0] scala> r. asInstanceOf compareTo delete getEndNode getGraphDatabase getId getNodes getOtherNode getProperty getPropertyKeys getPropertyValues getStartNode getType hasProperty isInstanceOf isType removeProperty setProperty toString |
scala> r.getType res8: org.neo4j.graphdb.RelationshipType = Love |
scala> r.getEndNode
res9: org.neo4j.graphdb.Node = Node[2]
scala> r.getEndNode.getProperty("name")
res10: java.lang.Object = 岡井 |
import org.neo4j.kernel.EmbeddedGraphDatabase
import scala.collection.JavaConversions._
def inspectNeo(path:String) {
val db = new EmbeddedGraphDatabase(path)
for (n1 <- db.getAllNodes) {
for (r <- n1.getRelationships) {
val n2 = r.getEndNode
if (n1 != n2) printf("[%s] --(%s)--> [%s]\n",
n1.getProperty("name"), r.getType, n2.getProperty("name"))
}
}
} |
scala> inspectNeo("/tmp/neo1")
[舞波] --(Love)--> [岡井] |
http://github.com/jawher/neo4j-scala
rm -rf /tmp/neo1 |
import org.neo4j.kernel.EmbeddedGraphDatabase
import org.neo4j.scala.Neo4jWrapper
object world extends Neo4jWrapper {
implicit val neo = new EmbeddedGraphDatabase("/tmp/neo1")
execInNeo4j { neo =>
val chisa = neo.createNode; chisa("name") = "岡井"
val mai = neo.createNode; mai("name") = "萩原"
val airi = neo.createNode; airi("name") = "鈴木"
val momo = neo.createNode; momo("name") = "嗣永"
chisa --> "疎遠" --> airi <-- "危機感" <-- momo
airi --> "疎遠" --> chisa
chisa --> "親密" --> mai
}
neo.shutdown
}
world |
scala> inspectNeo("/tmp/neo1")
[岡井] --(親密)--> [萩原]
[岡井] --(疎遠)--> [鈴木]
[鈴木] --(疎遠)--> [岡井]
[嗣永] --(危機感)--> [鈴木] |
グラフデータベースのneo4j をドキュメントをろくに読まずに、REPL 上から淡々と試行錯誤して覚える
import org.neo4j.kernel.EmbeddedGraphDatabase
val db = new EmbeddedGraphDatabase("/tmp/neo1") |
scala> db. asInstanceOf beginTx createNode enableRemoteShell getAllNodes getConfig getManagementBean getNodeById getReferenceNode getRelationshipById getRelationshipTypes getStoreDir index isInstanceOf isReadOnly registerKernelEventHandler registerTransactionEventHandler shutdown toString unregisterKernelEventHandler unregisterTransactionEventHandler |
scala> db.createNode org.neo4j.graphdb.NotInTransactionException |
scala> db.beginTx res1: org.neo4j.graphdb.Transaction = org.neo4j.kernel.TopLevelTransaction@329a0466 scala> db.createNode res2: org.neo4j.graphdb.Node = Node[2] |
scala> import org.neo4j.kernel.EmbeddedGraphDatabase
scala> val db = new EmbeddedGraphDatabase("/tmp/neo1")
org.neo4j.graphdb.TransactionFailureException: Could not create data source [nioneodb],
see nested exception for cause of error |
scala> db.getNodeById() |
scala> db.getNodeById(1)
org.neo4j.graphdb.NotFoundException: Node[1]
at org.neo4j.kernel.impl.core.NodeManager.getNodeById(NodeManager.java:388) |
scala> db.getNodeById(2) org.neo4j.graphdb.NotFoundException: Node[2] |
scala> db.getAllNodes res9: java.lang.Iterable[org.neo4j.graphdb.Node] = org.neo4j.kernel.EmbeddedGraphDbImpl$2@24174be7 |
scala> val nodes = db.getAllNodes scala> nodes. asInstanceOf isInstanceOf iterator toString |
scala> nodes foreach println |
scala> import scala.collection.JavaConversions._ scala> nodes foreach println Node[0] |
scala> val node = nodes head node: org.neo4j.graphdb.Node = Node[0] scala> node. asInstanceOf compareTo createRelationshipTo delete getGraphDatabase getId getProperty getPropertyKeys getPropertyValues getRelationships getSingleRelationship hasProperty hasRelationship isInstanceOf removeProperty setProperty toString traverse |
scala> node.getId res5: Long = 0 |
scala> node.getProperty |
scala> node.getProperty("name")
org.neo4j.graphdb.NotFoundException: name property not found for NodeImpl#0. |
scala> node.getPropertyKeys res8: java.lang.Iterable[java.lang.String] = [] |
scala> node.setProperty("name", "maiha")
org.neo4j.graphdb.NotInTransactionException
at org.neo4j.kernel.impl.core.LockReleaser.getAndSetupPrimitiveEleme |
scala> db.beginTx
scala> node.setProperty("name", "maiha") |
scala> node.getPropertyKeys
res12: java.lang.Iterable[java.lang.String] = [name]
scala> node.getProperty("name")
res13: java.lang.Object = maiha |
import org.neo4j.kernel.EmbeddedGraphDatabase
val db = new EmbeddedGraphDatabase("/tmp/neo1")
val node = db.getNodeById(0)
println(node.getProperty("name")) |
org.neo4j.graphdb.NotFoundException: name property not found for NodeImpl#0. |
scala> node.getPropertyKeys res1: java.lang.Iterable[java.lang.String] = [] |
scala> val tx = db.beginTx tx: org.neo4j.graphdb.Transaction = org.neo4j.kernel.TopLevelTransaction@106f29c8 scala> tx. asInstanceOf failure finish isInstanceOf success toString |
| メソッド | 役割 |
|---|---|
| success | commit |
| failure | abort |
| finish | close |
import org.neo4j.kernel.EmbeddedGraphDatabase
val db = new EmbeddedGraphDatabase("/tmp/neo1")
val tx = db.beginTx
val n1 = db.createNode
n1.setProperty("name", "maiha")
tx.success
tx.finish
db.shutdown |
import org.neo4j.kernel.EmbeddedGraphDatabase
import scala.collection.JavaConversions._
val db = new EmbeddedGraphDatabase("/tmp/neo1")
db.getAllNodes foreach println |
Node[0] Node[1] |
scala> db.getNodeById(1).getProperty("name")
res8: java.lang.Object = maiha |
[(root node?)] [name:maiha] |
| 現在のDB内のグラフ(想像) |
(以下、淡々と勉強中)
Scalaネット界でまことしやかに囁かれている噂がある。
「Akkaフレームワークの Actor はScalaの生Actorより高機能かつ高速」
そんな話を聞いてじっとしていれるほど、俺達大人じゃないんだ。
スケーラビリティがあり、障害耐性(fault-tolerant)を持つような並列型アプリケーションを簡単に書くことを目的としているのが、Akka Projectです。Akkaは、非同期(イベントドリブン)でシンプルで軽量な独自のアクタープロセス機構をベースにしており、障害管理やSTMおよびトランザクション、リモートアクターといった高レベルな機能も提供します。それ以外にも、永続的ストレージ、RESTインタフェース、Cometといったモジュールも具備しており、並列プログラミングを強力に支援するオールインワンフレームワークとなっています。
(オープンソフトウェア: Apache 2 License)
便利なjarです
se.scalablesolutions.akka.actorパッケージで定義され...
ですよねー。この件に関して作者は、「ver 1.0では短い名前にするかも(約束はできないけど)」と言っています。(現在はver 0.10)
pingにpongを返すアクターです。
import se.scalablesolutions.akka.actor.Actor
class Foo extends Actor {
def receive = {
case "ping" => println("pong")
}
} |
はい。"act { loop { react" なんて飾りです。偉い人にはそれがわからんのですよ。で、アクターの作成方法は...
scala> new Foo
se.scalablesolutions.akka.actor.ActorInitializationException
[maiha_1287811363519]
ActorRef for instance of actor [Foo] is not in scope.
You can not create an instance of an actor explicitly using 'new MyActor'.
You have to use one of the factory methods in the 'Actor' object to create a new actor.
Either use:
'val actor = Actor.actorOf[MyActor]', or
'val actor = Actor.actorOf(new MyActor(..))', or
'val actor = Actor.actor { case msg => .. } }'
null
at se.scalablesolutions.akka.actor.Actor$class.$init$(Actor.scala:337)
... |
Akka Actorは直接newすることはできません。上記のいずれかの方法で、作成して下さい。
Akkaではアクターを直接操作せずに、そのアクターをwrapしたActorRefオブジェクトを経由して操作を行います。したがって、actorOfで作成されたものは、ActorではなくActorRefとなります。
scala> val foo = Actor.actorOf[Foo] foo: se.scalablesolutions.akka.actor.ActorRef = Actor[Foo:1287771048941] |
ローカルアクターとリモートアクターの差異を吸収しています。これにより、ユーザはローカルとリモートの意識をすることなく、ActorRefにメッセージを投げるだけで、分散可能なアクタープログラミングを実現できます。
scala> val foo = Actor.actorOf[Foo]
scala> foo ! "ping"
se.scalablesolutions.akka.actor.ActorInitializationException
[maiha_1287813604216]
Actor has not been started, you need to invoke 'actor.start' before using it
null
at se.scalablesolutions.akka.actor.ScalaActorRef$class.$bang(ActorRef.scala:1566) |
Akka Actor では、起動していないActorにはメッセージを送ることができません。先にstartさせる必要があります。
不明 情報求む
import se.scalablesolutions.akka.actor.Actor
class Foo extends Actor {
def receive = {
case "ping" => println("pong")
}
} |
scala> val foo = Actor.actorOf[Foo] scala> foo.start scala> foo ! "ping" pong |
scala> val foo = Actor.actorOf[Foo] scala> foo.start scala> foo ! "ping" pong scala> foo ! "ping" pong |
Akkaでは、メールボックスのメッセージ処理はアクター自身でなくDispatcherと呼ばれるオブジェクトが担当します。Dispatcherは内部にループを持っており、その中からActor#receiveの処理が呼び出されています。
Dispatcher機構では、処理の主体はDispatcherオブジェクトです。従って、Actorのreceiveは処理内容が定義されたただのエントリ(handler)に過ぎず、処理のループに関する情報は含まれません。
ループ処理の方法は、利用するDispatcherの種類で切り替えます。デフォルトでは ExecutorBasedEventDrivenDispatcher が利用され、このDispatcherはブロックしません。
ReactorBasedSingleThreadEventDrivenDispatcher などがあります。
利用されるDispatcherの優先順位は
となります。Scala Actorのreceiveに近いブロック型を実現するには、例えば以下のようにします。
scala> val foo = Actor.actorOf[Foo] scala> foo.dispatcher = Dispatchers.globalReactorBasedSingleThreadEventDrivenDispatcher scala> foo.start scala> foo ! "ping" pong |
以下、淡々と勉強中。
2010年10月14,15日に行われた第23期竜王戦七番勝負<第1局>。
広く深い読みと驚異の終盤力を武器にしながらも、竜王戦ではさらなる異様な強さを発揮し君臨し続ける渡辺竜王。それに挑戦するのは、史上最強の棋士である事に恐らく誰も異論を唱えないであろう、羽生名人。竜王vs名人という名に恥じない、棋界2強によるガチの頂上決戦である。
1日目の渡辺優勢で始まったこの歴史的一局は、2日目の羽生の粘りと大局観によって押し戻され、午後を迎えて一手ごとに優勢評価が変化するまさに名局となった。が、その衝撃的なラストによって、将棋ファンの間ではさらに伝説の一局へと昇華することとなる。
後手の羽生玉は、周囲にオーラのような空間を残しつつも、絶体絶命の状況。しかし、後手はここまで力を溜めに溜め、大駒3枚と桂馬で先手玉を一気に打ち取る形を取っている。手番は羽生。今まさに手負いの羽生による最後の猛攻がはじまろうとしていた。そして90手目。羽生は誰も予想しない5五香を打つ。

一見、素人目にも簡単に歩で止められそうな香打ち。この時の驚きは、棋譜中継でも伝えられている。
羽生の△5五香から△5六同香に、控室は「どういう意味があるんだ?」と大混乱。 |
その懸念通り、羽生の香は渡辺の歩打ちによってただで取られてしまう。直後に羽生が投了。
この局面で羽生が投了を告げた。突然の出来事に、控室も大混乱。 |
「なぜ投了!?まだイーブンだろ!?」「小ヨセといっても極端に細かい!僕にはサッパリだ!」
2日間の熱戦。クライマックスに突入した瞬間のあっけない投了に、見るもの全てが驚愕し、思考停止した。ある意味、名局の品位を落としかねない香打ちからの突然の投了。
佐藤康光九段 > 何か錯覚があったのでしょうか? (10/15-18:05:04) 烏@長崎 > 突然の投了に、現地も大混乱です。 (10/15-18:04:49) 佐藤康光九段 > えーっ?投了ですか? (10/15-18:03:34) |
トッププロですら理解できないこの奇行の謎を解いたのは94氏だった。
94 :名無し名人 :sage :2010/10/15(金) 17:59:01 ID:x3CQVOGB 盤上にハートマークきたーーーーーーーーー |
| 第23期竜王戦 Part41 http://toki.2ch.net/test/read.cgi/bgame/1287131722/94 |

2010年。棋界の現人神たる羽生の戦いはもう別次元に突入している
| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |
| 前 | 2013年 6月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | ||||||