ぺこめも

困ったときとかにいろいろまとめてる

nuxtjsのVueRouterのpushで、params[]=foo&params[]=bar みたいなことをしたかった

環境はnuxtjs2.x。Nodejsは10.x。

this.$router.push('foobar', {
  query: {
    params: ['foo', 'bar']
  }
})

みたいなので、通常だと http://xxxxxx?params=foo&params=bar というようなURLになる。
どうも、調べてみると queryString を使用して

parseQuery: function(query) {
  return queryString.parse(query, {
    arrayFormat: 'bracket'
  })
},
stringifyQuery: function(params) {
  if (0 === Object.keys(params).length) {
    return ''
  } else {
    return (
      '?' +
      queryString.stringify(params, {
        arrayFormat: 'bracket'
      })
    )
  }
}

このように書けばいいよというのを見つけた。
NodeJS 標準の queryString には arrayFormat ってつけるところないじゃないのん ρ(・ω・、)

そこで、query-string というライブラリを使用したらいいことが分かった。

www.npmjs.com

nuxt.config.js に以下を追加する。
parseQuerystringifyQuery の中で require しているのは、nuxt.config.js の最初(module.exports の外)に書いても、parseQuery などの中では queryString is not defined のエラーが出るから。

router: {
  parseQuery: function(query) {
    const queryString = require('query-string')
    return queryString.parse(query, {
      arrayFormat: 'bracket'
    })
  },
  stringifyQuery: function(params) {
    const queryString = require('query-string')
    if (0 === Object.keys(params).length) {
      return ''
    } else {
      return (
        '?' +
        queryString.stringify(params, {
          arrayFormat: 'bracket'
        })
      )
    }
  }
}

f:id:pekomiya:20180925220010p:plain

たのしい ( 厂・ω・ )厂うぇーい

Nukkit プラグイン Tips - plugin.yml -

まだ、公式の開発者向けWikiが整備されていないので、plugin.yml の内容について解説しておく。

公式のサンプルコードをまずは載せる。

#name, main, version and api are required
name: ExamplePlugin
main: cn.nukkit.exampleplugin.ExamplePlugin
#remember version and api is string, don't write it like this: 1.0.0, or there will be an exception
version: "1.0.0"
api: ["1.0.5"]
load: POSTWORLD
author: Nukkit Project
# Authors and author will be added together in one list.
authors: ["Example", "Another"]
description: Example plugin showing the API
website: https://github.com/NukkitX/ExamplePlugin
# These dependencies are required for the plugin to start.
#depend: ["OtherPlugin", "ThisPlugin"]
# These dependencies are not required.
softdepend: ["PluginA", "PluginB"]
# Log prefix in console
prefix: "Example"
# Plugin will be loaded before these. Any cyclic loadbefore's or dependencies's will throw errors!
loadbefore: ["ImportantPlugin"]

commands:
  example:
    description: Example command
    usage: "/example"
    aliases: ["xample", "nukkitexample"]
    permission: exampleplugin.command.example
    permission-message: "You do not have the required permission to run /example"
permissions:
  exampleplugin.command.example:
    description: "Allows the user to run the example command"
    default: true
    children:
#     exampleplugin.command.example.test:
#       description: "Use the test feature in the example command"
#       default: true
  • name (必須)
    プラグインの名前(半角英数字、_.-、半角スペースが使用できる )
    半角スペースだけ(例えばname: " ")でも大丈夫なのが少し仕様としてもやっとしたりするけど、ちゃんと読み込める。
    f:id:pekomiya:20180817013631p:plain
  • main (必須)
    メインクラスまでのパス。このパスを使って、ClassLoader からロードする。なお、cn.nukkit. から始まるものは使用できない。
  • version (必須)
    プラグインのバージョン。
  • api (必須)
    対応するNukkit API のバージョン。どれに対応するかは、version コマンドで確認できる。
    f:id:pekomiya:20180817014016p:plain
    また、1.0.0 というような、「数字 . 数字 . 数字」という形式で書かなければいけない。文字列の配列を記入するが、書かれているAPI バージョンのいずれかが対応していれば、読み込むことができる。
  • load(初期値:POSTWORLD
    プラグインのロードされるタイミングを設定できる。現在、STARTUP, POSTWORLD を設定可能。
    pekomemo.hatenablog.jp

  • author
    プラグインの著者。version <plugin name> や、timings で表示される。authors と共存可能。

  • authors
    プラグインの著者(author だと一つだが、authors だと文字列の配列を記入できるので、複数著者がいるときは便利)。version <plugin name> や、timings で表示される。author と共存可能。
  • description
    プラグインの概要。version <plugin name> や、timings で表示される。
  • website
    プラグインのWebサイト。version <plugin name> や、timings で表示される。
  • depend
    このプラグインが依存しているプラグイン。依存するプラグインが読み込まれた後で、読み込まれる。(存在しない場合は以下のようなエラー)
    01:54:59 [CRITICAL] プラグイン'Sample'を読み込むことができませんでした: 不明な依存関係 01:54:59 [CRITICAL] プラグイン'Sample'を読み込むことができませんでした: 循環依存が検出されました
  • softdepend
    このプラグインが依存しているプラグインdepend と違って、エラーは出ない。
  • prefix
    コンソールに出力されるログの先頭につく文字を設定できる。標準はプラグインname
    [Sample] onEnableSample の部分。
  • loadbefore
    どのプラグインよりも前に呼ばれるべきか設定できる。そのプラグインが存在しなくてもエラーは出ない。

  • commands

    • description コマンドの概要 help コマンドで表示されるコマンドの説明で表示。
    • usage
      コマンドのリスナーが false を戻すときに、表示されるデフォルトのメッセージ。
    • aliases
      コマンドのエイリアスsample というコマンドで sエイリアスに設定していたら、 /s でこのコマンドの処理が呼ばれる。
    • permission
      このコマンドを使用するための権限
    • permission-message
      コマンドの送信元に、必要な権限がない時に表示されるメッセージ。
  • permissions

    • description(必須)
      権限の名前
    • default (デフォルト:false) 標準でだれが権限を所有するか。

      権限
      op op
      isop op
      operator op
      isoperator op
      isopadmin op
      isadmin op
      !op notop
      notop notop
      !operator notop
      !admin notop
      notadmin notop
      true true
    • children

Nukkit プラグイン Tips - ライフサイクル -

伝統的に、マインクラフトのサーバーMOD向けプラグインには
- onEnable - onDisable - onLoad

という、有効・無効・ロードのリスナーを作成できる。

public class SamplePlugin extends PluginBase {
    @Override
    public void onEnable() {
        getLogger().info("onEnable");
    }

    @Override
    public void onDisable() {
        getLogger().info("onDisable");
    }

    @Override
    public void onLoad() {
        getLogger().info("onLoad");
    }
}

Nukkitの場合も、ほかのサーバーMODと同じように以下のようなライフサイクルになる(だいぶ適当なフローチャートですまそん)。

f:id:pekomiya:20180817004518p:plain

また、サーバー起動時の読み込み順に関しては、plugin.ymlload (初期では POSTWORLD)で設定できる。

  • STARTUP

起動時にプラグインがロードされる。

f:id:pekomiya:20180817005150p:plain

  • POSTWORLD

ワールドが作成(すでにあるワールドであれば、読み込まれた後)に、プラグインがロードされる。

f:id:pekomiya:20180817005212p:plain

他にも、 loadbefore で、このプラグインが特定のプラグインよりも前にロードされるように設定できるほか、 depend で特定のプラグインの後にロードされるように設定できる。

Nukkit プラグインの作り方 part.2 - 最初のプロジェクト -

Nukkit 公式のサンプルコードも Maven を使用しているので、 Mavenを使ってプラグインを開発、コンパイルする。
Mavenの説明をすると、脱線して、作るのが難しく感じるかもしれないので、省略する。

3. 最初のプロジェクト作成

f:id:pekomiya:20180816151943p:plain

起動すると上図のような画面が表示される(初期起動時にはIDEのカラーテーマを選択したりしたかも)。
「Create New Project」を選択する。

f:id:pekomiya:20180816152208p:plain
(Mavenを選択して、「Next」)

f:id:pekomiya:20180816152323p:plain
(GroupId, ArtifactId, Version を記入する画面が表示され、Versionだけ1.0-SNAPSHOT が入っている。)

  • 蛇足

    GroupId プロジェクトのルートパッケージ
    ArchifactId プロジェクト名

    ちなみに、Nukkitの場合、groupId = cn.nukkit artifactId = nukkit で下図のようなパッケージ構成になっている
    f:id:pekomiya:20180816152914p:plain

プロジェクト名とプロジェクトファイルの場所を設定(基本そのままでいい)したら、「Finish」をクリックする

f:id:pekomiya:20180816153050p:plain

プロジェクトの作成が完了すると下図のような画面になる。

f:id:pekomiya:20180816153209p:plain


4. シンプルなプラグインプログラム

A. 依存性追加 pom.xml

このプロジェクトに作成したプログラムから、NukkitのAPIにアクセスするために、pom.xml に依存性を追加する。

  • 現在
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.hatenablog.pekomemo.example</groupId>
    <artifactId>sample</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>
  • 修正後
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.hatenablog.pekomemo.example</groupId>
    <artifactId>sample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <repositories>
        <repository>
            <id>nukkit-repo</id>
            <url>https://repo.nukkitx.com/snapshot</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>cn.nukkit</groupId>
            <artifactId>nukkit</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

B. ルートパッケージ作成

プロジェクト作成時に groupId には、ルートパッケージ名を記入する旨を書いた。src / main / java の配下にパッケージを作成する。

f:id:pekomiya:20180816153859p:plain

src から展開していくと、 java というディレクトが見えるので、右クリックして 「package」 を選択する。

f:id:pekomiya:20180816154017p:plain

groupId と同じ名前を記入して、「OK」を選択する。

f:id:pekomiya:20180816154140p:plain

C. メインクラスの作成

プラグインは、後述の plugin.yml の内容をもとに、PluginBase を継承したクラス(この講座では、プラグインの"メインクラス"と呼ぶ)を呼び出す。 plugin.yml は 「D」 で作成するので、まずはメインクラスを作成しよう。

f:id:pekomiya:20180816154519p:plain

パッケージ「jp.hatenablog.pekomemo.example」を右クリックして「Java Class」を選択する。

f:id:pekomiya:20180816154619p:plain

クラス名は、Java命名規則にしたがって、適当(適切)なクラス名を記入して「OK」を押す。 クラスを作成すると、内容が表示される。

f:id:pekomiya:20180816154724p:plain

このクラスは、プラグインのメインクラスなので、PluginBase を継承する

f:id:pekomiya:20180816154838p:plain

D. plugin.ymlの作成

NukkitがSpigotなどと同じような挙動であれば、pluginsディレクトに置かれた jarファイルの plugin.yml の設定をもとに、プラグインを読み込む。と、いうわけでplugin.yml を作成しよう。

javaディレクトリの下(jp.hatenablog.pekomemo.example と同階層)に resources というディレクトリが存在する。この中に plugin.yml を作成する。

f:id:pekomiya:20180816155153p:plain

f:id:pekomiya:20180816155210p:plain

plugin.yml には、name main version api が必須です。 - name: プラグインの名前 - main: メインクラスまでのパス(今回の場合 jp.hatenablog.pekomemo.example.SamplePlugin) - version: プラグインのバージョン - api: このプラグインがNukkitのどのAPIをサポートするか

なんか、PocketMineに強いインスパイアを感じる。PocketMineと同様に、ここのAPIのバージョンが動作させるNukkitのAPIバージョンよりも大きければ、プラグインのロードエラーがはかれる模様。

今回は、下記のようにした。

name: SamplePlugin
main: jp.hatenablog.pekomemo.example.SamplePlugin
version: "0.0.1"
api: ["1.0.0"]

5. ソースコードのビルド

最低限、プラグインとして必要なファイルを作成したので、いよいよビルドしてプラグインjar ファイルを作ろう。

f:id:pekomiya:20180816172232p:plain

右上のセレクトボックスをクリックして、「Edit Configurations...」 を選択する。 新しいウィンドウが表示されるので、プラス「+」をクリックして、 Maven を探して、クリックする。

f:id:pekomiya:20180816172153p:plain

f:id:pekomiya:20180816172106p:plain

package と記入して、「OK」を押す。 「OK」を押すと、初期状態だと 「Unnamed」という項目が表示される。

f:id:pekomiya:20180816172319p:plain

f:id:pekomiya:20180816172412p:plain を押すと、ビルドが始まる。

ビルドが終わると、下図のように、「target」ディレクトリが作成され、その中に sample-1.0-SNAPSHOT.jar というファイルができている。
これを、Nukkit の 「plugins」 にコピーしてサーバを起動すると、読み込まれていることがわかる。

f:id:pekomiya:20180816172810p:plain

Nukkit プラグインの作り方 part.1 - Java のインストールから、IDEの導入 -

あたま書き

BedrockEditionのカスタムサーバ(ここでは、JEのSpigotとかCuberiteとかいれて、プラグインで拡張したもの)って、運営が大変だと聞く。
というのも、ダウングレードができないらしい。

JEのほうが自由度が高くていいんだけど、人口的にはBEっていうグループに属するプレイヤーのほうが多いと思っていて、JEを遊んでた子とかも、友達とできないからBEを買うなんてのをよく聞く。
プラグインの作り方について、日本語で書かれたものもいくらかあるけど、どこもヤフー知恵袋みたいな内容(Wikipediaの内容のコピペだったり、適当に日本語訳したもの)が多く見受けられる。

公式の説明を日本語訳したもので「作れます!」って人は、そもそも公式ページをGoogle翻訳にかければいいんじゃぁ^ー と思ったりするので、ちょっとかみ砕いて説明をした講座を書いてみる。

使うもの・知識

1. Java インストール(すでに入れていたら飛ばしてください。)

世間はJavaのライセンス云々でもめていたりするけど、今回は Java8 の環境で開発、動作確認を行う。

まずは、JDKをインストールする。(JREJDKの違いについては、調べたほうが早い) f:id:pekomiya:20180816144412p:plain

(URL: Java SE Development Kit 8 - Downloads )

上記ページには「Java SE Development Kit 8u181」と「Java SE Development Kit 8u181 Demos and Samples 」があるが、「Demos and Samples」はJDKを使ったサンプルが含まれるため、今回の場合必要ではないので「Java SE Development Kit 8u181」をダウンロードする。
ダウンロードするためには、「Accept License Agreement」にチェックを入れないといけないが、ちゃんとライセンスには目を通しておくこと。

BCL For Java SE

ライセンスに同意できなければ、開発することができないので、OpenJDKを調べよう。

インストーラーがダウンロードできたら、実行してインストールする。

f:id:pekomiya:20180816145119p:plain

インストールが完了したら、PATHJAVA_HOME を設定しておこう。

2. IDEAの導入

Javaのプログラムを開発するためのエディタやIDEは多くあるけど、個人的には「IntelliJ IDEA」が好きだ。 開発ツールというものは、それぞれ良し悪しがあるものだけど、今回の講座では「IntelliJ IDEA」を使用してほしい。(他のIDEの場合…という記事は気が向いたら書く。)

JetBrainsという海外の企業が開発している IDE で、英語だけど、画像多めで書くので心配しないでほしい。

A. インストール

f:id:pekomiya:20180816150720p:plain
(URL: IntelliJ IDEA: The Java IDE for Professional Developers by JetBrains)

上記URLにアクセスして、「DOWNLOAD」をクリックする。

f:id:pekomiya:20180816150858p:plain

「Ultimate」「Community(無料)」という二つのバージョンがあるが、Nukkitプラグインを作る場合「Community」で十分なので、ダウンロードする。 ダウンロードができたら、実行してインストールする。

f:id:pekomiya:20180816151158p:plain

f:id:pekomiya:20180816151325p:plain
(64-bit launcher をチェックしておくといい)

インストールしたら、実行する。

次回から、実際に作ってみます。

続き >>>

pekomemo.hatenablog.jp