secure code for interactive programming

16
Secure Code for Python Interactive Programming PyCon JP 2014 OpenSpace 2014/9/14 @hagino3000

Upload: hagino-3000

Post on 25-May-2015

962 views

Category:

Technology


7 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Secure Code for Interactive Programming

Secure Code for Python Interactive Programming

PyCon JP 2014 OpenSpace 2014/9/14

@hagino3000

Page 2: Secure Code for Interactive Programming

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

前提

Page 3: Secure Code for Interactive Programming

Interactive Programming

• Pros

• Powerful, Fun, Quick

• Cons

• Some dangerous (Probability of breaking production environment)

Page 4: Secure Code for Interactive Programming

IPython Notebookからの……

Page 5: Secure Code for Interactive Programming

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

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

• 重い処理を放置

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

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

Page 6: Secure Code for Interactive Programming

回避したい

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

• データ回収の遅延

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

Page 7: Secure Code for Interactive Programming

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

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

• 省メモリな実装

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

• 共用IPython Notebookサーバの運用

Page 8: Secure Code for Interactive Programming

省メモリ

• とにかくgeneratorを返す

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

• 正しく扱えばよい

Page 9: Secure Code for Interactive Programming

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 {…(略)…}

Page 10: Secure Code for Interactive Programming

メモリ使用量のチェック

@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 からの

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

Page 11: Secure Code for Interactive Programming

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

• __slots__ 使っておく

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

Page 12: Secure Code for Interactive Programming

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

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

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

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

Page 13: Secure Code for Interactive Programming

人間は怠惰

• docコメント書いておく

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

Page 14: Secure Code for Interactive Programming
Page 15: Secure Code for Interactive Programming

Notebook Serverの運用

• 1日一回再起動

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

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

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

Page 16: Secure Code for Interactive Programming

Enjoy Interactive Programming