« [Zaurus] RubyとKeyHelper Appletで質問 | Main | [Zaurus] SKK用辞書サーバskkserv2 20051107パッケージ »

2007.03.11

[Zaurus] Rubyを使って現在位置の地図を一発表示 RQPosition.rb

2007.5.30追記

ほかの環境だと動かないみたいですね。ご迷惑おかけします。
僕の環境は、SL-C3200 + AH-S405Cです。端末が違うとダメなんでしょうかね。
協力していただける方がいらしたら、端末からの出力のログを取るスクリプトを置こうかと思います。
「ざうもに」は多くの端末に対応できているようなので、あれを参考にするといいのかな。
でも、ざうもにはC言語なんだよなー。

結局、KeyHepler Appletからrequireを通す方法が分からないので、そのうちRuby/QteでGUI付けようかと思ってます。

本題

RQPosition.rbというLinux Zaurus用Rubyスクリプトを作ったので置いておきます。

本スクリプトはPHSから位置情報を取得して、それを元にマピオンで現在位置の地図表示をします。
ブラウザはNetFrontを使用していますが、Operaでも大丈夫なんではないでしょうか。

特徴は、実行一発で地図表示することです。

いちいちダイヤルアップしたり切断したりをしなくていいようになっています。

また、Rubyスクリプトなので、容易に変更が可能です。

GUIはありません。KeyHelper Appletに登録して実行……してほしいところですが、うまくいっていません。こちらのエントリをどうぞ「[Zaurus] RubyとKeyHelper Appletで質問」。

免責

責任取りません。

ダウンロード

「rqposition.rb_2007.03.10_arm.ipk.bin」をダウンロード

使い方

rqposition.rb DialUp.conf

などといった感じで、ダイヤルアップのコンフィグファイル名を引数に与えます。
コンフィグファイルは以下のパスにあります。ここを調査して、適当なコンフィグファイルを指定します。

"/home/zaurus/Applications/Network/modules/"

-rw-r--r-- 1 zaurus qpe 838 Oct 1 20:08 DialUp.conf
-rw-r--r-- 1 zaurus qpe 838 Oct 1 20:02 DialUp0.conf

上記パスは内部処理で足しますので、ファイル名だけ指定すればOKです。

KeyHelper Appletへの登録は現状うまくいかなくとも、Shell Scriptから呼び出したり、aliasに登録するなどは可能です。

インストール

上のリンクからダウンロードしたパッケージをインストールします。

Rubyとruby-serialport、libgcc3.4.4が必要です。

「ruby-serialport_0.6_arm.ipk.bin」をダウンロード」

「libgcc_3.4.4-1_arm.ipk.bin」をダウンロード」

ruby-serialportのパッケージはFocVさん版のRubyパッケージのディレクトリ構成を前提としているので、RubyはFocVさんのものを使うと不便が無いかと思います。

KeyHelper Appletへの登録

これできないと意味無いですよね……。

注意点

処理中に電源を切るとstopして確実におかしくなるので、処理中は電源を切らないでください! それでも切った勇敢なあなたは、WhatsUpOnZ、kill等で当スクリプトをkillしてください。

これに対処すべくTrapでSIGSTOPを捕捉しようとしましたが、スペカ入れているせいか捕捉できないorz...。同時に監視スクリプトを起動してstopしてたらkillって感じですかね? それともスレッド化でしのげるものなのだろうか。

活用

パッケージをインストールすると、/opt/QtPalmtop/bin/rqposition.rbにスクリプトが入ります。
これを適当な場所にコピーして、編集するといいんではないでしょうか。

主処理はPhsという名前のモジュールに分割しているので、そのメソッドを呼び出すと簡単に使えます。
ただ、低品質だし、モジュールの作法とか分かっていないので、ファイルを分けることはやってません。
あくまでも「俺スクリプト」です。

「Phs.position_info」を呼び出すと返り値で位置情報が取得できます。

LatLon.pc # 郵便番号
LatLon.n1 # N{ココ}.nn.nn Enn.nn.nn
LatLon.n2 # Nnn.{ココ}.nn Enn.nn.nn
LatLon.n3 # Nnn.nn.{ココ} Enn.nn.nn
LatLon.e1 # Nnn.nn.nn E{ココ}.nn.nn
LatLon.e2 # Nnn.nn.nn Enn.{ココ}.nn
LatLon.e3 # Nnn.nn.nn Enn.nn.{ココ}

できなかった場合はfalseが返ります。できなかった場合も空のオブジェクトで返した方がいいんだろうか。
緯度、経度が取得できても郵便番号が取得できないことがあるので、その場合は「0000000」を返すことにしてます。

スクリプトのmain()を抜き出したのが以下です。Phsモジュールのメソッドを呼び出してます。
簡単にカスタマイズが可能なことが分かると思います。
例えば、Yahoo!地図の場合は、「url = 」を以下のようにすればOKです。

url = "http://map.yahoo.co.jp/pl?nl=#{p.n1}.#{p.n2}.#{p.n3}&el=#{p.e1}.#{p.e2}.#{p.e3}"

現在地の郵便番号から住所を検索したい場合は

url = "http://search.post.japanpost.jp/kt/zip/e7.cgi?z=#{p.pc}&xr=1"

でOKです。Operaを使いたい場合は、最後のやつを以下のようにすればOKなはずです。
Operaを使っていないので確認してませんが。

system("qcop QPE/System 'execute(QString,QString)' " +
"opera '#{url}'" )

main()を抜き出したもの

# 位置情報を取得、変数pに代入
p = Phs.position_info

# 位置情報が取得失敗した場合はfalseが返るので
# 事前処理が必要
if(p == false)
#タスクバーにメッセージ表示
Phs.mes("Failed get position info.")
#実行終了
exit
end

# URLを生成 とりあえず日本測地系で、セグメントごとにバラしてます
url = "http://www.mapion.co.jp/c/f?uc=1&nl=" +
"#{p.n1}/#{p.n2}/#{p.n3}&el=#{p.e1}/#{p.e2}/#{p.e3}" +
"&scl=10000&size=665,460&grp=Air"

# 郵便番号(postal code)の取得(取得できなかった場合は"0000000"が返る
#puts "postal code: " + p.pc

# ダイヤルアップ開始
# 引き数無しの場合は"DialUp.conf"になります
# /home/zaurus/Applications/Network/modules/ にあるダイヤルアップの
# confを指定します
if(Phs.connect(ARGV[0]))

# ブラウザで表示
system("qcop QPE/System 'execute(QString,QString)' " +
"netfront3 '#{url}'" )

一応ソース

ruby-serialportのサンプルがkodersとかにもあんまり無くて苦労したので、一応載せておきます。

「rqposition.html」をダウンロード

予定等

ここを見てMolodensky法のサブルーチンを移植したので、世界測地系への対応も可能ですが、NetFrontでGoogle Mapが見られないみたいで、実装はやめました。
Google Mapのメリットって何かありますかね。

あとは、緯度、経度を10進の小数で使うところもあるみたいで、そのメソッドは付けようかと思ってます。

|

« [Zaurus] RubyとKeyHelper Appletで質問 | Main | [Zaurus] SKK用辞書サーバskkserv2 20051107パッケージ »