4GSD へ ipk インストールの道 – その1

前のブログで 4GB の SD カードについて書きましたが、この4GSDを使っていて一番不便なのは zaurus 標準の「アプリケーションの追加と削除」から ipk パッケージをインストールでできないことです。

ipkg コマンドをシェルから実行することで一応インストールは可能らしいのですが、シンボリックリンクを自分で張らないといけない(?)など、ちょっと面倒そう。。

ということで、標準アプリでどうにか ipk をインストールできないか試行錯誤してみました。
以下、個人的なメモなので、口調を変えてます。

症状から推測

まず、症状はSDカードへインストールすると「 アプリケーション追加先のメモリーが足りません」と表示される。(その時の画面が張られたブログ

その症状から空き容量の計算がうまくいっていないことが分かる。また、2GB SD カードではエラーは出ないことから、2GB超えに問題がありそう。

2GB/4GBというと、16進数にすると、0x80000000 Byte/0x100000000 Byte なので、signed long int / unsigned long int 型で扱えない値ということで、この辺がクサい。

おそらく、(unsinged?) long 型で残容量を取得して、パッケージの必要容量を差し引いてマイナスだったらという判定をしてると思われる。何となく以下のような処理になっているのではないか。(ソースがないのでかなり適当)

unsigned long available_size = get_available_size(path);
int package_size = get_package_size(ipk_path);

if ( available_size - package_size < 0 ) {
容量が足りない!
}

この辺を何とかゴニョゴニョできれば良いのではないかと。

バイナリ探し

さて、指定したファイルシステムの空き容量を調べるには通常 statfs 関数を使う(MANページ)ので、強引に grep で statfs を使っているファイルを検索してみた。

 # grep -c statfs /opt/QtPalmtop/*/* | grep -v :0
# grep -c statfs /opt/QtPalmtop/*/*/* | grep -v :0

(zaurus の grep には -r オプションがないので・・・)

すると、/opt/QtPalmtop/binlib/qinstall.so が見つかった。名前を見ても合ってそうな雰囲気。

「ソフトウェアの追加/削除」アプリは /opt/QtPalmtop/bin/qinsall を実行すれば起動するが、シンボリックリンクになっており、実際は quickexec というコマンドが実行されるらしく、実際のインストール処理は qinstall.so が行っているようだ。

ちなみに、qinstall.so は常駐している qeserver プロセスがリンクしているようで、おそらくquickexec がプロセス間通信を行って、qeserver のインストール処理を起動しているのではないかと。

初めは、qinstall が単体のアプリになっていると思っていたので、LD_PRELOAD を使って statfs を置き換えるようなライブラリをリンクしてしまおうかと思ったんだけど、qeserver は qinstall.so だけでなく、多くの設定アプリ系の *.so をリンクしているので、qeserver 全体で statfs を置き換えるのはちょっと影響が大きそうだ。

qinstall.so の調査

Linux-PC に qinstall.so を取り出して、arm-linux-objdump を使ってシンボルを調べてみる。

 # arm-linux-objdump -TC qinstall.so | less
:
00000000 DF *UND* 00000010 GLIBC_2.0 statfs
:

確かに statfs がリンクされているようだ。
シンボルをざっと見ていたら、気になるシンボルを発見。

 00026d20 g    DF .text  000001bc  Base        InstallUtil::getAvailableSize(QString)

お、なんかそれっぽい関数発見。
名前から想像するに、パス名を与えるとその空き容量を返すような関数なのだろう。

この関数に手を入れて空き容量をごまかせばいけるかも。

(続く・・・かな?)

qgmap 0.1.5 リリース

qgmap の新版をリリースします。→ダウンロードページ

今回は主に GPS 関連の変更です。

  • GPS位置追従/追従解除が可能に
    (v0.1.4では強制追従でした)
  • GPS位置が取得できていないときは移動しないように変更
    (南米に飛ばされなくなりました)
  • 三角マーカでGPS取得位置と移動方向を表示(カーナビのように)
  • GPS情報ウィンドウに移動速度、移動方向、標高を追加
  • 地図閲覧の邪魔にならないようにGPS情報ウィンドウを右下隅に表示
  • 「Menu」キーでポップアップメニュー表示
  • 「Map Path」メニューの地図データディレクトリ選択ダイアログで
    SDカードとCFの認識が間違っていたバグを修正

項目は多いですが、細々とした変更が多いです。

今回の目玉は、三角マーカによる現在位置表示機能です。 目玉というほどの機能ではないですが(^^;

マーカ表示
現在位置のマーカ表示

カーナビのようにマーカの向きは移動方向を示しています。

0.1.4 の時はGPSで取得した現在位置で強制的にセンタリングされていましたが、現在位置の追従/非追従を切り換えられるようになりました。

「G」キーを押した時は追従モードになっています。右下のGPS情報ウィンドウの右上にロックアイコンが表示されます。
スタイラスやカーソルキー、0〜9キーで画面を移動させるとロックが解除され、GPSの取得位置に追従しなくなります。(ロックアイコンも消えます)
スペースキーを押せば再び追従します。

GPS情報ウィンドウ
右上にロックアイコン 下に移動速度・方向、標高表示を追加

また、地味に移動速度、移動方向、標高表示に対応しました。

あと、ディレクトリ選択ダイアログを実装してから今までまったく気づいていなかったのですが、「Map Path」で開くディレクトリ選択ダイアログで CF と SD カード認識の判定が逆になってたので修正しました。
SDカードを挿しているとCFとして認識し、CFを挿しているとSDと認識するという、何ともお粗末なバグでした。

ようやくこれでなんとかGPS端末として最低限の機能が実装できたかな・・・?

GM_Lite 修正版リリース

GoogleMaps のダウンロード制限回避版として公開していた down_imgs.pl を更新しました。(down_imgs-4.pl.txt)
また、ブログに埋もれてしまいそうだったのでダウンロードページへ移動しました。

今回の修正は、ダウンロード制限回避とは関係ないのですが、ダウンロードに失敗したPNGファイルを削除する修正を加えています。(まぐ様のご要望から行き着いた機能です。ありがとうございます。)

ネットワークエラーでダウンロードが途中で終わってしまったり、指定位置・縮尺の地図が存在せず、0Byteだった場合に、いままでは表示できないPNGファイルが残ってしまっていたのですが、今回の修正でそのファイルが削除されます。

エラーとなったファイルが削除されることで、再度ダウンロードを行うとそのファイルが再ダウンロードされるようになります。 0Byte ファイルや壊れたファイルが残りにくくなったはずです。

ただ、申し訳ないのですが、既にダウンロードされた地図ファイルで壊れているファイルを削除することはできません。これからダウンロードする際にエラーだったファイルが削除されるだけです。
(今更気づいたのですが、これではご要望に答えられてないですね ^^;)

ダウンロード済みファイルのチェックは・・・もうちょっと考えてみます (ーー;

GM_Lite改造版

2009/03/02 追記
waste様が GM_Lite を便利にするアドオン(?)のGmlMgr を作成されました。GmlMgr の方が、私のdown_imgs.pl よりも高機能で新しい Google Maps のバージョンへ対応も早いと思いますので、GmlMgr を使用されることをおすすめします!

概要

GoogleMapsのダウンロード制限を回避した down_imgs.pl を配布しています。

tera様の実用工房で配布されている GM_Lite-0.1.4 は GoogleMaps の地図画像をダウンロードし、ローカルで閲覧することができる素晴らしいソフトです。拙作 qgmap を作るきっかけにもなりました。

しかし、GoogleMaps では wget 等のダウンローダを使用した地図画像のダウンロードを制限する変更を行っており、デフォルトの GM_Lite ではダウンロードできなくなってしまいました。

そこで GM_Lite のダウンロードスクリプト down_imgs.pl を GoogleMaps のダウンロード制限を回避するように修正したので配布します。

down_imgs-5.pl.txt の w2.92 対応は waste 様が対応されたパッチをマージさせていただきました。waste様ありがとうございました!

注意! Google Maps の地図データをダウンロードするような使い方は Google Maps の通常の使い方ではありませんので、個人の責任で行ってください。

ファイル

ダウンロード後、down_imgs.pl にリネームし、GM_Lite-0.1.4 を展開したフォルダの、bin/down_imgs.pl と差し替えてください。

使い方はオリジナルの GM_Lite と同じです。

変更点

  • GoogleMapsのダウンロード制限に対応 (09/11/17時点で確認済み)
  • ダウンロードエラー時に対象ファイルを削除するよう修正 (以前は0Byteファイルが残った)

謝辞

GM_Lite を公開してくださった tera 様、素晴らしいアプリを公開いただきありがとうございます。

tera 様には GM_Lite だけでなく、ぷちのいず立ち上げ当初にも色々とコメント・アドバイスをいただき、大変お世話になりました。

履歴

qgmap 0.1.4 リリース

本当に久しぶりになってしまいましたが、qgmap をリリースします。→ダウンロードページ
2ヶ月ぶりですか。あいだ空きすぎですね (^^;

今回ようやくGPSに対応しました。といっても最低限の機能しかありませんが。。。

ひとまず現在位置を取得して、そこに移動する機能のみを実装しました。
ログ機能すらありません。いろいろな機能はこれから追加していきます。
GPSのログ取得やスレッド関係は HB1 様の Zega を参考にさせていただきました(^^)
すばらしいソフトとそのソースを公開していだたき感謝感謝です。

GPS機能を使用するには、まずGPSの設定が必要です。
左上のアイコンをクリックすると表示されるメニューの「GPS Settings」を選択します。

GPS設定メニュー
GPS設定メニュー

すると、次のようなダイアログが表示されます。

GPS設定ダイアログ
GPS設定ダイアログ

各設定の意味は以下の通りです。

  • GPS Device
    • GPS機器が接続されているデバイスファイルを指定します。
      Zega でいう、devFile 相当です。
  • PreCommand
    • GPS接続を行う前に実行するコマンドです。
      Zegaでいう、startGpsCommand 相当です。
  • PostCommand
    • GPS接続を切断した後に実行するコマンドです。
      Zegaでいう、stopGpsCommand 相当です。
  • 更新間隔
    • 画面を更新する間隔です。GPSが出力する間隔に関係なく、この設定で指定した間隔で画面が更新されます。
  • 測地系
    • GPS機器が出力する緯度・経度の測地系を指定します。
  • 時差
    • 現在地の時差を指定します。この時差を補正して測位時間を表示します。

基本的に、Zega で使用できている方は、devFile 指定を GPS Device に、startGpsCommand を PreCommand に、stopGpsCommand を PostCommand に指定すれば動くと思います。たぶんですが。

設定を行ったら、「G」キーで GPS 受信を開始します。
GPS受信モードに入ると、画面の左上に以下のような小窓が表示されます。

GPS情報表示
GPS情報表示

左上から右方向に、受信している衛星数、受信時刻、緯度、経度が表示されます。

緯度・経度が受信できると現在地を中心に表示します。スクロールしても強制的に現在地に戻されます。この辺は徐々に改良していきます。

GPS関連では今後、以下の項目を追加・改良したいと思っています。

  • 標高、移動速度、移動方位表示
  • 現在地自動センタリングのON/OFF切り替え
  • 現在地に移動方向を三角マーカで表示(カーナビのように)
  • NMEAログ保存機能
  • 移動軌跡表示

GPS機器は、M-241 と uPod で確認していますが、他の機器で使えるか不安ですので、試してみたかたは、動作した/しない関わらず、コメントに動作報告を頂けるとありがたいです。よろしくお願いします!

そろそろ機能が増えてきたので使い方をまとめないと・・・。