DHCP(CentOS7)
LinuxサーバーをDHCPサーバーとして、内部のクライアントマシンへIPアドレスを自動的に割当てるようにしました。
・DHCPとは
DHCP(Dynamic Host Configuration Protocol):
インターネットに接続しようとするパソコンや周辺機器などに対し、IPアドレス、またそれに付随するサブネットマスクなど、必要な情報を自動的に割り当てる仕組み。
・DHCPサーバーの設定
# # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.example # see dhcpd.conf(5) man page # option domain-name-servers 133.25.243.11; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.3 192.168.1.254; option routers 192.168.1.1; max-lease-time 7200; }
iptables(CentOS7)
Linuxに実装されたパケットフィルタリング型のファイアウォールであるiptablesを用いて、パケットフィルタリングルールや、アドレス変換ルールを適用しました。
・構成
LANポートを2つ搭載したデスクトップの一方にクライアントPC enp2s0を、もう一方に外部のネットワーク enp3s0を接続。
# sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -p icmp -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -i enp2s0 -j ACCEPT -A FORWARD -i enp2s0 -o enp3s0 -j ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT COMMIT *nat -A POSTROUTING -s 192.168.1.0/24 -o enp3s0 -j MASQUERADE COMMIT
・各テーブルとチェインの関係
(参考)
oxynotes.com
gnuplotのインストール(Mac)
gnuplot(ニュープロット)は、2次元もしくは3次元のグラフを作成するためのアプリケーションソフトウェアです。
数値計算で出力されたデータをグラフで見たいときなどに使います。
1. Homebrewのインストール
Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムです。
ターミナルで以下のコマンドを入力してインストールします。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
(参照)
macOS用パッケージマネージャー — Homebrew
2. Xcodeのインストール
App StoreでXcodeをインストールし、利用規約に同意します。
3. Aquatermのインストール
Mac OS XのAquaウィンドウ環境にベクトルグラフィックスを表示するフロントエンドアプリケーションです。
以下のサイトからインストールします。
4. gnuplotのインストール
ターミナルで以下のコマンドを入力してインストールします。
brew install gnuplot --with-aquaterm
完了したら以下のコマンドでインストールできているか確認します。(バージョンは自分で確認してください。)
cd /usr/local/Cellar/gnuplot/5.0.6/bin ls
→gnuplotが確認できればOK。
./gnuplot
→Terminal type set to "aqua"が確認できればOK。
最後に先ほどのディレクトリのまま以下のコマンドを入力すると、どのディレクトリからでもgnuplotが起動できるようになります。
mv gnuplot /usr/local/bin
PythonでFizzBuzzワンライナー #2
PythonでFizzBuzzワンライナー - OKKAH NETの続きです。
各プログラムの実行速度がどれほど違うのか気になったので比較してみました。
timeコマンドとは
timeコマンドはコマンド・プログラムを引数としており、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかったかを出力するコマンドです。
具体的にsleep 10で試してみましょう。
$ time sleep 10 real 0m10.008s user 0m0.002s sys 0m0.004s
timeが出力する real, user, sys はそれぞれ次のような意味になります。
- real(実時間)
プログラムの呼び出しから終了までにかかった時間(秒) - user(ユーザCPU時間)
プログラム自体の処理時間(秒) - sys(システム時間)
プログラムを処理するために、OSが処理した時間(秒)
よってsleep 10はプログラムの呼び出しから終了までに10.008秒かかったのに対して、sleep 10自体の処理にはCPUがほとんど使われていないことが分かります。
では実際に4つのFizzBuzzプログラムを比較してみましょう。比較しやすいようにFizzBuzzの上限を100から1000000に変えます。
1. for文
$ time python fizzbuzz1.py real 0m5.050s user 0m1.747s sys 0m1.322s
2. while文
$ time python fizzbuzz2.py real 0m5.029s user 0m1.892s sys 0m1.329s
3. 三項演算子
$ time python fizzbuzz3.py real 0m4.894s user 0m1.752s sys 0m1.326s
4. リスト内包表記+三項演算子
$ time python fizzbuzz4.py real 0m4.329s user 0m0.767s sys 0m1.235s
結果をグラフにすると以下のようになります。
やはり、リスト内包表記+三項演算子が圧倒的に速いですね。特にユーザCPU時間は他のプログラムと比べて2倍以上速いという結果がでました。
短い行数で記述し、かつ実行速度を上げたい場合には、リスト内包表記が便利。ただし可読性を失わない程度に。
PythonでFizzBuzzワンライナー
Pythonのリスト内包表記に慣れることを目的にFizzBuzz問題をやってみました。
– 2人以上のプレイヤーが1から順番に数字を発言していく
– 3で割り切れるときは「Fizz」を発言
– 5で割り切れるときは「Buzz」を発言
– 両方で割り切れるときは「FizzBuzz」を発言
– 間違えた人から脱落
細かな違いはあるでしょうが大体上記のようなルールのゲームです。
初心者も上級者も。FizzBuzz問題について考えてみよう | SiTest (サイテスト) ブログより引用。
昔流行った「世界のナベアツ」のギャグに似ていますね。
今回は1~100でやってみました。
まずは普通にfor文で書いたものから。
for num in range(1, 101): if num % 15 == 0: print "FizzBuzz" elif num % 3 == 0: print "Fizz" elif num % 5 == 0: print "Buzz" else: print num
続いてwhile文。
num = 1 while num <= 100: if num % 15 == 0: print "FizzBuzz" elif num % 3 == 0: print "Fizz" elif num % 5 == 0: print "Buzz" else: print num num += 1
そしてここからが本題です。
三項演算子:条件分岐を1行で記述することができる。
(条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
リスト内包表記:リストを生成するための表記方法。リストにおけるループ処理を1行で記述することができる。
[(式) for (変数) in (リストオブジェクト)]
これらを用いて記述していきます。
2行縛り(三項演算子)
for num in range(1, 101): print "FizzBuzz" if num % 15 == 0 else "Fizz" if num % 3 == 0 else "Buzz" if num % 5 == 0 else num
続いて1行縛り(リスト内包表記+三項演算子)
["FizzBuzz" if num % 15 == 0 else "Fizz" if num % 3 == 0 else "Buzz" if num % 5 == 0 else str(num) for num in range(1, 101)]
これではリストを作るだけで表示はされないので少し改良して、
print("\n".join(["FizzBuzz" if num % 15 == 0 else "Fizz" if num % 3 == 0 else "Buzz" if num % 5 == 0 else str(num) for num in range(1, 101)]))
リスト内包表記を用いることで、コードがシンプルになり、実行速度が高速になりました。