Emacs テクニックバイブル

今回は最近買った本の紹介です。

私は開発する際のエディタに主に emacs を使用しています。emacs はクセが強いため、慣れるまでは大変ですが、強力にカスタマイズできるため慣れると手放せなくなるという中毒性の高いエディタです。特に仕事柄、コードを読むことが多いのですが、emacs + gtags.el がないとコードを読む気になりません。

ただ、基本的な操作は不自由なく使えているのですが、あまりの多機能+奥深さぶりに私はほとんどの機能を使いこなせてません。多分 emacs の実力の 10% も使えていないと思います。あっかんべー

emacs lisp (emacs を拡張するためのマクロの言語)を分かっていないせいか、カスタマイズとかスクリプトの導入が面倒なんですよね。。。

そんな私が欲しかった本が最近発売されました。「Emacsテクニックバイブル ~作業効率をカイゼンする200の技~」という本です。

Emacs テクニックバイブル買いました
Emacs テクニックバイブル買いました

まだ途中までしか読んでいないのですが、実用的なスクリプトが多数載っていて、インストール方法や設定方法も書かれているので lisp が苦手な私でも簡単にカスタマイズできそうです。

というか、スクリプトを自動でインストールする仕組み (M-x install-elisp-from-emacswki) があることすら知りませんでした。こんなに簡単にインストールできるなんて・・・。

開発に実際に役立ちそうな物があるので1つ1つ試して行きたいと思います。

特に開発系で気になった物 (or 実際に使っているもの) は以下です。

  • 13.2 summarye.el バッファのサマリを表示する
    → ファイル内の関数一覧表示は便利そう
  • 13.5 M-x ediff-files, 13.6 M-x ediff-merge-files
    → これはたまにお世話になってます。マージの時便利
  • 13.10 M-x which-func-mode 現在の関数名を常に表示する
    → 便利そう。使ってみよう
  • 13.12 ipa.el ファイルに直接書き込まずにメモをする
    → コードリーディングの時に重宝しそう。メモ間でジャンプできるのもいいな。
  • 13.15 gtags.el
    → これなしでは生きていけません
  • 13.16 fold-dwim.el 複数の折畳み・展開コマンドに統一的なインターフェースを提供する
    → hideif.el とかアウトラインモードとか使ってみたけどキーストロークが覚えきれなかった私にはピッタリかも。

うーん。emacs は奥が深いなぁ。

もっとカスタマイズして効率的に開発できるようにしたいな。 そうすれば qgmap のリリースも早くなる・・・かも? (^^;

緯度経度から2点間の距離を求める

久しぶりに開発途中のネタです。

POI の最寄検索や、検索結果表示で現在値からの距離を表示させたくて、任意2点の緯度経度から距離を計算する方法を調べてみました。

地球が球体なら何となく頭をひねれば分かるかもしれませんが、楕円体の緯度経度から距離を求めるのは私には見当もつきません。

ということでググってみると、楕円体を考慮していて、世界中の緯度経度で通用しそうな計算式が2つ見つかりました。

何となく航海で使用する下の公式のほうが正確な気はしますが、上のヒュベニの公式の方が演算が簡単そうな気がします。

また、qgmapでは多少の誤差も許容できるので数%程度(?)の精度で十分です。そこで近似式も候補に入れてみます。

これらの計算式がどの程度の正確さなのか、ランダムに選んだ緯度経度で計算して誤差と計算速度を検証してみました。

とはいえ、検証しようにも正解がわからないので、とりあえず国土地理院のサイトで2点間の距離を計算できるようですので、そのサイトとの誤差を調べました。つまり、実際に正確かどうかの検証ではなくて、国土地理院のサイトの公式に近いかどうかの検証です (^^;

で、結果は以下のとおり。

アルゴリズムの違いによる国土地理院サイトとの誤差
アルゴリズムの違いによる国土地理院サイトとの誤差

縦軸は国土地理院サイトで計算した距離(a)と、公式で計算した値(b)の誤差の割合(|a-b|/a) で、横軸が2点間の距離を示しています。

さすが航海算法と呼ばれるだけありLambert-Andoyerの公式は距離によらず 10^-5 以下の誤差率になっています。

ヒュベニの公式は50km以下ではLambert-Andoyerの公式と同等ですが、距離が離れるほど誤差が大きくなっていくようです。

簡易近似式は1000km以下では誤差0.1%前後で、1000kmを越えるとヒュベニの公式と同様誤差が増えていきます。

また、それぞれの公式を Zaurus で計算させた時の時間も測定しました。ちなみに、スペシャルカーネルを使っているので、浮動小数演算が高速化される FastFPE パッチが適用されています。

測地線航海算法のHPにはLambert-Andoyer と式的には同じですが、計算量が少し少ない小野の公式というものも載っていたので、こちらも計測しました。

各公式の計算時間

公式
1万回の計算時間
近似式 0.2838 sec
ヒュベニの公式  0.5043 sec
Lambert-Andoyerの公式  2.8202 sec
小野の公式  2.6518 sec

やはり近似式は演算量が少ないので高速ですね。1万回の計算が0.3秒なら充分実用的です。

ヒュベニの公式は近似式に比べ 1.8倍、Lambert-Andoyerの公式が10倍、小野の公式が9.5倍の時間がかかりました。

やはり精度が高い下の2つの公式は三角関数の演算などが多いため遅いですね。ただ、同じ結果が得られる小野の公式は少し早いようです。

結論

近似式が思いのほか精度が高かったので近似式を使おうと思います。

もともと精度も1%程度あれば十分かなと思っていたので、qgmap には充分ですね。

開発は案外こういう自己満足的な調査が楽しかったりするんですよねー。笑顔

qgmap-0.2.2 リリース

長い間お待たせしました。qgmap をリリースします。→ダウンロードページへ

ただ、今回は結構変更が入っているのでバグが増えてるかもしれません。気づいたら教えてください。

0.2.1 からの変更点は以下のとおりです。

バグフィックス

  • 「ルート権限で実行する」にチェックするとイメージをmountできないバグを修正
  • POI管理画面でPOIが1つもない時に削除・変更を押すと落ちるバグを修正

新規機能

  • メニューを実装
  • POI検索を追加
  • プリセットアイコンを追加
  • POIのアイコンを選択するダイアログを作成

まず mount 関係のバグフィックスについてですが、root権限で実行するとイメージをマウントできないバグを修正しました。

ただ、解決していないと思います。ルートでのマウントは可能になっているので、ユーザ権限でマウントできない場合は、「ルート権限で実行」にチェックしてみてください。

おそらく、上記の減少は mount コマンドを 0.2.1 から入れ替えたのが原因だと思います。これについてはもう少し調査しますね。

続いて新規機能です。

まずはメニューの実装です。ビュースタイルでもスタイラスだけでほぼ全ての操作ができるようになりました。

 メニューを実装しました
メニューを実装しました

GUIアプリを作るのに慣れてないのですが、メニューを見るだけである程度操作できるようにしたつもりです。もちろんキーによる操作も今までどおり可能です。

もう1つの大きい新規機能はPOI検索です。

POI検索メニュー
POI検索メニュー

POI>POI検索 メニューでダイアログが開きます。

POI検索
POI検索ダイアログ

検索キーワードを入力して「検索」ボタンを押すと下側に検索結果が表示されます。検索キーワードは名前部分と説明部分の両方から検索されます。

検索結果のリストを選んでダイアログ右上の「OK」を押すと、そのPOIの場所にジャンプします。

 

他の機能としてはプリセットアイコンを追加して、アイコン選択のダイアログも追加しました。

プリセットアイコン & アイコン選択ダイアログ
プリセットアイコン & アイコン選択ダイアログ

プリセットアイコンはここで GPL と CreativeCommons のデュアルライセンスで公開されているものの一部を使用しました。

アイコンが多くなるとコンボボックスでは選択しづらいので選択ダイアログも追加しました。

これで少しは使いやすくなったのではないでしょうか。

 

初めにも書きましたが、今回は結構大きく手を入れているので、色々挙動がおかしくなっている部分もあると思います。気づいた点があればご指摘ください。

次のリリースはいつになるか分かりませんが、以下のような機能を考えてます。

  • SL-A300対応 (起動しない問題対応&ダイアログサイズ調整)
  • 周辺のPOI検索 (最寄りのコンビニとか)
  • POIの登録

まったり開発していきますのでよろしくお願いします。

OpenStreetMap

今回は地図に関連したプロジェクトのご紹介です。リリースじゃなくてすいません (^^;

Wikiのように誰もが自由に地図を書いたり編集したりできる OpenStreetMap です。

OpenStreetMap
OpenStreetMap  (画面は横浜駅近辺)

イギリスが発祥の、誰もが自由に使える地図をみんなの手で作り上げるというプロジェクトで、成果物の地図は再配布、販売も含め自由に使うことができます。

地図といえば、今まではライセンスフリーなものはほぼ皆無だったので、qgmap ではちょっと後ろめたい気持ちを持ちながら GoogleMaps をダウンロードして使用していました。

OpenStreepMap の完成度が上がれば、それこそ全て自由なライセンスの地図データで揃えることができるようになるかもしれません。

いずれ qgmap でも OpenStreetMap に対応しないとですね。詳しく調べてませんが、GoogleMap と同じ方式(ズームレベルやタイルのサイズ)だったらいいなぁ。

地図を書く時は、GPS のトラックログや、国土地理院が公開している航空写真などを元に道路を書いていくようです。

地図は利用するもので作るという発想はなかったので、これを知ったときは衝撃的でした。すごいなーと。

私も M-241 を持って散歩やドライブしながら、少しですが地図を書いています。

GPS をお持ちの方は散歩がてら地図を書いてみるのもおもしろいですよ!

ぼちぼち再始動

だいぶ放置状態になっていましたが、またーり再始動します。

4月辺りから仕事が忙しくて、放置状態になってしまったのですが、一度放置状態になってしまうと、忙しさが一段落してもなかなか再開できず、なんとなく8月近くまで来てしまいました。

これじゃイカン!と言うことで、再始動を宣言しちゃうことで、モチベーションの向上を促すテストです。

いちおう、忙しいながらも、ゆっくりですが qgmap の改良は行ってまして、3月辺りに話題に上ったメニューの追加は8割がた実装できてます。

当時の構想としては、今まで通りメニューレスのウィンドウで、MENUキーを押すか、メニューアイコンをタッチするとメニューが表示されるという、無駄に凝ったギミックを実装しようとしていたのですが、無駄に大変だったので常にメニューが表示されるような素直に実装することにしました。

あとはu1さんのコメントで携帯の絵文字をプリセットアイコンにしてはどうかという話があり、調べてみたところ、携帯用絵文字をフリーで(GPL or CreativeCommons)配布しているサイトがありました。この中からPOIに使いそうなアイコンを選んでプリセットアイコン化する作業も行っています。

と、相変わらずゆっくりですが、開発してますので温かく見守ってください(^^)

以下戯れ言。(上も戯れ言だけど)

時間がないのでできないけど、SL-C1000にBlueToothモジュールの内蔵化とか、 ハード的なものもおもしろそうだなー。
2年くらい前に sugarware さんと tera さんとそういう話してたなー。なつかしい。。

今ではTELEC認証済みでSPPスタック内蔵のBTモジュールを個人でも買える時代なので、UARTと繋げるだけでBT内蔵化ができちゃったりしそう。おもしろそー。

TELEC認証なしなら安いのあるけど、記事にはしづらいしなぁ (^^;

でも値段ならUSB-BTドングルの内蔵化か。4桁機限定だけど。

うーん。どっちにしろ、おもしろそうなんだけど、時間が・・・。