WHAT'S UP?

New post every sometimes. Here's OKKAH NET.

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を接続。


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)"

(参照)
Homebrew — macOS 用パッケージマネージャー


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


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

自分の中にある情報を外に発信するということ。

できるだけ多くの知識や技術の情報に触れることは大切です。

 

現代では、インターネットを使うことで、容易に世界中の先駆者達の情報に触れることができます。

 

しかし一番大切なことは、仕入れた情報に対して、自分の頭で考え、自分で発信することで、脳内の知識を整理する癖をつけることです。

 

現代では、この発信も、インターネットを使うことで容易にできます。

 

これを続けることで、世界中の様々な情報を自分で頭の中に入れて考えて自分なりの判断ができるようになると思います。

 

しかしそうは分かっていても、インプットが大変でなかなかアウトプットに手が回らないのが現状です。

 

アウトプットについては、よく次のようなことが言われます。

 

「インプットをきちんとしていないと、アウトプットをしても意味がない」

「まずはきちんとインプットをしてから、アウトプットをした方が効率が良い」

 

確かにこれらの意見はある意味正しいです。普段の授業をおろそかにしていると、テストで高得点は取れませんし、人前で発表をするにしても、その内容が頭に入っていないとうまく説明ができません。

 

しかし、先にインプットを完璧にする方法にはデメリットがあります。

 

1. インプットだけでは知識が定着しない

ノートに書いたり、ぶつぶつ唱えたり、友達とクイズを出し合いながら覚えた経験は皆さんにもあるかと思います。このアウトプットがなければ、知識はなかなか定着しません。

 

2. インプットに時間がかかると、アウトプットが始められない

発表のスライド作りの締切が近いのに、まずは知識を完璧にしてからにしよう... と、考えていてはいつまでたってもスライド作りが始められません。

 

ここで提案したいのが、先にインプットを完璧にするのではなく、インプットの過程にアウトプットを組み込む方法です。つまり、アウトプットのタイミングを早めるということです。

 

例えば「友達に説明する」という手法を使うとき、知識を完璧にしてから友達に説明するのではなく、ある程度知識がついた状態で友達に説明してみて、知識が足りないと自分で感じたところをもう一度勉強してみるのです。

 

先にインプットを完璧にする方法では、

「知識を完璧にする(インプット)→ 友達に話す(アウトプット)」

であるのに対して、

 

インプットの過程にアウトプットを組み込む方法では、

「知識を蓄える(インプット)→ 友達に話す(アウトプット)→ 足りない部分を補強する(インプット)→ もう一度友達に話す(アウトプット)」

と、同じ流れを二回繰り返すことができます。

 

インプットとアウトプットを繰り返すことにより、脳への定着をより確実なものにすることができるのです。

 

また、先にアウトプットを行うと、その後のインプットに必要な情報を、より効率的に収集することができます。やみくもにインプットをするよりも、アウトプットを少しでも先に始めておいた方が、結果として得られるものの質も高まります。

  

 

(参考)

www.youtube.com

 

www.ncbi.nlm.nih.gov