2013-09-16

Google App Engine から backlog.jp の API にアクセスする

Google App Engine から backlog.jp の API にアクセスしようとしたら、何やらエラーが出ました。 libbacklog は xmlrpc を使っていて、xmlrpc は socket を使っていて、Google App Engine では無料枠では socket 使えないのですよね。ちょっとしたツールを作ることが目的だったので、まずはその場しのぎすることにしました。Making XML-RPC calls from a Google App Engine application をちょっと変えただけです。

"""Provides patch for backloglib to work on Google App Engine
Usage:
>>> import backloglib
>>> import gaebackloglib
>>> gaebackloglib.patch(backloglib)
"""
import sys
import xmlrpclib
import logging
import re
from base64 import b64encode
from google.appengine.api import urlfetch
def patch(backloglib):
"""Patches backloglib for Gooble App Engine"""
backloglib.ServerProxy = ServerProxyWrapper
class GAEXMLRPCTransport(object):
"""Handles an HTTP transaction to an XML-RPC server."""
def __init__(self):
pass
def request(self, host, handler, request_body, verbose=0):
result = None
m = re.match('(.*)@(.*)', host)
host = m.group(2)
credential = b64encode(m.group(1))
url = 'https://%s%s' % (host, handler)
try:
response = urlfetch.fetch(url,
payload=request_body,
method=urlfetch.POST,
headers={
'Content-Type': 'text/xml',
'Authorization': 'Basic ' + credential
}
)
except:
msg = 'Failed to fetch %s' % url
logging.error(msg)
raise xmlrpclib.ProtocolError(host + handler, 500, msg, {})
if response.status_code != 200:
logging.error('%s returned status code %s' %
(url, response.status_code))
raise xmlrpclib.ProtocolError(host + handler,
response.status_code,
"",
response.headers)
else:
result = self.__parse_response(response.content)
return result
def __parse_response(self, response_body):
p, u = xmlrpclib.getparser(use_datetime=False)
p.feed(response_body)
return u.close()
def ServerProxyWrapper(url):
return xmlrpclib.ServerProxy(url, GAEXMLRPCTransport())
結局、このツールは使う必要がなくなったのですが、もしものときのために書き置きしておきます。

PyCon APAC 2013 に行ってきました

2013年9月14日、15日にPyCON APAC 2013 に行ってきました。ほんとは、今日はスプリントをやっているそうですが、自宅でだらだらしています。だらだらしながら、Evernote のメモを、ここに書き写すことにしました。

(9/16 23:30 ごろ: イアン・ルイス氏のプレゼンの感想を追記)

自分自身の発表

"Test Failed, Then..." というタイトルで、以前に書いた「requests でテストした、その後ですよ」の内容を、ラッパのコードだけではなくて、なんでそもそもそういうことをしているのか、という視点で話しました。コンポーネントだけでなく、人も疎結合にしたいのですよ、私は。




プレゼンテーション資料は、しゃべりがあることを前提に作るので、この内容だけでは伝わらないような気がします。You Tube に動画があがっていますが、話し始める前に動画が終了します。演台の後ならばれないと思ったのですが、パンツ履いていないのが見えたためカットされたのでしょう。

いつか、まとめて文章にするかも。

Programming AWS with Python

VPN を設定するときに boto でやるとどんな感じなのかな、と思って聞いていたら、かなり簡単そうである、というのが分かりました。これは試してみます。


Release Faster

David Cramer 氏による、継続的リリースの考え方と必要条件の話でした。内容自体はおそらくは、継続的デリバリーや devops の文脈で語られる話を総括したものです。ですが、ちと思い入れがあります。

Cramer 氏は2012年の PyCON US で Practicing Continuous Deployment という演題で発表をしています。この発表の practical さに感動し、自分のプロジェクトに少しずつ取り込んでいき、その結果を、昨年の PyCon JP で Trying Continuous Delivery という演題で発表しました。DISQUS から Dropbox へ移った Cramer 氏の発表を聞きたいなぁと wktk で行きました。






ブートストラップ
  • 新メンバーが速く仕事できるように環境設定は自動化
  • 依存性をできるだけ排除
  • 本当に必要なものだけインストールする。Apache、HAProxy、RabitMQ、Zookeeper、Hadoop はアプリ開発者のローカルには、初日には要らないだろう。
テスト
  • テストさえあれば、まあなんとかやってける
  • ツールを整備することで、文化に影響を与える
    • テスト書きたくなるようにする
    • コピペでもいいから、とにかく書きたくさせる
  • pytest, flake8, mock
  • 素早いフィードバック
レビュー
  • 壊れたマージを防ぐ
  • 「この変更ってまともかな?」
フィーチャ・ゲート
  • 一部の人にだけ機能を追加/変更する
  • 社内でリリースするのは、外部に対してリリースするのと同じ効果がある
  • gargoyle  Django 用のフィーチャゲート

その他

  • ツールの提供を通して、文化を浸透させる
  • インフラのビルドには時間がかかるので、最後に成功したビルドのスナップショットをとっておき、続きからやることでスピードアップする


Does Python dream of being unleashed?

Google App Engine の実験的機能 VM backend の紹介。Google App Engine のバックエンドサーバに、Google Compute Engine のインスタンスが使えるようになるそうです。まだ trusted tester のみ。

  • apt-get のみ管理者権限で実行できる。
  • /_ah/start でシェルを呼び出せる(ので、ユーザ領域で好きなことできる)
  • TCP, UDP 使える
  • CGI, WSGI 経由のリクエストは、これまでどおりの書き方でOK
  • URL による frontendとbackend の振り分けもこれまでどおりOK
これは気になります。やりたいことがいっぱいある。

Luigi, The Friendly Pipeline Plumber

俺達のイアン・ルイス氏によるツールの紹介。入力、出力(ファイル)、タスクを定義しておいて実行すると、依存関係を解決して順番にタスクを実行してくれるツールである luigi

このセッションが、いちばん即効性がありました。というのは、日付からネットワーク上に保存されているデータを特定してダウンロードし、加工して保存し、それをさらに加工や修正をする、という仕事があるのです。あるのですが、これがたまーーーーにしかやってこないので、ほったらかしになってて、やる度にちょっとずつバグを修正している感じです。Luigi は失敗したファイルを生成しない=そのタスクは終わっていない、ってことになっているので、コードを修正したら、そこから再実行してくれるのです。

今は、Make を使っているんですが、Luigi に乗り換えるのがいいなと思い始めました。Make で呼び出しているひとつひとつのタスクは、Python で書いてあるので移植も簡単だと思います。

おわりに

主催者のみなさん、ありがとうございました。10人の宴会どころか、4人の飲み会の幹事もできない私には想像もできないような大変なことだったことでしょう。

来年の PyCon APAC は台湾らしいです。PyCon US や Euro Python と違って近いので、行きたいなぁと思い始めました。そういう風にふらっと出ていける仕事の回し方ができるようになるといいなぁ。

David Cramer 氏と話をしたかったのですが、何を話していいのか分からず、結局ひとことも話していません。話すことがないのに話す必要もないわけですが。

英語も、プレゼンももっと練習しないとなぁと痛感。去年も思ったような気がしつつ。せっかく時間を割いて聞いてくれているのだから、もうちょいうまくならねば失礼ってもんです。しかもプレゼンのときすごく体がガチガチだったらしく、終わってから腰が痛くて、帰り道で休憩しないと動き出せないくらい疲れました。何やってんだか。

質問タイムでも、その後のパーティでも、「そのアプローチで、一体に何を作っているのか?」と、何人にも聞かれました。需要がありそうなので、機会があればまとめてみようと思います。