プログラマメモ2 - programmer no memo2

jsr-223 - 追記中 2017/01/09
2021/03/14

jsr-223です。


javaからJVM言語をスクリプト実行したいです。
主観ですが、メジャーな言語と思えるものを調べてみました。
かなりおおざっぱです。

対象
 clojure,groovy,scala,jruby,jython,kotlin, javascript


言語 engine name(shortName) Factoryクラス JAR 特記
Clojure Clojure clojure.contrib.jsr223.ClojureScriptEngineFactory clojure-jsr223-1.2.jar  
Groovy Groovy org.codehaus.groovy.jsr223.GroovyScriptEngineFactory groovy-jsr223-2.4.7.jar  
Scala scala scala.tools.nsc.interpreter.IMain$Factory scala-compiler-2.11.8.jar -Dscala.usejavacp=true
Kotlin kotlin org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory kotlin-jsr223-local-example-1.1-M04-eap-14.jar  
JRuby jruby org.jruby.embed.jsr223.JRubyEngineFactory jruby-complete-9.1.6.0.jar -Dpython.import.site=FALSE
Jython jython org.python.jsr223.PyScriptEngineFactory jython-2.7.0.jar  
javascript javascript com.sun.script.javascript.RhinoScriptEngineFactory#java7 resources.jar java8はNashorn


jsr-223って、もともとサーバーサイドで各種スクリプト言語の実行を目指したもののようですね。

こうやってみてみるとJVM言語っていろいろありますね。かなり貪欲というか。

呼び出し方は、ScriptEngineManagerにたいして、エンジン名を指定して、ScriptEngineを取得します。取得できない場合は、nullが返ってくるようです。

ちなみに、各ScriptEngineFactoryはプログラムの起動時に行われるようです。ScriptEngineFactoryの定義は、各ライブラリ(jar)のMETA-INF/services/javax.script.ScriptEngineFactory ファイルに記述されています。
ですので、このファイルを探せばよいというのがわかります。ただし、このファイルに記述されているのに実際のクラスがない場合、不幸なことにプログラム全体が起動しません。
# 遅延ロードでできないのかしら?

参考 clojure


以下、呼び出しソース

package jsr223; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class TestMain { public static void main(String[] args) throws ScriptException { a(); } static void a() throws ScriptException { // まとめて実行するとjava.lang.OutOfMemoryErrorする.... jsr223_noengine(); jsr223_Clojure(); jsr223_Groovy(); jsr223_Scala(); jsr223_JRuby(); jsr223_Jython(); jsr223_Javascript(); jsr223_Kotlin(); } static void jsr223_noengine() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "xxxx";// 存在しないものを指定 final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); if (scriptEngine == null) { System.out.println("*** 存在しないものを指定した場合は、script engineはnullになります。"); } else { scriptEngine.eval(""); } } static void jsr223_Clojure() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "Clojure"; final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("(println \"clojure \")"); } static void jsr223_Groovy() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "Groovy"; final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("println \"groovy \""); } static void jsr223_Scala() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "scala"; final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("println(\"scala \")"); } static void jsr223_JRuby() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "jruby"; final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("printf \"jruby \n\""); } static void jsr223_Jython() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "jython"; final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("print 'jython'"); } static void jsr223_Javascript() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "javascript"; // java7 Rhino java8 Nashorn final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("print('javascript')"); } static void jsr223_Kotlin() throws ScriptException { final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); final String shortName = "kotlin"; final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName); scriptEngine.eval("println(\"Kotlin\")"); } }


 参考

herokuでPlay!に挑戦 その1- おおざっぱ 2014/08/17

コンピューターが逝ってしまって、ようやく開発環境が復活。
また、いろいろやっていきたいなと思い始めた夏なのでした。

herokuとか、scalaとか、Play!フレームワークとか、いままで、触ったことがないものに挑戦ということでいろいろやってみました。

DB周りで無駄にはまってしまったのでとりあえず、メモ。

参考:

Play!は、2.3.3で現在の最新を使用。
開発環境はeclipse。
Play!自体は、typesafeのactivatorをhomebrewでインストール。
はじめ、どうインストールしていいのか、わからず(調べたらいろいろでてきて迷った)
macportsで入れようとして、パッケージが古かったり、パッケージャーを使わない方法もあったりと、試行錯誤。
activatorを起動すると、ブラウザベースの設定画面がでてきたりと、この辺もまったくなれずとまどった。

何度か、seedsからプロジェクト作っては壊しを繰り返して、慣れた。

 この辺で、herokuでアカウントを作成して、開発機(macosx)のssh、gitあたりの設定をする。pushしてデプロイでherokuで動くことを確認。

なんとか起動までできたので、そこから、生成されるファイル構成をざっくりながめ、頭くらくらしつつ、DB周りの設定にとりかかったのだけど、調べて、しっくりこなかったので、MyBatisを使うことに決定。DBはpostgresqlを使うことにした。
 
スキーマを定義しないやり方って、はじめはいいかなーと思ったけど、フレームワークやツールが何しているのかわからないとはまりそうなのと、不満もつと嫌いになりそうなのと、生のSQLが近くにあったほうがいいかなとの判断。単純なCRUD書くのは面倒だと思うけど。

DB周りって、接続情報をどう設定から取得するのとか、まあ、面倒。
生のコネクションの作り方は、herokuのドキュメントにあった。

MyBatisはちょっと工夫が必要だった。専用の設定ファイルを使用する系は、頭ひねる必要があった。

 ここで、今回用意した設定ファイル。
build.sbt

libraryDependencies ++= Seq( "org.postgresql" % "postgresql" % "9.3-1102-jdbc41", "org.mybatis" % "mybatis" % "3.2.7", javaJdbc, javaEbean, cache, javaWs )

application.confのDB設定

db.default.driver=org.postgresql.Driver db.default.url="jdbc:postgresql://localhost:5432/herok1" #db.default.url=${?DATABASE_URL} db.default.url=${?DATABASE_HOST} db.default.user=oreore db.default.user=${?DATABASE_USER} db.default.password="" db.default.password=${?DATABASE_PASSWORD}

ここで注意、どうもmybatisさんにパラメータを渡す場合、urlからユーザとパスワードを切り出さないといけないようなので、今回とった方法は、herokuの環境変数にDATABASE_HOST,DATABASE_USER,DATABASE_PASSWORDを設定するやり方。

いずれにしろコードで、SqlSessionFactoryを生成しないといけないので、DATABASE_URLから切り出す方法がいいと思う.....

mybatisのconfiguration.xmlの場所は以下。
application.confには、
mybatis.configuration=mybatis/configuration.xml
と設定


osx上での、PostgreSQL関連は、簡単そうだったので、単体のappで提供されているものを使いました。ただ、これだとpsqlのパスがちょい面倒
 GUIに慣れてるので、heroku側のDBを触るときは、pgAdmin使ったけど、共用のDBを目視でさがすのはいささか苦痛。
 とりあえず、何を参考にしてはまったかはメモ。
ほんとは、もっとこまかい無数のことに足をすくわれたのだけど。

 レッドブルの消費は、5缶。

Scalaメモ 2007/09/09

HHa(H派)メモ - ほぼりスクリプト言語Scalaの情報ソース

Scalaという言語があるらしい。


Groovyよりはやそうだ。
※groovyにはやさを求めてはいないけど。
coding, by Derek Young: Scala vs. Groovy: static typing is key to performance


Scala言語というのは何やらエレガントらしい。


ちょいとためしてみよう。頭がすっきりする言語ならいいなぁ。