WHAT'S UP?

New post every sometimes. Here's OKKAH NET.

pyenvでPythonのバージョンを切り替える

pyenvは、Pythonのバージョンを簡単に切り替えてくれるツールです。2系列と3系列の切り替えに便利です。


1. pyenvのインストール
まずはpyenvをインストールしましょう。以下のコマンドでgitからcloneします。

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv


2. pyenvのパスを通す
bash, zshと、fishの場合で設定ファイルに記述する内容が違うので気をつけて下さい。

・~/.bash_profileや~/.zshenvを編集する場合

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)


・~/.config/fish/config.fishを編集する場合

set -gx PYENV_ROOT "$HOME/.pyenv"
set -x PATH $PATH "$PYENV_ROOT/bin"
status --is-interactive; and . (pyenv init - | psub)


これで、pyenvコマンドが使えるようになるはずです。


3. pyenvでPythonをインストール
では、pyenvを用いてPythonをインストールしてみましょう。

$ pyenv install 2.x.x
$ pyenv install 3.x.x


以下のコマンドで現在利用できるバージョンを確認することができます。

$ pyenv install --list


4. pyenvでバージョンを切り替える
バージョンの切り替えをします。localの場合は今いるディレクトリに、globalの場合は全体に反映されます。

$ pyenv local x.x.x
$ pyenv global x.x.x


以下のコマンドでPythonのバージョンを確認することができます。

$ python --version
Python x.x.x

GitHubの基本的な使い方

GitHubは、ソフトウェア開発プロジェクトのためのソースコード管理サービスです。

基本的な使い方をメモしておきます。


1. repositoryの作成
リポジトリはデータを保存する場所のことで、パソコン内にあるものをローカルリポジトリGitHubのサーバ上にあるものをリモートリポジトリと呼ぶ。

GitHubのwebページ上で作成する。


f:id:okkah:20171204212947p:plain


2. clone
リモートリポリトジを複製して、パソコン内に新しいローカルリポリトジを作成すること。

作成したいディレクトリにcd した後に、

git clone https://github.com/XXXXX/XXXX.git

URLは、GitHubのcloneしたいリポジトリページの右上の緑色のボタン(Clone or download)のUse HTTPSをクリックすれば表示されるので、それをコピーする。


3. add
ファイルやディレクトリをインデックスに保存すること。

git add ファイル名やディレクトリ名など
例)git add .


4. commit
インデックスに変更された記録をローカルリポジトリに登録すること。

git commit -m "コメント"
例)git commit -m "initial commit"


5. push
ローカルリポジトリの内容をアップロードしてGitHub上のリモートリポジトリに反映させること。

git push リモート名 ブランチ名
例)git push origin master

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

(参照)
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)]))


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