2013年12月10日火曜日

python の apiclient.discovery.build() が遅い

google-api-python-client で、Resource オブジェクトを取得するのに
毎度 discovery.py:build() を呼ぶと、毎度 https 通信が発生し動作が遅
くなってしまう。Web アプリの場合なんかは、アクセス毎にこれが発生
するのは問題。

なんで https 通信が発生するのかは、Discovery Document なる、Google
API を利用する際に必要な情報が記された JSON 形式のデータを毎度とり
に行っているから。discovery.py の以下の部分。

    190   logger.info('URL being requested: %s' % requested_url)
    191
    192   resp, content = http.request(requested_url)
    193  
    194   if resp.status == 404:
    195     raise UnknownApiNameOrVersion("name: %s  version: %s" % (serviceName,
    196                                                             version))
    197   if resp.status >= 400:
    198     raise HttpError(resp, content, uri=requested_url)
    199 
ただ、この JSON のデータは毎度取りに行く必要もないようで、一度とっ
たらキャッシュしてしまって、build() でなく build_from_document() を
使うのが良い。
キャッシュの仕方なんだけど、今のところ build() 関数にベタに
print content などとしてしまって、吐出されたやつをファイルに保存
しているが、もっと良い方法あるんだろう。

調べてわかったらまたメモります。

2013年11月13日水曜日

Locust なる load testing tool

軽量な Web アプリのロードテストツールを探してたところ、Locust なる
Powered by Python なプログラムを発見。これ結構使える。
動作は Python コードで書くので柔軟性がある。

インストールは pip で一発だが、CentOS6 で可能な限り rpm で入れたいので
以下のように。そのうち自分で spec 作るか。

mater ブランチ持ってきてもいいけど、一応タグ打ってある版をここから
持ってきた。

# yum install python-devel python-zmq libevent-devel
# wget https://github.com/locustio/locust/archive/v0.6.2.tar.gz  -O locust-0.6.2.tar.gz
# tar xvzf locust-0.6.2.tar.gz
# cd locust-0.6.2
# python setup.py install

インストールが終わったら、適当に使ってみる。今回はユーザ毎にパラメータ
を変更した GET リクエストをたくさん投げる負荷テストをしてみたかったので
以下のような簡単なソースに。

テスト対象の動作の定義は、TaskSet クラスを継承したクラス(ここでは
MyFirstTasks) に適当な名前のメソッドを作り、その中でリクエストの URL
とパラメータを self.client.get() に指定すればいいだけ。複数メソッドを定義
した場合はランダムにそれを実行してくれる模様。@task(n) の n は、そのメソッ
ドの実行割合らしい。

実行順を定義したかったらクラスの定義をネストすれば良いらしい(私はまだやっ
たことがないが)。

Locust クラスを継承したクラス(ここでは MyFirstUser)は、操作するユーザ
を模したクラスらしい。この中の task_set という attribute に、上記した TaskSet
のクラス名を定義する。min_wait と max_wait はようわからんのだが、ユー
ザインスタンス間の実行間隔を定義しているらしい。
from locust import Locust, TaskSet, task
import random

class MyFirstTasks(TaskSet):
    @task(1)
    def myfunc(self):
        teststr = "teststr-" + "%04d" % random.randint(1,100)
        self.client.get("/mytest/?teststr=%s" % teststr)
class MyFirstUser(Locust):
    task_set = MyFirstTasks
    min_wait = 500
    max_wait = 1500

上記ファイル名を myfirsttest.py としたとして、下記のように実行する。

    locust -f myfirsttest.py -H http://www.fastriver.net

-H はリクエストを送るホストを定義する。

すると、http://localhost:8089 に管理画面が表れ、ここでスタート/ストップが
できたり、実行結果がわかったりする。

とまぁ超簡単な動作はこんな感じでできるが、複雑なもテストも動作を Python で
書けるので、Form に送る値を csv ファイル等に定義しておいて、ランダムにそれ
を送出するようなテストもできそう。

あと、master/slave 構成にもできるようなので、テストクライアント自体の
負荷分散も可能でかなり多くのリクエストを同時に送ることができそう。

また時間があったら詳しい使い方なんかを書いてみようと思う...書けたらいいな。。




2013年11月7日木曜日

Google の Service Account の p12 ファイルのパスフレーズ

Google Cloud Console または Google APIs Console において、
service account 用の pkcs#12 ファイルのパスフレーズっていったい何?
と思って調べたところ、Python の API のソースにその答えがあった。

notasecret だそうで。client.py:

    908         private_key,
    909         scope,
    910         private_key_password='notasecret',
    911         user_agent=None,
    912         token_uri=GOOGLE_TOKEN_URI,

実際の環境で使う場合は結び直した方が良さげ。

SignedJwtAssertionCredentials のコンストラクタ第4引数で指定する。

2013年11月6日水曜日

Google Cloud Console のエラー

Google Cloud Console でプロジェクトを作ろうとして以下のエラー

Cloud Console has not been activated for your account. Your account may be suspended or disabled. If you are a Google Apps user, ask your domain administrator to enable Apphosting Admin on your account.

Google Apps なユーザでかつ管理者なんだけど。。。Web 調べても情報が皆無。
試行錯誤したところ、Google Apps のコンパネのトップで「その他の設定」→
「他のGoogleサービス」→「Google App Engine 管理コンソール」が無効になって
いたせいだったらしい。
これを有効にしたところ、プロジェクトの作成成功。

2013年11月5日火曜日

DBus のバス名一覧の取得


dbus-send --session           \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames


dbus-send --system            \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames

2013年11月1日金曜日

openldap で bdb のトラザクションログが消えない

set_flags DB_LOG_AUTOREMOVE してるのに消えない。
これを設定すると checkpoint の際に消してくれるらしいが、
man slapd-bdb によると、slapd.conf に checkpoint の設定
が無い場合チェックポイントが発生しないらしい。
なので checkpoint 512 5 などと設定してみた。すると消える
ようになった。

デフォルト checkpoint が発生しないというのが解せないが…
じゃぁいつ flush してるのかと。

2013年9月25日水曜日

いとしい

Jasper Soft ってところから DM が来たんだけど、英語直訳で
冒頭が「いとしい Ryo」となっていて気持ち悪かったw