2011年12月24日土曜日

[Power saveing] 節電を簡単にする道具

How to save power in real life #2

もうすっかり冬です。夏に比べて冬の方が電力需要が多いため、節電しなければなりません。計画停電のときの苦労は二度としたくないですからね。

Mtkは、楽に節電するためUSB連動タップを使ってます。
USB端子を持つホスト器とタップの電源を連動できます。
たとえば、パソコンの電源に連動してディスプレイの電源をオン/オフする、といった使い方ができます。
節電のみならず、電源操作の手間も減らせて一石二鳥です。

ところで、この夏は発熱する物はすべてコンセントを抜いていたのですが、テレビ用のアンテナブースターだけはむやみに抜くわけにはいきませんでした。
最近のテレビにUSB端子がついているので、テレビの電源に連動して周辺機器(アンテナブースターやオーディオアンプなど)の電源をオン/オフするためにUSB連動タップを使いました。
おかげで、周辺機器の電力消費と発熱を抑えることができました。
アンテナブースターは発熱が多くて不安でしたがこれで解消しました。アンテナブースターはアナログアンプ回路なのでスイッチング電源を使えないみたいです。

関連ネタ 夏に備えて節電対策
それでは皆さんよいお年を!

2011年12月17日土曜日

[Android] x86用Android4.0(ics-x86)はVmwareで使えるか?

Trying to run Android4.0-x86 on Vmware

x86用Android4.0が公開されました。
Android-x86(http://www.android-x86.org/download)が次の4つのプラットフォーム用にAndroid-x86-4.0-devel を公開しました。
・AMD Brazos
・ASUS laptop
・ASUS Eee PC
・Tegatech tegav2 tablet

無理を承知でこれらのディストリビューションをVmwareで起動してみました。
関連ブログ [Android] VmWare PlayerでAndroidをデバッグする
起動する操作は次の通りです。

Vmwareを起動し「新規仮想マシンの作成」をクリック

「インストーラーディスクイメージファイル」をクリックし、ダウンロードしたisoファイルを選択して次へ

仮想マシン名はご自由に。Mtkは「android-x86-4.0」と入力しました。
格納場所はデフォルトのままでも結構です。Mtkは十分な空き容量のあるDドライブを指定しました。

ディスク容量の指定はデフォルトのままで結構です。Mtkは1GBにしました。

完了

ここからは操作方法が変わります。
Vmwareのウィンドウをクリックすると、マウスポインターが消えてVmwareだけ操作できます。
Windowsの操作に戻るにはCtrlキーを押しながらAltキーを押します。
この画面ではカーソルを一番下のInstallationに移動しEnterを押します。

インストールが始まるのですが・・・

検証した結果
android-x86-4.0-devel-amd_brazos.iso
ブートから先に進まず。

android-x86-4.0-asus_laptop-20111209.iso
インストールしようとするとディスクのフォーマットに失敗して先に進まず。
ライブCDではnot asusの警告が出て先に進まず。

android-x86-4.0-eeepc-20111209.iso
ライブCDは起動するものの、ほとんど操作を受け付けず。

android-x86-4.0-eeepc-20111209.iso
ブートから先に進まず。

というわけで、残念な結果となりました。

今のところ、PCで動作するAndroid4.0エミュレーターはAndroid-SDK-r15に含まれる公式のみのようです。
公式エミュレーターはARMをエミュレートしているので再現性は高いのですが、遅くて不安定なのが玉に瑕です。

以上、参考になれば幸いです。

2011年12月10日土曜日

[Android] アプリケーションでデータ通信のオン・オフを設定できない理由

Reasons for failing to switch mobile networks

データ通信をオン・オフするアプリケーションを作ろうとしたら、不可能であることがわかりました。
1.隠しメソッド
データ通信をオン・オフするための機能はTelephonyManagerクラスにあるのですが、隠しメソッド(@hideアノテーション)のためアクセスできません。
隠しメソッドにアクセスするためリフレクションを使うとこんなコードになります。

※ユーザーインターフェースの実装を省略しているのでこのままでは動きません

これにユーザーインターフェースを実装してアプリケーションとして完成させるとエミュレーターで動作することは確認できました。

2.パーミッション
上のソースは実機は動作しません。
動作させるためのパーミッションが2つあります。
android.permission.MODIFY_PHONE_STATE
android.permission.WRITE_SECURE_SETTINGS

このうち、WRITE_SECURE_SETTINGSはアプリケーションがマニフェストに宣言しても実機での動作では許可されてません。
データ通信の他、bluetoothの設定変更もWRITE_SECURE_SETTINGSが必要なようです。

ユーザーの知らないうちに勝手にデータ通信やbluetoothの設定を変えられたら不都合なので、セキュリティーレベルが高くされているのは仕方ないかもしれません。

以上、参考になれば幸いです。

2011年12月3日土曜日

[Android] ライブ壁紙の作り方

How to code live-wallpaper applications
ライブ壁紙のアプリケーションを作ってみました。
対応OSはAndroid2.1以上です。
ライブ壁紙の作り方はさぞかし難しいだろうと思っていたのですが、プログラム的にはSurfaceViewと同じで意外と簡単でした。
以下ソースです。

マニフェスト(AndroidManifest.xml)
リソースファイル(res/xml/wallpaper.xml)
ライブ壁紙のソース(WallpaperSasmple.java)

このライブ壁紙は画面をタップすると徐々に大きくなる円を描き、指を離すと徐々に消えていきます。
円の色は5種類です。
円の数の上限を決めてないのでたくさん表示させることができますが、動作が遅くなるかもしれません。

以上、参考になれば幸いです。

2011年11月26日土曜日

[Android] マルチタッチアプリケーションの作り方

How to code multi touch applications

LYNX3D SH-03Cでマルチタッチに反応するアプリケーションを作ってみました。Android2.1以上に対応します。
指でタッチした場所に円を表示します。5本の指まで反応します。
以下サンプルです。

アクティビティー(Main.java)
マニフェスト(AndroidManifest.xml)
それぞれの円は指の動きを追いかけます。
このアプリを作った時点では、マルチタッチは公式には3本指までしかサポートしていないようで4本以上の指を認識するには隠しパラメータを読み取る必要がありました。(onTouchEventイベントの 0x305 とか 0x036 とか)
実際にタッチしている指の数とAPIの値が一致しないので円が一つ多く表示されることがあります。

MotionEventクラスにはdeprecated(非推奨)にされた定数とメソッドがあるのでご注意ください。
詳細は http://developer.android.com/intl/ja/reference/packages.html をご覧ください。

以上、参考になれば幸いです。

2011年11月19日土曜日

[Application] Wi-Fi sync Screen v1.03公開

Androidアプリケーション Wi-Fi sync Screen v1.03 を公開しました。
"Wi-Fi sync Screen"はWi-Fiスリープを解除した端末のバッテリーを長持ちさせるアプリケーションです。
Android端末をWi-Fi接続すると再起動してしまうAirStationなどをお使いの方におすすめです。
詳細はこちら

v1.03での変更点
安定性向上

ダウンロードはこちら
※ダウンロード前にエンドユーザーライセンス契約(EULA)を必ずお読みください。
https://market.android.com/details?id=jp.fujiu.AndroidApp.WifiSyncScreen Android Market

◆トラブルシューティング◆
Wi-Fi Sync Screenを設定してもAirstationが再起動する(Wi-Fiルーターが誤動作する)場合は、Android端末のWi-Fiのスリープを解除してください。

Recovered from crash の表示について
Android1.6では画面を開いたとき "Recovered from crash"と表示されることがあります。
リソース不足により動作できなくなったWi-Fi sync Screenを回復したことを意味します。
このメッセージが表示される場合は次の対策を推奨します。
・OSを可能な限り最新版にバージョンアップする
・使用していない常駐アプリケーションを停止する
この機能はv1.03で追加されました。

[Android] 新旧のAndroidで動作するServiceの作り方

How to able to run service applications on all OS versions

ServiceクラスのonStartメソッドはdeprecated(非推奨)に指定され、Android2.1以降では使うべきではないメソッドになってしまいました。
実際にAndroid2.1以降ではonStartメソッドが呼ばれないことがあります。
代替メソッドとしてonStartCommandメソッドが用意されましたが、Android1.6にはonStartCommandメソッドがありません。

1.6以降のどのAndroidでも同じように動作するサービスアプリケーションを作るには、onStartメソッドとonStartCommandメソッドの両方を実装します。
1.6以降のAndroidに対応させるので、プロジェクトのBuild TargetはAndroid1.6(API Level 4)とします。
以下はサンプルです。

サービスクラス(MyService.java)


Activity(Main.java)


マニフェスト(AndroidManifest.xml)


このプロジェクトを実行するとActivity(真っ黒の画面)が表示されている間だけMyServiceクラスが起動します。
実行するとAndroid1.6ではonStartメソッドが、Android2.1以降ではOnStartCommandメソッドが呼ばれます。

Build TargetにAndroid1.6をしていたい場合は、onStartCommandメソッドはオーバーライドせずに(@overrideアノテーションを書かずに)コーディングします。
Eclipseを使う場合、[ソース]-[メソッドのオーバーライド] メニューを開いてもonStartCommandメソッドは選べません。メソッド名や引数を間違えないようにAndroidリファレンスからコピーします。

onStartCommandメソッドを使う上で特に注意することがあります。
サービスはOSによってrestartされることがあるのですが、restartされたときに呼ばれるonStartCommandメソッドの引数 intent は null です。
(return START_STICKY; と指定した場合)
Android1.6とAndroid2.xとでは、restartされたときの引数の内容が異なります。

また、Android1.6では「No more background processes」によりrestartされてもonStartメソッドが実行されないことがあります。
Android1.6のサポートが難しくなってきました。

以上、参考になれば幸いです。

2011年11月15日火曜日

[Application] お天気ロイド v1.10公開

Androidアプリケーション お天気ロイド v1.10 を公開しました。
お天気ロイドは最新のWeather Hacks(気象データ配信サービス)をホーム画面に表示してくれるアプリケーションです。

v1.10での変更点
安定性向上

ダウンロードはこちら
※ダウンロード前にエンドユーザーライセンス契約を必ずお読みください。
https://market.android.com/details?id=com.arimasu.mtk.AndroidApp.OtenkiWidget Android Market

操作方法
Android Walker様にて動画付きの操作方法が公開されました。

2011年11月13日日曜日

[Application] お天気ロイド v1.09公開

Androidアプリケーション お天気ロイド v1.09 を公開しました。
お天気ロイドは最新のWeather Hacks(気象データ配信サービス)をホーム画面に表示してくれるアプリケーションです。

v1.09での変更点
Android2.xでの安定性向上

ダウンロードはこちら
※ダウンロード前にエンドユーザーライセンス契約を必ずお読みください。
https://market.android.com/details?id=com.arimasu.mtk.AndroidApp.OtenkiWidget Android Market

操作方法
Android Walker様にて動画付きの操作方法が公開されました。

2011年11月12日土曜日

[Android] OSをバージョンアップするとアプリが動かなくなる理由

The reason for being unable to run applications on recent OS

古いOSで動いていたアプリケーションが新しいOSで動かなくなる理由を調べてみました。
最近になってAndroidリファレンスを見たら、過去によく使われたメソッドや定数がdeprecated(非推奨)にされていました。

たとえばServiceクラスのonStartは現在deprecatedにされ、API Level 5(Android2.0)以降に実装されたonStartCommandが追加されています。

1.6以前
2.0以降
onStart
動作する
非推奨
onStartCommand
実装されてない
動作する
Android1.6にも対応させるにはonStartを使いたいところです。
ところがAndroid2.2ではonStartメソッドが呼ばれないことがあるのです。
この挙動の違いが古いOSで動いていたアプリケーションが新しいOSで動かなくなる理由の一つです。

Serviceクラスの他、Intent・Context・Activity・SQLiteDatabase・MotionEventのように頻繁に使うクラスもdeprecatedが散見されます。
deprecatedのメソッドや定数を使ったアプリはOSのバージョンごとに動作が異なる可能性があります。
市販の書籍を参考にしている開発者は要注意です。書籍で紹介されている方法がdeprecatedの可能性があります。

VisualBasic5.0で作られたフリーウェアがWindows7で動いてる姿を見るとOSは互換性を維持することが当たり前に思えるのですが、Androidは違います。
度の端末でも動作するアプリケーションを作るには、アプリをメンテナンスし続ける必要がありそうです。

次回は1.6と2.xに両対応のアプリケーションのサンプルを公開する予定です。→公開しました

以上、参考になれば幸いです。

2011年11月4日金曜日

[Application] お天気ロイド v1.08公開

Androidアプリケーション お天気ロイド v1.08 を公開しました。
お天気ロイドは最新のWeather Hacks(気象データ配信サービス)をホーム画面に表示してくれるアプリケーションです。

v1.08での変更点
Android2.xでの安定性向上

ダウンロードはこちら
※ダウンロード前にエンドユーザーライセンス契約を必ずお読みください。
https://market.android.com/details?id=com.arimasu.mtk.AndroidApp.OtenkiWidget Android Market

操作方法
Android Walker様にて動画付きの操作方法が公開されました。

2011年11月3日木曜日

[Application] Wi-Fi sync Screen v1.02公開

Androidアプリケーション Wi-Fi sync Screen v1.02 を公開しました。
"Wi-Fi sync Screen"はWi-Fiスリープを解除した端末のバッテリーを長持ちさせるアプリケーションです。
Android端末をWi-Fi接続すると再起動してしまうAirStationなどをお使いの方におすすめです。
詳細はこちら

v1.02での変更点
Android2.xでの安定性向上

ダウンロードはこちら
※ダウンロード前にエンドユーザーライセンス契約(EULA)を必ずお読みください。
https://market.android.com/details?id=jp.fujiu.AndroidApp.WifiSyncScreen Android Market

◆トラブルシューティング◆
Wi-Fi Sync Screenを設定してもAirstationが再起動する(Wi-Fiルーターが誤動作する)場合は、Android端末のWi-Fiのスリープを解除してください。

2011年10月29日土曜日

[Android] Android2..1から2.2へバージョンアップした後の障害

About Android2.2 difficulties

1.Wi-Fi sync Screenお天気ロイド
Wi-Fi sync Screenとお天気ロイドがAndroid2.2にバージョンアップしたLYNX3D(SH-03C)で稀に仕様通りの動作をしないことを確認しました。
現在、不具合を修正したバージョンを開発中です。
一定の品質が確保でき次第公開いたします。
もし、お困りの方がいらっしゃいましたら恐れ入りますがもうしばらくお待ち頂くようお願い申し上げます。
この不具合が端末を破壊することはありません。

2.SQLiteを使うアプリケーション
Android2.1の頃から「電卓少女」というアプリをインストールしていたのですが2.2にバージョンアップしたら起動しなりました。
LogCatを見るとAndroidRuntimeが出てます。 SQLiteに関するエラーが出てます。こんな時は
[設定]-[アプリケーション]-[アプリケーションの管理]を開いて[キャッシュを削除]をタップします。
これで直るはず・・・と思ったら直りませんでした。
アンインストールして再度マーケットからインストールしたら起動できるようになりました。
SQLiteを使うすべてのアプリケーションで起きるわけではないようです。

以上、参考になれば幸いです。

2011年10月22日土曜日

[Android] 端末をPCにつないでも認識されない

How to solve the problem that fails to negotiate USB connection

LYNX3D(SH-03C)をAndroid2.2にしたらPCにUSB接続しても認識されなくなりました。
結論
[設定]-[USB設定]-[USB接続モード]の画面を適当にいじったら突然認識されました。
この画面では「カードリーダーモード」が選択されているのですが、「高速転送モード」や「MTPモード」を何度か選択したら直りました。
その後も不安定な状態が続いたので端末を再起動したら安定しました。
SH-03C用USBドライバーの再インストールもしたのですが効果ありませんでした。

以上、参考になれば幸いです。

関連ブログ
[Android] データ通信をオンにしても3Gにつながらない
[Android] パケット代の節約術
[Android] バッテリー節約術

2011年10月15日土曜日

[Android] LYNX3D (SH-03C) をAndroid2.2にバージョンアップ

How to upgrade LYNX3D
今更ですが、Android2.1のLYNX3DをAndroid2.2(ビルド番号02.01.00)にバージョンアップしました。
詳細はこちら→LYNX 3D SH-03Cのバージョンアップ情報

手順を簡単に説明します。
  1. LYNX3DをWindows PCにUSBケーブルで接続する。
  2. USBドライバをダウンロードし、Windows PCにインストールする。
  3. メジャーアップデートツールをダウンロードし、Windows PCにインストールしたら起動する。
  4. メジャーアップデートツールの指示通りにLYNX3Dの画面を開く [設定]-[端末情報]-[メジャーアップデート]-[アップデートの確認]、[アップデートの実行]
最後の[アップデートの実行]はメーカーの発表で60分以上とされています。Mtkの環境で40分くらいでした。

バージョンアップ後は端末がオールリセットされた状態になります。たとえばこんな設定がリセットされます。(この他にもあります)
  • 3G回線を使う設定に戻された。
  • Wi-Fiを使わない設定に戻された。(これは酷い)
  • Wi-Fiアクセスポイントの設定が消えた。(これも酷い)
  • Wi-Fiスリープ設定が購入時の状態に戻された。
    これが一番酷い!この仕様がまるでWi-Fi sync Screenの問題のようにコメントされました
  • 壁紙の設定が購入時の状態に戻された。
  • GPSの設定がオフに戻された。
  • 開発用設定の「USBデバッグ」「スリープモードにしない」「疑似ロケーションを許可」もオフに戻された。
アプリ個別の設定は影響ないのですが、端末の設定と連動しているアプリは挙動が変わるかもしれません。

バージョンアップ後はタップやフリックの反応が向上して操作しやすいし、ライブ壁紙はかっこいいし、YouTube3Dはおもしろいです。

自動で追加されたライブ壁紙

そして、Android2.1のLYNX3DはOpenGLを使うとアプリケーション終了後もバッテリーが減り続ける奇病があったのですが、バージョンアップで治りました。
時間をかけてバージョンアップした甲斐がありました。
こう言うサービスを受けると本当に買ってよかったと思います。

以上、参考になれば幸いです。

2011年10月8日土曜日

[Android] マーケットの「インストール中」の状態が続く

how to solve a problem that Market keeps installing

一部の端末で、Android Marketでインストールしたアプリケーションが「インストール中」のままになり、他のアプリケーションをインストールできなくなることがあります。

設定→アプリケーション→アプリケーションの管理→マーケット(Androidマーケットのアイコン)
から
キャッシュを消去 と アップデートのアンインストール
を実行すると改善することがあります。

「アプリケーションの管理」に「マーケット」が表示されない場合
「設定」→「アプリケーション」→「アプリケーションの管理」
を開いて
メニューボタン(XPERIAなら画面左下の田ボタン)を押して
「フィルタ」→「すべて」
で表示されます。

この不具合は、2010年11月頃にマーケットがバージョンアップされてからよく聞くようになりました。
もし同様の症状が出たらお試しください。

以上、参考になれば幸いです。

2011年10月1日土曜日

[Android] バッテリー節約術

How to save battery power

今までの開発経験から、Androidスマートフォンの機能ごとにバッテリーの節約方法について考えてみました。
ステータスバーの画像です。少しのアイコンしか表示されていなくてもAndroid端末は多くの処理を実行しています。

3G(データ通信)
オフにするとメールやテザリングなどのデータ通信ができなくなります。
すごく不便ですが、バッテリーのみならずパケット代も節約できます。
※オフにした場合、SPモードメールやCメールは新着通知だけ受信できます。メールの送受信はできません。
[設定] - [無線とネットワーク] - [モバイルネットワーク] - [データ通信] で設定できます。
詳細はこちら

Wi-Fi
オフにするとWi-Fiスポットに反応しなくなるのでバッテリー消費を少しだけ節約できます。
外出が多く3Gだけを使いWi-Fiルーターに接続することがなければオフにしてもいいと思います。
[設定] - [無線とネットワーク] - [Wi-Fi] で設定できます。

GPU
GPUはバッテリーを激しく消費するのですがユーザーは設定できません。
OpenGLを使うアプリケーション(ゲームに多いようです)はGPUをフルに使います。
アプリケーション実行中に本体が発熱するようならGPUが使われています。
ドコモ LYNX3D(Android2.1)はOpenGLアプリを終了した後もバッテリーが減り続けるという奇病があるので、アプリ終了後は本体の電源を入れ直してます。
(au IS01にはこの奇病はありません。同じメーカーなのに不思議です)

GPS
設定をオンに設定するだけならバッテリー消費に影響はないようです。
オフに設定するとGPSを使用するアプリケーション(Latitude、彼ログなど)が使えなくなります。
[設定] - [現在地情報とセキュリティ] - [GPS機能を使用] で設定できます。

ライブ壁紙
Androidの目玉機能ですが、バッテリー消費への影響が大きいです。
オフにしてしまうと不便になるので一番の悩みどころだと思います。

ウィジットアプリケーション
すべてのウィジットがバッテリーを激しく消費させるわけではありませんが、画面に常駐して何らかの処理をしているので、少なからずバッテリーに影響を与えます。
使っていないウィジットは画面から消すとバッテリーに優しくなります。

サービスアプリケーション
サービスはバックグラウンドで動作しています。
画面表示がないので次の画面操作で動作中のサービスの確認や停止ができます。
[設定] - [アプリケーションの管理] - [実行中のサービス]
ただし、プリインストールのサービスアプリケーションは停止できないことが多いです。


結論
バッテリーを長持ちさせると使い勝手が悪くなるジレンマに陥ります。
スマートに使おうとすると充電器が手放せません。
以上、参考になれば幸いです。

2011年9月24日土曜日

[Windows] Subversionをインストールしたら起動が遅くなった

CollabNet Subversion EdgeをインストールしたらWindows7の起動が遅くなりました。
イベントビューアーを見ると同じエラーが何度も出てます。
CollabNet Subversionのバージョン2.0から添付されるようになった Subversion Edge の起動に時間がかかっているようです。
30000ミリ秒以内に起動しない以外は問題なく動作しているのですが、負荷の原因になっているようです。

設定を変更するため
コントロールパネル - システムとセキュリティー - 管理ツール - サービス
を開きます。
「CollabNet Subversion Edge」の名前を探してダブルクリックし、スタートアップの種類を「自動(遅延開始)」に変更します。
同じように「CollabNet Subversion Server」も「自動(遅延開始)」に変更します。

これでエラーはなくなりました。
MtkはSubversion Edgeを使わないのでスタートアップの種類を「手動」にしました。

Windowsは起動と同時にいろいろな処理を開始するので、自動起動のサービスは最小限に設定したいところです。
Windows 7/Vistaはサービスの遅延開始が設定できるので、うまく設定すると起動時の負荷を減らせます。

以上、参考になれば幸いです。

2011年9月17日土曜日

[PlayStation] DUALSHOCKの修理

Repairing a broken DUALSHOCK

プレステ2のコントローラDUALSHOCK2が誤動作するようになってしまいました。
振動すると、触ってないはずの×ボタンとL1ボタンが押されたような動作をします。
コントローラーを本体から抜き差ししても誤動作するので分解してみました。
ボタンや配線やハンダに異常はなさそうです。
ただし、赤丸で囲んだモーターのスポンジが劣化しています。
おそらくモーターに遊びができてしまい、回転した瞬間に基板に干渉していると思われます。

ホームセンターやカー用品店で売られている「制振テープ」とか「隙間テープ」を用意して修復します。上の画像のコントローラーの下に写っているものがそれです。
モーターに張られていたスポンジの厚さは1mmほどでした。今回用意できたのはそれよりちょっと厚めですが問題ありませんでした。
エーモン 防音テープ 3mm厚

エーモン 防音テープ 3mm厚
950円
(税込、送料別)

ホルツ防振、防音テープ 5mm厚

ホルツ防振、防音テープ 5mm厚480円
(税込、送料別)

古いスポンジは強力な両面テープで貼られているので根気よくはがします。
はがした後に新しいスポンジを貼り付けます。
後は元通りに組み立てます。

これで誤動作しなくなりました。

以上、参考になれば幸いです。

2011年9月10日土曜日

[Android-NDK] ERROR [binderDied] end

How to solve "[binderDied] end" error

アプリを開発していたら、突然こんなエラーが起こりました。
ERROR/CameraService(1215): [binderDied] end

Android-NDKのログにはこんなエラーが出てます。
DEBUG/ndk(2474): [ 08-27 20:12:59.451 2474:0x9aa F//system/bin/app_process ]
DEBUG/ndk(2474): stack corruption detected: aborted

原因はJNI(Android-NDK)のchar配列の要素不足でした。

エラーになったコードの抜粋
sprintf関数の引数xとyとzがdouble型だったため、文字列に変換すると予想以上に長くなり、50バイトを超えてしまいました。
char c[50];を
char c[100];に変更したら正常に動きました。

LogCatに「CameraService」とあるし実際に android.hardware.Camera を使うアプリだったのですが、カメラは全く関係ありませんでした。
エラー内容と関係ないログが出力されたので、少し手間取りました。

ちなみにVisual C++ 2010 ではどんなエラーメッセージが出るのかと思い、同じバグを再現したところ
Run-Time Check Failure #2 - Stack around the variable '変数名' was corrupted.
バッファー オーバーランが *****.exe で発生し、プログラムの内部状態を破損しました。[中断] をクリックしてプログラムをデバッグするか、または [続行] をクリックしてプログラムを終了してください。
と表示されました。

「[binderDied] end」というメッセージはわかりにくいですが、「stack」と「corruption / corrupted」というキーワードを見たら、スタック領域の破損∋配列の要素不足の疑いがありそうです。

以上、参考になれば幸いです。

2011年9月3日土曜日

[GPS] 経度1度の距離の求め方

How to get distance of 1degree longitude

blog.fujiu.jp  経度1度の距離の求め方
緯度(北緯)1度あたりの距離はおよそ111kmですが、経度(東経)1度あたりの距離は緯度によって大きく変わります。
経度1度の距離は赤道に近づくほど大きく、遠ざかるほど小さくなります。
GPSセンサーを使ったアプリケーションで距離を測る時に困ってしまいます。

経度1度のおおよその距離(km)は次の式で求められます。

経度1度の距離(km) = cos(緯度×0.017453293) × 111.3194908
※0.017453293=2×π÷360(角度からラジアンを求める係数)
※111.3194908=6378.137×2×π÷360(地球を半径6378.137kmの球として断面の円周を求める係数)

cos関数の括弧の中は緯度(北緯)のラジアンです。経度(東経)ではないのでご注意ください。緯度と経度を間違えると正しく計算できません。

この計算は地球を真円としてしますが、実際の地球は楕円です。
計算結果がどれくらい誤差があるのか、国土地理院の距離と方位角の計算と比較してみます。

緯度(北緯) 計算値(km) 国土地理院(km) 大まかな位置
20 104.60610 104.64693 沖ノ鳥島
26 100.05330 100.11747 尖閣諸島
33 93.36038 93.45286 四国、九州
36 90.05936 90.16329 関東、近畿、竹島(島根県)
40 85.27568 85.39341 東北
44 80.07654 80.20570 北海道

案の定、赤道から遠ざかるほど誤差が大きくなってます。北緯44度の地点で誤差0.16%です。
とは言え、三角関数1個の計算で距離が求まるので、スマートフォン用アプリケーションには十分だと思います。 (※1)
実際に使ってみると計算誤差よりセンサーの誤差のほうが大きいくらいです。


distance(km) of 1degree longitude = cos(latitude_degrees * 0.017453293) * 111.3194908

計算にはMicrosoft Excel 2010を使いました。

(※1) 2010年当時、スマートフォンが今のものよりスペックが低くバッテリー容量が少なかった頃の考えです (2016年4月追記)


以上、参考になれば幸いです。

2011年8月27日土曜日

[AV] コンポーネント端子がついてないテレビにPS2や古いDVDプレイヤーを接続する

How to connect component terminal to D terminal?

テレビも液晶ディスプレイも故障したため新しいテレビを買を買ったのですが、このテレビにはコンポーネント端子がついていません。(承知の上で買いました)
今までのテレビが10年以上前に買った製品だったので、ゲーム機もDVDプレイヤーもコンポーネント端子でつなげていました。

テレビ背面の端子。コンポーネント端子やS端子がありません。


左がプレステ2用、左が汎用
綺麗な映像を見たいのでコンポジット端子は使いたくありません。
このテレビにはD端子がついてるのでD端子ケーブルを買えばいいのですが、機器に合わせて全部そろえるとしたら大きな出費です。
HDMIの時代に、アナログ規格のケーブルに投資するのは気が引けてしまいます。

そこで、1780円前後で売られているコンポーネント端子をD端子に変換するケーブルを買いました。
富士パーツD端子コンポーネント変換ケーブル AD-513 0.1m(D端子・オス-コンポーネント端子・メス)
AVケーブルD端子⇔コンポーネント端子変...

AVケーブルD端子⇔コンポーネント端子変...
価格:1,785円(税込、送料別)

これで綺麗に映りました。

私事ですが、プレステ用のAVケーブルはコンポーネント端子ケーブルの他、21ピンアナログRGBケーブルやS端子ケーブルも持ってます。
過去にいろいろなAV規格があったのに、デジタル時代の今ではHDMI、DisplayPort、Thunderboltといった異なる規格が乱立してます。
日本のメーカーのノートパソコンにはHDMIがついてますが、HP製にDisplayPort、アップル製にThunderboltといった別の規格がついてます。
ノートパソコンの映像を外部出力するにはそれぞれの規格に対応した装置が必要になってしまいます。
規格争いはいい加減にして欲しいですね。

2011年8月20日土曜日

[Android] ThumbモードとARMモード、どちらが速いのか?

Which is faster, Thumb or ARM?

多くのAndroid端末に使われているARM系CPUは16ビットのThumbモードと32ビットのARMモードとがあります。
「ARMモードの方が速い」という意見がある一方、「Thumbモードはプログラムサイズが小さい分メモリーアクセスが少ない」という意見があり、どちらが効率がいいのかよくわかりません。
そこで、ThumbモードとARMモードを比較してみました。

Activityのソース(Main.java)
jni/nck.cpp
Android.mk(Thumbモードの場合)
Android.mk(ARMモードの場合)
結果
(1)int型(32ビット)の検証
エミュレーター・実機(IS01)とも、Thumbモードの方が速い。

(2)float型(64ビット)の検証
エミュレーターではARMモードの方が速く、実機(IS01)ではthumbモードの方が速い。

(3)atan2関数(複雑な計算)の検証
エミュレーターではARMモードの方が速く、実機(IS01)ではthumbモードの方が速い。

結論
Thumbモードの方が速い場合がある。
ARMモードが常に速いとは限らないようです。Android-NDKを使ったアプリケーションを公開する時は機種ごと・アプリごとにベンチマークを取って比較した方がいいようです。

以上、参考になれば幸いです。

2011年8月13日土曜日

[Android] 自身をタスクキルするアプリケーションを作るには

How to kill the application's own self

Androidアプリケーションは終了すると、何の処理をしなくてもRAM(メモリー)に残ります。
(終了してもバックグランドで処理を続けるプリケーションもあります)
他のアプリケーションが起動するなど、空きメモリーが必要になったときにOSがRAMから消します。
アプリケーションがRAMに残っていた方が速く起動できるし、バッテリーやフラッシュROMの寿命も長持ちします。

ただ、アプリケーションが終了後もRAMに残ることに不安を覚えるユーザーも少なからずいらっしゃるようです。
そこでActivityを終了したらRAMから消える(タスクキル)サンプルを作ってみました。

ソースです。
Activityのソース用(Main.java) ※パーミッション不要のため、マニフェストは省略

onDestroyメソッドの最後に Process.killProcess(Process.myPid()); を書くだけです。

アプリケーションを起動するとタスクリスト(※)にパッケージ名が表示されます。
(※正式名称は不明ですがここでは「タスクリスト」と呼びます)
一度起動したアプリケーションは、RAMに十分な空き容量があれば終了してもタスクリストから消えないのが普通です。

Process.killProcess(Process.myPid()); が実行されると直ちにタスクリストから消えます。

ちなみにタスクキルすると
INFO/ActivityManager(**): Process jp.fujiu.AndroidApp.ProcessKiller (pid ***) has died.
というログが残ります。異常終了したときと同じ内容なので、あまりいい気分ではありません。
タスクキルのメリットを強いて上げるならメモリーリークを解放してくれるようですが、メモリーリークを起こしているならタスクキルに頼らずコードを直すべきです。
本当にタスクキルするかどうかをユーザーに確認する画面を用意した方がいいと思います。

以上、参考になれば幸いです。

2011年8月6日土曜日

[Android] Android-NDKでテクスチャを表示するには

How to draw textures in Android-NDK

Havaは大きいソースが扱えないので、[Android] 頂点の多いポリゴンを扱うには では頂点数の多いポリゴンをAndroid-NDKを使ってJNIからJavaに大きい配列を渡す方法でバナナを表示しました。この方法はFloatBufferの作成に時間がかかるという問題がありました。
今回は、頂点とテクスチャの機能もJNIで書いてみます。

JNIで画像を扱うには?
テクスチャを表示するためglTexImage2Dを使います。
glTexImage2Dで表示できるテクスチャ画像はunsigned char型配列のビットマップデータです。配列の内容は1ピクセルごとにRGBAの順に1バイトずつです。
このブログを作成している時点ではJNIからres/drawableフォルダーやassetsフォルダーのファイルを扱う方法が見当たりませんでした。
そこで、JNIで画像データを扱うために次のようにしました。
  1. Javaでres/drawableフォルダーの画像をint型配列に変換してJNIに渡す
  2. JNIでJavaから渡されたint型配列をunsigned char型配列に変換しテクスチャ表示する
以下ソースです。
ndk.cpp
glu.h (Android-NDKのsampleの com.example.SanAngeles から抜粋しました)
Android.mk
これら ndk.cpp、glu.h、Android.mk と、HBehrens-obj2opengl-a0f123e.zipのbanana.h をプロジェクトのjniフォルダーにインポートし、カレントフォルダーをjniに移してndk-buildを実行します。
HBehrens-obj2opengl-a0f123e.zipののbanana.jpgをres/drawableフォルダーにインポートします。

Activityのソース(Main.java)
画面をフリックするとバナナが回転するようにしました。
これをエミュレーターで実行したら一瞬でバナナが表示されました。JavaでFloatBufferを作成する方法(エミュレーターで2分くらい)とは大違いの速さです。
テスト環境では、Heapを見比べたらJavaでFloatBufferを作成する方法に比べて1MBほどメモリーの節約になりました。
Android-NDKでビルドしたアプリケーションはARMの端末でしか動作しないのが玉に瑕です。

以上、参考になれば幸いです。

2011年7月30日土曜日

[Android] Androidエミュレーターが起動しなくなった

How to solve a problem that Android-NDK dose not launch
android-sdk_r12-windowsをインストールしたらエミュレーターが起動しなくなりました。

エラーメッセージ
invalid command-line parameter: Files\android-sdk-windows\android-sdk_r12-windows\tools/emulator-arm.exe.
Hint: use '@foo' to launch a virtual device named 'foo'.
please use -help for more information

どうやらパスにスペースが含まれていることが原因のようです。
保存場所を
D:\Program Files\android-sdk-windows から
D:\android-sdk-windows に変更したら起動するようになりました。

android-sdk_r11-windowsまではパスにスペースが含まれていてもちゃんと動いたのでびっくりしました。
ちなみにAndroid-NDK(ndk-build)もパスにスペースがあるとコンパイルできませんでした。

以上、参考になれば幸いです。

2011年7月23日土曜日

[Windows7] メモリーを増設したら起動しなくなった (Kernel-power イベントID41)

Windows7 had been unstable since I added memory.

安くて有名だったサーバーHP ProLiant ML115 G5にWindows7-64bitをインストールしてパソコンとして使っているのですが、メモリー(RAMモジュール)を5GB(2GB×2 + 1GB)から8GB(2GB×4)に増やしたら起動が不安定になりました。
過去に故障のためメインボードを交換してます。
CPUはAthlon X2に交換済みです。

電源が切れた状態から起動(コールドスタート)すると
「ファイルを読み込んでいます」と表示した後に勝手に再起動し、修復セットアップを要求する(無視すると正常に起動する)
「このファイルのデジタル署名を検証できません」と表示される(再起動すると正常に起動する)
のどちらかの現象が起こります。
たまに正常に起動しますが復元ポイントに戻されます。再起動した場合はこの症状は起きません。
イベントビューアーをみるとKernel-power イベントID41が記録されています。

※この問題は
起動しなくなったHP ProLiant ML115 G5が直った
にて完全に解決しました。
以下の解決方法は2011年7月時点の内容ですのでご了承ください。

結論
BIOS設定の
Advanced
 - CPU Configuration
  - Memory Channel Mode を
Independent から Combined に変更したら解決しました。

しかもメモリーのWindowsエクスペリエンスインデックスが7.1から7.2に上がりました。
容量もこの通り8GB(8MB×1024)と認識されてます。

試してみたけど解決に至らなかったこと
  • 修復セットアップ
    →復元ポイントに戻されるだけ、Windows Updateが台無しです
  • CドライブをフォーマットしてOSをクリーンインストール
    →効果無し
  • ハードディスクのSATAケーブルを交換
    →変化無し
  • BIOSのPowerNow!をDisableに設定する
    →効果無し
  • グラフィックボードをRADEON HD5450(VRAM 512MB)からNVIDIA GeForce 8400GS(VRAM 256MB)に変更
    →効果無し、ただし発熱量が下がりました
  • MEMTEST86+でRAMの不良確認
    →異常なし
  • デバイスマネージャーのPCI標準PCI-to-PCIブリッジ デバイス13(オンボードのグラフィック機能)を無効にする
    →効果無し
  • システムエラーの「自動的に再起動する」の無効化
    →エラーが起きた後に再起動するかしないかの設定なので意味がない

気休め1・デバイス13の無効化

気休め2・システムエラーの「自動的に再起動する」の無効化

最近のWindowsは不具合が起きたらOSよりハードウェアを疑うべきです。
ただし今回の症状はハードウェアは正常で、しかもコールドスタートするとたまに発症する内容でなので対処方法がわかるまで時間がかかりました。

以上、参考になれば幸いです。