2010年6月17日木曜日

スマートフォンとセンサー

iPhone4も出ることですし、こんな話題で。

Webアプリケーションに関する仕事に携わってたせいか、ケータイのイメージは「面倒くさいヤツ」でした。
Webブラウザやメーラーに限って言えば、互換性からはほど遠い仕様であったりなかったりで…。

しかし、iPhoneやAndroidで変化が見られます。
これらは、PCに限りなく近い形で標準化がなされています。
限られたメモリやCPUの中でよくぞここまで、と思うことも少なくないのです。

さらに特徴的なのは、このデバイスを「センサー」としてほぼ自由にアプリケーションを作ることができる、というもの。
しかも非常に簡単に。
iPhone4はジャイロセンサーまで搭載しているし、Androidもデバイスでの差異はあるかもしれませんが、
様々なセンサーを搭載しています。

さらに、より多くのセンサーがスマートフォンに搭載されることで、例えば体温計になったり、血圧計になったり、
いろいろ妄想も膨らむでしょう。

いずれにせよ、それらのセンサーをいかにサービスに落とし込めるか、これが今のテーマです。
ちなみに、Windows7でも比較的簡単にセンサーを扱える仕組みがあります。

2010年6月10日木曜日

Google App Engine / Python での Shift_JIS 問題

ガラケー向けのサービスをGAEで開発していたときに直面した問題を。

GAEでクエリ文字列やPOSTされたデータを取得する際には、下記のメソッドを使います。

self.request.get('hoge')

しかし、文字コードがShiftJISの場合、何故か取得出来ない。
UTF-8は取れるのにぃ。

こんな時は、GETの場合はQUERY_STRINGを、POSTの場合はBODYを調べる。

self.request.query_string
self.request.body

すると、ここまでは値が来ている。
文字コードがAsciiかUTF-8じゃなかったら捨ててると見た。

そこで、QUERY_STRINGまたはBODYから直接文字列を取り出す。
その文字列をunquoteして、decode('cp932')すれば無事取得できる。

まさか、ここでコケるとは思わなかったので、マジでビビった。

Google App Engine で全文検索を実装(Python)

もちろんPythonです。Javaじゃありません。

ともかく、一応SearchableModelというクラスで全文検索らしきことができるのですが、
当然マルチバイトなんて知らないわけです。
まあ、こんな感じで使いますが。

def Hoge(SearchableModel):
id = db.IntegerProperty()
name = db.StringProperty()

q = Hoge.all().search("hoge")


問題点としては、
・スペース区切りで単語を分ける(日本語はどないすんのじゃ)
・二文字以下はインデックスしない(そりゃ英語はいいわな、それで)
・検索する単語も二文字以下はなかったことになる(絞り込みできない)

ところが、こちとら日本人な訳で、なんとかせにゃならん訳です。
GAEだと分かち書きエンジン導入も面倒だし。
で、検索対象の文字列が50文字程度なら、こうしたらいいのでは?と。

・N-Gramもどき(一文字、二文字、三文字…で文章を分割)で文字列を分割
・これで出来た文字列の二文字以下のものは、マルチバイト文字列の何かを足して三文字にする(足した文字は検索でも使う)
・これらをスペースで繋げて、インデックス用プロパティに保存
・後はSearchableModelが勝手にインデックス化

実際に実装したところ、きちんと日本語で全文検索できてます。
これで少しは役に立つかな?