Spica*

プログラミングの話。

Minecraft Spigotプラグイン "RSSNewsBook" を公開しました

www.spigotmc.org

これはMinecraftの世界の中でニュースを読むためのSpigotプラグインです。 URLが入っていれば、そのURLをクリックすることで、そのニュースの詳細を見ることが可能です。

第二回神戸マインクラフト勉強会にて、公開したことを発表させて頂きました。

その時のスライドはこちら。

www.slideshare.net

モチベーションに関して

スライドにもちょっと紹介していますが、僕はMinecraftと別の何かを繋ぐことを前々からしたいなと思っていました。その形はぼんやりしていて具体的ではないのですが、まずは自分の生活フローと結び付けたいと考えていました。「例えば、マイクラ内のボタンを押すと、家のエアコンがつく」とか。でもハード苦手なのでそれは敷居が高いなと。それで代わりの何かを考えていたのです。

それで、勉強会があるとのことで、これの期間を目標にしてSpigotプラグインを作ろうと思い立ちました。残り3週間、実装からローンチまでの期間としては良いくらいではないかなと。あとはアイデアだけ。何にしよう。

で、僕は毎朝出勤の際にニュースを読むのですが「ああ、とりあえずはこれかな」という感じで即決しました。なんとなくあんまり使いドコロ無いのではという気もしなくもなかったのですが、とりあえず始めないと始まらないということで、実装開始した感じです。最初なので、あまりアイデアの良し悪しは考えませんでした。

あとは、プロジェクトの作り方でしょうか。Androidアプリ開発の経験が長く、Android Studioに慣れているので、IntelliJ+Gradleベースプロジェクトにこだわりました。あとはTestabilityにもこだわりたくて、テストしにくいプロジェクトは嫌だと思ったのもあります。Gradleを選んだのはこの辺もありました。今のところは僕的には結構満足度高くて、

  • テストコードはsrc/main/test/javaに入れておけばJUnit4で実行可能。Yamlからの取得・Yamlとして保存する方法に関して今回は仕様しました
  • ソースコードを変更した後、jarにまとめる→サーバのpluginsディレクトリにjarを入れる→起動の流れをコマンド一発で行えるようにしました。これのおかげで、試すまでの時間がうんと短くなりました

時間がなくて一部シェルスクリプト使っているのだけが気になっているところ…。これも解決して、Windowsでも開発出来るようにしたいところです。

最低限の自分の要望を組み込むところまではいきたいので、これからも開発続けます!

Bukkit pluginを作るために参考にしたところ

またリンク集みたいに雑多に置いておくなど… Unityもこないだ触ったのでそれも書いておきたい…

環境

先に注意点

リンク

コンフィグファイル

プラグイン使っているとわかると思うんですが、基本的にプラグインって

  1. プラグインをダウンロードする
  2. サーバのpluginsフォルダに入れる
  3. 起動する。すると plugins/<プラグイン名>/config.yml というファイルが出来上がる
  4. サーバを止める
  5. config.yml を修正して再度起動

みたいな感じだと思います。この流れを基本とすると、開発側でやりたいことは具体的にいくつか決まってくると思います。それをちょっと下記に列挙しておきます

デフォルトの config.yml を導入

プラグインを作るには、成果物のjarに plugin.yml を含めないといけませんが、それと同じように config.yml もjarに梱包しておきます。そして下記のコードを実行すると、「 config.yml がなければ作成する」という実装ができます。

        File configYml = new File(plugin.getDataFolder(), "config.yml");
        if (!configYml.exists()) {
            plugin.saveResource(configYml.getName(), false);
        }

大切なのが plugin.getDataFolder()plugin.saveResource(fileName, false) 。前者はサーバの plugins ディレクトリのパスを取得することが可能で、後者はjarファイルに含まれている任意のファイル名のものを、 plugins/<プラグイン名>/<fileName> の位置に保存できます。

mitmproxyを使ってresponse body書換え

ふと思いついてmitmproxyを触ってみてた。今まであんまりちゃんとmitmproxyのhookできたことがなくて、ちゃんと調べてみてたんだけど、ちょっとクセがあるっぽい感じだった。

  • mitmproxyではpythonスクリプトを間に差し込み、リクエストを書き換えたりできる
  • mitmproxy -s my_script.py みたいな感じで起動すると、指定したスクリプトでリクエスト・レスポンスを書き換えることが出来る。
    • mitmdump -s my_script.py でもいける。こちらの場合、標準出力に表示されるので、スクリプトに問題があった時よく分かる
    • mitmproxy -s my_script.py での起動の場合、スクリプトエラーがあると、読まれないっぽい。エラーも出ない
    • スクリプトエラーがあると、左下の表記がちょっと違う
      • エラーあり: f:id:esperia:20160405011037p:plain:h35
      • エラーなし: f:id:esperia:20160405011044p:plain:h37
    • 引数をmy_script.pyに渡す場合は、 mitmdump -s 'my_script.py --foo 42' のように渡す

上記を踏まえて。

下記のようにスクリプトを書いた。このスクリプトは先程の Inline scripts の部分を元に書いた。

from libmproxy.models import decoded

def start(context, argv):
    f = open('test.json')
    context.mydata = f.read()
    f.close()
    print(context.mydata)

def response(context, flow):
    with decoded(flow.response):
        original = "example.com"
        target_path = '/path/to/get'
        print("handle request: %s %s" % (flow.request.host, flow.request.path))
        print("  Host: %s" % (flow.request.headers["Host"]))

        if original in flow.request.headers["Host"]:
            if flow.request.path == target_path:
                print("Match request.")
                flow.response.content = context.mydata

上記を mitmdump -T --host -s my_scripts.py で起動。うまく書き換わった。 もっと細かくプログラム組めば、オレオレセッション値とか設定できそう。

まれにデバッグとか調査とかで使うことがあるので慣れておきたいな。

Unreal Engine 4始めたのでまた参考にしたところリンク集

C++わかんない人なのでそこから…。 プログラマー向けです。

環境について

  • Macの動作不安定すぎるのでWindows必須。今のところWindows10で問題ない

最初手を付けるところ

またまとまったら追記する

Scalaもくもく会参加してきました

初めてScalaの勉強会におじゃましました!

感想

Scalaというか、関数型言語というのに興味が湧きまして、Play Frameworkをちょいちょいいじってたんですが そしたら社長が勉強会の存在教えてくれまして、ちょっと行ってみよかなみたいになった次第です。

もくもく会なので基本もくもくなんですが、結構なもくもく具合だったので「あっ、これガチなやつや」みたいに思ってたんですけど、主催者の人がテンション高いのと、Scalaに詳しい方々がゆったりお話聞いてくださる方々でしたので、全然大丈夫で充実できました。

あとやっぱり、お詳しい方々なだけあって色んな問題が飛ぶように解決したり、「そんなものあるんや」的なこととか、Scalaのライブラリの流行りの傾向とか知る機会にもなってよかったです。

いろんな話をする時間も次もっとほしいですね!(僕は勝手に取らせてもらった感じになってましたけど…!)

お聞きした内容

断片的ですが、学んだ内容を記載しておきます。

次回

ちなみに次は3/24(木)とのことです! 僕行けるかまだ分かんないんですが、行けたら行きます!

Play! Framework with Scala (2.5.x) ドキュメントメモ

メモ。随時アップデートする。

おまけ

Scala自体について

Cent OS 7 で Minecraft Overviewer使ってみた

Minecraft Overviewerとは、MinecraftのワールドをGoogleMapっぽく、ブラウザで表示できるようにするためのものです。マインクラフトをGoogleマップっぽく表示できるツール「The Minecraft Overviewer」 - GIGAZINEで知った。Gigazineよりも前の記事あるし、結構前からあったんですね。

結果として静的ファイルが出来上がるのも特徴。出来上がったフォルダの中に、index.htmlがあり、それをブラウザで開けば表示される感じ。もちろん、FTPでサーバにアップロードしてみんなで見ることもできます!

こんな感じ

f:id:esperia:20160201211732p:plain

上記は、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/$basearchbaseurl=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.では、ファイル内の$releaseverlatestに書き換えてます。これは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)と、rendersworldに指定した文字列は合わせましょう。

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

カップラーメンが湧く頃には、みなさんの素敵なワールドが一望できるようになってることでしょう!