Overlay WeaverをEclipseで使う

# Overlay Weaver
DHTなどオーバーレイネットワークを用いたP2Pシステムの研究において、ノードを立てて実験を行うには莫大なリソースが必要になる。また、DHTなどのアルゴリズムは複雑であり、その独自実装によってパフォーマンスが、実装に影響を受けるのか、アルゴリズムに依存するのかがわかりづらい。そこで、Overlay Weaverは構造化オーバーレイネットワークをエミュレーションし、その上での新たなアルゴリズムの比較や、応用アプリケーションの実装を容易にするためのライブラリである。

解説スライド：[オーバレイ構築ツールキット Overlay Weaver](http://www.shudo.net/publications/200605-SACSIS-2006-OW/shudo-SACSIS2006-slides-OverlayWeaver.pdf)
公式HP：[Overlay Weaver](http://overlayweaver.sourceforge.net/index-j.html)

今回は、Overlay WeaverをEclipseで実行し、テストシナリオを作成することによって実験を行う手順を解説する。

# 環境
- MacOS El Capitan
- Eclipse Java EE IDE Oxygen.2 Release (4.7.2)
- Java SE 8 1.8.0_45

# インストール & 環境設定
公式HPをみると、Java 7に対応したところで、更新が止まっているように見えるが、筆者の環境ではJava8で問題なく動作した。

Overlay Weaverはgithubで公開されている。
[shudo/overlayweaver](https://github.com/shudo/overlayweaver)
EclipseでFile->Importで、GitリポジトリからImportし、プロジェクトを作成する。

## ライブラリの読み込み
プロジェクト内にあるライブラリを読み込むように、Project -> Properties -> Java Build Pathから設定をする。Libディレクトリ内のjarファイルを全て読み込むようにすればよい。


# 実行
## 実行ファイルの作成
今回は、テストシナリオ関係のファイルをプロジェクト内scenarioディレクトリに、シナリオをtest-scenario、ログ設定ファイルをlog-off.properties、出力結果をtest-scenario-outに出力するものとする。

とりあえずtest-scenario、log-off.propertiesは以下のように作成する。

``` txt:test-scenario
# the first node
class ow.tool.dhtshell.Main
arg -p 10000
schedule 0 invoke

# invoke nodes
arg emu0
schedule 1000,1000,3 invoke

# put
schedule 2000 control 0 put key0 value0

# get
schedule 3000 control 1 get key0

# show status
schedule 3000 control 0 status

# show localdata
schedule 4000 control 0 localdata
schedule 5000 control 1 localdata
schedule 6000 control 2 localdata
schedule 7000 control 3 localdata
```

```txt:log-off.properties
.level=OFF
```


log-off.propertiesは、logがtest-scenario-outに出力され、実行結果が読みづらくなるのを防ぐために、ログを出力しないようにするための設定である。

## 実行設定
Eclipseで設定ファイルなどの読み込み先、出力先を指定する。

Run -> Run Configurations...から実行設定ウィンドウを開く。
Mainタブで、main classを以下に設定。
```ow.tool.emulator.Main```

<img width="871" alt="スクリーンショット 2018-02-22 10.42.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/82740/e35b615b-4c5f-adc4-13b1-bf903a7f6e00.png">

Argumentsタブから、Program argumentsに以下を設定。
```"${project_loc:overlayweaver}/scenario/test-scenario"```
VM argumentsに以下を設定。
```-Djava.util.logging.config.file="${project_loc:overlayweaver}/scenario/log-off.properties"```

<img width="871" alt="スクリーンショット 2018-02-22 10.43.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/82740/d40b938a-e0f6-c0ea-2cb6-c8acf8f14b57.png">

Commonタブから、Output Fileに以下を設定。
```${project_loc:overlayweaver}/scenario/test-scenario-out```

<img width="872" alt="スクリーンショット 2018-02-22 10.43.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/82740/c2f181cb-012a-3190-b929-8151f06bea74.png">

設定が終われば、apply、runを押せばtest-scenarioに書かれたシナリオが実行でき、test-scenario-outに結果が表示される。

# テストシナリオ
詳しいシナリオの書き方は、公式ドキュメント（[ 計算機 1台上での複数ノードのエミュレーション](http://overlayweaver.sourceforge.net/doc/tutorial/emulator/index-j.html)や[DHTシェル](http://overlayweaver.sourceforge.net/doc/manual/dhtshell/index-j.html)）を参考にしてほしい。ここでは先述のシナリオの説明を簡単にする。

``` txt:test-scenario
# the first node
class ow.tool.dhtshell.Main
arg -p 10000
schedule 0 invoke

# invoke nodes
arg emu0
schedule 1000,1000,3 invoke

# put
schedule 2000 control 0 put key0 value0

# get
schedule 3000 control 1 get key0

# show status
schedule 3000 control 0 status

# show localdata
schedule 4000 control 0 localdata
schedule 5000 control 1 localdata
schedule 6000 control 2 localdata
schedule 7000 control 3 localdata
```

まずは、最初のノードを立ち上げている。その後、3つのノードを立ち上げ、接続している。Key-ValueをDHT内にput、getを行い、stausの閲覧、各ノードlocalにあるデータの閲覧を行っている。なお、Overlay Weaverでは、DHTのアルゴリズムを特に指定しなければChordになる。

schedule命令は、`schedule ミリ秒 命令`の形式で、実行開始からのミリ秒後に何をするかを記述できる。control命令は`control NodeID 命令`の形式で各ノードに対して命令を渡してあげることができる。

したがって、`schedule 2000 control 0 put key0 value0`は、「実行開始2000ミリ秒後にノード0からkey0をキーとして、value0をDHTへputする」という命令になる。

# 終わりに
P2Pの研究は2001年のChordの発表以降盛り上がりを見せたのち、少し下火になっている印象があるが、ブロックチェーンなどの新たなP2P技術の登場に合わせて、再注目されるのではないか、という期待を持っている。

こうしたシュミレータ自体の開発は数年止まっているようだが、P2Pの研究においては必要不可欠な存在なので、ぜひ継続的な利用者の増加と、メンテナンスの継続が行われていったら、と思う。

#　参考
[Overlay Weaver の使い方 - 情報科学屋さんを目指す人のメモ（FC2ブログ版）](http://did2.blog64.fc2.com/blog-entry-309.html)

余談だが、このブログの[P2Pの専門知識ゼロから独自DHTを実装評価するまでの学習方法と参考資料まとめ](http://did2.blog64.fc2.com/blog-entry-425.html)は大変参考になったので、P2Pに興味のある人は一読すると良い。