Dropbox

Wireless Toolkit 2.5.1 QwertyDevice Emulator上海での生活が落ち着いて来たので久しぶりにKKJConvのソースをいじっています。ついでに開発環境も最新版に更新しました。

使い勝手は良くないのですが事情があってKKJConvはSunから提供されているWireless Toolkitを使用しています。それを最新版の2.5.1にしてQwertyDeviceのエミュレーターを立ち上げたら、左のようなM600に大型液晶を付けたような形になっていました。見た目はE61をシーソーキーにしたようだと言えなくもないかな。以前はNokiaコミュニケータ型(だけどカッコ良くはない)のものでした。

見た目はカッコ良くなったのですがPCのキーボードを使用してのテストは勝手が良くないです。アルファベットは、そのまま打てるのですが数字を入力するに一手間かかります。きっとWireless Toolkitの開発チームにM600のファンが居るに違いないです。

ということでKKJConvに軽微な変更を加えたv1.01が出来上がったのですがネットの問題でなかなかサーバーにパッケージをアップロード出来ないです。まいったなぁ。

WTK25 QWERTYエミュレーターの謎

Java MIDPの開発ツールをWTK22からWTK25に更新しました。KKJConvを動かしてみると何故かQWERTYデバイスのエミュレータのみでキーが二重に入力されるようになりました。最初はKKJConvの隠されたバグが顕在化したのかと少々あせりました。

QWERTY以外のエミュレータでは問題ないですし、落ち着いて考えると キー入力をダブらせるバグを作るほうが難しいです。そこで簡単な切り分けを行ってみるとキーを押下するとkeyPressedと一緒にkeyRepeatedというイベントが発生していました。keyRepeatedは、その名の通りキーをホールド後一定時間が経過してからキーが離されるまで連続して発生するイベントです。それが何故かkeyPressedと同時に発生してしまい入力が重複してしまったということです。MIDPのエミュレータは以前からそうなのですがキー・リピートが(少なくとも導入時の設定では)出来ないものなので何やら怪しげです。

何はともあれQWERTYエミュレータの設定ファイル C:\WTK25\wtklib\devices\QwertyDevice\QwertyDevice.properties をのぞいてみると # keyRepeatEvents = false などという場所がありました。以前の設定ファイルには存在していなかったキーワードと思います。コメントアウトされているので有効にしてみます(行頭の#を外す)。これで目出たく余分なキーリピートの発生は抑制されました。

もう一度現象を確認すべく先のキーワードをコメントアウトしてみますが、同じ現象は発生しませんでした。ついでにkeyRepeatEvents = trueにもしてみましたが挙動は全く変わりません、キーリピートも有効にはなりませんでした。ま、とりあえず使えるようになったのでよしとします。

Visual Studio 2005 on Mac OS X
趣味のプログラミングも極力MacBookで行うと企んでいます。Boot CampでXPを動かせば、ほとんど問題はないのでしょうが、それでは面白みがありません。どうせならMac OS Xと同時に使いたいものです。ということでしばらくはParallelsを使用した環境構築の探求にいそしみます。今回使用したParallelsはBeta3 (Build 3106)です。
まずは一番問題が出そうなVisual Studio 2005に挑戦しました。とりあえずBoot CampにXPを導入し、同じXPをParallelsからも立ち上げるようにしての環境構築。Boot Camp側でVS2005を導入してみます。ParallelsもBoot Camp側も一応問題なさそうです。Parallels側でWindowsプログラムのデバックなどがうまくいくかどうか心配していたのですがC#のプログラムでステップ動作なども出来ました。またWindows Mobileのリモートでバッグも問題ありません。
ということで、次に純粋なParallelsだけでの環境構築です。これで、すこし時間を費やしてしまいました。VS2005の導入を何度試しても途中で失敗してしまいます。現象はいくつかあったような気がしますが、どうもCD-ROMの読み込みに問題があるように思えます。Boot Campで導入したWindowsのイメージをバックアップしParallels側にリストアすれば使えます。しかし、それでは手軽に再導入というわけにはいきません。

結局Parallels Image Toolを使用してVS2500のCDイメージを作成し、そこから導入するという方法でうまく行きました。ただしCDイメージの読み込みが遅いのか、まるでハングアップしたかと勘違いするほど導入に時間がかかります。

上のビットマップはVS2005をCoherence Modeで動かした状態です。実際はVirtueDesktopsで画面を切り替えた方が快適です。

Symbian OS プラットフォームセキュリティ

この本も帰国前にアマゾンでオーダーしておきました。Symbian OS v9のセキュリティーの概略からプログラムの書き方、署名の付け方までまでコンパクトに解説した本です。S603rd, UIQ3でプログラムを書こうとする人は必読と言えるでしょう。

入手後、数日たっていますが全然読めていません :(。パラパラと眺めているだけです。こういう本は、英語で入手しないといけないことが多いのですが(Symbianはそうでもないかな?)、日本語だとやはり読みやすそうです。

写真はアマゾンへのリンクです。

ユニコードでのRename

覚書です。とある理由で大量にファイル名の変更を中国簡体字で行う必要に迫られました。一つ一つならExplorerで可能なのですがBATで処理したいような場合、日本語Windows上では単純にBATを書いても無理なようです。色々方法はありますがWindowsの標準装備で行う場合Vbsciptを使うというのが定石でしょう。 

以下のような内容のファイルをUnicode(LE)で作ります。ファイル名の拡張子はvbsとして、コマンドラインから cscript xx.vbs のようにして実行します。

Set oStdOut = WScript.StdOut
Set oFs = CreateObject(“Scripting.FileSystemObject”)
Call ren(“002.3gp”, “你好.3gp”)
Call ren(“003.3gp”, “你好2.3gp”)
Sub ren(org, dst)
 if (oFs.FileExists(org)) Then
  Set oFile = oFs.GetFile(org)
  oFile.Move(dst)
 End If
End Sub

山根さんとこで紹介されているようにKKJConvをBlackBerryで稼動することが出来ました。
これはMIDPのプログラムをBlackBerry用にパッケージしなおしただけのものです。ソースとかは一切必要が無いので、手持ちのMIDPプログラムをBlackBerry用に変換するのは難しくはありません。もっとも、山根さんの記事にあるようにKKJConvが不可解な落ち方をしているのでBlackBerry特有の不具合みたいなものは発生するかもしれません。

[ 必要なツール ]
BlackBerry Developers -> DownloadsにあるJDE Component Package
これはパッケージ作成に必要なツールだけが含まれています。フル開発パッケージであるBlackBerry JDEでも当然OKでしょう。

[ パッケージの作成方法 ]
変換したいMIDPのjarファイルとjadファイルを用意します。jadについてはjarに含まれているMANIFEST.MFから何とか作ることも出来るでしょう(ここでは詳細は省きます)。

jarを元にcodという拡張子のパッケージを作ります。
– スタート->Research In Motion->BlackBerry JDE Component Package->JDE Components Command Promptを開きます。
– 以下のコマンドを実行。
rapc import=.\lib\net_rim_api.jar codename=KKJConv -midlet jad=y:KKJConv.jad y:KKJConv.jar

これはCommand Promptを開いた状態のままでyドライブにjarとjadがある場合の例です。
これにてカレントディレクトリーにKKJConv.codが出来上がればOKです。

KKJConv.alxファイルの作成。
BlackBerryにcodを導入するにはalxファイルが必要です。alxの中身はテキストでjadと似ています。以下にKKJConv用にでっち上げたalxファイルを書いておきますのでjadと見比べて適当に作成すれば良いと思います。

<loader version="1.0">
<application id="KKJConv">
<name>KKJConv</name>
<description>KKJConv</description>
<version>0.72</version>
<vendor>Kozak N'sLAB</vendor>
<copyright>Copyright (C) 2006 by Nobumichi Kozawa</copyright>
<fileset Java="1.0">
<files>KKJConv.cod</files>
</fileset>
</application>
</loader>

私は、まだエミュレーターも動いていないので実際のテストは全て山根さんにお願いしています。山根さんありがとうございました。

BlackBerry自体に色々と未知の部分も有ります。この手順を試す場合は、くれぐれも自己責任で行うことをお願いします。

KKJConvを作っていて機種依存で苦労した部分の覚書です。

[ TextBoxの改行コード ]
Nokiaの場合単純に”\n”、16進数で0x0aを改行として考えれば問題ないです。
UIQ機(M1000やM600i)ではParagraph Separator(UTF-8だとe2 80 a9)というコードを使います。
NokiaのデバイスにParagraph Separatorを書き込んでも、ちゃんと改行されます。
問題はプログラム中でParagraph Separatorをどうやって表現するかということです。”\n”みたいな文字列で表現できれば簡単なのですが見つからなかったのでKKJConvの中では以下の関数で返る文字を使用しています。

private char getParaSepa()
{
    byte [] ps = new byte[3];
    String sP;
    // this is Paragrpah Separator in UTF-8
    ps[0] = (byte)-30; ps[1] = (byte)-128; ps[2] = (byte)-87;
    try {
        sP = new String(ps, "UTF-8");
        return sP.charAt(0);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return 0x0a;
}

[ Unicode ]
Nokiaや、おそらくSonyEricssonのデバイスではUTF-16LE, UTF-16BE, UTF-8のどれでもエンコード、デコードが出来ますがM1000ではUTF-8しか扱うことが出来ないようです。このためKKJConvの辞書は最初UTF-16LEを使っていたのをUTF-8に変更しました。

PS. 日本から上海に戻ってすぐ出張に出ています。移動日が多いだけで仕事は少ないのでKKJConvの更新が出来るつもりでしたが、食事行ったり飲みに行ったりで結局何も出来ていないです。

KKJConvの中にE61固有のコードが沢山含まれています。機種固有部分を処理するために自動的に機種を判別するコードを組み込みました。その際に使用したのがSystem.getPropertyというAPIです。

このgetPropertyで得られる値を表示するプログラムKGetPropertyを以下のurlにアップロードしました。KKJConv用の機種判別コードは既に完成していますが、皆さんのデバイスで、どんな値が返るのか今後の参考のために知りたいと思います。もし時間に余裕があれば調べてコメントいただけないでしょうか?

http://www.nkozawa.com/html/E61MyProgList.html

私の香港版、ちょっと怪しい中文E61では以下のような値が得られました。

Encoding: ISO-8859-1
Platform: NokiaE61-1/0610.04.04
Locale:
Configuration: CLDC-1.1
Profiles: MIDP-2.0

何故かLocaleはブランクです。エミュレーターではちゃんと文字がでていたのでバグではないと思います、、、

6/29追記
言語を中国語に変更したら Locale: zh-CN になりました。上のは英語にしていたときです。en とでるべきなのでしょうが、事実上は影響ないでしょうね。

本命のプログラム作っていて改行とバックスペースが効いているのに気づきました。
で、昨日のキーコード表示プログラムを眺めてると、あまりに単純なバグがありました。修正版のV1.1の発行と相成りました。結構、恥ずかしいです。よくあることとは言え、こんなんで大丈夫なんだろうか、、、

http://www.nkozawa.com/html/E61MyProgList.html
新しいファイル名はKKeyCC11.zipです。

NOKIA E61のフルキーボードのキーを押した時にどんなキーコードがMIDPのプログラムで得られるかを調べるプログラムを作りました。CanvasクラスのkeyReleaseイベントで得られるキーコードを16進数で画面に順次表示していくものです。おそらくはプログラマー以外の人には何の意味も無いものです。MIDP1.0が動くデバイスであれば、どんなものでも動くはずです。

以下のurlで公開しています。ファイルKKeyCC10.zipにソースコードと実行コードが入っています。実行コードは展開してbinディレクトリーに入っているKKeyCodeChecker.jarです。

http://www.nkozawa.com/html/E61MyProgList.html

結果として分かったのは、取得したかったEnterとかバックスペースのキーコードは得られないということでした。その他にもキーコードの得られないキーがいくつか、、、

試しにSonyEricssonのP910cでも実行してみました。なんとフルキーボードは、この方法では全く役立たずでした。TextBoxなどのOSの部品を使うような場合は、当然大丈夫でしょう。