Play! Framework with Scala (2.5.x) ドキュメントメモ
メモ。随時アップデートする。
各種IDEでのセットアップ方法
- JetBrains側ドキュメント: IntelliJ IDEA 2016.1 Help :: Getting Started with Play 2.x
- Play側ドキュメント: https://www.playframework.com/documentation/2.5.x/IDE:tite
- 僕はプロジェクトの雛形自体は
activator
コマンド経由で作成し、To import a Play project:
の部分を参考にインポートする感じで使ってます。
- 僕はプロジェクトの雛形自体は
データベース設定
- https://www.playframework.com/documentation/2.5.x/ScalaDatabase
- ※ただし、slickを使うのであれば、上記ではなく PlaySlickのドキュメント見たほうが良い。設定方法違う
- MySQL JDBC Connector の最新バージョン確認: http://mvnrepository.com/artifact/mysql/mysql-connector-java
JSONを扱う方法
- Converting to a JsValueの項目がとっても分かりやすい。なんとなくでいけると思う
ユニットテスト方法
- Scalaの文法を細かく知るためにも、ユニットテストの方法は早々に学んでおいたほうが良いと思う(持論)
- https://www.playframework.com/documentation/2.5.x/ScalaTestingWithScalaTest
- Play Framework 2.4.x以降、ScalaTestを使うの基本ぽい。でもSpec2使ってる人のほうが多いみたい(勉強会で聞いた)。
routes
ファイルの変更方法
おまけ
- WindowsのGit bash上にて、
./activator
実行すると、エラー吐かれる問題- こんな問題
- Activator UI: Failed to load sbt configuration (Windows) · Issue #1037 · typesafehub/activator
- Windows | Git Bash | activator run results in IllegalArgumentException: URI has an authority component · Issue #1033 · typesafehub/activator
- ちなみに、sbtにて似たようなことが起きていたようだけど、これは直接関係なさそうだった。Java 1.7_60以前のバグの対応っぽい
- 対策は、 http://stackoverflow.com/a/30722296 に書かれてある
~/.sbt/repositories
ファイルを開き、file://
->file:///
にしたら治るよ、との話。- ただし、僕の場合
~/.sbt/repositories
がそもそも無かった
- 僕の場合は、Typesafe Activatorのダウンロードページにて、
download the mini-package
じゃない方をダウンロードし、PATHを通すと動作するようになった。- 根本的な原因は僕の方ではわからずじまいだったのでもやもやするのである…
- こんな問題
WindowsのGit-Bash上で
./activator
使うと、めっちゃCPUぶん回るっぽい。cmdとか使ったほうがよさげContent-Typeの返し方
その他
Scala自体について
- とりあえず文法知った気になれるやつ
Cent OS 7 で Minecraft Overviewer使ってみた
Minecraft Overviewerとは、MinecraftのワールドをGoogleMapっぽく、ブラウザで表示できるようにするためのものです。マインクラフトをGoogleマップっぽく表示できるツール「The Minecraft Overviewer」 - GIGAZINEで知った。Gigazineよりも前の記事あるし、結構前からあったんですね。
結果として静的ファイルが出来上がるのも特徴。出来上がったフォルダの中に、index.html
があり、それをブラウザで開けば表示される感じ。もちろん、FTPでサーバにアップロードしてみんなで見ることもできます!
こんな感じ
上記は、The Lord of The Ringsのローハン。これは超デカイマップなので、ビルドには1時間、サイズは2.2GBになったけど、通常マップでは数分でおわるます。
使い方
Installing — Overviewer 0.11 documentationにインストールあります。
# 1. overviewer.repoをダウンロード $ sudo wget -O /etc/yum.repos.d/overviewer.repo http://overviewer.org/rpms/overviewer.repo # 2. 編集して書き換え $ sudo vim /etc/yum.repos.d/overviewer.repo baseurl=http://overviewer.org/rpms/$releasever/$basearch ↓ baseurl=http://overviewer.org/rpms/latest/$basearch # 3. Minecraft Overviewer インストール $ yum install Minecraft-Overviewer
1.
ですが、公式ページではwget
でダウンロードしてます。ただ僕はcurl
派なので、sudo curl -o /etc/yum.repos.d/overviewer.repo -L http://overviewer.org/rpms/overviewer.repo
で入れました。
2.
では、ファイル内の$releasever
をlatest
に書き換えてます。これはCentOS 7に正式に対応してなくて、入らないからです。
Minecraft Overviewerのrpm一覧に、7
が出てきたらここを書き換える必要はないと思いますが、公式のIssue #1204みた感じ対応するつもりない気もしますね。。
configファイルを書く
ビルドする際、ビルドに関する設定ファイルを指定するんですが、まずはそのファイルを作ります。
最初はThe Configuration File — Overviewer 0.11 documentationを見て作成するのが良さそうということで、今回は下記で作りました。
worlds["Rohan"] = "/home/user/Dev/minecraft/overviewer/Rohan_Divici/Rohan" renders["normalrender"] = { "world": "Rohan", "title": "The Lord of The Rings - Rohan", } texturepath = "/home/user/Dev/minecraft/textures/1.8.9.jar" outputdir = "/home/user/Dev/minecraft/overviewer/rohan"
worlds["Rohan"]
では、ワールドの場所を指定します。worlds
の添字部分に指定した文字列(今回はRohan
)と、renders
のworld
に指定した文字列は合わせましょう。
texturepath
は、クライアント側にインストールしているマイクラ本体のjarを指定します。それぞれおそらく下記のパスにあると思います。
- Macだと、
/Users/myuser/Library/Application\ Support/minecraft/versions/1.8.9.jar
- Windowsだと
C:\Users\myuser\AppData\Roaming\.minecraft\versions\1.8.9.jar
outputdir
は、ビルドした結果を保存する場所です。
ビルド開始
overviewer.py
というコマンドが使えるようになっています。下記でビルド開始しましょう!
overviewer.py --config=/home/user/Dev/minecraft/overviewer/config
カップラーメンが湧く頃には、みなさんの素敵なワールドが一望できるようになってることでしょう!
ダイアモンドストーンを買ったんだけど、海賊版っぽかった件
三行で
- 先にレッドストーンを買ったら満足の出来だった
- 続けてダイアモンドストーンを買ったらすっげー塗装が荒かった
- 別の販売元から新しいの買ったら満足の出来だった
比較写真
- 側面
- 底面
- レッドストーンと、アレなダイアモンドストーンとの比較
塗装wwwwwww
- 箱
箱はほとんど一緒。でも、ダンボールの板が厚く、もこもこしてふたが閉まり切っていない印象がある。
ここまでアレな感じですけど、ちゃんと電気はつくんです。しかも塗装悪いほうが明るい。
Amazonにも注意書きが。
所感とかその後
Amazonの注意書きと、その前にきれいなつくりのレッドストーン購入していたのもあって、 これ海賊版(偽物)っぽいなーって感じたけど、その前提なくていきなりダイアモンドストーン買ってたら よくわからずにそのまま使ってたかもしれないなーとも思ったりした。輸入品ってことだったし…。
結局悪いほうは返品して買いなおしました。「恵比寿本店」で買いなおしたんだけど、 写真にも写ってるようにこっちはとってもきれいでした。
思い切って買いなおしてよかった。これでマイクラライフもさらに楽しく過ごせますね!
Minecraftグッズ
追記:ダイアモンドストーンを買ったんだけど、海賊版っぽかった件 - Spica*
ちょっと日本のと海外の比べた時に、日本の結構値段設定高くなってるなぁと思っただけなんですが。
Amazon(日本)
- Diamond Ore
- Redstone Ore
MINECRAFT(マインクラフト) レッドストーン・LEDライト [並行輸入品]
- 出版社/メーカー: ThinkGeek
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
Amazon.com
- Amazon.com: Minecraft Redstone Ore by Think Geek: Toys & Games
- Amazon.com: Think Geek Minecraft Light-Up Diamond Ore: Toys & Games
すごい欲しい。Amazon.comって送料どうなんだっけ。。ううむ。
IntelliJ IDEA + Forge 1.8 で modding 環境整えた
以前、 IntelliJ IDEA + Forge 1.7 で modding 環境整えた - Spica* という記事を書いたんですが、最近(?)ちょっとやり方が変わっていたようでした。 Basic Modding - Minecraft Forge の方ではなく、新設されていた公式ドキュメント Home - Forge Documentation を読みながら、再度環境を整えていきます。
環境
手順
この手順は、Forge DocumentationのGetting Startedのものです。
- まず、Minecraft Forgeから、"Mdk"をダウンロード
- 表示されるadfoc.usの広告は、絶対にクリックしないでね…
- "forge-1.8-11.14.4.1563-mdk.zip"みたいなファイルがダウンロードできる
- ダウンロードしたら、ダブルクリックで解凍
- ターミナルを開き、下記を実行する。
# 解凍したディレクトリに移動 cd /path/to/forge-1.8-11.14.4.1563-mdk # 環境を準備する(Minecraft, forgeのデコンパイルとビルド) ./gradlew setupDecompWorkspace # intelliJ IDEA向けの環境ファイルを準備する ./gradlew genIntellijRuns
※もし、Mac OS X El Capitan以降をお使いで、 ./gradlew setupDecompWorkspace
の実行に失敗する場合、 FIX MinecraftForge gradlesetupDecompWorkspace failed · Issue #2183 · MinecraftForge/MinecraftForge の問題が起きているかもしれません。こちらのコメントを参考に、 build.gradle
のコメントを書き換えるとビルド通ると思います。
- 続けてIntelliJ IDEAを開き、最初の画面で"import project"を選択して、先ほどのディレクトリの中にある"build.gradle"ファイルを選択する。その後JDKを選択したりする画面が表示されるが、そのまま次へいく。
- しばらくすると、開発する画面が表示される。
こんな感じ。ここまでで開発の準備はOKです。
デバッグ実行を行う
- IntelliJ IDEA上の、[Edit Configuration] を開く
- 左上の+ボタンを押下し、Gradleを選択する
- それぞれ値を入力して、OKを押す
- Gradle projectの欄は、右側のディレクトリボタンを押すと自動的に入力可能
- Tasksの欄は、
runClient
にする
- 緑色の右向き▲を押して、実行する
- Minecraftが起動する
お疲れ様です!ここまでで実行OKです。
ここからどうやってMOD開発してくの?
僕もまだ模索中です。。
今のところ、Modding カテゴリーの記事一覧 - Minecraftとタートルと僕 がなかなか良さそうです。 1.7.10の記事で環境構築方法は違いますが、APIがそこまで大きく変わることはないと思うので。。
インターネットで検索して出る情報も、古い物が多いですがわりかし使えるのではないかと思ってます。
良さそうな記事あれば教えて下さい!!
Minecraftでカスタムアイテム作ってみる
ForgeのMod制作の続きをしてみる。以前のセットアップの記事はこっち。
とりあえずアイテムを作る。
とりあえずアイテムを作るのは非常に簡単で、Mod初期化時に GameRegistry#registerItem()
メソッドを使ってアイテムを登録すれば良いだけのようです。
ここでいうMod初期化時というのは、 preInit(FMLPreInitializationEvent event)
が呼ばれるタイミングです。ハンドラの書き方とかはざっくりとセットアップの記事にも書いてます。
つまるところ、下記のように net.minecraft.item.Item
を継承したクラスを新しく作っておき…
package com.example.examplemod; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; public class GenericItem extends Item { public GenericItem() { // 色んな設定をする setMaxStackSize(64); setCreativeTab(CreativeTabs.tabMisc); setUnlocalizedName("genericItem"); } }
下記のように、Mod初期化時のハンドラで登録してあげると、もうそれだけでアイテムが一応出来上がる。
package com.example.examplemod; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.init.Blocks; @Mod(modid = ExampleMod.MODID, name = ExampleMod.MODNAME, version = ExampleMod.VERSION) public class ExampleMod { /** MODのID。小文字であること */ public static final String MODID = "examplemod"; /** MODの名前 */ public static final String MODNAME = "Example Mod"; /** MODのバージョン */ public static final String VERSION = "1.0"; @Mod.Instance(value = ExampleMod.MODID) //Tell Forge what instance to use. public static ExampleMod instance; private static GenericItem myItem; @EventHandler public void preInit(FMLPreInitializationEvent event) { myItem = new GenericItem(); GameRegistry.registerItem(myItem, "myItem"); } }
確認してみる
- シングルプレイでワールドを生成する
- チートモードをONにしておく
- そのワールドでプレイ開始
/give @p <MODID>:<ITEMID>
というコマンドを発行する<MODID>
は、コード内のMODID
変数に格納した名前。<ITEMID>
は、#registerItem()
の第二引数に指定した名前。- 例:
/give @p examplemod:myItem
上記でアイテムが入手できる。下記のような感じ
ローカライズ(日本語化)する
アイテムの名前がなんか変な名前(item.genericItem.name)になっているのが分かります。 これを日本語名にするには、アイテム名を記述したファイルを作成します。
ファイルは、プロジェクト内のsrc/main/resources/assets/genericmod/lang
ディレクトリの下に、 ja_JP.lang
という名前で作ります。僕の環境では、 src/main/resources
まではディレクトリが存在したので、そこから先のフォルダとファイルは自分で作りました。
他の言語にも対応させるには、同様のディレクトリに別の言語向けファイルを作ります。例えば、英語だと en_US.lang
です。
IntelliJ IDEAでは下記のような表示になります。
で、そのファイルには下記のような記述をします。
英語(en_US.lang):
item.genericItem.name=Delicious Cookie
日本語(ja_JP.lang):
item.genericItem.name=おいしいクッキー
その状態で実行すると、下記のような表示になります。
英語:
日本語:
おおおお。ほとんどコード書いてないですが、実際の画面にアイテムとして出てくれるとかなり嬉しいですね!
参考
PythonでCバインディング試してみた
以前MIDIハッカソンで、「PythonはC/C++とお話できます!」的な話を聞いていて、ずっと気になっていたのでちょっと試すだけ試してみた。PythonからCプログラムを呼び出す | 象歩を参考に、そのまま動かすところまでやってみた。CもPythonも未経験だけど、可能性広げる意味で。。
コンパイルのところでちょっと詰まったのでメモっておく。
環境
ソースを用意する
先ほどの記事を参考に、 hello.c
と helloWrapper.c
を用意する。「1.ソースコード」の節と「2.wraper コード」の節のソースコードをそれぞれそのままコピペでOK。
コンパイル
コンパイルに使用するコマンドは、参考記事では下記のようになってる。
gcc -fpic -o hello.o -c hello.c gcc -fpic -I/usr/include/python -o helloWrapper.o -c helloWrapper.c gcc -shared hello.o helloWrapper.o -o hellomodule.so
しかし、homebrewでインストールしたpythonでは /usr/include/python
にヘッダファイルがあるわけではないので、そのままでは動かない。
$ gcc -fpic -I/usr/include/python -o helloWrapper.o -c helloWrapper.c helloWrapper.c:2:10: fatal error: 'Python.h' file not found #include "Python.h" ^ 1 error generated. $ ls /usr/include/python ls: /usr/include/python: No such file or directory
この辺を解決しなきゃ。。
hello.c
のコンパイル
とりあえず一行目は動くので、動かして hello.o
を作る。warning出るけど…
$ gcc -fpic -o hello.o -c hello.c hello.c:9:2: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)' printf("こんにちは、私は %s の %s です。\n", adrs, name); ^ hello.c:9:2: note: include the header <stdio.h> or explicitly provide a declaration for 'printf' 1 warning generated. $ ls hello.c hello.o helloWrapper.c
helloWrapper.c
のコンパイル
続けて、 helloWrapper.c
のコンパイル。Python.h
をインクルードしているので、これがあるパスを見つけて、 -I
の後に記述しなくちゃいけない。
で、ググってたら、python-config --prefix
というコマンドがある のを見つけたので実行してみると、ビンゴっぽかった。
$ python-config --prefix /usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7 $ ls `python-config --prefix` Headers@ Python* Resources/ bin/ include/ lib/
Headers内に Python.h
があったので helloWrapper.c
のコンパイルは下記のコマンドでいけた。
$ gcc -fpic -I`python-config --prefix`/Headers -o helloWrapper.o -c helloWrapper.c helloWrapper.c:31:10: warning: incompatible pointer types initializing 'PyCFunction' (aka 'PyObject *(*)(PyObject *, PyObject *)') with an expression of type 'PyObject *(PyObject *, PyObject *, PyObject *)' [-Wincompatible-pointer-types] {"out", hello_out, METH_VARARGS | METH_KEYWORDS}, ^~~~~~~~~ 1 warning generated. $ ls hello.c hello.o helloWrapper.c helloWrapper.o
hellomodule.so
の作成
最後、 hellomodule.so
共有モジュールの作成。これもさっきのパスにヒントがあって、 -L
オプションには、lib
ディレクトリを指定すれば良いようだった。
-l
のオプションですごく迷ったのだけど、 compilation - C can't compile - symbol(s) not found for architecture x86_64 - Stack Overflow とか見ると、静的ライブラリlibimplementations.a
の場合は-limplementations
という指定にしていた。
libディレクトリには、libpython2.7.dylib
というファイル名があったので、-lpython2.7
かなと思って下記のコマンドを発行。
$ gcc -L`python-config --prefix`/lib -lpython2.7 -shared hello.o helloWrapper.o -o hellomodule.so $ ls hello.c hello.o helloWrapper.c helloWrapper.o hellomodule.so*
いけた。ここまでで材料が揃った。
実行する
$ python Python 2.7.10 (default, Jul 13 2015, 12:05:58) [GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import hello >>> hello.add(2, 3) 5 >>> hello.out("大原", "麗子") こんにちは、私は 大原 の 麗子 です。 >>> quit()
おおー!
今度はnode.jsのネイティブバインディングやってみたいですね!