2015年11月28日

Emacs でも位置情報が欲しい……位置情報欲しくない?

例えばですよ。

もし貴方が新幹線に乗っていて プログラムを書くのに夢中になってしまったとするじゃないですか。

そして、ふと我に帰った時に、 今いる場所がどこだかわからないって状況が起こるかもしれないじゃないですか。

そんな時に、プログラムを書く時に使っていた目の前にある Emacs で 位置情報を取得できたら便利くない?

というわけで、取得できるようにしました。

https://github.com/mugijiru/emacs-geolocation

ただし Mac OS X 限定。

インストール

Github から clone してきて

(add-to-list 'load-path "/path/to/emacs-geolocation")
(require 'geolocation)

するか

el-get を使うなら

(:name emacs-geolocation
       :description "Get geolocation use Google Maps Geolocation API."
       :type github
       :features "geolocation"
       :depends (request)
       :pkgname "mugijiru/emacs-geolocation")

のようなレシピを emacs-geolocation.rcp とかいう名前で保存して

M-x el-get-install RET emacs-geolocation

したら入るはず。

設定

Google API KEY の設定が必要です。 適当に https://code.google.com/apis/console から取得してください。

それと Google Maps Geolocation API を有効にしてください。

上記で取得した Google Maps Geolocation API を使える API Key を 以下のようなコードで設定します。

(setq geolocation-google-api-key "YOUR-API-KEY")

使い方

(geolocation-get-geolocation) ;; ((longitude . 127.65) (latitude . 26.17))

こんな感じ。

位置情報を取得してそのまんま Google Maps を デフォルトのWebブラウザで開く場合には以下の感じ。

(let* ((location-data (geolocation-get-geolocation))
       (latitude (number-to-string (assoc-default 'latitude location-data)))
       (longitude (number-to-string (assoc-default 'longitude location-data)))
       (url (concat "http://maps.google.com/?q=" latitude "," longitude)))
  (call-process "open" nil nil nil url))

仕組み

周囲で拾える Wi-Fi の情報を収集して それをGoogle Maps Geolocation API にブン投げてるだけ。

Mac OS X だと以下のコマンドで 周囲の Wi-Fi の情報を拾える。

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s

Linux とかだと環境がなくてわからないから非対応。

周囲のWi-Fi情報を拾って その中からMacアドレスと電波強度とチャンネル情報を抽出して Google Maps Geolocation API に それらの情報をJSON形式でPOSTしたら位置情報が得られると。

最後に

これで Mac と Emacs さえあればどこにいても現在位置がわかる! Happy!

posted by 麦汁 at 01:19 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする