direnv を使って Vagrantfile にシークレットキーなどの情報をべた書きしないようにする

Vagrant + Digitalocean + Ansible でのサーバ構築も結構慣れてきたので、Vagrantfile や Ansible playbook を Github にプッシュしておこうと思ったのですが、Vagrantfile に digitalocean のAPIキーなど、公開してはいけない情報があったので direnv を使って隠すようにしました。

direnvは、ディレクトリに環境変数をセットして、そのディレクトリがカレントになった時だけ環境変数が有効になるというもので、使い方によってはかなり便利に使えるものだと思います。

direnvのインストールですが、OS Xの場合はHomebrewでインストール出来ます

$ brew install direnv

インストール後、zshrcに下記記述をして source ~/.zshrc します(他シェルの場合はドキュメントを確認下さい)

eval "$(direnv hook zsh)"

そして、direnv edit . とコマンドを打ち、立ち上がったエディターで

export SECRET_KEY=secretkey
のように記述し、保存します。保存すると、カレントディレクトリに .envrc というファイルが出来ます。

作成した環境変数をシェルで確認してみます。

$ echo $SECRET_KEY

今度はPythonで確認してみます。

>>> import os
>>> os.environ.get("SECRET_KEY")

肝心のVagrantfileへの記述する場合ですが、VagrantfileはRuby記法で書かれている為、Rubyで環境変数を取得するようにします。

ENV["SECRET_KEY"]
と書けばいいみたいです。

追記: .envrc は .gitignoreへ記述して公開リポジトリへアップしないようにしましょう!
追記その2:zshrc への記述を

if [ -x "$(which direnv)" ]; then
    eval "$(direnv hook zsh)"
fi
のようにするとdirenv有無にかかわらずzshrcを使い回せます。


Vagrant+DigitalOcean+Ansibleで作成したFlaskアプリにブラウザで素早くアクセスする

手持ちのマシン(MacBook Air (13-inch, Mid 2012))のSSD空き容量が少なくなってきたこともあり、ローカルにVMを立てるのをやめ、Vagrant+DigitalOcean+Ansibleを使ってFlask製アプリ(自家製ブログツール)を立ててこのエントリを書いています。

DigitalOceanでドロップレット(仮想マシン)を立てると毎度毎度新しいIPアドレス割り当てられるので、デプロイしたFlaskアプリにブラウザでアクセスするには、vagrant ssh-config というコマンドを叩いてIPを確認する必要があります。

$ vagrant ssh-config
Host default
  HostName 128.199.xx.xx
  User hoge
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/hoge/.ssh/digitalocean/id_rsa.digitalocean.com
  IdentitiesOnly yes
  LogLevel FATAL

毎回だと非常に面倒くさいのでopen コマンドとawkを使って

$ open http://$(vagrant ssh-config | awk '$1~/^HostName/{ print $2 }'):5000

このようにアクセスするようにしました。 open にurlを渡すとデフォルトブラウザ(自分の場合はChrome)で立ち上がってくれるので便利です。


[IPython] PuDB を IPython のマジックコマンドで使う

最近アルゴリズムなんかを理解する為に写経したPythonコードをPuDBにかけることが多いのですが、PuDBを単体で動かすよりも、IPython上で使えたほうがなにかと便利なのでやり方をメモっておきます。試した環境はYosemite、Python3.4.2です。

スクリーンショット 2015-07-09 21.18.23

PuDBに関してはこちらのエントリーが詳しいです(参考にさせて頂きました)

PuDBを動かす場合、pip でインストールしてから、このようにいつもpythonと打つところをpudbとして起動させます。

pudb3 sieve.py 1000
もしくは-mオプションを付けて呼び出すのですが、
python -m pudb sieve.py 1000
IPythonを使っている場合は以下のようにするとマジックコマンドで使えます
In [1]: import pudb.ipython

In [2]: %pu
%pudb   %pushd

In [2]: %pudb sieve.py 1000
但し、これだと毎度毎度呪文のようにインポートしなければならないので、IPythonの起動時にインポートしてしまいます。具体的には以下のようにプロファイルを作成し、コンフィグファイルにインポートコマンドを記述します。
$ipython profile create
$vi .ipython/profile_default/ipython_config.py 
そして、 c.InteractiveShellApp.exec_lines というコメントアウトされた箇所を見つけ、コメントアウトを解除し、"import pudb.ipython"を追記します。
# lines of code to run at IPython startup.
c.InteractiveShellApp.exec_lines = [
    "import pudb.ipython"
]
因みに、virtualenv(wrapper)環境のIPythonでもちゃんとPuDBのマジックコマンドは使えているので、virtualenv(wrapper)環境下でも設定ファイルは見てくれているようです(sys.pathするとpathが通っているのがわかります(一番最後))。
In [1]: import sys; sys.path
Out[1]:
['',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/bin',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/lib/python34.zip',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/lib/python3.4',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/lib/python3.4/plat-darwin',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/lib/python3.4/lib-dynload',
 '/usr/local/Cellar/python3/3.4.2/Frameworks/Python.framework/Versions/3.4/lib/python3.4',
 '/usr/local/Cellar/python3/3.4.2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/lib/python3.4/site-packages',
 '/Users/hogepiyo/.virtualenvs/tmp-b5af62af20e6b944/lib/python3.4/site-packages/IPython/extensions',
 '/Users/hogepiyo/.ipython']

In [2]:
IPython起動時の設定に関してはこちらを参考にさせて頂きました。
Python Tips:IPython の起動時に特定の処理を走らせたい - Life with Python


[Python]剰余算の真理値判定とエラトステネスの篩

例えばこのような奇数を求めるコードがあって

In [1]: list(filter(lambda x: x % 2, range(10)))
Out[1]: [1, 3, 5, 7, 9]

このなかの x % 2 は真理値判定となっていて、余りがあればTrueであり、なければFalseである。ところが(俺だけかもしれないが)これがどうもしっくりこない(笑)% は余りを求めるのだから、余りがあればTrueなんだということは頭では理解しているつもりなのだけど、余りがゼロの場合に割り切れたんだからTrueだ、とふと思ってしまう。なんでだろうとずっと考えていたのだけれど、どうやら俺は奇数より偶数のほうが好きだからかもしれない。。

# -*- coding: utf-8 -*-

def sieve(num):
    primes = list(range(3, num, 2))
    for i in range(len(primes)):
        if primes[i]**2 > primes[-1]: break
        primes[i+1:] = filter(lambda p: p % primes[i], primes[i+1:])
    print(primes)

if __name__ == '__main__':
    import sys
    sieve(int(sys.argv[1]))

上記コードにも偶数をフィルタリングして除外する箇所があって、そこでも剰余算の真理値判定をしている。これはエラトステネスの篩という有名なアルゴリズムらしい。

良いもの。悪いもの。: アルゴリズムの素晴らしさに気付かせてくれたのはエラトステネスの篩だった
こちらのサイトのコードを Python3で書き直させてもらった。


[Python]NZMATHのインストールで若干ハマった

NZMATHを少し使ってみたくなってpipでインストール出来るとどこかに書いてあったのでやってみたのですが、

$pip install nzmath
Downloading/unpacking nzmath
  Could not find any downloads that satisfy the requirement nzmath
  Some externally hosted files were ignored (use --allow-external nzmath to allow).
Cleaning up...
No distributions at all found for nzmath
Storing debug log for failure in /Users/foobar/.pip/pip.log

となってインストール出来ません。

use --allow-external nzmath to allow

と出ているので、

$pip install nzmath --allow-external nzmath

としてみたところ、今度は

Downloading/unpacking nzmath
  Could not find any downloads that satisfy the requirement nzmath
  Some insecure and unverifiable files were ignored (use --allow-unverified nzmath to allow).
Cleaning up...
No distributions at all found for nzmath
Storing debug log for failure in /Users/foobar/.pip/pip.log

となるので

$pip install nzmath --allow-external nzmath --allow-unverified nzmath
両方付けてみるとうまくいきました。因みに環境はOS X Yosemite 10.10.3 Python2.7.6 です。多分Python2系じゃないとうまく動きません

素因数分解など

In [1]: import nzmath.factor.methods as methods

In [2]: methods.factor(123456)
Out[2]: [(2, 6), (3, 1), (643, 1)]
In [3]: from nzmath import prime

In [4]: prime.nextPrime(643)
Out[4]: 647

参照サイト
良いもの。悪いもの。: 2013年と2014年の違い


PAGE TOP