2010年10月30日土曜日

Google App Engineのcronを日付指定で実行

 GAEのcronで「毎月5日の午前4時」のような日付指定を設定したかったのだけど、そういう構文は無いらしい。その代わり、第一月曜とかは可能。なので、

cron:
- description: monthly ranking update
url: /tasks/rank/fetch
schedule: 1st mon,tue,wed,thu,fri,sat,sun of month 04:00
timezone: Asia/Tokyo
のように第1週の7日間に毎日起動して、スクリプトの中で日付を調べて動作する/しないを判断するようにした。
 日本のtimezoneはAsia/Tokyo。JSTとかにするとappcfg.py updateで最後のcorn更新のメッセージで500(server error)を吐く。しかしログに残らず(Admin Logには成功した変更のログしか残らない)、ヒントも無いので原因を見つけにくい。

2010年10月23日土曜日

青空文庫リストDBの再構成

 青空文庫の作家別作品一覧CSVから作家リスト、作品リストを再構成するスクリプトがだいたい出来た。「翻訳者名等」のカラムが曲者で、作者不詳の外国作品等で翻訳者と著者を兼ねる人が居る、編集者もここに入るが翻訳者との区別がつかない等が問題。編集者としての存在は今のところ1作品だけなので無視して、著者と翻訳者しか居ないという前提で矛盾無く扱える手順はできた。
 CSVにはWeb上で公開されている読み仮名などの情報が無いので、各著者、作品毎に青空文庫をスクレイピングして情報を追加した。読み仮名はソートで必要になるし、生誕日がわかれば「今日はどの作家の誕生日」というトピックでお勧め作品のリストアップができる。没年月日も取り込んだけど、これは使わないだろうな。

 スクレイピングは、当初はBeautifulSoupを使っていたが、パースエラーが時々起きる上に、回避手段としてblog等に載っているhtml5libを使う手段が実はhtml5lib側で拒絶されてる事がわかり、lxmlを使う方法に改めた。結果、回りくどいやり方で取り出していた文字列がXPathを使って一発でできるようになり、パースエラー回避以外にもメリットがあった。lxmlはGAE上では使えないようだが、あちらではスクレイピングはしないだろう。

2010年10月20日水曜日

Google App Engine SDKは32bit

64bitのActivePython入れても動かなかったよ。

青空文庫の作品リスト

Amazon以前に青空文庫の作品リストにアクセスできる必要がある。
公開されているzipファイルをgetして展開し、csvをカラムに分解する部分は出来た。

JIS第3水準、第4水準の文字は、csvの中でも作品テキストと同様のマークアップがなされているが、これは後回し。まずはGAEのDatastoreで読み書きできるようにする。

2010年10月18日月曜日

青空文庫とAmazon

 昔、青空文庫のテキストをビューアと一緒にアプリ化して配布するサイトを運営していた事がある。当時、ユーザーから直接あるいはblog等で間接的に指摘されていたのが、「作品を選ぶ判断材料が無い」という事。作家とタイトルがあるだけで、読んでみるまで作品の概要も評判も分からないのである。
 ダウンロード数でソートする程度の事はできていたが、さほどアクセス数の多くないサイトだったので、指標としては当てにならない。おそらく、作家の名前を聞いたことがある程度の理由でダウンロードされた作品がほとんどだろうと思う。

 今、不本意ながら自由に使える時間が倍増したので、この機会に青空文庫タイトルとAmazonをつなぐサービスを作ってみようと思う。ヒントになったのは、今春公開されたカーリルである。カーリルは、図書館横断検索を統一的で使いやすいインターフェースで提供すると同時に、Amazonの持っているイメージやレビューを表示してくれる。自分としては、Amazonのユーザーズレビューが、その本を借りて読むべきか否かを判断する上で大いに役に立っている。カーリル出現以前は、Amazonを見てから図書館のネットサービスで予約するという手順を踏んでいた。これをワンストップの使いやすいインターフェースで実現して見せたカーリルは、私にとって衝撃的だった。

 図書館の蔵書をwebで予約する人は、借りてみるまで自分が求めている本であるかどうかわからない。カーリルがその判断材料をAmazonに求めたように、青空文庫とAmazonとリンクしたサービスがあれば、大量の作品を目の前にして作品選択に迷う人の役に立つのではないかと思う。