日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

Frameworkで遊ぶ

最近いろんなフレームワークに触ってみようと思っていろんなものに触っています。
具体例としてコードを書いています。
phpくらいしか触らなかったせいでplayフレームワークで色々困ったので
言語が変わった時俺はどんなところで困るのか試してみようと思いました←
のわりにphpが多いです

対象は

の予定です。
こんなフレームワークあるよってコメントがあったりすると喜んで試しに行くので教えてください(^ω^ ) 三 ( ^ω^)←
ちなみに、レポジトリはこちら
tarata/VariousFrameworkTry · GitHub

play frameworkで java.lang.NoClassDefFoundError: scala/StringContext

Scala Play Frameworkでエラーが発生した

ちょいちょいハマったからメモ

sbt 0.13.0以上でplay実行したら実行できなかった件

java.lang.NoClassDefFoundError: scala/StringContext
	at sbt.CommandStrings$.<init>(CommandStrings.scala:62)
	at sbt.CommandStrings$.<clinit>(CommandStrings.scala)
	at sbt.BuiltinCommands$.initialize(Main.scala:195)
	at sbt.xMain.run(Main.scala:27)
	at xsbt.boot.Launch$.run(Launch.scala:55)
	at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
	at xsbt.boot.Launch$.launch(Launch.scala:69)
	at xsbt.boot.Launch$.apply(Launch.scala:16)
	at xsbt.boot.Boot$.runImpl(Boot.scala:31)
	at xsbt.boot.Boot$.main(Boot.scala:20)
	at xsbt.boot.Boot.main(Boot.scala)
Caused by: java.lang.ClassNotFoundException: scala.StringContext
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
	... 11 more
Error during sbt execution: java.lang.NoClassDefFoundError: scala/StringContext

色々調べたけど
scala 2.9にはscala/StringContextがない??
なので、scala 2.10にしました。
→以前 Error during sbt execution: java.lang.NoClassDefFoundError: scala/StringContext
(´・ω・`)

scalaのversionが変わらない・・・?
→ /path/to/PLAY_HOME/framework/sbt/play.boot.properties

[scala]
version: 2.9.2

[app]
org: play
name: console
version: 2.1.5
class: play.console.Console
cross-versioned: true

[repositories]
local
maven-local
typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
maven-central

[boot]
directory: ${play.home}/sbt/boot

[ivy]
ivy-home: ${play.home}/../repository

scalaのversionが2.9.2 ??
とりあえず、PATHとかの問題なんかわからないので、とりあえず、sbt 0.12.4で我慢することに

PlayProjectがダメな件

sbt 0.12.4にしてplay 2.1.5にしたらWarningでました(´・ω・`)w

WARNING

Looks like you are using a deprecated version of Play's SBT Project (PlayProject in project/Build.scala).
We are adding all of the new Play artifacts to your libraryDependencies for now but consider switching to the new API (i.e. play.Project).

For any migration related issues, please consult the migration manual at http://www.playframework.org

なんかPlayProjectなくなったんですね。

import sbt._
import Keys._
import PlayProject._ //→ import play.Project._

object ApplicationBuild extends Build {

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

    val appDependencies = Seq(
      // Add your project dependencies here,
    )

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

すると、appVersionの引数の場所は fileクラスだ!とか怒られました。
・・・が、なぜか再現しなくなりました(๑´╹‸╹`๑)
怒った原因がわからないので、参考にしたページをとりあえず、置いておいて終わろうと思います(´・ω・`)w

SBTSubProjects

playframeworkでheaderの操作 - Access-Control-Allow-Origin

playframeworkで作成したWEBページに他のドメインのサイトからajaxでデータを取得しようとした時いつも通り「Access-Control-Allow-Origin」に引っかかった。

結論から言えばResponse headerを

Access-Control-Allow-Origin: *

とすれば基本的にクロスドメインなhttpアクセスを許可するってことになる(はず。たぶん←)
んで、play frameworkってどうやってResponse Header設定するんだっけってなった。

超簡単だったw
参考
こちらでjustと言われているようにw


playframeworkのcontrollerでresponseを返すときに、

object Hoge extends Controller {
    def fuga      = Action { 
        Ok(views.html.hoge())
        .withHeaders("Access-Control-Allow-Origin" -> " *") // ←←←
    }
}

とすればいいだけw
これで

Access-Control-Allow-Origin : *

が設定される。

play frameworkを他の環境で使ったら動かなかった。 play frameworkのversionが異なる編

sbtのversionを直したのに(´・ω・`)
playが上手く行かなかった・・・(´・ω・`)

[info] Loading project definition from /path/to/project
[warn] 	module not found: play#sbt-plugin;2.0.4
[warn] ==== typesafe-ivy-releases: tried
[warn]   http://repo.typesafe.com/typesafe/ivy-releases/play/sbt-plugin/scala_2.9.2/sbt_0.12/2.0.4/ivys/ivy.xml
[warn] ==== sbt-plugin-releases: tried
[warn]   http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/play/sbt-plugin/scala_2.9.2/sbt_0.12/2.0.4/ivys/ivy.xml
[warn] ==== local: tried
[warn]   /usr/local/Cellar/play/2.1.3/libexec/repository/local/play/sbt-plugin/scala_2.9.2/sbt_0.12/2.0.4/ivys/ivy.xml
[warn] ==== Typesafe repository: tried
[warn]   http://repo.typesafe.com/typesafe/releases/play/sbt-plugin_2.9.2_0.12/2.0.4/sbt-plugin-2.0.4.pom
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/play/sbt-plugin_2.9.2_0.12/2.0.4/sbt-plugin-2.0.4.pom
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	::          UNRESOLVED DEPENDENCIES         ::
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	:: play#sbt-plugin;2.0.4: not found
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn] 	Note: Some unresolved dependencies have extra attributes.  Check that these dependencies exist with the requested attributes.
[warn] 		play:sbt-plugin:2.0.4 (sbtVersion=0.12, scalaVersion=2.9.2)
[warn]
sbt.ResolveException: unresolved dependency: play#sbt-plugin;2.0.4: not found
	at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:214)
	at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:122)
	at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:121)
	at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:117)
	at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:117)
	at sbt.IvySbt$$anonfun$withIvy$1.apply(Ivy.scala:105)
	at sbt.IvySbt.liftedTree1$1(Ivy.scala:52)
	at sbt.IvySbt.action$1(Ivy.scala:52)
	at sbt.IvySbt$$anon$3.call(Ivy.scala:61)
	at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:75)
	at xsbt.boot.Locks$GlobalLock.withChannelRetries$1(Locks.scala:58)
	at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:79)
	at xsbt.boot.Using$.withResource(Using.scala:11)
	at xsbt.boot.Using$.apply(Using.scala:10)
	at xsbt.boot.Locks$GlobalLock.liftedTree1$1(Locks.scala:51)
	at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:51)
	at xsbt.boot.Locks$.apply0(Locks.scala:30)
	at xsbt.boot.Locks$.apply(Locks.scala:27)
	at sbt.IvySbt.withDefaultLogger(Ivy.scala:61)
	at sbt.IvySbt.withIvy(Ivy.scala:102)
	at sbt.IvySbt.withIvy(Ivy.scala:98)
	at sbt.IvySbt$Module.withModule(Ivy.scala:117)
	at sbt.IvyActions$.update(IvyActions.scala:121)
	at sbt.Classpaths$$anonfun$work$1$1.apply(Defaults.scala:955)
	at sbt.Classpaths$$anonfun$work$1$1.apply(Defaults.scala:953)
	at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$58.apply(Defaults.scala:976)
	at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$58.apply(Defaults.scala:974)
	at sbt.Tracked$$anonfun$lastOutput$1.apply(Tracked.scala:35)
	at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:978)
	at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:973)
	at sbt.Tracked$$anonfun$inputChanged$1.apply(Tracked.scala:45)
	at sbt.Classpaths$.cachedUpdate(Defaults.scala:981)
	at sbt.Classpaths$$anonfun$47.apply(Defaults.scala:858)
	at sbt.Classpaths$$anonfun$47.apply(Defaults.scala:855)
	at sbt.Scoped$$anonfun$hf10$1.apply(Structure.scala:586)
	at sbt.Scoped$$anonfun$hf10$1.apply(Structure.scala:586)
	at scala.Function1$$anonfun$compose$1.apply(Function1.scala:49)
	at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311)
	at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311)
	at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:41)
	at sbt.std.Transform$$anon$5.work(System.scala:71)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:232)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:232)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
	at sbt.Execute.work(Execute.scala:238)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:232)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:232)
	at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
[error] (*:update) sbt.ResolveException: unresolved dependency: play#sbt-plugin;2.0.4: not found
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?

今度は、play frameworkのversionがよくなかったらしい(´・ω・`)

「module not found: play#sbt-plugin;2.0.4」でぐぐる
http://stackoverflow.com/questions/11906682/java-play-2-compile-error-heroku
http://stackoverflow.com/questions/13737926/unresolved-dependency-sbt-org-scala-sbtsbt-2-9-10-12-1-not-found-play-exampl
がひっと

/path/to/project/plugins.sbt
内の

addSbtPlugin("play" % "sbt-plugin" % "2.0.4")

addSbtPlugin("play" % "sbt-plugin" % "2.1.3")

(自分のplay frameworkのversionに変更)
とすると、とりあえず動いた!!
めでたしめでたし