Secure Code for Interactive Programming

Preview:

DESCRIPTION

PyCon JP 2014 オープンスペースで発表。 IPython Notebookといったインタラクティブ環境用のコードをいかに安全にするか。

Citation preview

Secure Code for Python Interactive Programming

PyCon JP 2014 OpenSpace 2014/9/14

@hagino3000

ここではデータ分析環境DB等の巨大なデータソースに直にアクセスできる共用IPython Notebookサーバーを想定しています。

前提

Interactive Programming

• Pros

• Powerful, Fun, Quick

• Cons

• Some dangerous (Probability of breaking production environment)

IPython Notebookからの……

突然の死• 大量のデータをロードしてしまいスワップアウト

• DB、ネットワークに負荷をかける

• 重い処理を放置

• CPUに負荷をかけてしまい監視にひっかかる

• なにげなくファイルに保存したらDisk Full

回避したい

• インフラの人におこられる

• データ回収の遅延

• データロスト & 再送処理の手間

運用と設計でなんとかしよう

• インタラクティブ環境向けのショートカットメソッド(データロード)

• 省メモリな実装

• 人間の怠惰さ、ミスを想定した設計

• 共用IPython Notebookサーバの運用

省メモリ

• とにかくgeneratorを返す

• DBフルスキャンする様なコードを実行していたとしても、generatorが帰ってきた時点ではセーフ

• 正しく扱えばよい

generatorのチェーン例def invoke(file_name, db_name):! db = MongoClient(‘localhost’)! db.events.insert(convert(parse(readline(file_name))))!!def readline(file_name):! with gzip.open(file_name) as input:! for line in input:! yield line!!def parse(lines):! for line in lines:! yield json.loads(line)!!def convert(rows):! for row in rows:! yield {…(略)…}

メモリ使用量のチェック

@profile!def readline(file_name):! with gzip.open(file_name) as input:! for line in input:! yield line

$ pip install memory-profiler $ pip install psutil からの

指定したメソッドの行ごとに使用量が出せる

大量のオブジェクトの扱い

• __slots__ 使っておく

• 属性の少ないクラスを扱う場合は有効

人間は怠惰• とりあえずパラメータ無しで実行とかしがち

• 絞り込み条件無しで実行すると全データフェッチするような設計だと死ぬ

• 例えば生ログを取ってくる様なメソッドの場合は期間を必須にする

• 期間の最初だけ指定されたら??

人間は怠惰

• docコメント書いておく

• mymodule.load_data? でいつでも参照できる

Notebook Serverの運用

• 1日一回再起動

• CPU、メモリ使用量は不定期に暴れる

• 起動ユーザーは権限小さめが良い

• インフラの人には大丈夫だと言おう

Enjoy Interactive Programming

Recommended