2008年10月25日土曜日

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

- 8:00
起床。眠い!

- 9:00〜11:00
持ち込んだカルドセプトDSが大活躍してくれました。

- 11:20
温泉でさっぱりしたところで仕事開始。
まずは昨日のまとめを行う。増田さんと俺の違いは何?何を改良すればあのように優れたハッカーになれるか?

- 12:00
お昼ご飯を食べながら会社の仕事をやったりメールチェックしたりRSSをチェックしたり

- 13:00
来宮神社まで遊びにいく、神社まで遊びに行くというと、某吸血幼女が頭に浮かんだりするがいっさい関係ないと思います

- 14:23
神社に行く予定がなぜか途中の有名人の別荘に足を取られて1時間以上ガイドの人のお話を聞くことに・・・
遅れている仕事を取り戻す

- 16:05
django.conf.globalsettings.py

# List of processors used by RequestContext to populate the context.
# Each one should be a callable that takes the request object as its
# only parameter and returns a dictionary to add to the context.
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
# 'django.core.context_processors.request',
)
django.core.context_processors.mediaがメディアファイルのURLをテンプレートに渡されるコンテキストに勝手に渡してくれる
strutsに例えるならば、request.setAttritebute()を勝手に裏でやってくれるところ
ここで、
    return {'MEDIA_URL': settings.MEDIA_URL}
としているので、テンプレートの中でMEDIA_URLが使えるはず。使ってみよう

- 20:03
4時間ぐらいずっとdjango.views.static.serve()について悩みっぱなし。
設定は絶対に間違っていないはずなのに、staticファイルが何度やっても読み込めない・・・なぜ?
こんなエラーが出る:
Page not found: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/contrib/admin/media/css/django_todo.css
一体全体どうしてdjango/contrib/adminなんて所を見ているのかどうかわからない・・・

- 20:10
増田さんありがとう(またかよ)!
つまりはこういうことでした。settings.pyの以下の行が原因。

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
# MEDIA_URLやdjango.views.static.serveのdocument_rootと同じ値を設定すると、
# django.adminの要求するパスとかぶってしまうためうまく動かない!
ADMIN_MEDIA_PREFIX = '/media/'
#ADMIN_MEDIA_PREFIX = '/admin_media/' のように書き換えればうまくいくことがわかりました
これでなんとか先に進めそうだ!ラストスパート!!

- 23:19
無事にJavaScriptとCSSを参照することに成功するものの、こんどはUnicodeとJSONではまってしまう・・・
1:'\u71c3\u3048\u308b\u30b4\u30df\u3092\u51fa\u3059\u7528\u610f\u3092\u3059\u308b'こんな感じの文字列で画面に送られてきてしまう。日本語として出したいのだが・・・
2:そもそもJSONがeval()できない!
eval('{a:b}');
これを実行するとエラー・・・

1時間近く格闘して解決。まず1については、これは評価されていない素のユニコード文字列だから。これをそのままtext/plainとして画面に出しているから記号のまま画面に出てしまうようだ。Python側でこれをどうこうすることはできない(Unicodeとして正しいから。出力時に勝手にきちんとした日本語にされる訳で、データとしてはユニコードとして正しい。u'\u71c3'とu'燃'は全く同じ。)解決するためには、いったんこの文字列をJavaScriptでevalして評価してもらう必要がある。

2については、そもそもJSONとして形式が間違っている。
プロパティ名と値はクオテーションする必要がある。
eval('{"a":"b"}');
これが正しい。しかしこれでもエラーになる。なぜか?
http://d.hatena.ne.jp/language_and_engineering/20081022/1224597688
このページをみて解決。まさに書いてある通り。
全体を括弧で囲まないと、"a"がジャンプ用ラベルとして扱われてしまう。括弧で囲めば{}以下がオブジェクトとして扱われる。
ということで、正解はこう
eval('({"a":"b"})');
JSONでやたら括弧が多い理由がやっとわかった!!
それにしても、たかがJSONと思って驕り高ぶっていたらひどい目にあった・・・己の無知を痛感。