iPhone4も出ることですし、こんな話題で。
Webアプリケーションに関する仕事に携わってたせいか、ケータイのイメージは「面倒くさいヤツ」でした。
Webブラウザやメーラーに限って言えば、互換性からはほど遠い仕様であったりなかったりで…。
しかし、iPhoneやAndroidで変化が見られます。
これらは、PCに限りなく近い形で標準化がなされています。
限られたメモリやCPUの中でよくぞここまで、と思うことも少なくないのです。
さらに特徴的なのは、このデバイスを「センサー」としてほぼ自由にアプリケーションを作ることができる、というもの。
しかも非常に簡単に。
iPhone4はジャイロセンサーまで搭載しているし、Androidもデバイスでの差異はあるかもしれませんが、
様々なセンサーを搭載しています。
さらに、より多くのセンサーがスマートフォンに搭載されることで、例えば体温計になったり、血圧計になったり、
いろいろ妄想も膨らむでしょう。
いずれにせよ、それらのセンサーをいかにサービスに落とし込めるか、これが今のテーマです。
ちなみに、Windows7でも比較的簡単にセンサーを扱える仕組みがあります。
2010年6月17日木曜日
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')すれば無事取得できる。
まさか、ここでコケるとは思わなかったので、マジでビビった。
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が勝手にインデックス化
実際に実装したところ、きちんと日本語で全文検索できてます。
これで少しは役に立つかな?
ともかく、一応SearchableModelというクラスで全文検索らしきことができるのですが、
当然マルチバイトなんて知らないわけです。
まあ、こんな感じで使いますが。
def Hoge(SearchableModel):
id = db.IntegerProperty()
name = db.StringProperty()
q = Hoge.all().search("hoge")
問題点としては、
・スペース区切りで単語を分ける(日本語はどないすんのじゃ)
・二文字以下はインデックスしない(そりゃ英語はいいわな、それで)
・検索する単語も二文字以下はなかったことになる(絞り込みできない)
ところが、こちとら日本人な訳で、なんとかせにゃならん訳です。
GAEだと分かち書きエンジン導入も面倒だし。
で、検索対象の文字列が50文字程度なら、こうしたらいいのでは?と。
・N-Gramもどき(一文字、二文字、三文字…で文章を分割)で文字列を分割
・これで出来た文字列の二文字以下のものは、マルチバイト文字列の何かを足して三文字にする(足した文字は検索でも使う)
・これらをスペースで繋げて、インデックス用プロパティに保存
・後はSearchableModelが勝手にインデックス化
実際に実装したところ、きちんと日本語で全文検索できてます。
これで少しは役に立つかな?
登録:
投稿 (Atom)