GAE Hack-a-thon Disc.3に行ってきた

hackathon」と名のつくものには初めての参加。ドキドキでした。
http://twisted-mind.appspot.com/gae-hack-a-thon-disc-3/


今回は事前ミーティングである程度のトピックを絞り、それぞれに興味をもったものに集まってチームを組んで作る、という形式だった。
自分が選んだのは「Google Data API(GData)を色々使って何かを作る」というもの。4人のチームで1日かけてwebアプリを作った。

  1. 画像ファイルを送信するフォームを用意
  2. POSTされた画像のExif情報を読み取り撮影日時と位置情報を取得
  3. 読み取った情報をDataStoreに保存
  4. 保存された情報をもとに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情報が入っている部分を抜き出すだけ。
…なんだけど、得られるデータ型が決まってしまっているので、変換をかける必要があった。

どうやら度、分、秒をそれぞれ分母と分子でもつ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、楽しかった!
自分で黙々と開発するのもいいけど、近くでコード書いているヒトがいると「負けるものか」と集中できるし、周りのヒトに質問、相談してすぐに答えを見つけられるのは嬉しいし。
これからも機会があれば積極的に参加しようと思います。

参加者の皆さん、お疲れさまでした。