2011年5月10日火曜日

要望などメモ

以前のメモの続き

・変換後に句読点を入力したら自動的に確定するという事は可能ですか?いちいちエンターキーを押して確定しなくてもすみますから。
→前入力文字は句読点を入れた瞬間に確定するが、句読点自身が確定しないのがダメ
文字入力時の先頭記号類は即時確定?


・無変換キーを押したら、対象文節のアンダラインを消すことができますか?かな状態で確定したように見せかけるわけです。仮確定と呼んでいます。確定を意識せずにスムーズに入力できるんです。

→Android IME未確定状態でアンダーラインを消す方法がわからない。

・記号ですが、6→[ 7→】となります。

→クロス打鍵で別の括弧をだそうとしてキー配置ミス。記号配置は後で考える。

・変換戻しができるといいです。変換→後退キー→変換キャンセル
→変換キャンセルして入力文字編集状態にする方法を考える
無変換後文字入力状態にする?

・「*」を「後退キー」にバックスペースを「Del(カーソルの右を削除)」
→「右カーソル」「後退」を続けて出力すればなんとかなるかな?

・「アニメーション」が「アニメー寺院」に化ける
→シフト時間の評価が必要?

解決済


・「*」を「後退キー」に
そうしてみました (2011-05-10)

2011年5月9日月曜日

ひらがなモード時「ん」の横を後退キーにしました

「ん」の横を後退キーにしろという方が沢山いらっしゃるのでキーテーブルを見てみると、現状では「ん」の横に「*」が配置されています。これは後退に変更しても困る人は少ないかなと思ったので、そうしてみました。英字モードはいままで通りです。いずれはキー配置を設定できるようにしたいと思ってます。

テキスト挿入時にカーソルがずれていく障害も修正しました。こんな障害が残ってるのはテストケースが足りないわけですが、ぶっちゃけ自分ではあまり使ってませんねぇ。ネットワーク接続なしで使えれば使用頻度も上がるんじゃないかと、OpenWnnのソースを眺めてますが、なかなか。

2011年4月21日木曜日

OpenWnnのビルド

ネットワークのないところでもかな漢字変換が使えるようにするためOpenWnnの移植を考えてます。まずはソースをダウンロードしてOpenWnnをmakeして端末にインストールするまでをやったので、その作業メモです。

本当はAndroidの全ビルドをやりたかったのですが、"Could not load 'clearsilver-jni'"  というエラーがどうしても解消できなかったので断念。やり方知ってる人は教えてください。

【必要マシン環境】
froyo以降では64bit Linux環境が必要なようです。32bit環境でやると "Only 64-bit build environments are supported beyond froyo/2.2." というエラーが出て止まります。

Java はSun (今はOracleですが) のサイトからダウンロードした 1.6 が必要です。Ubuntuのapt-getでインストールされるOpenJDKを使うと、sunからダウンロードしたjavaを使ってくれというエラーメッセージが出力されました。


Androidソースのビルドに必要なライブラリ】
これも"Android ソース"のビルド方法のサイトにいろいろ載っていますが、 だいたい次のようなものが必要です。

git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential
zip curl libncurses5-dev zlib1g-dev lib32readline5-dev g++-multilib

apt-getコマンドなどでインストールしておきます。

【Androidソースのダウンロード】
OpenWnnの部分だけあればいいのではなく、ライブラリとかmake環境の作成とかに必要なので全ソースを落とさなければなりません。まあOpenWnnだけ落とす方法は知らないのですが。

git-core をインストールし、repoをインストールして、repo syncでダウンロードします。このへんは "Android ソース" などで検索するとやり方を紹介したサイトがいろいろでてきます。

このへんを参考にしました。
Androidソースコードをダウンロード・ビルドするには - 逆引きAndroid入門



うちのネットワーク環境がおかしいのかもしれませんが、Androidソースのダウンロード中で止まってしまうことがよくありました。放っておくと一晩たってもそのままなので、ダウンロードが凍りつく度にコントロールCで中断して、repo syncと打ちこんで再開し、と長い時間かかって落としました。


【Androidのビルドエラー】
なんとか全ソースを落としたらビルドです。ここではソースを落としたディレクトリを'android'ディレクトリとします。android/build/envsetup.shで環境をセットアップしてから'm'コマンドでビルドしてみます。
[android]$ source build/envsetup.sh
including device/htc/passion/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
[android]$ m
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=AOSP
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv5te
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
============================================
....(略)
Docs droiddoc: out/target/common/docs/doc-comment-check
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/doc-comment-check-timestamp] エラー 45
上のように "Could not load 'clearsilver-jni'" と表示されてうまくいきません。ググるとJava1.5を使うといいみたいですが、最新のソースではJava1.6を使わないと警告がでるようです。いろいろ調べてみましたが、どうもよく分かりません。うむむ。



【OpenWnnのJNIライブラリのビルド】
気をとりなおして、OpenWnnのビルドだけを行うことにします。

OpenWnnは JNIで作られたライブラリとJavaのソースから構成されています。JNIのライブラリはクロスコンパイラのあるLinux環境で作成し、残りのJavaソースはEclipse環境に移してビルドすることにします。
 
まずLinuxで 'android/packages/inputmethods/OpenWnn' に移動します。ここがOpenWnnのソースディレクトリです。'mm' コマンドでこのディレクトリ以下をmakeすると次のエラーメッセージが表示されます。
[OpenWnn]$ mm
...(略)
make: *** `out/target/product/generic/obj/SHARED_LIBRARIES/libWnnEngDic_intermediates/LINKED/libWnnEngDic.so'に必要なターゲット `out/target/product/generic/obj/lib/libc.so' を make するルールがありません. 中止.
'libc.so'が必要なので、これをビルドするソースを探します。これは 'android/bionic/libc' にあります。そこに移って再び 'mm' でビルドします。
 すると今度は 'out/target/product/generic/obj/lib/libdl.so' がないと言ってくるので、'android/bionic/libdl' に移ってビルドします。JNIライブラリが作成されるまで、このように人間makeをやり続けます。

JNIライブラリで必要なのは 'android/out/target/product/generic/obj/lib' にある libwnndict.so libWnnJpnDic.so libWnnEngDic.so の3つのファイルです。

人間makeを続けていくと、そのうち package.apk を作成するのに必要なファイルがないと言ってきますが、この時点で libwnndict.so libWnnJpnDic.so libWnnEngDic.soの3つが作成済となっています。あとはEclipse環境でやります。

依存関係をまとめると次のようになります。表の下から順にビルドするといいでしょう。

作成ファイル作成ディレクトリ依存ファイル
libwnndict.so libWnnJpnDic.so libWnnEngDic.so android/packages/inputmethods/OpenWnn libc.so
libc.so android/bionic/libc libdl.so
libdl.so android/bionic/libdl apriori soslim
apriori android/build/tools/apriori libelfcopy.a libelf.a
libelfcopy.a android/external/elfcopy -
libelf.a android/external/elfutils -
soslim android/build/tools/soslim -


※実は android ディレクトリで、'make OpenWnn' というコマンドを打てば、最後まで作成できるということを後から知りました。ただし、この方法でできた OpenWnn.apk は必要なライブラリがリンクされていないのでサイズが半分くらいしかなく、実機に持っていっても実行できません。ここでできたJNIライブラリだけを使って以下の作業を行う必要があります。


【OpenWnn.apkのビルド】
 ここから先は「Android Hacks――プロが教えるテクニック & ツール」という本のadamrockerさんの記事が参考になりました。

 OpenWnn のソースをEclipse環境に移します。Windowsなどでも大丈夫です。必要なものは 'android/packages/inputmethods/OpenWnn'以下にある src/ res/ ディレクトリと、AndroidManifest.xml ファイルと、'android/out/target/product/generic/obj/lib' にあるJNIライブラリ libwnndict.so libWnnJpnDic.so libWnnEngDic.soです。JNIライブラリは移動先に libs/ ディレクトリを、その下に armeabi/ ディレクトリを作成し、その下にコピーします。

移動先を OpenWnnTestとすると以下のようになります。
OpenWnnTest/
┝ AndroidManifest.xml
┝ src/
┝ rec/
└ libs/
   └ armeabi/
     ┝ libwnndict.so
     ┝ libWnnJpnDic.so
     └ libWnnEngDic.so
移動先ができたらEclipseを起動し、新規プロジェクトを作成します。Androidプロジェクトを選択し、詳細設定で既存ソースを元に作成するようにし、今作ったOpenWnnTestを指定すればOKです。

あとは通常にビルドすればいいのですが、リソースファイルがgen/の下にできないときは、プロジェクトのプロパティからJava Build Pathを選択し、Order and Exportでクラスの作成順序をチェックします。

2011年3月8日火曜日

ELECOM TK-FBP017のSPP転送フォーマット

Bluetooth HIDとSPP
ELECOM TK-FBP017のBluetoothインターフェースは、右上のスイッチを設定することによって、2種類のプロファイルを選べます。プロファイルとはBluetoothの通信方式のことです。

ひとつはHIDです。キーボードとして接続するための規約なので、このモードで接続できれば、特別なことをしなくても、OSで通常のキーボードとして処理されます。アプリケーションにはキーボードイベントが通知されるので、専用のキーボードとまったく同じに見えます。残念ながらAndroid携帯でHIDを備えてる機種はほとんどありません。

もうひとつはSPPモードです。アプリケーションではBluetooth経由のシリアルポートに見えるので、OKeyPieのようなIMEを使って、シリアルから読みだした値をアプリケーションに入力値として送ってやる必要があります。Android2.0以降では、たいていこのモードを備えているので、こちらの方式ならほとんどの機種に接続できるはずです。(Nexus Sのような例外もあるので注意)

ELECOM TK-FBP017 のSPP転送フォーマット
TK-FBP017は、キーボードを押した瞬間と、離した瞬間に、キーボードのデータを送ってきます。転送フォーマットは次のとおりです。
ff (押した、あるいは離したキーのコードのバイト列) 00
先頭に16進数のffが1バイト送信され、キーコードがいくつかあって、最後に00で終わります。キーコードの配置は下図のとおりですが、これは押したときの値で、離したときのキーコードは図のコードに80をORした値となります。

たとえば "A" のキーを押した場合は
ff 1c 00

離したときは
ff 9c 00

"A" と "B" が押されたときは
ff 1c 32 00
というふうに転送されてきます。

TK-FBP017 キーコード (クリックで拡大)
同時打鍵も検出できますが、まったくデータが来ない組み合わせもあるので注意が必要です。

2011年3月7日月曜日

IS05, SoftBank 005SH で動作確認

日本アンドロイドの会の定例会で、シャープ製Android端末 au IS05 および SoftBank 005SH を触ることができました。マーケットからOKeyPieをインストールしてTK-FBP017を接続してみたら、ちゃんと動きました。いまのところ動かないのNexus Sだけだなぁ。

会場には噂のXoomもあったんですが、XoomのマーケットアプリではOKeyPieが検索できなかったのでインストールできませんでした。残念。

 動作確認できた機種 Android 2.0以上必須
HTC Desire SoftBank X06HT
SoftBank 005SH
Docomo GALAXY Tab SC-01C
au IS05
 動かなかった機種
Nexus S

2011年3月6日日曜日

Androidテキスト入力画面のショートカット

Androidは実はいろいろなところでキーボードショートカットが使えます。アプリケーションの作りにもよりますが、テキスト入力画面はどれも EditViewを貼って作るので、たいてい次のようなショートカットが使えます。

キー操作機能
シフトキー+カーソル範囲指定
MENU+A (TK-FBP017ではCtrl+A)全指定
MENU+X (TK-FBP017ではCtrl+X)カット
MENU+C (TK-FBP017ではCtrl+C)コピー
MENU+V (TK-FBP017ではCtrl+V)  ペースト
シフトキー2回CapsLock
  解除はシフトキー1回
Alt+→行末
Alt+←行頭
Alt+↑文頭
Alt+↓文末
Alt+Del行全体を削除
Alt+空白(英字モードのみ)
特殊記号入力表示

これらに対応するために OKeyPie の出力コードを変更しました。OKeyPieを更新してください。

2011年3月2日水曜日

Android用親指シフトIMEの使い方

いろいろ不備はあるのですが、ひとまずマーケットに登録しました。Androidマーケットにて
「OKeyPie」もしくは「親指シフト」で検索すると見つかります。

動作条件

 対象キーボード
ELECOM TK-FBP017
 動作確認できた機種 Android 2.0以上必須
HTC Desire SoftBank X06HT
SoftBank 005SH

Docomo GALAXY Tab SC-01C
au IS05
 動かなかった機種
Nexus S

インストール

Androidマーケットにて「OKeyPie」もしくは「親指シフト」を検索してください。


 インストールしたら、ホーム/メニュー/設定/言語と文字入力を選択し、「OKeyPie」の項目にチェックを入れます。IMEはこれをやらないと使用できません。


何か凄いことを警告されますが、信頼して「OK」を押します。


Bluetooth通信の準備

TK-FBP017を開くとこのようになってます。


右上のスライドスイッチを左側にずらして SPP モードに設定しておきます。


Androidに戻ってホーム/メニュー/設定/無線とネットワークを選択します。Bluetooth機器を検索する前にキーボード側の接続スイッチを押しておきます。

 

デバイス検索でELECOM TK-FBP017が見つかったら、それをタッチして「ペアリング」を行います。


 「承認」を押してペアリングします。

IME切り替え

エディタなどテキストを入力する場所を長押しします。


入力方法をタッチします。すでにインストールされているIMEがいろいろ表示されるので「OKeyPie」を探してタッチします。見つからないときは、ホーム/メニュー/設定/言語と文字入力 の「OKeyPie」欄にチェックが入っているか確認してください。


Bluetoothキーボード接続の開始

入力欄をタッチすると、OKeyPieのソフトキーボードが表示されます。右の大きいボタンが設定ボタンで、左はソフトキーボードの消去ボタンです。


設定ボタンを押すと、まだBluetoothが有効になっていないときは、ダイアログが表示されるので有効にして、もう一度設定ボタンを押してください。有効になっていれば、接続メニューが表示されます。

「ELECOM TK-FBP017」をチェックし、キーボードの左上の接続ボタンを押してから、Android画面の「Start」ボタンを押します。
10数秒してインジケータが一瞬緑色に光ったら、接続成功です。インジケータは一瞬光ったあと消えてしまうので見逃さないようにしてください。これで、使うことができます。無入力のまま放っておいたりしてキーボードとの接続が切れた場合は、Bluetoothキーボードとの接続からやり直してください。


接続に成功したら、1行だけのソフトキーボードは表示しなくても使えます。また、カーソルキーなどはホーム画面などでアイコンを選択するときにも有効です。つまりIMEはソフトキー窓を閉じても、ずっと動いているわけです。