ndnSIMドキュメント ~環境構築編~

# 1. このドキュメントについて
ndnSIM公式ドキュメントは[ここ](http://ndnsim.net/2.3/)にあります。
ほとんどは公式ドキュメントで事は済むのですが、インストール、シミュレーションの実行辺りの説明が少し不親切なので、備忘録がてらメモしました。
また、ndnSIMの日本語の公式ドキュメントは存在しないので、ndnSIMを使いたいという皆さんのために少しでも役立てば、と考えて書きました。

# 2. シミュレーション環境について
現在のところ、LinuxもしくはmacOSしかサポートしてないようです。
公式ドキュメントではLinuxはUbuntuしかサポートしていないようなことを言っていますが、CentOSでもきちんと動きました。
ndnSIMはns-3のNDNモジュールなので、ns-3が動作する環境なら（ほぼ）どこでも動作すると思います。

今回のドキュメントは筆者の都合上、**CentOS**でndnSIMを動かすことを仮定して話を進めていきます。
その他の環境で動かそうを考えている方はコマンドを適宜読み替えてください(^^)

# 3. ndnSIMのインストール＆セットアップ手順
公式ドキュメントの[Getting Started](http://ndnsim.net/2.3/getting-started.html)を参考に進めていきます。

## 3-1. 依存ライブラリ（特にbzip2とBoost）のインストール
ndnSIMはBoostを使用します。
ただ、Boostのバージョンは1.54以上でないといけないので、最新のBoostライブラリを取ってきてマシンにインストールします。
ですが、Linuxの場合はbzip2を解凍するライブラリが無いため、まずbzip2のライブラリをインストールすることから始めます。
ターミナルで以下のコマンドを打ち込んでbzip2ライブラリをインストールします。

```sh
wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
tar zxf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
sudo make PREFIX=/usr/local CFLAGS="-fPIC -O2 -g" install
```

次にBoostライブラリをインストールします。

```sh
wget http://downloads.sourceforge.net/project/boost/boost/1.64.0/boost_1_64_0.tar.bz2
tar jxf boost_1_64_0.tar.bz2
cd boost_1_64_0
./bootstrap.sh
sudo ./b2 --prefix=/usr/local install
```

Sudo権限を持っていない環境の場合はbzip2やBoostをインストールする先のPrefixを少々変更する必要があります。
詳しくは[公式ドキュメント](http://ndnsim.net/2.3/faq.html#installing-boost-libraries-to-a-non-privileged-location)に委ねます。

その他の依存ライブラリは次のコマンドでインストールします。
(2017/05/14追記：`epel-release`をインストールします。`cryptopp-devel`をインストールするためです。)

```sh
sudo yum install epel-release
sudo yum install gcc-g++ git sqlite-devel cryptopp-devel openssl-devel
```


オプショナルですが、ndnSIMでビジュアライザを動かしたい方はpythonの諸々のライブラリをインストール必要があります。
おしゃれなシミュレーションをしたい場合はぜひご利用ください(^^)

```sh
sudo yum install pygoocanvas python-kiwi graphviz-python
sudo yum install graphviz-devel
sudo yum install python-pip
sudo easy_install pygraphviz
```

（補足：上のコマンドだと「ファイルは存在しません」と怒られる場合があるので、適宜他のコマンドで同じことを実行してみてください…）

## 3-2. ndnSIMのダウンロード
次に今回の目的のndnSIMをマシンにダウンロードします。
ndnSIMのコードを置きたいディレクトリに移動し、以下のコマンドを打ち込んでください。

```sh
mkdir ndnSIM
cd ndnSIM
git clone https://github.com/named-data-ndnSIM/ns-3-dev.git ns-3
git clone https://github.com/named-data-ndnSIM/pybindgen.git pybindgen
git clone --recursive https://github.com/named-data-ndnSIM/ndnSIM.git ns-3/src/ndnSIM
```

## 3-3. ndnSIMの実行
ndnSIMを動かす前に、まずndnSIMのコンフィグをしてからマシンにndnSIMのライブラリをインストールする必要があります。
ndnSIMは基本的に[`waf`](https://waf.io/)と呼ばれるソフトウェアを利用してコンフィグ、ビルド、そしてインストールをします。
以下のコマンドを叩きます。

```sh
cd ns-3
./waf configure --boost-includes=/usr/local/include --boost-libs=/usr/local/lib --enable-examples -d debug && ./waf && sudo ./waf install
sudo ldconfig
```

これでndnSIMを動かす環境は整いました。
まずシミュレーション例を動かしてみましょう。

```sh
./waf --run=ndn-simple
```

2017/05/14追記：上記のコマンドでシミュレーションが動かない場合は以下のように実行してください。

```sh
PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/include ./waf --run=ndn-simple
```

動いたら環境設定成功です！おめでとうございます！
~~動かなかったら地獄のデバック作業の始まりです。~~
その他の例は[ここ](http://ndnsim.net/2.3/examples.html)にあるので遊んでみるといいと思います。

3-1.でpythonのライブラリを入れた方は以下のようにコマンドを実行することでビジュアライザとともにシミュレーションを動かすことができます。

```sh
./waf --run=ndn-simple --vis
```


## 3-4. scenario templateの利用
ndnSIM直下のns-3のファイルをいじって個々のシミュレーションファイルを作成することは[推奨されていません](http://ndnsim.net/2.3/best-practices.html)。
そのため、ndnSIMではscenarioと呼ばれる別ディレクトリを用意してそこに独自のシミュレーションファイルを入れます。
ここでは予め用意されているscenario templateをダウンロードし、そしてscenario templateを用いてシミュレーションする方法を記載します。
（実はここが一番面倒くさかった…。）

まずは以下のコマンドを実行してscenario templateをダウンロードしてください。

```sh
cd ..
git clone https://github.com/named-data-ndnSIM/scenario-template.git my-simulations
cd my-simulations
```

次に3-3.で行ったのと同じようにコンフィグします。

```sh
PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/include ./waf configure --debug
```

最後にシミュレーションの実行します。ここでは仮に`simulation`というシミュレーションファイルを作成したとします。

```sh
PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/include ./waf --run=simulation
```

# 4. シミュレーションファイルの作成
ndnSIMは強力な[APIドキュメンテーションサイト](http://ndnsim.net/2.3/doxygen/annotated.html)を持っています。
このサイトを閲覧することでシミュレータ内で何が起こっているかが大体わかります。

シミュレーションファイル自体は`my-scenario/scenarios`フォルダ内に置き、シミュレータ自体に何か手を加えたい場合はそのファイルを`my-scenario/extensions`フォルダ内に置き、シミュレーションします。

具体的なシミュレーションファイルの作成方法は別記事にまとめようと思います。