2013年9月15日日曜日

PyCon APAC 2013 1日目に行ってきた(2) #pyconapac

昨日のPyCon APAC 2013 1日目に行ってきた(1) #pyconapac に行ってきた、の続き。

Interrupt-Driven programming

スライドはまだ上がっていないっぽいんだけど、だいたいこれ と同じだと思われる。SIGALRMによるタイムアウトのハンドリングはPythonだけではなく一般的なUnixであればどの言語でも使えるのでよい手法だなーと思った。それを使いやすくしたのがinterruptingcow でこれは便利そうだと思った。全体的には英語+喋るスピードが速くてほとんど聞き取れなかったけど、スライドの内容はだいたい理解できたと思う。

はじめに
  • bitbucketはDjango
  • githubbitbucketのAPIのレスポンス時間が比較された
    • bitbucketが遅いという内容
  • レスポンスタイムでaverageは見るな
  • slow requests have a big impact
    • ユーザをいらつかせる
    • APIクライアントを壊す(timeout)
    • Rants on Twitter
    • foncus on the remining 2% instead.
logging timeouts

タイムアウトをログに記録する。

コードのイメージ

def handler(*args):
    raise Excepiton("Request timed out")

signal.signal(signal.SIGALRM, handler)

signal.setitimer(signal.ITIMER_REAL, 28)
try:
    アプリケーションの処理
finally:
    signal.setitimer(signal.ITIMER_REAL, 0)

→Tracebackが得られる!あとは遅いところをひたすら治す

  • legacy/bad code often resists refactoring
  • Unpredictable input
interruptingcow

https://pypi.python.org/pypi/interruptingcow

さっきのSIGALRMのあれをモジュールにして使いやすくしたもの。

from interruptingcow import timeout
with timeout(2, RuntimeError):
    なんか処理

みたいに書ける。

Scalable content linkification の例

def prelace(doc, pattern, tmpl):
    try:
        replace処理
    exception TimeoutExcepiton:
        pass
    return doc

with timeout(.1, TimeoutException):
     print replace(doc, re.compile, '<a href="">sss</a>')
django-timelimit

これもこの人が作っているモジュール。詳細は調べきれてない。

Unique Aspects
  • works with legacy code
  • Generic solution to different problems
  • Optimistic approach (EAFP vs LBYL)
まとめ
  • Page render times highly dependent on runtime factors
  • Page timeouts have a disproportinally large impact
  • Refactor, pre-compute, paginate, remove funcionality, etc
  • Time-box expensive code with cheap fallback
  • interruptingcow - time-box arbitrary Python code
  • django-timelimit - time-box Django template fragments
  • the average color of the universe isCosmic Latte

Fabric for fun and profit

Fabricはちょっと前にFabricの豆知識 で書いたようにちょっと触ってたのでわりと復習的な感じだった。

はじめに
  • We script everything
  • We ssh in and out servers all the time
  • FabricはPythonでsshでやっていたことを効率よくするためのツール
Fabricの簡単な説明
  • fabfile.py
  • @task
  • $ fab hello
Environment configuration
@task
def production();
    env.user = 'pdfs'
    env.hosts = [ 'example.com' ]

it is just python. we can mix python codes into system commands

Vagrant development
$ fab vargrant -- sudo service couchdb restart
Fabricの代替
  • Ansible - Chefのような構成管理ツール
  • Invoke - タスクを定義して実行

How the Mock library helps me developing client-side applications

MockというPython3.3から標準に含まれるようになったモックライブラリの説明と、外部のWebAPI呼び出しにおける使い方の説明。Mockって1回使ってみたんだけど個人的には微妙で(でもなんで微妙だったか思い出せない)、個人的にはpy.test のmonkeypatchより複雑なことをしたいときはFlexMock というものを使っている。3.3から標準添付されたので今後はやっぱりこっちを使ってみようかな。

  • @clsung さん from Taiwan
  • 仕事はフリーランス
はじめに
  • モックライブラリはmock以外にMox, Flexmockがある
  • mock はPython 3.3から標準ライブラリになった
Mockの特徴
  • Mock()
  • MagickMock()
  • @patch decorator
How mock helps me
  • Develop/test client-side applications
  • Server-side APIs (Google Drive v2)
  • Client-side request library (requests)
    • HTTP requests
    • HTTP

とかとか。

Mock open() - StringIO

with patch('__builtin__.open') as m:
    m.return_value = ...
patch.object(requests, 'requests', autospec=True).start()
patch('gdapi.utils.retry', lambda: x, y)
その他テストで使える有用なライブラリ
  • factory_boy
  • httpretty
  • testfixtures

0 件のコメント: