Translate

2017年1月24日火曜日

kotlinでplugin

KotlinでImageJ Plugin作成-1

はじめに

Kotlinという言語がある。Javaと互換性があり、Androidのアプリ開発で使われている。AppleのSwiftになんとなく似てる。Null安全というおもしろい仕組みがある。たとえばJavaで
ImagePlus imp;
Roi roi = imp.getRoi();
とすると、ビルドは通るが実行時にNullPointerException(ヌルポ)が出て怒られる。kotlinで同じ個所を書くとこんな感じになる(と思う)
var imp: ImagePlus? = null
var roi: Roi? = null

if (imp != null)
    roi = imp.Roi;

//あるいは
roi = imp?.Roi;
なんだかJavaのコードに比べてコード数が倍以上に増えてしまっている。
  • Kotlinでは、nullが代入される可能性がある変数には、?をつけないといけない(1行目、2行目)。
  • nullを参照する際に、if文でnullじゃないことを確認しないとけない(4行目、5行目)
  • あるいは、安全呼び出しとして、.のかわりに?.を使う必要がある(7行目)
こうすることで、ビルドの段階でnullをはじくことができるため、デバッグが容易になる。 kotlinでImageJのPluginを開発するのはなかなか良いのではないかと思い、作ってみる。

準備

(いつものように)形から入る。kotlinを扱う場合、IDEはEclipseではなくIntelliJ IDEAがいいらしい。そもそもKotlinはJet Brains社で開発された言語で、IntelliJ IDEAもJet Brains社が提供しているので相性が良い。EclipseにもPluginはあるそうだが、どうもそれほど使い勝手が良くないらしい(2017.1.23現在。自分では試していません。。。)。ということで、IntelliJ IDEAをインストールする。当然Community Edtion (Free)。

Intelli Jの設定

  1. Intelli J IDEA
    • 真ん中にあるDownloadを選んで、CommunityをDownload
    • インストールはデフォルト設定で良いと思います。
  2. 初期設定(かなり適当)
    • 起動後、設定を引き継ぐかどうか聞かれるので適当に選択
    • プロジェクトの保存先(Eclipseでいうworkspace)を聞かれるので適当に作成する
    • Create New Projectを選ぶ
      • Check out from Version Controlを選べば、例えばGithubからリポジトリをCloneしてくることも可能(minimal-ij1-pluginとか)。今回は使わない。

Kotlin + ImageJのプロジェクト作成

  1. Create New Projectを選ぶと、New Projectというウィンドウが出てきて、JavaとかKotolinとかのProjectを作成することができる。ここでは、あえてMavenを選ぶ(後でkotolinにします)
    • Kotlinを選んでからMaven可もできるはずだけどよくわからなかった。。
  2. いろんなarchetypeが出てくるが、ImageJのPlugin開発には関係ない(たぶん)なので、右下の[Next]を選ぶ
  3. MavenでおなじみのGroupid, Artifactid, Versionを入力する
    • Groupidは開発者が属する組織や、個人を識別するドメインを入れる。私の場合はjp.yo4など。ドメインの順は逆なのが通例
    • Artifactidは最終的なプロダクト(.jarなど)の名前になる。ImageJのPluginの場合、必ず名前のどこかにアンダーバー”_”を入れないといけない
    • Versionはお好みで。開発中のバージョンにはSNAPSHOTを入れておく。
  4. Project名と保存場所を指定して[Finish]
  5. そうすると、何もない殺風景な画面になり心配になるのでとりあえずProject Viewを開く。[View -> Tool Window -> Project]
  6. 画面左にProjectが表示される。

ProjectのKotolin化

このままではただのMavenのProjectなのでこのProjectをKotlin化する
  1. メニューから[Tools -> Kotlin -> Configure Kotlin in Project]
  2. Single moduleで今作ったProjectを選んで[OK]

ImageJのdependencyを加える

いつもはminimal-ij1-pluginをgithubからクローンして設定を書き換えて使っているが、ここでは新規にMavenのProjectを作ったので、手動でdependencyを加えてみる。
  1. pom.xmlを開く
    • すでに開いている場合はそのままでよい。開いていない場合は、Project Viewの自分のProjectを展開してpom.xmlを選ぶ
  2. どこでもいいので[alt + insert]を押す
  3. GenerateというContext menuが現れるので、Dependencyを選ぶ
  4. Maven Artifact Searchウィンドウが開く。ここからMaven Repositoryを選ぶことができる。
  5. 上のフォームに”imagej”と入力する
  6. たぶん3つの候補が得られる。最低限必要なのは真ん中のij:1.xx (xxはバージョン名)
    • imagej-maven-pluginをいれると、ImageJのPluginを開発するときに便利な機能(copy-jars)が使えるようになる。
    • pom-imagejはImageJの様々なライブラリであるBill of Materialsが使えるようになる
  7. とりあえず、真ん中のij:1.51gを入れとく
以上でKotlin+ImageJ開発環境が整ったので、プラグインを開発していく。

(2017/01/25 タイトルを少し変更)
(2017/03/10 Maven Artifact Searchのウィンドウを追加)

4 件のコメント:

  1. ImageJのdependencyを加えるの項目の5番で3つの候補が得られません
    「Not Result」と返ってきます。他に設定する項目があるのでしょうか?
    Windows10,Communiyu Edition2016.3.5です

    返信削除
  2. こんにちは。コメントありがとうございます。Maven artifact searchのウィンドウが表示された際に、repositoryの一覧は表示されているでしょうか(ブログ本文に画像を追加しました)。表示されていない場合、Maven RepositoryをUpdateする必要があるのかもしれません(私は無意識でやっていたのかも。。)
    Stack overflowに以下の記事がありました。
    http://stackoverflow.com/questions/3990372/maven-artifact-search-is-always-empty
    Maven Repositoryをreimportする
    http://stackoverflow.com/questions/9980869/force-intellij-idea-to-reread-all-maven-dependencies
    このあたりが参考になるのかもしれません。。

    返信削除
  3. 返信ありがとうございます。
    頂いた情報を基に問題を解決することができました。ありがとうございます。
    続きの記事を参考にしてInvertのサンプルを作ることができました。
    ありがとうございました。

    返信削除
  4. うまくいってよかったです。またどうぞよろしくお願いします。

    返信削除