2011年8月7日

[widget]よくわからんがAppWidgetが動いた

過去記事:2010/08/19 23:36

AndroidのAppWidgetといえば、ネットで検索すると山のようにヒットする。
花形だ(私の中では)。


にもかかわらず、なぜか私はうまく動かすことができない・・・。
おそらく、理屈がわからずに作っているからだろう。
APIがたくさんあると、どうにもめんどくさくなっていかん。
それが慣れない「Java」ということになり、さらに手を抜いてしまっている。


また、自由度が高いところも、調べるのが面倒になった理由に挙げられよう。
ああやってもこうやっても実現できる、といわれると、ではどれがいいんだ?というところで止まってしまうのだ。
私にとって一番いいのは、手間がかからないこと。
特に今回は拡張するような機能もないので、やりたいことができればよかったのだ。

そんなこんなして、何とかできあがったようなので、次回から学習も含めて解説してみよう。
やるのは、

  • アイコンタッチとブロードキャストを受け付ける
  • 受け付けると、アイコンを変化させる
  • アイコンは各AppWidgetではなく、全AppWidgetが変化する

というだけのもの。
前回からの宿題ですな。

[a500]自作EjectSDが動かない

A500の調子がいいうちに、自作のアプリをインストールしてみた。
それが悪い影響を及ぼすかどうか知らんけど、普通に動いてもらわねば。


https://market.android.com/details?id=jp.typepad.hirokuma.EjectSD
うまく動かない。
マウントなどを認識してくれないのだ。

logcatで見ると、アプリは/mnt/sdcardを見ているようだ。
しかしmountで見ると、SDカードは
  • /mnt/external_sd
  • /mnt/secure/asec
あたりにマウントされているようなのだ。
うーむ、巷では聞いたことがあったのだが、自分のところに影響しようとは。
printenvすると、こうなっていた。

SECOND_VOLUME_STORAGE=/mnt/external_sd

EjectSDでは、Environment.getExternalStorageState()でマウント状態を取得している。
パスは、Environment.getExternalStorageDirectory().toString()で取得している。
つまり、getExternalStorageシリーズでは正しく取得できないことになる。
まいったなあ。


http://developer.android.com/guide/topics/data/data-storage.html#filesExternal
getExternalFilesDir(null)、でいいのかな?

ちょろっと試したいところだが、mmでビルドできる環境じゃないと動かないアプリなのだ。
Context.getExternalFilesDir(null)

これは、nullが返ってきた。
W/ApplicationContext(  835): Unable to create external files directory

API9だとandroid.os.storage.StorageManagerがあるので、使えるかもしれん。
が、それは使いたくないので、このまま進めよう。

環境変数を見てみる。

String str3 = System.getenv("THIRD_VOLUME_STORAGE");
String str2 = System.getenv("SECOND_VOLUME_STORAGE");
String str1 = System.getenv("EXTERNAL_STORAGE");
String str = Environment.getExternalStorageDirectory().toString();

結果

D/EjectSD ( 1195): 3 : /mnt/usb_storage
D/EjectSD ( 1195): 2 : /mnt/external_sd
D/EjectSD ( 1195): 1 : /mnt/sdcard
D/EjectSD ( 1195): 0 : /mnt/sdcard


決め手に欠けるので、これはユーザに選んでもらうしかないなぁ。

しかしどうしようもないのは、mount/umountのブロードキャストが飛んできてなさそうなこと。
MountServiceではだめなのかなぁ。
voldやMediaScannerなんかは動いているから、取得する方法はありそうなんだけど。

まだまだ、である。

[a500]今日は調子がよい。。

昨晩、またタッチパネル操作ができなくなったので、放っておいた。
今朝もだめだったんだけど、USBキーボードを使うか、動いた一瞬の隙を突いたか忘れたが、工場出荷時に戻した。

そこから、調子がよい。
あんまり使ってはいないけど、再起動しても、スリープから復帰させても動いている。
最初からこの状態だったら、何も悩まないのに。。。

まだAcerには電話していないので、今週はこれで様子を見てみよう。
だんだんこうやって、初期不良時間が短くなっていく。

[a500]Amazonはこの件についてAcerに問い合わせを要求した

やっぱり、これは初期不良だよな。
なんたって、買った直後ですらタッチパネルが使えなかったし。
でも、使えることもあったしなぁ。。。

そんなわけで、Amazonの返品要求(交換)をしてみた。
理由は、

初回の起動からタッチパネルが反応しないため、 何もできない。ごくまれに、使えることがある。 

と、現状を書いた。
短いのかもしれんが、だらだら書いても同じだしなぁ。


数時間後、メールが来た。

誠に申し訳ありませんが、当サイトでは、お客様よりご連絡いただいた問題が初期不良かどうかを判断できません。
恐れ入りますが、取扱説明書または保証書をご確認のうえ、今回の問題について一度メーカーにお問い合わせください。

まあ、もっともな話だ。
現品を見られるわけでもなく、自社製品というわけでもないので、私個人の判断では相手も納得しないだろう。
「使えることがある」というのも、気になったのかもしれない。
私でもそう言うだろうな。


そんなわけで、Acerに電話せんといかん。
そして、納得してもらえたら、窓口の人の名前を教えてもらい、それをAmazonに通知して、ようやく不良品扱いとなる。

ふー。

2011年8月6日

[a500]返品しそうになっているが、まだ迷いはある

8割方、返品へ気持ちは動いている。
もう一度工場出荷時に戻したんだけど、そこからタッチパネルは反応なし。
USBキーボードを挿すと動くんだろうけど、それは製品仕様を満たしていない。
では、返品だ。


しかし、どうにかしたらタッチパネルが動くかも。
そう思って、あれこれ試している。
そしたら、音量ボタンを押したときに出てくるポップアップ画面がときどきタッチパネルに反応することがわかった。
反応したからといって、アプリ側が反応してくれるわけではない。
タッチパネルのところだけ反応するのだ。


あー、ソフトバグというか、ハードウェア初期化のタイミングがずれてるとか、安定時間が部品交換で変わったとか、そんなんじゃなかろうかね。
適当な推測だけど。

とにかく、今のうちにあるA500は、一番最初の「ようこそ」画面から先に進めないのであった。
やっぱり返品かねぇ。

[a500]Acer A500を買ったが、タッチパネルが反応せん

AcerのA500というタブレット端末を購入した。
それはいいのだが、タッチパネルが反応しないことが多くて困る。

まず、電源をONすると、起動画面が出て、Androidのアニメーションが出て、ロック解除画面が出る。
ここでタッチパネルが使えない。。。
100%かというとそういうわけでもなく、98%くらい。
たまーに、使えるときがある。
95%くらいかも。
時計描画は更新されるし、電源ボタンを短押しするとLCDがON/OFFするし、長押しするとダイアログも出てくる。
adbだって動く。
だから、死んでいるわけではない。

だけど。。。タッチパネルが使えないので、ロック解除できない。
うーむ。
最近わかったのは、USBキーボードを挿すと解除できるということ。
挿すと、ホーム画面が出てくる。

さて、ホーム画面が出てきたらOKかというと、そういうわけではない。
相変わらずタッチパネルが使えない。
このとき、2パターンある。
画面の一番下(ステータスエリア?)にホーム画面へ遷移したりするタッチパネルのボタンがあるのだが、それが使えるときと使えないときだ。
そこが使える場合、タッチするとタッチパネルが復帰して、使えるようになる。
使えない場合は・・・どうしようもない。

まあ、今は「どうしようもない」なんだけどね。
ネットで調べると何人かいるようで、スリープさせて復帰させるとだいたい大丈夫、という人もいた。
うちはそうではないみたい。
参ったなぁ。。。

誰も彼もがそうではないようなので、ソフトバグではないのかもしれない。
でも、ハードバグだったらもうちょっと動きが悪そうな気がするし。
うーん、うーん。。。


RESETボタンがあるので、試しもした。
変わらず。。。
念のため工場設定に戻しもしたが、やはり変わらんかった。


今、再起動させて、反応している。
そう、動いているときはなんの問題もないのよねぇ。。。
ソフトをインストールしてこうなった、とかならソフトを疑うんだけど、買って、電源ONして、最初の入力中に反応しなくなったからなぁ。
メールアドレスの入力中に、急になったような記憶がある。
なので、初期不良・・・?
でも動くときは動くし・・・と、堂々巡りだ。

あ、今まで動いていたのに、急に反応しなくなった。
うーん、さっぱりわからん。

Rotation Lockボタンとサウンドボタンをいじったら、また反応しだした。。。
いったいなんなんだ??

2011年7月31日

NFCは一過性か

数年前に作業を選ぶとき、誰も選びそうになかったFeliCa。
そこから、なんとなく見続けているような気がするNFC関係のこと。

当時は「NFC」などという言葉は一般的じゃなかった。
私もFeliCaのことを知るので手一杯で、NFCという分野があることすら知らなかった。

そして今。
人口に膾炙したって程ではないけども、日本で普通の人が「NFC」と書くことも多くなっている。
Taspoのときには何も言わなかったのに、なんで今さら、という気はしなくもない。
それを言えば私だって、何を今さらってことにはなってしまうのだが。

私が知っている範囲では、Androidの影響だ。
でも、それは2.3でNFCを使えるって話が出てきたところなので、ほんの最近だ。
もっと以前に何かあったのではないだろうか。

以下、ネットの検索だけなので、間違っていたら済みません。


ISO18092は、2003年に規格化されたようだ。
14443はそれより前。
ドコモの506iCは2004年。
モバイルSuicaは2006年。

そこから5年。
国内でNFCに特に何かあったか?というと、Taspoが出たり、自動車免許が電子化されたくらいしかわからない。
でも、「Taspoを携帯電話に載せろ」とか、「免許情報を携帯電話で読みたい」という話はついぞ聞かなかったような気がする。
うーむ、よくわからん。


よくわからんが、やはり「急に」人々が口にし出したという印象はぬぐえない。
私もその部類に入るかもしれんな。
んで、長続きするかというと、よくわからん。
NFCは、決済方面か、データ交換方面か、どっちかしかないと思う。
決済方面は、個人では手が出せないので、やるならデータ交換。
データ交換って、できてしまえば、あとはアプリだけの話だ。
アプリとなると興味が持てないのだ。


まあ、それは今の私のお話。
タブレット端末を買おうとしているので、それでまた変わってくるかもしれん。
かわらんかもしれん。
しかしまあ、熱しやすく冷めやすい国民性、と言われるのはしゃくなので、冷めない程度に続けていきましょうかね。

NDEFよ、お前もか・・・

NFC Data Exchange Format。略してNDEF。
NFCでデータ交換するときのフォーマットだ。

・・・。
データ交換するための形式というのは、世の中に数多くあると思う。
「交換」といっても、同時にやりとりするわけではないので、自分から相手に渡すだけだ。
まあ確かに、RFでのデータやりとりは、なるべくさっさと済ませたい。
1byte送るのに何マイクロ秒かかるから・・・なんて計算をしょっちゅうやってるので、気持ちはよくわかる。
わかるんだけど、けっこうここら辺で使ってる通信って、速度が速いやん。
そんなに独自の形式にこだわらなくていいんじゃないのかなぁ・・・。

私としては、OBEXとかバイナリXMLとか、もう既に存在するフォーマットを使ってほしかったな。
しゃーらしいので、作業をふやさんでほしい。

まあ、個人の声が届かないから好き勝手出来るってのもあるんだけどね。


まず、NDEFには「NDEF message」がある。
NDEF messageは、1つ以上の「NDEF record」がある。

・・・
・・・・・・

なんか、どこのフォーマットも、どれもこういう形式やん。
BIFFだってDICOMだってXMLだって、バイナリやテキスト関係なく、結局のところはこういう形式にならざるを得ない。
みんな同じようなものを別の意味で持たせるので、使う人達は同じようなパーサを毎回作らなくてはならない。
なんか、ばからしい。

そんなわけで、資料を読むのはやめた。
人が作ったライブラリをいただくことにしよう。
なかったら、いるものだけ作ればいいや。

[c++]暗黙のキャスト

ここ最近、Cでしか書いていないので、C++のことはずいぶん忘れている。
ちょっと思い出していかないといかん。

Qtの本を読みながらソースを見ていくと、こんな行があった。

  newAction
->setShortcut(tr("Ctrl+N"));

Ctrlキー+Nキーを押したときに動作するのだ、ということを設定している。

私が思ったのは「Qtって、文字列に書いたら自動的にやってくれるんだねぇ」だった。
しかし、文字列ってことは、誰かがそれを解析していることになる。
解析して、「Ctrl」と「N」に分割して、それをフラグにしてうんたらかんたら、となるはずだ。
そういう処理は、私はあまりお好きではない。
できればフラグで与えてしまって終わり、としたい。
解析にコストをかける必要がないときには、なくしてしまいたい。

では、とQAction::setShortcut()の仕様を見た。

void QAction::setShortcuts ( constQList<QKeySequence> & shortcuts )

void QAction::setShortcuts (QKeySequence::StandardKey key )

この2つしかない。
暗黙で何か行われているようだ。


intやcharなどのプリミティブ型は、よく暗黙でキャストされている。
また、継承関係にあるクラスについても、よくあることだ。
そうでない場合、何かしてやらないといけないと思う。
ここら辺の記憶が曖昧なので、順に見ていこう。


まず、引数から。

tr("Ctrl+N")

QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )[static]

trはQObjectクラスのstatic関数で、ほぼすべてのQtクラスはQObjectを継承していると思う。
なので、QObject::をつけずにアクセスできる。
この人は、QStringオブジェクトを返している。

QAction::setShortcuts()は2つあるが、片方はいかにもコンテナって感じなので、気にしなくてよいだろう。
今回呼び出されているのは、引数がQKeySequence::StandardKey型の方のはず。。

QKeySequence::StandardKeyというのは、enumだ。
数値とQStringに互換性はないな・・・。

QKeySequenceクラスにこういうのがあった。

QKeySequence::QKeySequence ( const QString & key )

これは、なんか近いぞ。
QKeySequence::StandardKey型ではなく、QList<QKeySequence>型をとるのだろうか。

QList::QList ( const QList<T> & other )

違うな。
なにかおかしい。。。。


ここでQActionのヘッダを見ていると、こうなっていた。

void setShortcuts(const QList<QKeySequence> &shortcuts);
void setShortcuts(QKeySequence::StandardKey);

やはり、ヘルプに漏れがあるわけではないのか。。。ん?

void setShortcut(const QKeySequence &shortcut);

単数形の関数がある!
しかし、ヘルプにはなかったぞ??

ヘルプ内を検索してみると・・・関数名一覧やショートカットの説明には出てきたけれども、関数詳細には出てきていなかった。
何と言うことだ・・・・。


void setShortcut ( const QKeySequence & shortcut )


はい、こんな実装です。
つまり今回では、QStringが暗黙でQKeySequenceオブジェクトに変換(生成)されていた、というわけだ。
ヘルプで関数仕様がわかれば、たぶんネタにしてなかったお話だ。

引数の型変換ついては「プログラミング言語C++ 第3版」の「11.3.5 コンストラクタと変換」に記載されている。
パフォーマンスに影響がないなら、同じ内容の関数を引数ごとに作るよりも、オブジェクトの自動変換に任せてしまっていいんじゃないの、というところだ。


プログラミング言語C++は、読むのが難しい本だ。
「勉強するんだから原典を読まないと!」と思って買ったものの、詳細がよくわからないときにしか読んでない。
食材買いに出かけるので、本屋に寄ってみましょうかね。

2011年7月30日

PaSoRi以外のR/Wに選択肢はあるだろうか

今日FeliCaに詳しい人と話していて、PaSoRiを開発用途で使うのはFNさんとしてはやっぱりよろしく思わないだろうなぁ、という気がしてきた。
個人で楽しむ分には気にはしないけれども、代替えがあるのかどうか考えてみた。



まず出てくるのは、RC-S620/S。
これはUARTなので、組込機器としては使いやすい。
しかしこれが製品のAndroid端末向けとなると、ちょっと話が変わってくる。
たぶん、Android製品でUARTポートを持つものはないと思う。
そうなると、USB変換しなくてはならない。
うちにはCP2102があるので、これを使えばUART-USB変換ができる。
できるのだが、今度はAndroid側でUART制御ができなくてはならない。

Linuxであれば/dev/ttyUSB0などでアクセスできる。
しかし、それは/dev/ttyUSB0へのアクセス権があるからだ。
何もしなければ、rootの人しかアクセスできないので、アプリからは使えない。
最近のAndroidでは、udevを使ってアクセス制御ができるようになっているが、どっちにせよアクセス許可がユーザにまで広げられていないとだめだ。

そして、カーネルがシリアル変換を有効にしているかどうか、ということもある。
ユーザに公開しないし使うようにしないのなら、ドライバレベルでOFFになっているかもしれない。


Androidアプリ側でUSB機器を制御することを考えると、実はドライバが対応していない方がいいのかもしれない。
ここはまだ調べていないのだが・・・。

Android3.1からは、USB Host機能が使用できるようになっている。
まあ、少なくともAPIは追加されているので、製品として使えるようにしてあるなら、使えるだろう。

カーネルがUSB Hostに対応するだけなら、ドライバが対応していればいい。
例えば、USBキーボードを挿すとそこから文字入力ができる、などというしくみはアプリではなくドライバが対応していて、Androidのプラットフォーム側が利用していると思われる。

そう考えると、ドライバとしては認識されていないUSB機器だけがAPIで制御できるのではなかろうか。
下からと上からアクセスされるのをプラットフォームはよしとすまい。
ならば、UART-USB変換がドライバとして対応されていない方が、USB Host機能を使うにはよいのかもしれない。


しれないが・・・CP2102の仕様書を読んでドライバをアプリでやるのか・・・という思いはある。
めんどくさい。
まあ、できるようになっておくと今後としてはいいのかもしれんが・・・。

結論を急がず、別の選択肢を考えてみよう。


「UARTがだめなら、最初からUSBにすればいいじゃないの」ということで登場したのかどうかわからないが、RC-S620/Uという製品がある。
シリアル版が「S」で、USB版が「U」なのだろう。
これなら、何も考えずに使えるのではなかろうか?

ネットで検索したが・・・情報が出てこない。
そもそも、一般人が入手できそうなルートが見当たらない。
なんだろう、PaSoRiとの棲み分けが難しいのだろうか。

気にはなるが、入手できないなら仕方ない。


ならば、SONYから離れざるを得まい。

と探してみたが、これもまた選択肢が少ない。
IOデータの「ピタっち」が一番近いのだが、生産中止になっている。

ACR社のものが近いと言えば近いのだが・・・開発に使っていいのかわからん。
SDK買った人ならいいよ、なのかもしれん。
それならPaSoRiも同じだよなぁ。。。



結局のところ、PaSoRiも明示的に「開発に使うな」とは書いてないのだ。
見つけていないだけかもしれんが・・・。
たぶんNGなのは、PaSoRiとの通信をモニタすることだろう。
昔のソフトにはよく「解析するな」みたいな文言が書かれていたものだ。

まあ、PaSoRiが本当に動かせてから考えるとしよう。
杞憂になってしまうのは技術者的には嫌なのだが、なんらかの理由でできないかもしれんしね。