2010年5月31日月曜日

GAE:Datasotre のクエリを実行する方法

 この項目の最後の方にあるけど、fetch() を実行するか iterable として処理するしかないそうだ。

 for に入る前にデータがいくつあるか調べるには fetch() を実行するしかない、てことね。

 

2010年5月29日土曜日

AWS:エラーが発生

 作成中の web アプリケーション、デプロイしてデータを食わせるとエラーが発生した。

 さて、困ったと同時にちょっとワクワクする気持ちが半分(^^;。やっぱりオイラは問題を解決すのが好きな人、のようだ。

 原因は、ちょっとログを吐かせて記憶を手繰りながらググるとすぐ判明。AWS の PA-API が一秒より短い間隔ではデータを受け付けないこと

 作っているのは読書データ管理プログラムなのだが、データを増やしていったら、データ一覧を表示する部分で発生。ま、当たり前か。

 一覧表示件数を 10件ぐらいにすればよいのだけれど、ページングの処理は自分でしなくては駄目か。Django の ペジネータ は使えないかなぁ。

 あ、広く公開してみんなが使うようになったらどうしよう?、てそんなことは今から考える必要も無い (^^;

2010年5月28日金曜日

山を越えた

 作りかけの GAE アプリが出来た。

 GAE Python + AWS PA-API を使った読書管理システム。

 動くようになったら、一気にやる気がうせてしまった。デザインが全くお話にならないのだが....。

 

2010年5月27日木曜日

JS:今日は JavaScript と遊ぶ

 今日は JavaScript と遊ぶ。C 上がりのプログラマとしては JavaScript 自体より、DOM の方が難しい。

 HTML の要素・属性と DOM の要素の区別が微妙。

 プロパティにアクセスするだけで小一時間かかってしまった。

2010年5月25日火曜日

HTML:特定のテキスト入力域にフォーカスをあてるには?

 google に「html input フォーカス」と入れて、一番最初に出てきたページに答えがあった。

 キモは body タグに onload="document.forms[0].sono1.focus();" を付け加えること。

2010年5月24日月曜日

Django:Django 1.2 の変更のまとめ

Django 1.2 の変更のまとめ
のページを twitter 経由で発見。

項目だけ見ていくと
 ・マルチDB
 ・モデル検証
 ・CSRF 対策
 ・messages API
 ・メールバックエンド
 ・smart if テンプレートタグ
 約半分は何がどうなったのかわからない (^^;

 もっと勉強せねば。 

2010年5月22日土曜日

Aptana Eclipse:SVN がおかしくなったら

 先日 Aptana をアップデートしたら、SVN が動かなくなった。connector がなんチャラとエラーが出る。

 再起動したり、Project を share しようとするタイミングで SVN のプラグインを六つほどインストールするように聞いてくるので、適当に選択してやるも、「最新バージョンインストール済みでインストール不可」とかいってくる。そんなことを何度か繰り返すがうまくいかない。

 結局それらしい plug-in を一旦削除->再インストールで動くようになった。
 やり方は Help->About Aptana Studio->Installation Details で開くダイアログの Installed Software タグの中から SVNKit 1.* を全部 Uninstall して、再起動 -> 同じもの再インストール。

 SVN は使い方がよくわからないし、SVN サーバーが同じマシン上にあるのであまり役に立つとも思えないが、気休め程度に使用中。

google のパックマンは

javascript で書かれているみたいだ。

一応ソースを抜いてみた (^^;

2010年5月21日金曜日

web 系ってやつは

 昨日まで GAE+Python と格闘していたのに、今日は css と戯れる。何日かしたらテストパターンを作って地道なテストに入らなくてはなるまい。

 多分「プロ」は分業なんだろうなぁ。

 ま、当分は一通りこなさねば。

2010年5月19日水曜日

GAE Python Django:テンプレートからリストにアクセスする方法

こんな感じでよいみたい
{% for list in lsits %}
{{ list.0 }}
{{ list.1 }}
{% endfor %}

辞書もいけるようだ

GAE Python:ローカル変数が使える??

 SDK にて。関数でもなんでもないところに、定数代わりにリストでテーブルを作って、データベースから読み出した値で一部を書き換え、テンプレートに渡す、という処理をしていた。
 プログラムは URL でアクセスされるたびに再起動されるわけだから、テーブル代わりのリストも毎回新規作成されるだろうと思っていたら、前回書き換えた値が次回にも残っていた。

 これって...、今回は不具合として出てきたから良いが、偶然動いてしまう情況だったら、ちょっと手ごわそうな不具合になりそう。

2010年5月17日月曜日

GAE Python:なんだか形になってしまった

 GAE+AWS を使った読書管理システム。なぜか基本部分が出来上がってしまった。

 手をつけてからちょうど3週間。長いのか短いのかはわからないが、意外と簡単。

 さてここからは細かい仕事がいろいろと延々と待っているのだが、最後まで持っていけるか?

2010年5月16日日曜日

GAE Python:メールを受信しようとしたら

 こちらのページの内容を元に、aptan 上でメール受信のテストをしようとしたら、なにやら
11:20:48,650 py_zipimport.py:103] Can't open zipfile C:\hp\bin\Python\lib\site-packages\setuptools-0.6c3-py2.5.egg: IOError: [Errno 13] file not accessible: 'C:\\hp\\bin\\Python\\lib\\site-packages\\setuptools-0.6c3-py2.5.egg'
INFO 2010-05-16
 とエラーが出て、動いている様子がない。

 調べてみると、このエラーメッセージは特に関係なく、メールを受信したハンドラのあるファイルに
def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()
 という、非常に基本的なコードが入っていないことが原因だった。
 基本的過ぎて、サンプルコードにも入ってなかった orz。

 これで小一時間はドブに捨てたなぁ。もったいない。

2010年5月14日金曜日

GAE Python:日本語の関係でちょっと嵌る

 一区切り付いたので一応デプロイしてみたら、お約束で動かない (; ;)

 最初は文字コードの 0xXX が処理できない、みたいなエラー。ソースの発生した場所を見てみると、新しく追加した日本語コメントの場所。
 ここはお約束でファイル先頭に '# -*- coding: utf-8 -*-" を追加。基本をサボるとつまらんところに引っかかる。

 二つ目はちょっと手強かった。フォームでデータを入力し、[登録]ボタンを押すとデータストアに登録されるはずなのに、なぜか全く登録されない。
 aptana,GAE Launcher では全く問題ない。

 あっちこち調べていくうちに、app engine の Dashboard(GAE Launcher の右上のボタンから入れる)の左メニューに Logs を発見。開くと E のアイコンが !!

 開いてみると、メッセージはこんな感じ。

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

E 05-13 09:30PM 18.654

if self.request.get('cmd') == '登録':
 なるほど、登録のボタンが押されたことを認識できなければ、当然データベースに登録はされない。
 さてどうしようと悩んだが、とりあえず u'登録' とやってみたら OK。
 これも基本中の基本だよなぁ orz。

 三歩進んで二歩下がり下がりながら、今日も一歩前進。

2010年5月13日木曜日

GAE Python:date django オブジェクトで嵌る

 datastore の DateProperty に値を入れようとしたらなかなか入らない。

 いろいろ調べた結果、
・DateProperty は Python の date 型、str は入らない
・date 型は datetime 型と違う
・datetime -> date の型変換は datetime.date()
 ということで何とかなった。

 c の、整数値一本ですべて扱うというのが懐かしい。あれはあれで面倒だったけど。

 あと django テンプレートの ifequal/ifnotequal の動きが変^hよくわからない。とりあえず if に書き換えた。

2010年5月11日火曜日

GAE Python AWS:とりあえず、動いた

 半月ほど前に始めた、AWS+GAE Python による、読書情報管理システム、たたき台というか骨格部分が aptana 上で動いた。

 さて、ここから肉を付けて行かなくてはならないのだが、飽きずにやっていけるか...。

 

2010年5月7日金曜日

GAE Python:ImportError: No module named _multiprocessing は、

 ここいらここいらを見ると GoogleApp Engine Launcher が python 2.5 ではなく、2.6 を使っていることが原因らしい。

 で、App Launcher の Edit->Preferences を開いて Python Path を見ると空欄になっていて、default が C:\Python262\pythonw.exe とある。

 ここに C:\Python262\pythonw.exe と入れて再挑戦。正常に動いた。

2010年5月6日木曜日

GAE Python AWS:デプロイしたら

 作成中の GAE+AWS アプリ、切りの良いところまできたのでデプロイすることにした。

 aptana 上で debug してたので、まず、Google App Engine Launcher から起動すると...、 App Engine の中で
ImportError: No module named _multiprocessing
 と出て、途中で止まってしまう (; ;)
 めげずに (^^;、デプロイ。データをいくつか入れて、最初のうちは動いていたのだが、日本語を入力すると
UnicodeEncodeError: 'ascii' codec can't encode characters in position ....
 というエラーが。こっちは自分で書いたコードで出たので、調べてみると、どうも文字コードの問題らしい。

 google 様にお伺いをたてると、ピッタリのページが。
 結局
       val = str( params[key] )
        if type(params[key]) == unicode:
val = params[key].encode('utf-8')
else:
val = str( params[key] )
に書き換え。

 いろいろ調べたが、どうも aptana の python が 2.6 の気配がある。明日調べよう。

 あ、あと、AWS に日本語を食わせるときは UTF-8 のようだ。

2010年5月5日水曜日

Python GAE AWS:AWS の 返した xml を ElementTree で使うには、

 AWS の返した xml、minidom でうまく解析できたので、ElementTree を使ってみようと思ったらうまくいかない。
 テストコードを書いて、XML を切り貼りしながら調べていくと、調べるほど動きが不思議。
 何度かネットで調べていくと、こんなページを見つけた。元凶はxmlns 属性だそうな。むー。こちらでは6時間嵌ってあきらめた人もいるようだから、原因が見つかっただけマシか。ま、おいらも6時間ぐらいドブに捨てたけど。

 さて、ここからどうするか。minidom に戻るか、xml.sax にするか、ElementTree でもう少しがんばるか。

----
 結局、xmlns 属性を削除することにした (^^;。正規表現を使ってこんな感じ。
import re
t = re.search('xmlns=".*?"',xml)
xml = xml[0:t.start()] + xml[t.end():]
 恐るべし Python、てか、いまどきの LL はこれぐらいのことはフツーに出来るんだろうが、C/C++ が長かったせいか浦島太郎状態。


 

2010年5月4日火曜日

GAE Aptana Python:ブレークポイントを生かす方法

 Aptana を使って GAE/Python のデバッグを始めたのだが、ブレークポイントがうまく機能しない。たまに使えることもあるのだが、フツーに設定すると止まらない。

 これは、Aptana で django のデバッグをやり始めたときにもあった。あの時はどうやって解決したのかと、悩んだが思い出せない。

 あれこれ考えて、やっときちんと動くブレークポイントの設定方法がわかった。

 1.まず、エラーを起こして、コンソール窓にエラーメッセージを表示させる。
 2.コンソールからエラーが発生したソースへのリンクをクリックする
 3.2で開いたソースにブレークポイントを設定する。

 Project Explorer から開いたソースファイルにいくらブレークポイントを設定しても効かない。

 これでようやくすっきりした。

2010年5月2日日曜日

AWS:memo ItemLink の Description

 ItemLinks ->ItemLink -> Description の内容と、その下の URL のリンク先
 なぜか英語で返ってくるのでメモ
・Add To Wishlist -> ほしいものリストに追加
・Tell A Friend -> 友達に知らせる??(何も表示されない)
・All Customer Reviews -> 「カスタマーレビュー」のページ
・All Offers -> 新品および中古品(要はマーケットプレイス)

ちなみに商品ページは DetailPageURL

2010年5月1日土曜日

GAE Python AWS:レスポンスが返ってきた

 最初に参考にしたページが AWS 用のモジュールだったのだが、Product Advertising API 用ではなかったことに気が付かずだいぶ時間を取られてしまう。AWS って妙に奥が深そうでよくわからない (^^;

 こちらこちらのページ、そしてそこからたどり着いたこちらのページ(Signed Requests Helper)を見ながら cut & try を繰り返して何とかレスポンスが返ってくるようになった。

 ちなみに変更後のソースはこんな感じ。
import os,hashlib,hmac,base64,time,urllib
import xml.dom.minidom

akey = 'xxx'
skey = 'yyy'
def get_url(params, host, path):
'''return signatured rest request url.
For detail, see http://docs.amazonwebservices.com/AmazonSimpleDB/2009-04-15/DeveloperGuide/index.html?REST_RESTAuth.html'''

# first sort the keys alphabetically
keys = params.keys()
keys.sort()

# then construct query string 'key1=val1&key2=val2...'
pairs = []
for key in keys:
val = str( params[key] )
pairs.append( urllib.quote(key, safe='') + '=' + urllib.quote(val, safe='-_~') )
qs = '&'.join(pairs)

# now we get what to sign.
target = 'GET\n%s\n%s\n%s' % (host, path, qs)
sig = base64.b64encode(hmac.new(skey,target,hashlib.sha256).digest())
# url = "https://%s/?%s&Signature=%s" % (host, qs, urllib.quote(sig) )
url = "http://%s%s?%s&Signature=%s" % (host,path, qs, urllib.quote(sig) )
return url

def aws_test(url):
param = {}
param['AWSAccessKeyId'] = akey
param['Service'] = "AWSECommerceService"
param['Version'] = '2009-03-31'
param['Operation'] = 'ItemSearch'
param['SearchIndex'] = 'Books'
param['Keywords'] = 'harry+potter'
param['AssociateTag'] = 'kennik-22'
param['Timestamp'] = '2010-05-01T12:00:00Z'


url = get_url(param, url, '/onca/xml')
res = urllib.urlopen(url).read()

return res
 署名の付け方のドキュメントはこちら

GAE Python AWS:手ごたえがでてきた

 AWS からエラーメッセージらしきものが送られてきた。
AWS.InvalidOperationParameterThe Operation parameter is invalid. Please modify the Operation parameter and retry. Valid values for the Operation parameter include TagLookup, ListLookup, CartGet, SellerListingLookup, CustomerContentLookup, ItemLookup, SimilarityLookup, SellerLookup, ItemSearch, VehiclePartLookup, BrowseNodeLookup, CartModify, ListSearch, CartClear, VehiclePartSearch, CustomerContentSearch, CartCreate, TransactionLookup, VehicleSearch, SellerListingSearch, CartAdd, Help.