[Blender] BlenderプラグインをBlender本体に取り込んでもらうまでの流れ

作成したBlenderのプラグインをBlenderのリポジトリへcommitする流れを毎回のように忘れてしまうので、まとめることにしました。
これからBlenderのプラグインをBlender本体に登録したい方は参考になるかと思います。
（元記事：http://d.hatena.ne.jp/nuttinutti/20150124）

# プラグインの機能が既に存在するか確認する
作って公開したいプラグインが、既にBlenderに存在する機能であるかを確認します。

Blenderで公開されているプラグインは、バージョン2.6であれば[Blender Addons Catalog](http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts)から確認することが出来ます。
作成したプラグインの機能が存在しない場合はラッキー。
有用な機能であれば、Blender本体に登録される可能性が高くなります。

既に機能が存在する場合でも諦めるのはまだ早いです。
公開されているプラグインに性能面や機能面で問題点がないか確認してみましょう。
問題点の改善や新機能を追加することで、Blender本体に登録させてもらえる可能性もあります。
もちろん既存のプラグインに比べて何も進展がないようなプラグインでは、Blender本体への登録は厳しいです。

# プラグインを作成する
プラグインが新規のものか既存のものかが分かったら、プラグインを作成していきます。
[過去の記事](http://qiita.com/nutti/items/a836391723bd28cd3e4c)でBlenderのプラグインの作成方法について簡単にまとめていますので、参考にしてみてください。

最終的にBlender本体として公開することを考えている場合、プラグインの作成には少し気をつけることがあります。
Blender本体として公開するということは、いわば"Blenderのソフトウェアの1つ"として公開されることと同じことになるため、プラグインのソース自体の品質的にも一定以上のものが求められます。
品質といっても良く分からないと思いますが、具体的には以下の2点に気をつけつつプラグインを作成していくとよいと思います。
<ul><li>コーディング規約
Blender特有の情報をプラグインに記述する必要があります。（[Script requirements](http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Guidelines/Addons)を参考にしてみてください。）
加えてPythonのコーディング規約であるpep8に準拠している必要があります。pep8については、[PEP 8 - Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/)を参考にしてください。
1行の最大文字数が79文字を超えてはならないpep8-80というのもありますが、ここまでは求められていないようです。
</li><li>Pythonの効率的な記述
Pythonは同じ機能を実現する時、誰が書いても似通ったコードになるという話も聞きますが、書き方ひとつで実行効率が大きく変わってきます。
例えば、リストに格納された値を2倍にしたリストを作成するコードを見てください。

```pycon:optimize_sample_1.py
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> double_l = []
>>> for i in l:
...    double_l.append(i * 2)
...
>>> double_l
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```

これをPythonの機能であるリスト内包表記で書くと、以下のようになります。

```pycon:optimize_sample_2.py
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> double_l = [i * 2 for i in l]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```

最終結果はどちらも同じですが、リスト内包表記を用いた場合のほうが実行速度が速いです。
これは、最初の例では"append属性を取り出して関数を呼び出す"という処理に対して、リスト内包表記を用いた場合は"リストに要素を追加する"という処理になるからです。
この辺の詳しい内容は[ここ](http://dsas.blog.klab.org/archives/51742727.html)で紹介されているので気になる方は確認してみてください。
</li></ul>

書き方次第で実行速度が変わる例を出しましたが、Blenderではより性能の良いプラグインが好まれます。
使う人にとっては少しでも速く実行されたほうが良いのは当然といえば当然ですね。
ですから[Best Practice](http://www.blender.org/api/blender_python_api_2_62_1/info_best_practice.html)を確認して、ぜひ効率の良いプラグインを作ることを心がけてみてください。

# プラグインの機能レビューを受ける
苦労して（？）作成したプラグインが完成したら、いよいよ次はレビューです。
レビューといっても、いきなりプラグインのソースレビューを行うのではなく、作成したプラグインが実用的なものかを判断する機能レビューになります。
過去の経験から、登録までの流れの中でこのレビューが最も厳しいと感じます。
レビュワーによる機能の改善提案への対応も厳しい要因の一つですが、作成したプラグインに対して賛同を得る人を増やすのが何よりも難しいです。
ここは辛抱強く待つしかありません。Blenderの関連サイトに宣伝してもよいかもしれませんね。
例えば、[Blender Artists](http://blenderartists.org/forum/forumdisplay.php?48-Released-Scripts-and-Themes)に投稿するのもありかもしれません。

レビューの申請は、[developer.blender.org](https://developer.blender.org/)（通称D.B.O）から行います。
D.B.Oは会員制となっているため、ユーザ登録が必要ですので登録しましょう。
会員登録したら、右上の**＋**から**Maniphest Task**をクリックして新しいタスクを作成します。
新しいタスクを作成するためには以下の項目を入力していきます。
<ul><li>Title
**作成したプラグインの機能**がはっきりと分かるようなタイトルをつけましょう。
</li><li>Assigned To
タスクを誰に割り当てるかを指定します。
B.P.O内に知り合いがいる場合は、追加してみるのもよいでしょう。
追加しなくても誰かしらレビューしてくれると思うので、何も追加しなくても良いです。
ちなみに私自身もB.P.Oに登録しているので、タスクを割り当ててくれればレビューできるかもしれません。（ユーザ名：Nutti）
</li><li>CC
自分を追加しておけばよいでしょう。
</li><li>Priority
タスクの緊急度を設定します。基本はNormalで。
早くレビューを済ませたい方は、Highにしておくと見てくれる可能性があがるかもしれません。
</li><li>Projects
プロジェクト名を指定します。
プロジェクト名はプラグインの機能を連想させるものにすると良いです。
</li><li>Type
作成したプラグインを登録することを考えているため、今回のケースでは**Patch**を選択します。
</li><li>Description
作成したプラグインの詳細を記載します。
フォーマットは特に決まっていませんが、どうしたらよいか分からない人は、[私のプラグインのタスク](https://developer.blender.org/T38460)を参考にしてみてください。
</li></ul>

タスクを作成したら、後は反応をひたすら待つのみです。
なお、レビュワーによる機能の改善提案への対応は積極的に行いましょう。
レビュワーの意見を聞くことで、この人はサポートもしっかりしてるし今後も期待できそうだと考え、作成したプラグインに対する支持者が増えてきます。
そして・・・レビュワーからBlender本体に対して登録したらどうですか、というコメントがもらえたら・・・おめでとうございます！Blenderへの登録はもうすぐそこです！

# Wikiページの作成
機能レビューを通ったら、プラグインのWikiページを作成しましょう。
プラグインのWikiページは[Blender Addons Catalog](http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts)から参照することができます。
Wikiページに掲載する項目はほとんど決まっているので、他のプラグインのWikiページを見ながら作成していくとよいでしょう。
参考になるか分かりませんが、私の作成したプラグインのWikiページは[ここ](http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/UV/Copy_Paste_UVs)から参照できます。
なおWikiページのアカウントはB.P.Oとはアカウントが異なりますので、ユーザ登録していない場合は追加してください。

# ソースコードレビュー
Wikiページを作成したら、プラグインのソースコードをレビューしてもらいましょう。
機能のレビューと同様、ソースコードのレビューについても[developer.blender.org](https://developer.blender.org/)から申請を出します。
ソースコードレビューを受けるまでの流れを以下に示しますので、参考にしてみてください。
また、[Wikiページ](http://wiki.blender.org/index.php/Dev:Doc/Tools/Code_Review)にもコードレビューの仕方が載っているので、こちらも参考にしてみてください。
<ol><li>最新のBlenderリポジトリを取得
プラグイン用のレポジトリを取得します。
プラグインには以下の3種類がありますが、今回は**Contrib**として登録します。
<ul><li>Release
Blenderの公式プラグインです。追加するためには本手順に加えて追加の手順が必要なようです。こちらは今回対象外とします。
プラグインはレポジトリのrelease/scripts/addonsに保存されます。
</li><li>Contrib
機能・ソースレビューが完了していて、一定の品質を得ているプラグインです。
プラグインはレポジトリのrelease/scripts/addons_contribに保存されます。
</li><li>External
レビューが行われていないプラグインのため、プラグインの利用は自己責任です。
</li></ul>
最新のBlenderのリポジトリを取得する方法を以下に示します。

```shell-session:source_review_1.sh
$ cd [作業用ディレクトリ]
$ git clone git://git.blender.org/blender-addons-contrib.git
```

</li><li>作成したプラグインを指定の場所に置く
リポジトリ取得後、作成したプラグインをリポジトリへ移動させます。

```shell-session:source_review_2.sh
$ cd blender-addons-contrib
$ cp [作成したプラグイン] .
```

</li><li>差分を取得
リポジトリへ移動後ソースの差分を取得します。
以下のコマンドを実行し、出力結果をコピーします。

```shell-session:source_review_3.sh
$ git diff
```

</li><li>レビューを依頼する
[developer.blender.org](https://developer.blender.org/)の左側にある**Differential**をクリックした後に表示される、**Create Diff**をクリックします。
先ほどコピーした出力結果を**Raw Diff**にペーストし、一番下の**Create Diff**のボタンをクリックします。
</li></ol>

# レポジトリへソースの取り込み
ソースコードレビューにて、指摘の反映が済んだらBlenderのリポジトリに登録しましょう。
リポジトリへの登録の手順を説明します。
<ol><li>リポジトリに対するcommit権の取得
Blenderのリポジトリへ登録（commit）するためは、リポジトリ管理者からcommitの権利を貰う必要があります。
現在リポジトリの管理はIdeasmanという方が行っているようです。
[IRC](http://webchat.freenode.net)と呼ばれるチャットに入り、Ideasmanにリポジトリのcommit権限を与えてもらうようにお願いしましょう。
・・・ちなみにチャットに入るときには、他の人の名前でログインしないよう気をつけましょう。
私は最初使い方がわからず、話したい人の名前を入力するのかと思っていたので、Ideasmanという名前で入ってしまい色々と騒ぎになってしまいました。（私の無知さが面白かったから気にしないでなど、厳しいコメントはありませんでしたがさすがに焦りました。）
英語でのチャットになりますが、Web調べながら言いたいことを伝えていけば良いのでなんとかなるでしょう。
それでも・・・という方は、私に一報いただければ可能な限りサポートしたいと思います。
</li><li>リポジトリの取得
commit権をもらったら、リポジトリを取得しましょう。
リポジトリの取得については、[Wikiページ](http://wiki.blender.org/index.php/Dev:Doc/Tools/Git)が参考になるでしょう。
リポジトリの取得は、例えば以下のように行います。

```shell-session:source_commit_1.sh
$ cd [作業用ディレクトリ]
$ git clone git://git.blender.org/blender-addons-contrib.git
$ cd blender-addons-contrib
$ git submodule update --init --recursive
$ git submodule foreach --recursive git checkout master
$ git submodule foreach --recursive git pull --rebase origin master
$ git pull --rebase
$ git submodule foreach --recursive git pull --rebase origin master
```

</li><li>著者・連絡先の設定
リポジトリへcommitした時に、commitを行った人物や連絡先を設定します。
この設定は一度行っておけば、2度目以降は実施する必要はありません。

```shell-session:source_commit_2.sh
git config --global user.name "[名前（ニックネーム可）]"
git config --global user.email "[連絡先メールアドレス]"
```

</li><li>commit権の設定
リポジトリに対するcommit権の設定を行います。

```shell-session:source_commit_3.sh
$ git remote set-url origin git@git.blender.org:blender-addons-contrib.git
```

</li><li>ssh鍵の登録
以下のコマンドを実行し、ssh鍵を作成します。

```shell-session:source_commit_4.sh
$ ssh-keygen
```

作成したssh鍵の公開鍵は~/.ssh/id_rsa.pubに置かれているので、これを[developer.blender.org](https://developer.blender.org/)に登録します。
D.B.Oの右上の**工具マーク**をクリックし、左メニューの**SSH Public Keys**をクリックします。
そして、**Upload Public Key**をクリックし、**Public Key**にid_rsa.pub本文をコピー＆ペーストして、Nameに適当な名前をつけて**Add Key**をクリックすることで、ssh鍵の登録が完了します。
</li><li>登録するプラグインを配置
登録したいプラグインを希望の場所に置きましょう。

```shell-session:source_commit_5.sh
$ cd blender-addons-contrib
$ cp [作成したプラグイン] .
```

</li><li>ローカルリポジトリへcommit
Blender本体へリポジトリを登録する前に、ローカルのリポジトリへcommitします。

```shell-session:source_commit_6.sh
$ git add [作成したプラグイン]
$ git commit
```

git commitを実行するとエディタが開きます。
ここに登録した内容を記すことになりますが、記入する内容は[フォーマット](http://wiki.blender.org/index.php/Dev:Doc/New_Committer_Info#Commit_Logs)に従っておけばまず間違いないでしょう。
</li><li>リモートリポジトリ（Blender本体のリポジトリ）へpush
いよいよ登録も最終段階です。プラグインをBlender本体のリポジトリへ登録しましょう。
登録は以下のように行います。

```shell-session:source_commit_7.sh
$ git pull --rebase
$ git push
```

</li></ol>

おめでとうございます！
これであなたが作成したプラグインがBlender本体へと取り込まれました。
次のBlenderのバージョンが公開された時から、Blender本体にあなたの作成したプラグインが入っていることになります。
作業はここで終わりですが、最後に作成したプラグインの宣伝＆バグ修正などの報告のためのサポートページを作成しましょう。

# サポートページの開設
作成したプラグインはBlenderの本体として公開されますので、作成したプラグインのユーザも多くなると思います。
プラグインにバグがあった場合や新機能追加の要望など、ユーザが開発者に対してコンタクトの取れる場が必要になってきます。
そこで宣伝も含めて、あなたのプラグインのサポートページを作成してみましょう。
Blenderプラグインのサポートページとして最も有名なのは、[Blender Artists Community](http://blenderartists.org/forum/)（会員登録制：無料）ですね。
様々なプラグインの宣伝が**Released Scripts and Themes**で行われています。
新たなスレッドを作成するため、**POST NEW THREAD**から投稿してみましょう。
内容は好きに書いてもらって良いです。
操作手順の動画や画像を貼るのも良し、追加機能を募集するのも良し、バグ報告の場として利用するのも良しです。

なおサポートページですが、Blender Artists Community以外にも[GitHub](https://github.com/)などのOSSホスティングサービスも候補としては良いでしょう。

# おわりに
作成したプラグインをBlender本体として公開する方法を共有させていただきました。
公開まで非常に長い道のりですが、Blender本体へ登録される（＝自分の作成したソフトウェアが評価される）ことによる達成感は非常に大きいです。
またBlender本体へ公開する過程で、機能レビュー・ソースレビューなどのソフトウェア開発工程を体験できるため、スキルアップとしてもよいのではないでしょうか。
そしてなにより、公開してプラグインを使ってもらい感想をもらえる（それも海外の人から）というのは作り手からすると大変うれしいものです。
良いアイデアが持っていたら、ぜひ公開することを検討してみましょう！！
長くなりましたが、お疲れ様でした！