dorapon2000’s diary

忘備録的な。セキュリティとかネットワークすきです。

Ubuntu 16.04 LTS で ns3.29 をインストールする

追記

Ubuntu 18.04へのns-3.30のインストール方法をQiitaに書きました.

qiita.com


ns3.29が2018年9月4日にリリースされました。 ns3は1年に1回というペースでバージョンアップを繰り返しています。 早速自分もインストールしてみました。 以下では全部のせ(ns-allinone-3.29)のインストールをします。

エラーを被りながら、右往左往して得た最短ルートをうろおぼえで書いています。 間違っていたらコメントで指摘してくださると助かります。

環境

プレインストール

ns3のインストールの前に、必要なパッケージをaptコマンドでインストールしていきます。

$ sudo apt update
$ sudo apt upgrade

とりあえず、Installation - Nsnamに従って必要なパッケージをすべて入れます。 16.04でない環境の方は若干違うので、詳細はリンクを参照してください。

sudo apt install gcc g++ python python-dev
sudo apt install mercurial python-setuptools git
sudo apt install qt5-default
sudo apt install gir1.2-goocanvas-2.0 python-gi python-gi-cairo python-pygraphviz python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython ipython3  
sudo apt install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev
sudo apt install autoconf cvs bzr unrar
sudo apt install gdb valgrind 
sudo apt install uncrustify
sudo apt install doxygen graphviz imagemagick
sudo apt install texlive texlive-extra-utils texlive-latex-extra texlive-font-utils texlive-lang-portuguese dvipng
sudo apt install python-sphinx dia 
sudo apt install gsl-bin libgsl2 libgsl-dev
sudo apt install flex bison libfl-dev
sudo apt install tcpdump
sudo apt install sqlite sqlite3 libsqlite3-dev
sudo apt install libxml2 libxml2-dev
sudo apt install cmake libc6-dev libc6-dev-i386 libclang-6.0-dev llvm-6.0-dev automake
pip install cxxfilt
sudo apt install libgtk2.0-0 libgtk2.0-dev
sudo apt install vtun lxc
sudo apt install libboost-signals-dev libboost-filesystem-dev

ns3のダウンロード

以下はほぼGetting Started — Tutorialの翻訳みたいなもの。

ホームディレクトリを汚したくない方はワーキングディレクトリを作成してそちらにインストールしてください。 ns3のダウンロードにはいくつか方法がありますが、ここではbakeを使います。 別の方法としてtarballをダウンロードしてからインストールする方法もあるのですが、私の環境ではエラーが出てしまいました。

$ cd
$ mkdir workspace
$ cd workspace
$ hg clone http://code.nsnam.org/bake

bakeというディレクトリが作成されます。

$ ls bake
bake                  bakeconf.xml  doc       generate-binary.py  TODO
bake.py               examples      test

一時的にbakeディレクトリへのプログラムパスを通します。

cd bake
export BAKE_HOME=`pwd`
export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

bakeを用いてns3をダウンロードします。 ns-allinone-3.29の部分のバージョン番号を直せば特定のバージョンを入れられます。 また、必要最低限のns3パッケージだけでいい場合は-e ns-3.29として下さい。

$ ./bake.py configure -e ns-allinone-3.29
$ ./bake.py check
$ ./bake.py download

sourceというディレクトリが新しくできます。

$ ls source
BRITE          netanim-3.108  openflow-ns-3.25  pygccxml-1.9.1
castxml        ns-allinone-3.29        pybindgen         v1.9.1.tar.gz
click-ns-3.25  nsc-0.5.3      pygccxml

ns3のビルド

ns3のビルドをします。

$ ./bake.py build

ns3のテスト

ns3に同封されているテストコードを実行して正常に動くか確認します。

$ cd ns-allinone-3.29
$ ./test.py

30分くらいかかりました。

最後にns3のサンプルスクリプトを動かしてみます。

$ ./waf --run hello-simulator
Hello Simulator

Hello Simulatorと表示されれば無事ns3.29のインストールは完了です。 お疲れ様でした。

参考

ネットワークシミュレータ ns-3.28 を Ubuntu 16.04 にインストール - ハードでもソフトウェア http://orsnken.hatenablog.com/

※記事のURLを貼るとバグるのでサイトトップページのURLで失礼します。

gnuplotほどよく必要最低限まとめ

実験で出たデータを手っ取り早くグラフ化して確認したいときに毎度gnuplotでぐぐってる気がするので、自分のために必要最低限だけまとめておきます。

環境

インストール

$ sudo apt install gnuplot

実行

グラフ化したいデータファイルを次のように用意しました。

$ cat data.tr
# comment
# x y z
1 2 1
2 4 4
3 6 9
4 8 16
5 10 25
6 12 36
7 14 49
8 16 64
9 18 81
10 20 100

gnuplotスクリプトをファイルへ書きます。 今回はxとyの値を使ったグラフを出力します。zの値は使いません。

$ cat graph.plt
set xlabel "x"
set ylabel "y"
plot "data.tr" using 1:2 w lp title "y = x ^ 2"
set terminal png
set output "graph.png"
replot
  • xlabelylabelはx軸y軸のラベル名。

  • plot "data.tr"gnuplotの核で、そのファイルを読み込んでグラフにプロットする。

  • using 1:2は1行にある空白区切りの1個目(=x)の値をx軸、2個目(=y)をy軸の数字として読み取れという意味。

  • w lpwith linespointsの短縮形で折れ線グラフになる。

  • title "y = x ^ 2"はそのまま。

ここまでがgnuplotによる画面への出力/描画で、出力先をpngファイルへ切り替えて、ファイル名の指定、pngファイルへの再描画をそれ以下で行っています。

gnuplotコマンドに渡して実行してみます。

$ gnuplot graph.plt

f:id:dorapon2000:20181007082508p:plain

ファイルへの出力だけにしたい場合は、いきなり出力先をpngに切り替えておきます。 WSL上でgnuplotを動かす場合はこうしないとうまく動きませんでした。

$ cat graph.plt
set terminal png
set output "graph.png"
set xlabel "x"
set ylabel "y"
plot "data.tr" using 1:2 w lp title "y = x ^ 2"

指定できるグラフの種類

with ???
lines ライン表示
points データポイント表示
linespoints ラインとデータポイント表示(折れ線表示)
impulses インパルス表示
dots ドット表示
steps ステップ表示
errorbars 誤差グラフ
boxes 棒グラフ
boxerrorbars 誤差と棒グラフ

CSVファイル

ファイルの先頭にset datafile separator ","を入れることで区切り文字をカンマへ変更できます。

引数を渡す

$ gnuplot -e 'indir="input"; outdir="$OUTPUT_DIR"' myscript.plt
set terminal png
set output outdir."/my_plot.png"
plot indir."/my_data.dat"

.は文字列結合

参考

シェル芸入門忘備録

突然シェル芸が勉強したくなったので、勉強したコマンドたちをまとめました。 シェル芸を忘れた未来の自分と、シェルは使ってるけどシェル芸のコマンドは知らない人向けです。 説明はできるだけ省いて、上から実行結果を見ていくだけで内容とシェル芸の雰囲気がつかめるよう努めました。


実施環境

紹介するコマンド

  • man
  • seq
  • shuf
  • tac
  • rev
  • yes
  • bc
  • tr
  • cut
  • sort
  • uniq
  • sed
  • awk
  • xargs
  • grepオプション
  • lsオプション

man

基本のキ。ホームポジションから手を離さず使い方を思い出せる。

$ man man

seq

連番を生成。1からなので注意。

$ seq 10
1
2
3
4
5
6
7
8
9
10

0から生成。

$ seq 0 5
0
1
2
3
4
5

bashの機能でも似たようなことができる。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

shuf

出力の順番をシャッフルする。

$ seq 5 | shuf
3
4
2
1
5

tac

逆順に表示。

$ seq 5 | tac
5
4
3
2
1

rev

各行の文字列をリバースする。

$ echo "いろはにほへと" | rev
とへほにはろい

yes

yを無限出力。

$ yes | head -5
y
y
y
y
y

文字を指定。

$ yes hello! | head  -5
hello!
hello!
hello!
hello!
hello!

bc

文字列を計算する。

$ echo "1+2*3" | bc
7

tr

置換。引数に空白""指定不可。

$ echo 1 2 11 10 2 | tr " " "\n"
1
2
11
10
2

$  echo 1 2 11 10 2 | tr "12" "ab"
a b aa a0 b

特定の文字列削除。

$ echo 1 2 11 10 2 | tr -d " "
1211102

cut

半角空白" "を区切り文字として3フィールド目を取得。区切り文字はデフォルトでタブ\t

$ echo 1 2 11 10 2 | cut -d" " -f3
11

-bでバイト目を取得。-cで文字目を取得だが、ubuntu@WSLではマルチバイト文字があるとエラーを吐いた。Macのcutは正しく動いた。

$ echo hello! | cut -b 2
e

$ echo hello! | cut -b 2-
ello!

sort

$ echo 1 2 11 10 2 | tr " " "\n" | sort
1
10
11
2
2

# --numeric-sort
$ echo 1 2 11 10 2 | tr " " "\n" | sort -n
1
2
2
10
11

# --reverse
$ echo 1 2 11 10 2 | tr " " "\n" | sort -nr
11
10
2
2
1

# --uniq
$  echo 1 2 11 10 2 | tr " " "\n" | sort -nu
1
2
10
11

uniq

重複削除

$ echo 1 2 11 10 2 | tr " " "\n" | sort -n | uniq
1
2
10
11

# --duplicated
$ echo 1 2 11 10 2 | tr " " "\n" | sort -n | uniq -d
2

# --count
$ echo 1 2 11 10 2 | tr " " "\n" | sort -n | uniq -c
     1 1
     2 2
     1 10
     1 11

sed

置換。

# ABC -> XYZ
sed 's/ABC/XYZ/g'

# 10行目~20行目で置換
sed '10,20s/ABC/XYZ/g'

# 2つ置換
sed -e 's/AAA/XXX/g' -e 's/BBB/YYY/g'

# AAAを含む行のBBBをCCCへ置換
sed -e '/AAA/s/BBB/CCC/g'

行の削除。

# 1行目削除
sed 1d

# 1~3行目削除
sed 1,3d

# #から始まる行を削除
sed '/^#/d'

文字の削除。

sed -e "s/ABC//g"

awk

ある種のプログラミング言語なので詳細は他のサイトに譲る。基本はawk PATTERN{ACTION}でif (PATTERN) ACTIONと捉えられる。

空白またはタブで区切られた5番目が10000以上のとき。

$ ls -l / | awk '$5 >= 10000 {print}'
-rwxr-xr-x  1 root root 87944 Jan  1  1970 init

$ ls -l / | awk '$5 >= 10000 {print $5}'
87944

ACTIONを省略すると{print}と同義。~は==の正規表現版。==はなぜか動かなかった。

$ ls -l / | awk '$6 ~ /Sep/'
drwxr-xr-x  1 root root   512 Sep 13 22:07 dev
dr-xr-xr-x 11 root root     0 Sep 13 22:07 proc
drwxr-xr-x  1 root root   512 Sep 13 22:07 run
dr-xr-xr-x 12 root root     0 Sep 13 22:07 sys
drwxrwxrwt  1 root root   512 Sep 12 22:00 tmp

PATTERNを省略すると全行に適応

$ ls -l / | awk '{print $1,$2,$3}' | head -5
total 88
drwxr-xr-x 1 root
drwxr-xr-x 1 root
drwxr-xr-x 1 root
drwxr-xr-x 1 root

$ ls -l / | awk '{print $1$2$3}' | head -5
total88
drwxr-xr-x1root
drwxr-xr-x1root
drwxr-xr-x1root
drwxr-xr-x1root

PATTERNには正規表現も可能

$ ls -l / | sed 1d | awk '/^[^d]/{print $9, "is not a directory"}'
init is not a directory

NRはNum of Recordsで現在行が入るawkの変数。NFもある。

ls -l / |  awk '/^[^d]/ && NR>1{print $9, "is not a directory"}'
init is not a directory

--field-separator。区切り文字をデフォルトの"[ \t]+"から":"に変更。-F","でCSVに使える。

$ cat /etc/passwd | awk -F":" '$7 ~ /bash$/{print $1}'
root
dorapon
  • ENDは最後に1回だけ実行されるPATTERN。BEGINもある。
  • PATERN{ACTION}は並べて複数書ける。
  • 仮想配列もある。ただし出力順番は不定
  • ACTION自身もセミコロン;で複数書ける。
  • for,while,case,ifも雰囲気で使える。
$ ls -l / | awk 'NR>1{month[$6] += $5} END{print "The sum of capacity of each month."; for(m in month) print m,month[m],"bytes"}'
The sum of capacity of each month.
Sep 1536 bytes
Jan 87944 bytes
Apr 5120 bytes
Jul 2560 bytes

xargs

空白タブ改行を一緒くたにまとめる。

$ echo "1 23\n4\t5 6  7\n\t89"
1 23
4       5 6  7
        89

$ echo "1 23\n4\t5 6  7\n\t89" | xargs
1 23 4 5 6 7 89

# 2行ごと改行出力
$ echo "1 23\n4\t5 6  7\n\t89" | xargs -L2
1 23 4 5 6 7
89

# 1行ごと
$ echo "1 23\n4\t5 6  7\n\t89" | xargs -L1
1 23
4 5 6 7
89

$ echo "1 23\n4\t5 6  7\n\t89" | xargs -L1 | tr " " "+" | bc
24
22
89

取得した複数のファイル名を1つづつ引数に取りたい時

$ grep -ils info /var/log/*
/var/log/dpkg.log

# xargsがないと出力自体を引数にとってしまう。
$ grep -ils info /var/log/* | tail -3
/var/log/dpkg.log

$ grep -ils info /var/log/* | xargs tail -3
2018-09-06 22:47:28 trigproc man-db:amd64 2.8.3-2 <none>
2018-09-06 22:47:28 status half-configured man-db:amd64 2.8.3-2
2018-09-06 22:47:33 status installed man-db:amd64 2.8.3-2

# 実際に実行するコマンドは-tオプションで見られる。
$ grep -ils info /var/log/* | xargs -t tail -3
tail -3 /var/log/dpkg.log
2018-09-06 22:47:28 trigproc man-db:amd64 2.8.3-2 <none>
2018-09-06 22:47:28 status half-configured man-db:amd64 2.8.3-2
2018-09-06 22:47:33 status installed man-db:amd64 2.8.3-2

便利なオプション

grep

オプション 説明
-r, --recursive 再帰的に探索 grep Error -r /var/log
-i, --ignore-case 大文字小文字区別なし grep Error -ri /var/log
-l, --files-with-matches ファイル名だけ出力 grep Erro -rl /var/log
-e, --regexp 正規表現
-o, --only-matching 一致した文字を出力 grep -e -o "eth[0-9]\+" hoge.log
-v, --invert-match を含まない grep -v 0 dropstats.log
-s, --nomessages エラー出力なし

ls

オプション 説明
-1 1行で表示 ls -1
-t 更新時間順 ls -lt
-S サイズ順 ls -lS
-F ディレクトリの後ろに/ ls -lF

乱数生成

bash環境変数$RANDOMを使う場合。ただし、0~32767。

$ echo $((RANDOM%+101))
47

連続で

$ yes 'echo $((RANDOM%+101))' | head -5 | bash
21
60
50
70
88

/dev/urandomを使う場合。

echo $(($(od -vAn -N1 -tu < /dev/urandom) % 101 ))
99

参考サイト

用語集:ランダム・乱数まとめ: UNIX/Linuxの部屋

AWKのトリッキーな配列&連想配列の仕組み・動作と目からウロコのテクニック (1/2):CodeZine(コードジン)

macをHigh Sierraにアップデートしたらoh-my-zshでタブ補完ができなくなった

1年ぶりのブログ更新になってしまいました。

ブログにまとめようとメモはたくさん残しているんですが、メモで満足してしまう感があります。

環境

さて、今のmacのターミナル環境はiterm2にzshとoh-my-zshを入れているのですが、気づかぬうちにタブ補完ができなくなりました。

1単語目ならコマンドの候補が、2単語目以降はファイルの候補が出てくるはずです。

タブを押してもボンボンというビープ音しか聞こえません。

自分のようなせっかちな人のために結論から述べると、High Sierraにアップデートしたことでoh-my-zshで謎の不具合が発生したことが原因です。

当初はzshからbashに切り替えてもタブ補完はできず、zshとoh-my-zshをアップデートしてもできず。

しかし、iterm2ではなくmacに初期搭載されているターミナルで試すとタブ補完できるということからiterm2に問題があるのだと思っていました。

High Sierraがiterm2のタブキーの機能を上書きしてしまったという当たりをつけて検索しても解決出来ませんでした。

結局放置してファイル名は長らくタイプしていました。

解決策

最近改めて検索したところ、oh-my-zshgithub issueに解決策が投稿されていました。

1nv3rse commented on 3 Dec 2016

I have solved it! in .oh-my-zsh/oh-my-zsh.sh, look at 14th line:

:${ZSH_DISABLE_COMPFIX:=true}

turn true to false, save it,then execute source ~/.zshrc ,restart your terminal,you will know some directory which are insecure,then execute chmod 755 <insecure-directory>, at last, back to .oh-my-zsh/oh-my-zsh.sh,the 14th line,turn false to true, and source ~/.zshrc

it will be solved!!!

github.com

まずホームディレクトリ以下にある.oh-my-zsh/oh-my-zsh.shの14行目をfalseにします。

 $ vim ~/.oh-my-zsh/oh-my-zsh.sh

.zshrcを再読込し、ターミナルを再起動します。

 $ source ~/.zshrc

すると次のようなメッセージがoh-my-zshから出ます。

Last login: Tue Feb 27 22:12:50 on ttys000
[oh-my-zsh] Insecure completion-dependent directories detected:
drwxrwxr-x    5 dorapon2000  admin    160  7  4  2015 /usr/local/Cellar/zsh/5.0.5/share/zsh
drwxrwxr-x  915 dorapon2000  admin  29280  7  4  2015 /usr/local/Cellar/zsh/5.0.5/share/zsh/functions
[oh-my-zsh] For safety, completions will be disabled until you manually fix all
[oh-my-zsh] insecure directory permissions and ownership and restart oh-my-zsh.
[oh-my-zsh] See the above list for directories with group or other writability.

[oh-my-zsh] Insecure completion caches also detected:
-rw-r--r--  1 dorapon2000  staff  1090  2 27 22:33 /Users/dorapon2000/.zcompdump-dorapon2000-MBA-5.0.5
[oh-my-zsh] Moving to "/Users/dorapon2000/.oh-my-zsh/cache/zcompdump-bad/"...

/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:81: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:95: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:102: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:115: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:125: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:135: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:144: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:150: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:153: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:156: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:159: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:169: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:172: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:174: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:188: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:200: command not found: compdef

上のファイルパスが示されている2行に注目して、それらに対して権限を755にします。

 $ chmod 755 /usr/local/Cellar/zsh/5.0.5/share/zsh
 $ chmod 755 /usr/local/Cellar/zsh/5.0.5/share/zsh/functions

再び~/.oh-my-zsh/oh-my-zsh.shの14行目をtrueに戻せば.zshrcを再読込すればタブ補完が復活します!

 $ vim ~/.oh-my-zsh/oh-my-zsh.sh
 $ source ~/.zshrc

具体的な原因やなぜ復活するのかなどの疑問は塵となり海未の藻屑と化しました。

issueではタブキーをオーバーライドしてHigh Sierraのキー設定を上書きした方もいらっしゃるようです。

検索した当初は同じように悩んでる人がたくさんいると思ってたのですが、日本語記事は見当たらず、そんな人の助けになれば幸いです。

参考

stackoverflow.com