2015-01-28

Microsoft Location Serviceの動作

とある諸事象でMicrosoftのLocation APIの動作について調べてた。ちなみにBingのAPIとは別らしい。

Windows 8以降のLocation APIは、Windows Phoneと同じようにWiFi情報を元にして位置情報を決定することができる。Orionという呼ばれる位置情報サーバーにSOAPでリクエストを投げるとデータが返ってくる仕組みだ。2011年から稼働しているのにSOAPでAPIにアクセスする。

これだったらGoogleとかの位置情報サービスと変わらないのだけど、Windows 8以降のLocation Providerはサーバーから取ってきたデータを内部データベース (\ProgramData\Microsoft\Windows\LocationProvider\LocationCache.dat) にキャッシュしておく。そのためLocation APIを呼び出しても常にサーバーへ問合せはされない仕組みになってる。これはただのキャッシュというよりも、ある程度な範囲 (300m? くらい) の位置情報データベースを内部でも構築するような仕組みになっているため、インターネットの接続が切れた後であっても自分の位置が変更 (=WiFiのブロードキャストリストやシグナル情報が変更) になれば、Location APIが位置情報を推測して返すことが可能になってる (どうもドライバ内で計算してるっぽい)。

実際のデータに関しては、inference.location.live.netというSOAPサーバーにHTTPSで接続してデータを取得してる。そのためこのサイトをブロックしてしまえばおそらく位置情報の取得ができなくなる。

この位置情報サービスのデータについては、Windows Phoneのサイト (http://www.windowsphone.com/ja-JP/how-to/wp7/web/location-and-my-privacy) を見るとデータポリシーとかは書いてある。いろんな情報をまとめると、Windows 8でも同じサーバーにアクセスしてるのはわかってる (でもAPIは微妙に違うみたい)。

このページを読む限りそもそもデータ収集にWindows Phoneも使われていたそうなので、Microsoftの位置情報サービスは日本での精度に期待できないということはよくわかったし、_nomapとSSIDにつけても無視するということもよくわかった (https://www.windowsphone.com/en-us/support/location-block-listで申請しろってことらしい)。

そのデータ収集だけど、どうもBing Map版ストリートビュー車も使ってるということらしいけど、日本ではそのサービスがされていないので日本での情報量が少ないこともよくわかるオチでした。

2015-01-25

Firefox Nightlyで位置情報プロバイダがGoogleからMozillaに変更になった

ブラウザ内で位置情報を取得する際、FirefoxではGeoIPとWiFi情報から位置情報を決定している。従来のFirefoxではGoogleの位置情報APIを利用していたのだが、先週末のFirefox NightlyからGoogleの位置情報APIではなくて、Mozilla自身の位置情報APIを使うように変わった。

Mozillaの位置情報サービスはMozilla Location Servicesという名前で開発を行っていて、GoogleのAPI互換かつ、サーバーなどのソース、収集されたデータさえも公開されている。(細かい話は以前書いたエントリを参照のこと。)

ここで参照されるデータというのは、以下のアプリで収集されたものがベースになっている。
  • Mozilla Stumbler
  • Firefox for Android (Mozilla 位置情報サービスへのデータ送信を有効にしている場合)
Firefox for Androidで位置情報データがMozillaへ送信する場合は限定的な条件がついている。それはGeo Location APIを利用した際にGPSベースで位置を取得した場合のみだけになっている。そのため、まとまった量の位置情報のデータを送るためにはMozilla Stumblerを使うのが現状ではベスト。

これらのデータに関しては一年前からコツコツデータ収集をしてきたので、東京の都心に関してはデータの密度は高くはなっている。

ただ、これだと場所によってはデータの品質に問題があるので、Windows版とOSX版のみ別のプロバイダを使うオプションが存在してる。

Microsoft Location API
Windows版上でabout:configgeo.provider.ms-windows-locationtrueにすると、代わりにMicrosoftの位置情報サービスを使うようになる (Windows 7以降)。すなわち位置情報についてはInternet Explorerと同様の品質になる。

Core Location API
OSX版上でabout:configgeo.provider.use_corelocationtrueにすると、代わりにAppleの位置情報サービスを使うようになる。(OSX 10.8以降だったはず)。すなわち位置情報についてはSafariと同様の品質になる。

Firefoxの正式版のころにはいろいろ変わっていると思うけど、今の開発版ではこんな感じになってる。

2015-01-18

XHR({mozSystem: true})がマジで使えない件

XHR (XMLHttpRequest) 自体は、CORS (Cross-Origin Resource Sharing) をサポートしないと自分のドメイン以外へのXHRのリクエストに対してレスポンスヘッダーとかの値を取ることはできない。そのためFirefox OSではmozSystemというオプションを用意して、CORS対象でないサイトへのリクエストであってもXHRが使えるようにはなっている (SystemXHRの権限を与える必要あり)。

また、XHRは302などのリダイレクションに対しては、自動でリダイレクト処理を行う。

CORSが使える環境においては、XHR.withCredentials = true にするとCookieとかも扱えるようになる。CORSじゃない環境 (mozSystem:true) の時はCookieとかは自動的には送らない。

XHRはこんな感じで動作するだが、この前提において、こんなケースにぶち当たった。

POST /abc
Host: example.com
Content-Type: application/x-www-form-urlencoded
Cookie: SESSIONID=ABC

というリクエストをとあるサーバーに投げると

302 redirect HTTP/1.1
Location: https://example.com/def
Set-Cookie: cookie=ABC <----(A)

と返してくるから、XHRは自動的にリダイレクト処理をするので、

GET /def
Host: example.com
Cookie: SESSIONID=ABC

と送るわけだ。ここで重要なのは (A) でSet-Cookieした値は、リダイレクト後のGETには入らないということ (mozSystem: trueだから)。そのCookieがWebサーバー側は必要としてたようで、以下のように返してきた。

404 Not Found HTTP/1.1
Host: example.com

(A) の値さえ取得できれば、自分でリダイレクト処理をすればいいんだけど、当然ここから、(A) を取得する方法なんて存在しないようで。。。XHRでリダイレクトを止めたいという話はstackoverflowでもwell-knownな質問で、答えは「不可能」。

一瞬mozTCPSocketを使って簡易HTTPクライアントを作ろうかと思ったけど、そもそもHTTPSなサイトなんだよねということで諦めた。このXHR({mozSystem: true})自体はちょっと凝ったことはできないよねってこと。そもそもFetch APIが来てればこんな悩みもしなかったのにって話でした。

(後でmozSystem:trueの場合でいいからリダイレクトを止めるオプション作りやがれバグはファイルしておくが)

2015-01-17

Micosoft Wireless Display Adapterを買った

ポートランドのMSストアにはなかったんだけど、Miracastを試したくなってebayで購入。

以下感想

  • Windows 8.1のラップトップ (DELL XPS12) は簡単につながる。Surfaceも。
  • 若干遅延があるけど、気にならないレベル
  • Store Appとして設定アプリがあるのでこれを入れればファームアップデートとか行える
  • Nexus 5もMiracastでつながる。でもたまに表示がおかしくなる。表示がおかしくなったら、再度再接続すれば直る
  • XPEDIA Z1fのMiracastだと接続中のままで接続が完了しない
  • Nexus 9がMiracastサポートしてなかったということを気付く

という感じ。

2015-01-14

ルビ on Firefox

ちょっと前縦書きの話を書いたので、次はルビの話でも。日本語で残さないとMozillaはやる気がないとか、変なこと言う人が日本には多いしね。

ルビについてもFirefoxでは開発チーム的にはは実装途中になっている。ルビの実装状況をみたいのであれば、Nightlyを使ってabout:configでlayout.css.ruby.enabledをtrueにすれば使えるよ。

例えば、こんな感じのHTMLは、

<div><ruby><rb>🍛</rb><rt>咖喱</rt></ruby></div>

以下の感じに描画される。


もちろん、以下のような感じでwriting-modeを設定すれば、

<div style="writing-mode: vertical-lr;">
<ruby><rb>🍛</rb><rt>咖喱</rt></ruby>
</div>

writing-modeが適用された状態で表示される。



CSS Rubyはまだほとんど実装されていないのだけど、デフォルト値のruby-align: space-aroundだけ動作する。

このバグをウォッチしているといろんなバグの修正がわかるはず。

今のところそんな感じ。自分が実装をやってないからどのバージョンでデフォルト有効になるかは知らないけど、2015年中には有効になると思うよ。

2015-01-04

2014年に買ってしまったもの

ガジェットで覚えてるものだけ。

Microsoft Natural Ergonomic Keyboard 4000
会社で使ってたNatual Keyboard Elite (USBのみのOEM版というレア仕様) のキーボードが壊れてしまったので購入。ちなみに初代Natural Keyboardは家で未だに使ってます。

ずっと使ってきただけあって、一番馴染むのがNatural Keyboardという自分にとっては、未だにこの配列のキーボードを出してくれるMicrosoftには感謝してる。SpaceSaverやHHKとかを使った結果、これが一番なのでどうしようもないですね。

ちなみに買ったのはebay経由でUS配列のほう。日本でJIS配列を発売するようになったおかげでUS配列が日本で買いづらくなったのはホント勘弁してほしい。

Microsoft Sculpt Ergonomic Mouse
最近ずっとLogitechユーザーだったんだけど、MX-Rの後継機が存在しない & MX-Rのバッテリがついに死んだということで購入。MX-Rは発売日にヨドバシで買ったものだから、愛着あったんだけどね。

電池の蓋がすぐ外れてしまうという問題と会社の机と相性が悪い以外は、満足してる。マウスパッド使えばいいだけだし。



Flame
Firefox OSの開発用端末。本当に買えるのか試したら、買えてしまったヤツ。もう国内で売ってないけど。海外のはAsaに聞けば買えるかもね。

こいつに関してはいろんな話がありましたが、ノーコメントです。

メインのスマフォが壊れた時に、これで何日間か生きてましたが、えっと普段使いにはパフォーマンス足りないっすねって。アプリの問題はLINE (スタンプを新規で買えないとかLINE絵文字使えないって話はあるが) とTwitterとWeb Browserと日本語IMが使えれば生きていけるってのを確認できたのはよかったです。

ASUS MeMO Pad 7
Intel入ってるAndroidで安価なものを探してたところ、2万しない価格で売ってたので買いました。主にIntel Androidのデバッグ用途。GPUドライバの出来がよくなくて、Open GL叩きまくるとハードウェアごと落ちるのが玉に傷。最近のファームでだいぶ直ってるけど。

この世代のatomは性能良くなってるんで、VAIO PがこのCPUで出れば買うのにねって (元VAIO Pユーザー)



Google Nexus 9
タブレットには一切興味がないのだけど、64bit ARMで動くAndroidということで買いました。nVidiaの新規設計のaarch64 CPUかーと思ってただけだったんだけど、リリース直前になってコードモーフィング使って動かしているという情報を耳にして、このトランスメタが過去にやってたことをnVidiaがやるってことで、テンション上がりまくり。

いろんなデータとってみたけど、aarch32モードはCortex-A15と同性能レベルでaarch64じゃないと速くないです。あとAESのネイティブ命令速っ。

でも主の用途は、Android/aarch64の評価用 + 開発用途なだけ。



au Fx0
Mozillaで働いてるんだし、ドックフードしないとねということで。自分のMS時代からのポリシー(というかあの会社の文化でもあるけど)で、エンジニアであるのであれば、ドックフードを食べなきゃいけない(要は自分たちで作ってるものは、自分で使って試せということ)というのがあってね。あの会社の恐ろしいところは社内のプロダクションに開発途中版 (内部デプロイ用のバージョンであって、外にでてるベータのクオリティにも満たさないもの)を投入してくるんで、社内で社内で業務が止まることがたまにあるというところ。当然そうなると開発チームが緊急修正行うことに。。。話がそれた。

これに関しては、書けない話は大量にありますが、えーっと、LGのソフトウェアチームは優秀でしたよ。ハードウェアメーカーもソフトウェアチームはグローバルに持たないといかんなーと思いました。これのソフトウェアに関しては、今まで出たFirefox OS Phoneの中で一番素の状態とはかけ離れてるんじゃないかなっ?


来年はというと、素のLinux (Fedoraらへん) が動くaarch64ボードは絶対買ってるだろうねというところかな?