「hackathon」と名のつくものには初めての参加。ドキドキでした。
http://twisted-mind.appspot.com/gae-hack-a-thon-disc-3/
今回は事前ミーティングである程度のトピックを絞り、それぞれに興味をもったものに集まってチームを組んで作る、という形式だった。
自分が選んだのは「Google Data API(GData)を色々使って何かを作る」というもの。4人のチームで1日かけてwebアプリを作った。
- 画像ファイルを送信するフォームを用意
- POSTされた画像のExif情報を読み取り撮影日時と位置情報を取得
- 読み取った情報をDataStoreに保存
- 保存された情報をもとにGoogle Maps APIでポイント表示
だいたい出来たのはこのあたりまで。結局GDataは使っていない、というオチにw(本当はspreadsheetsとかを使って何か表示しようとか考えてた) あと保存した画像も中で保存するだけで、表に出てくるのは位置情報だけ、で終わってしまった。一日でできることって限られてしまうなぁ。
自分が担当したのは「Exif情報を読み取る」「DataStoreに保存するために作成したDataModelに合わせてデータを変換する」という部分。
Exif情報は、EXIF.pyというPure PythonライブラリがSourceForgeにあったのでこれをそのまま使う。
EXIF.py download | SourceForge.net
ただし、このライブラリで処理できるのはファイルのデータであり、postされてきたデータを直接処理することはできない。
そういう場合はStringIOというクラスを使うことでファイルと同様の扱いができるようになる、と教えていただいた。
import StringIO import EXIF ...<中略>... def post(self): # 画像データの取得 image = self.request.get("image") # EXIFの解析 sio = StringIO.StringIO(image) tags = EXIF.process_file(sio) ...<略>
あとはprocess_file()から得られたtagsを探索して、日付やGPS情報が入っている部分を抜き出すだけ。
…なんだけど、得られるデータ型が決まってしまっているので、変換をかける必要があった。
- GPS情報
どうやら度、分、秒をそれぞれ分母と分子でもつListで返ってくるようなので、DataStoreのGeoPtPropertyに格納したりGoogle Maps APIで使うようにしたりするためには小数の形式に変換する必要があった。
こちらを参考にして、それ用のメソッドを書いてみた。
転送中
def __getDegree(self, values): deg = values[0].num / values[0].den / 1.0 deg += values[1].num / values[1].den / 60.0 deg += values[2].num / values[2].den / 3600.0 return deg
- 日付情報
よく分からないけど"2009:04:01 12:34:56"のような形式で取れるらしい。
これもなんとかしてdatetime型にしてやりたい、ということでこんなカンジに。
import time import datetime ...<中略>... st = time.strptime(tags['Image DateTime'].values, '%Y:%m:%d %H:%M:%S') imgDateTime = datetime.datetime(*st[:6])
python詳しくない上に、あんまりジックリ調べずに「とりあえず動けばいいや」的なカンジで作ったので、間違っているかも知れません。ツッコミいただけると幸いです。
他のグループの発表
最後に全グループの成果発表会があった。どのグループも楽しそうでとても面白そうだった。
以下は聴きながら取った自分メモ。
Osaka AppProxy 大阪弁フィルタを持つProxyサーバー 内部で2つのProxyを使う 画像フィルタリングは難しい? Genshi On AppEngine XML型テンプレートエンジン astを使ってparser問題を回避 プロファイリングの結果、遅い原因。 結論:時期尚早 Full Text Search N-gramの説明 SearchableModel 細かく検索ができるようになった Indexサイズが心配、など ソース公開してます([http://bitbucket.org/a2c/gaehackathon_misopotato/overview/:title]) GAEでモバイルサイト モバイルはきついよ キャリアによる仕様の違いなど 絵文字等に対応 テンプレートを用意し、キャリア別の対応を内部で処理 Djangoで、GAEでも動くようにして作っている Remote API 達成率20%くらい 外からデータストアを操作 アップロード用のyamlを生成するスクリプトを作成 削除用もスクリプト作成した 便利! JRuby on Rails on Google App Engine for Java やり方はBlogに書いてあるんで ハマったこと:エラーメッセージ 30秒超えたときのエラーが不親切なので気をつけて JRubyの設定である程度最適化できた GData GDataをつかってみる PicasaAPIを使えば画像の保存もできるのでは? Android アカウント管理アプリ オンライン、オフラインを受け取る だらだらアプリケーション とにかくだらだらと○○が表示されるアプリケーション Twitterから形態素解析、YouTubeを流す 一周したらまた読み直して流す http://gilpa.appspot.com/ Twitterアプリ Flexを使って表示するためにXMLでデータを吐く PyAMF? friends_timelineを表示、更新 GatewayとWebApplicationの共存が難しかった
まとめ
初めてのHackathon、楽しかった!
自分で黙々と開発するのもいいけど、近くでコード書いているヒトがいると「負けるものか」と集中できるし、周りのヒトに質問、相談してすぐに答えを見つけられるのは嬉しいし。
これからも機会があれば積極的に参加しようと思います。
参加者の皆さん、お疲れさまでした。