2008年10月24日金曜日

第4回Python温泉 参加中 1日目

- 11:40
宿に到着、こんなに坂の上とは思わなかった

- 12:30
近くの来宮神社でうどん、なかなか美味しい
雨が降っていなければまたきて写真撮ろう

- 13:00
RTMにアクセスするだけの簡単なDjangoアプリを作ってみることにする
http://www.rememberthemilk.com/services/api/
http://repo.or.cz/w/pyrtm.git
こいつのソースを解析してRTMへのアクセス方法を調べる予定、まずは後回しにしてdjango側からつくってゆく

- 14:00
全員黙々とプログラミング作業中、なんだか会社にいるときよりまじめに仕事している俺がいる
さすがにこの空気で遊ぶ訳には・・・

- 15:42
なんとかURLとviewの設計まで完了、まだHelloWorldレベル
Modelは全然使ってないです^^

誰でも知っているどうでもいいTips:
Mac OS Xのpythonのインストール先はなんだか特殊なのでwhichして調べよう
   akisute bin$ which python
/Library/Frameworks/Python.framework/Versions/Current/bin/python
akisute bin$ cd /Library/Frameworks/Python.framework/Versions/Current/bin/python

2行目をコピーして、/bin/pythonを/libに書き換えるといい感じ。/lib/python2.5/site-packages以下がみんな大好きサイトパッケージです
後々の実験のために、ここのsite-packagesにrtm.pyをおいておく

- 16:03
そろそろRTMへのアクセスが必要なので、rtm.pyの解析を行うことにした
パブリックメンバーとして用意されているメンバーは4行目に定義されている
   __all__ = (
'API',
'createRTM',
'set_log_level',
)

あとtest()も自由に使えるようだ。
どうやらcreateRTM()すれば基本万事解決みたいですね。
ここでapiKey, secret, token, frob, signといったよくわからない単語が多数登場。RTMのAPIリファレンスをみて勉強し直すことにする

- 16:50
WireSharkなるソフトウェアが話題になる。
(パケット監視ソフトウェアらしい)
Mac OS XではCocoa動作ではなくてX11(多分GTK)で動作するとのこと
・・・こんなのを使うのかよ

- 17:22
RTM APIシステムについて調査完了。別記事にして詳しく書きます。腹減った・・・

- 18:12
温泉に入ってきました。さすが源泉掛け流しだぜ・・・いい湯でした

- 18:42
rtm.pyの使用により、RTMからタスク一覧を取得することに成功!
しかしrtm.pyが例外を吐いて止まってしまいました。
Traceback (most recent call last):
File "", line 1, in
File "rtm.py", line 381, in test
print [t.name for t in rspTasks.tasks.list.taskseries]
AttributeError: 'list' object has no attribute 'taskseries'
ソースを追ってみると・・・384行目
rtm = createRTM(apiKey, secret, token)
rspTasks = rtm.tasks.getList(filter='dueWithin:"1 week of today"')
print [t.name for t in rspTasks.tasks.list.taskseries]
さらに追いかける・・・85行目から
def get(self, **params):
"Get the XML response for the passed `params`."
params['api_key'] = self.apiKey
params['format'] = 'json'
params['api_sig'] = self._sign(params)
json = openURL(SERVICE_URL, params).read()
LOG.debug("JSON response: \n%s" % json)
if _use_simplejson:
data = dottedDict('ROOT', simplejson.loads(json))
else:
data = dottedJSON(json)
rsp = data.rsp
if rsp.stat == 'fail':
raise RTMAPIError, 'API call failed - %s (%s)' % (rsp.err.msg, rsp.err.code)
else:
return rsp
rsp.statにはアクセスできるが、
rspTasks.tasks.list.taskseriesにはアクセスできない・・・
返ってきたJSONをよく見てみる
{"rsp":{"stat":"ok","tasks":{"list":[{"id":"3161896","taskseries":{"id":"......
なるほど、listがリストになっている。
rspTasks.tasks.list[0].taskseriesというふうにしなくちゃならないんだな。

- 21:26
ご飯も食べ終わってそれでもひたすらソースを書き続ける・・・
引き続きDjangoのview作成を進めるが、rtm.pyの結果をJSON形式にできないことが判明(DottedDictという特殊な型)
自分でJSON変換を書くしかないのかな?オブジェクトをJSONに変換するライブラリなんていくつもありそうだけど

それからもう一つ問題が、
Djangoのデバッグ時のエラー画面(エラーの詳細情報を表示してくれる)がうまく表示されない。

TemplateSyntaxError: Caught an exception while rendering: unknown encoding: X-MAC-JAPANESE

- 22:34
増田さんがあっというまに問題を解決してしまいましたとさ・・・
かろうじて何をやっているのか見えた箇所をメモ
find -r? ./ -name 'sitecu*.py'
C Pythonを使ってC言語のstdlibのlocaleモジュールにアクセス?
QuickSilverを利用?
export LANG=ja_JP; python
>>> import sys
>>> dir(sys)
>>> sys.getdefaultencoding()
>>> import locale
>>> print locale.getdefaultlocale()
>>> assert False, locale.getdefaultlocale()
>>> print '\n'.join(sys.path)
python -vで読み込まれたパッケージがすべて表示される
/usr/local/bin以下のシンボリックリンクをdmgパッケージからインストールしたPython.org公式のPythonが上書き(というか優先的に読み込み)している
結論から:
1:python.org公式の2.6にアップグレードする。問題が修正されている。
2:/System/Library以下のPython2.5.1を利用する、Macシステム標準のPythonはMacPortsから大量のパッチがあたっているらしい。
公式の2.5.2はそれらのMac用のパッチがあたっていないためそのような問題が起きる・・・?
(Cocoaを利用してロケールを読み込んでいるから?envを無視している?)
3:どちらもいやなら、sitecustomize.pyを作って修正を書き込む

よくわからないがとにかくpythonを2.6にアップグレードするのが最善なようだ。

- 0:46
python2.6へのアップグレードは問題解決にならなかった。
確かにパッチはあたっていたが、locale.getdefaultlocale()の値を書き換えるようなパッチではなく、
getdefaultlocale()の値がX-MAC-JAPANESEの場合はsjisに振り返るようにしているだけで、
直接locale.getdefaultlocale()の値を利用しているdjangoの場合には使えないようだ。

locale.getdefaultlocale()が正しい値を返すようにするにはAppleがビルドしたpython(パッチ適用済み、要するに2.5.1)を使うしかない。

そこで回避策を考えつかれた:
エラーで落ちる原因はX-MAC-JAPANESEを処理するためのcodecが登録されていないから見つからないでLookupErrorになっている
X-MAC-JAPANESEの正体は単なるshift-jisなので、shift-jisのコーデックを利用して新たにX-MAC-JAPANESEのコーデックを登録すればいいということらしい。

あっというまにパッチが完成、試してみると・・・見事に通った!これがハッカーの仕事か・・・

あとFinderで隠しファイルを表示したり/usr/binを表示する方法が地味にわかった
http://goonsh.ddo.jp/fg/2005/01/18/on-finder
http://netafull.net/macosx/014755.html

Spotlightの有用性もわかった
明日はQuickSilverを入れてみることにする

今日はもう寝る!!