HALの不定期雑記 電子小物の話題など

自作ソフト/過去記事のまとめ Fossil Wrist PDA 関連リンク集
Softwares for the Fossil Wrist PDA (English page)

スポンサーサイト   [English]

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Palmのランチャープログラム作成覚書   [English]

今回はプログラミングの話です。あまり分かりやすい話ではないので興味のある方だけ“続きを読む”をクリックして下さい。
ランチャーアプリを作るために,アプリ情報一覧の取得と保存をどうするかという話です。

HalLaunch を作る時に私が考えていたのは LocalID dbID が不変であると信じるか否か,また時計アプリのように同じ CreatorID を持つ複数のアプリをちゃんと扱えるかどうかです。

以下はプログラミング中のメモにちょっとだけ手を入れただけのものでまとまりが無く,正直言うと人様にお見せするレベルの物ではないです。
読みにくいとは思いますが,まあ同じようなことをやろうとしている人には参考になるかもしれないので載せてみます。

dbID は変わる可能性があるらしい
Wandering Palm blogさんのところ(1/15-17辺り)経由の公式(?)情報による。
現実問題としてこの変化がめったに起こらないものだとしても可能性がある以上長期保存を目的とした情報として使いたくない。

最終的にアプリを起動する方法
起動方法: SysUIAppSwitch(cardNo, dbID, sysAppLaunchCmdNormalLaunch, NULL);
→ 前もって cardNo, dbID の情報を準備しなければならない。

どの情報をPrefSetAppPreferences()で保存しておくか
保存方法1: cardNo, dbName → 起動時に dbID = DmFindDatabase(cardNo, dbName);
保存方法2: cardNo, dbID, tAIN → 起動時の処理不要
保存方法3: cardNo, dbName, tAIN → 起動時に dbID = DmFindDatabase(cardNo, dbName);
→保存方法2の利点は実行時の処理が不要,tAIN でボタン名表示できる。しかし dbID は変わる可能性があるらしいので却下した。
→保存方法3は名前を二重に保存するのがメモリの無駄だと思った。利点は tAIN でボタン名表示できる。

アプリの一覧を得る方法
取得方法1: while(){ DmGetNextDatabaseByTypeCreator(); }
取得方法2: SysCreateDataBaseList(); → DmDatabaseInfo() で dbName 取得/時計アプリは別処理必要
→取得方法1なら保存方法1で可。またほぼ同じ手順で時計アプリの情報も探索保存可能。
→取得方法2
ソートされた tAIN の一覧取得可能,ただし dbName を得るためには DmDatabaseInfo() で調べる必要がある。
ソートしなければ直接 dbName は取得可能。しかしそれでは取得方法1に対する利点も無い。
tAIN を表示するなら保存方法3または2を使う必要がある。
さらに同じCreatorIDを持つ時計アプリ群は結局取得方法1で調べなければならない。

まとめ
一般的には取得方法2と保存方法2を組み合わせるのだと思う。
しかし dbID が変わり得るのだとすれば保存方法2は駄目。
また同じ CreatorID を持つ時計アプリ群をリストアップするには取得方法2では出来ない(と思う)。


実際に ver 0.3b ではソースを簡単にし,メモリの消費を抑える観点から取得方法1と保存方法1の組み合わせを実装した。
欠点→表示される名前が tAIN でなく dbName。ソートするなら自前の処理必要。
長所→コーディングが楽(同じCreatorIDを持つ時計アプリもほぼ同じ手段で処理可能)。
保存サイズ = ボタン数 * ( sizeof(Char) * dmDBNameLength + sizeof(cardNo) )
= 34 byte * Nbutton;

次の ver 0.4b(?)ではソートされた tAIN を表示するか? 具体的には取得方法2+1と保存方法3の組み合わせか?
長所→使い手にとってはソートされたアイコン名のほうが便利。
欠点→保存する preference のサイズがほぼ倍になる。プログラムが面倒。
保存サイズ = ボタン数 * ( sizeof(Char) * dmDBNameLength + sizeof(cardNo) + sizeof(Char) * X )
//dmDBNameLength == 32 // X は tAIN の長さ == 32(?)
= 66 byte * Nbutton;

または,取得方法2+1,保存方法1でもいいかも。この場合 tAIN と dbName が違う場合にソート結果が一見おかしくなるが実行には支障は無いはず,また大体の場合において tAIN と dbName は同じような名前だとすれば問題は無い?
保存サイズは 34 byte * Nbutton

または,一般アプリと時計アプリの処理をきっちり分けてアプリの処理は
第4の保存方法:tAIN, CreatorID
として実行時に DmGetNextDatabaseByTypeCreator() をループでなく一度だけ実行して cardNo, dbID を取得するか?この方法で問題は無いか?

いずれにせよ一般アプリと時計アプリの処理は分ける必要がありそう。なにか他にいい方法ありますかね?


で,やっと本題ですがこちらのエントリひぐちさんから頂いたコメント

もしかして、DmGetNextDatabaseByTypeCreator()で全てのapplタイプの
データベースを検査し、ainRscを取得して名前のリストを作っては
いませんか?

もしそうだとしたら、SysCreateDataBaseList()を使用することを
お勧めします。このAPIですと、余計なことを一切考えずにアプリ
ケーション名をリストとして作成することができます。

もしすでにSysCreateDataBaseList()をお使いでしたらごめんなさい。
なお、最後のパラメータをtrueにすると、ソートもしてくれますよ。


に対する返事なのですが,おそらくお勧めしてくださっているのは上で述べた“取得方法2と保存方法2の組み合わせ”に近いことだと思うのですが,上で述べたとおり dbID の永続性を信じていいものかどうか気になるのと,時計アプリの処理が楽になるという理由で,御指摘の通り SysCreateDataBaseList() は使わずに
> DmGetNextDatabaseByTypeCreator()で全てのapplタイプのデータベースを検査し
ています。
ちなみに DA の一覧取得にはちゃんと SysCreateDataBaseList() を使ってはいますが,dbID ではなく dbName を利用するために最後のパラメータを false にしているので,やっぱりソートされていません。この最後のパラメータは2つの意味を持っていて分離できないみたいなので悩ましいです。


要するに HalLaunch の現状はコーディングで楽をするために使用者に違和感を感じさせてしまっていて,その解消方法もいくつもある,という状態なので次のバージョンでは何とかしたいと思います。

ここまで読んでいただいた方,まとまりの無い文章でごめんなさい。また他の方法などありましたらヒントだけでもコメントして頂ければ嬉しいです。

コメント

ひぐち:

こんにちは、ひぐちです。本記事に関して、私の設計方針をご参考までに
紹介させていただきたいと思います。長文、大変失礼いたします。

・「dbID は変わる可能性があるらしい」
 変わります。実際、私はこれで致命的な不具合を埋め込んだままアプリを
 リリースして真っ青になった経験があります。
 たとえばCLIEで、あるアプリのdbIDを記録しておき、その後MS Backupで
 データをバックアップ→ハードリセット→MS Backupでデータを復元、
 とし、さっきと同じアプリのdbIDを確認すると、見事に変わっている
 ことがわかります。
・「どの情報をPrefSetAppPreferences()で保存しておくか」
 拙作HotTimeやHotButtons(Ver2.X)では、dbIDは保存せず、CreatorIDと
 typeIDだけ保存しています。この方法だと同じCreatorIDの複数アプリを
 扱えないことになりますが、元々Palmではそのような状態の方がルール
 違反なので、通常は問題になりません。
 dbIDに関しては、アプリ起動時に毎回取得し直しています。
・「アプリの一覧を得る方法」
 私がSysCreateDataBaseList()を使っているのは、経験的に、ほとんどの
 アプリでこのAPIを使用しているように見えるからです。同じAPIを使って
 いれば、結果的にUserInterfaceが統一され、使いやすいアプリになる
 という考え方です。
 SysCreateDataBaseList()を使用していれば、面倒な考慮がすべて不要に
 なり、たとえdbIDを毎回取得し直さなくてはならないとしても、メリット
 が大きいのではないかと思っています。
・「また同じ CreatorID を持つ時計アプリ群をリストアップするには
  取得方法2では出来ない」
 はい、ご指摘の通りです。SysCreateDataBaseList()でリストを取得した
 あと、今度はDmGetNextDatabaseByTypeCreator()で再度'Foss'のアプリを
 取得しなくてはなりません。ただし、上にも書いた通り、このような
 考慮をしなくてはならないのはWristPDAだけです。
・まとめ
 すみません、だらだらと書いてしまいました。アプリリストの作成に
 関する私の考え方をまとめると、以下の通りです。
 ---
 ・WristPDA専用アプリならDmGetNextDatabaseByTypeCreator()で一覧を
  取得した方が効率がよいと思います。つまり、HalLaunchにおける
  HALさんの選択は全く間違っておらず、正しいと思います。
 ・一般的なPalmデバイス用アプリの場合は、SysCreateDataBaseList()
  を使用した方が良いと思います。この場合、同じCreatorIDを持つ
  複数のアプリに関しては考慮しないことになります。
 ---

 あくまでこれは私の考え方ですので、「ご参考」ということで聞き流して
 いただければ幸いです。長文、失礼いたしました。

  • 2005/05/03(火) 18:32:05 |
  • URL |
  • ひぐち #-
  • [ Edit]

HAL:

ひぐちさん,こんにちは。
詳しい説明本当にありがとうございます。大変助かります。

ちょっと時間を置いてから自分のメモとひぐちさんのアドバイスを読み返して,なにかすっきりしない感じがしていたのが解消されました。

HalWatch 本体は時計というよりも,時計アプリ専門の特殊ランチャーとでも言うべきものなのです。それでもともと HalLaunch は HalWatch に機能追加するための練習として作っていたものを発展させていった結果できたものなのです(原型は留めてませんが)。

要は特殊ランチャーを発展させて,そこから普通のランチャーを作ろうとしていた,これが問題のひとつ。また,

> 同じCreatorIDの複数アプリを扱えないことになりますが、
> 元々Palmではそのような状態の方がルール違反なので

こういう Palm についての常識が無かったという問題,これらが変な実装をしてしまった原因のようです。

そこで考えを改めて,まず普通のランチャーを作って,そこから Fossil の特殊性に対応するようにします。

というか既にひぐちさんのご指摘に従って SysCreateDataBaseList() を用いるやり方でプログラムを書き直しました。今のところ複数の時計アプリの区別はできてませんが,アプリの名前はデータベース名ではなくて tAIN で表示して,ちゃんとソートされた状態で動いてます。

あとは時計アプリを追加して,ボタンの字が消えてしまう現象を解消(これは簡単なはず)してやればよさそうです。

今回は詳しい説明のお手間を取らせてしまい申し訳ありませんでした。でも,本当に助かりました。ご指摘頂かなかったら変な実装のまま,データベース名を自前でソートしようとしていたでしょうから。それとこの辺の処理に関係した,まだ指摘はされていない勘違い(というか致命的ではないバグ)にも気づくことができました。重ねて御礼申し上げます,ありがとうございました。

  • 2005/05/04(水) 12:37:54 |
  • URL |
  • HAL #-
  • [ Edit]

ひぐち:

ひぐちです。
いろいろとよけいなお世話的発言をして、申し訳ありません。
あんまり長くなってもアレなので(笑)、最後に1つだけ。

>今のところ複数の時計アプリの区別はできてませんが,
>アプリの名前はデータベース名ではなくて tAIN で表示して,
>ちゃんとソートされた状態で動いてます。

はい、このアプローチが良いのではないかと。

そもそも'Foss'&'appl'のアプリが複数存在することが特殊なので、
上記の方法で取得したリストの最後に、'Foss'&'appl'のアプリ名
リストを「追加」してしまえば良いのではないかと思っています。
この部分だけはソートされませんが、WristPDAのユーザはその特殊性を
理解しているはずなので、問題ないと思います。

それでは、長々と申し訳ありませんでした。

  • 2005/05/04(水) 15:47:57 |
  • URL |
  • ひぐち #-
  • [ Edit]

HAL:

あんまりいつまでもこの話を引っ張るのもどうかと思いましたが,やっぱり言っておきます。

> いろいろとよけいなお世話的発言をして、申し訳ありません。

そんなこと無いです。本当に助かっています。

以前の設定情報の保存方法の時もそうでしたけど,それぞれのAPIの機能とかはマニュアルをみれば分かりますが,こういうときにはこのAPIを使うのが普通だ,という感覚みたいなものはやっぱりある程度の慣れが必要だと思います。

私はユーザーとしても WristPDA が初めての Palm なのでその辺の感覚が無いのです。だからひぐちさんのアドバイスはとても助かります。これからもどしどし突っ込みを入れてもらえるとありがたいです。

ちなみにプログラムの方はアプリ一覧に時計アプリを追加することも大体できました。あと,細かい修正と動作チェックが終わったらリリースしようと思います。

  • 2005/05/05(木) 10:59:56 |
  • URL |
  • HAL #-
  • [ Edit]

コメントの投稿 (Post Comment)

管理者にだけ表示を許可する (Only administrator can read this comment)

トラックバック

トラックバックURLはこちら
http://hal9.blog3.fc2.com/tb.php/25-09859d75
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。