WHAT'S UP?

New post every sometimes. Here's OKKAH NET.

iptables(CentOS7)

Linuxに実装されたパケットフィルタリング型のファイアウォールであるiptablesを用いて、パケットフィルタリングルールや、アドレス変換ルールを適用しました。


・構成
LANポートを2つ搭載したデスクトップの一方にクライアントPC enp2s0を、もう一方に外部のネットワーク enp3s0を接続。


iptables

# 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


・各テーブルとチェインの関係

f:id:okkah:20170527152929p:plain


(参考)
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 StoreXcodeをインストールし、利用規約に同意します。

Xcode

Xcode

  • Apple
  • 開発ツール
  • 無料


3. Aquatermのインストール
Mac OS XのAquaウィンドウ環境にベクトルグラフィックスを表示するフロントエンドアプリケーションです。

以下のサイトからインストールします。

sourceforge.net


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


f:id:okkah:20170523133843p:plain

f:id:okkah:20170523133852p:plain

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


結果をグラフにすると以下のようになります。
f:id:okkah:20170511113923p:plain


やはり、リスト内包表記+三項演算子が圧倒的に速いですね。特にユーザCPU時間は他のプログラムと比べて2倍以上速いという結果がでました。



短い行数で記述し、かつ実行速度を上げたい場合には、リスト内包表記が便利。ただし可読性を失わない程度に。

PythonでFizzBuzzワンライナー

Pythonのリスト内包表記に慣れることを目的にFizzBuzz問題をやってみました。


そもそも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)]))


リスト内包表記を用いることで、コードがシンプルになり、実行速度が高速になりました。