投稿

ラベル(SmartTraining)が付いた投稿を表示しています

SmartTrainingがPebble SDK 2.0に対応しました

はじめに SDK 2.0の情報が出始めたのが2013/11中旬頃、既にPebble熱は冷め、完全にスルーしようと思っていましたが、1月下旬にとあるユーザさんから「Pebble 2.0対応しないの?」みたいなメールをいただき、遅ればせながら対応を開始しました。で、おかげさまで、無事に2.0への対応を完了し、Pebble AppStoreでPublishしましたのでマイグレーションまでの手順をざっくりとメモしときます。ただ、現時点ではまだPebble AppStoreは公開されていません。そのうち、公開されるんじゃないですかね? SDK 2.0の準備 公式サイトをみてそのままやるだけです。 https://developer.getpebble.com/2/getting-started/ 現時点ではまだPebbleアプリ自体がベータ版なので、上記手順に従ってアップグレードします。たぶん、ハマるところはないと思います。 コードのマイグレーション 今回のSDKのバージョンアップは結構大きな変更を含むので、以下のページにマイグレーション手順がまとめられています。 https://developer.getpebble.com/2/guides/migration-guide.html こちらもそのままやればハマるところはないと思います。 というのは半分正解で半分ウソです。 実際問題、この手順でやればいいのですが、細かく説明されていない箇所もちょくちょくあって、SDK付属のサンプルアプリのコードを見て真似する形で修正しました。あと、コアなAPIのI/Fが結構変わっているので、手順に従って修正していても超不安でした。 Githubにブランチを切ってみましたので、 diff を見てみましょう。 公式マイグレーション手順以外でのポイント 公式のマイグレーション手順に記載されているところはそちらを参照して頂くとして、それ以外でハマった箇所だけピックアップしていきます。 window_set_window_handlers() サンプルコードを見ているとinit()系関数内で以下のような記述がよく出てきます。 いつからこんな書き方をするようになったのかわかりませんが、SDK付属の各サンプルはシレっとこんな書...

ANT+なセンサー対応4つ目

 今年の5月にSmartTrainingがANT+なフットポッドに対応した後( ANT+なセンサーに対応してみました )、8月くらいに心拍計に対応と徐々にANT+対応を進めてまいりましたが、ようやく今回のバージョンVer.6.5.0で3・4種類目のケイデンス、スピードセンサーに対応しました。手元にあるセンサーはこれで全部対応しました。車椅子向けにちゃんと使えるかどうかはユーザさんからの声が聞けていないのでわかりません。是非車椅子ユーザさんからのご意見を聞きたいです。 ◆対応済みANT+センサー  ・フットポッド  ・心拍計  ・Bikeケイデンスセンサー  ・Bikeスピードセンサー  実は今回対応したセンサーからデータが取れること自体は5月の時点で確認済みでしたが、常に行き当たりばったりで開発の進むSmartTrainingの機能にハマり込むように機能拡張するために周辺機能の改造に手間取りました。  以前のSmartTrainingは、GPSからの位置情報がない限り、リアルタイム系のデータ(例えば速度や心拍数など)は記録できないような作りになっていましたが、今回からセンサーから取れる情報は位置情報とは切り離して記録するようにしました。心拍数やケイデンスも同様に記録するようになっています。  また、「ストローク」を廃止しました。元々、これはトレーニングタイプ水泳を選択した際に水をかいた回数を加速度センサーでカウントしようとしたものでした。これまで利用していた方がいらっしゃったかどうかはわかりませんが、ご不満があれば連絡ください。復活させるかどうか考えます。  あとANT+的には体重計とBikeパワーセンサーに対応できるかもしれませんが、センサー機材を入手するのが費用的に困難なので、対応は難しいかもしれません。ただ、ご協力いただける方がいらっしゃれば対応できるかもしれません。特にBikeパワーセンサーについてはどなたかご協力いただけると助かります。  まぁ、いずれにしてもこれで約2年前に初期バージョンをリリースした当時から頭の中にあったデータの種類的にはほぼ全て対応し終えました。次は本格的にクラウド対応しようと思います。この対応が完了すると、データのソースがクラウド上に移行できるようになるので、端末を変えてもデータが引き継がれます。バックアップ機能の替わりにもなります...

翻訳リソースキター!

イメージ
ちょっと前にSmartTrainingに libandrotranslation を組み込んで、英語、日本語以外もまともに対応していこう、と思っていました。 libandrotranslationについて詳しくは こちら 。 誰からも何も来なかったらそれはそれでネタにしようと思っていましたが、ついに対応から1ヶ月?ようやく初めての翻訳リソースが来ました! 来た言語_国は、「pt_BR」。。。何それ、、、初めて見た。 調べてみたらそれは、ptはポルトガル語、BRはたぶんブラジルじゃない? ブラジルといえば これ っていうか、遠すぎてよくわかんない、アツい、サッカー、鉄鉱石、くらいしか。 でもGraças, Graças。開始ボタンだけポルトガル語らしい。 SmartTrainingはジーコを応援しています。

AWS対応してみました

イメージ
今日のABC2011wでもAmazonさんが講演されていた今話題(?)のAmazon Web Service for Android(AWS)。 SmartTrainigでもAWSを利用してみたのでまとめまとめ。 ◇今の状況 ・「ラリー機能で誰が先頭を走ってるか表示できたら燃えるよ?」って意見もらう。 ・GAE本買って読む。 ・よくわからない。時間無い。挫折。 ・半年放置。 ・デ部でセカイのやましたさんからAWSについて教えてもらう。 ・何それ、サーバプログラム書きたくない俺向きジャン。 ・とりあえずテスト的にSmartTrainingに機能追加してみた。 ←今ここ! ◇成果 これまで、 SmartTrainig のラリー機能は自分が走った距離を貯めて仮想的なコース上に進捗状況を表示するだけでした。 これに、他の人のラリー記録を重ね合わせて表示することができるようになりました。 ◇手順 ・AWSのアカウント作成。 この辺から適当に 。 ・AWS SDK for Androidの 取得 。 ・AWS SDKのセットアップ ・あとはやりたいことを書けばいい。 ※詳しくはたぶん こちら (自分は日本語の情報を見つけられず、 本家サイト の情報だけでなんとかなりました) ◇軽く技術的なこと ・SimpleDB上にドメインを1つ作る(ほぼサンプル通り)。 ・各クライアントはラリー登録時にラリー関連のデータをアップロードする(ほぼサンプル通り)。 ・他クライアントはラリー画面表示時に条件にヒットする他人のラリーデータをダウンロードしてマップ上に表示する(ほぼサンプル通り)。 ・AWSへのアクセス用アカウントはAWS Identity and Access Management(IAM)で権限を制限したアカウントを生成して、全クライアントがこれを利用。accessKeyとsecretKeyは軽く暗号化かけてアプリ埋め込みw「セキュリティ軟弱じゃねぇ?」とか言われると、否定できません。でも、accessKeyとsecretKeyバレても権限制限してるから、いいかなっと。変なことされたら無効にして新しいKey生成しちゃえばいいや。みたいな。とにかく、鍵管理サーバとかも書きたくない。 ・扱うデータに個人情報や機密情報は含めない。抜かれても大丈夫なデータだけ扱う。 ・ ここ とか真面目に...

【勇者募集】SmartTraining 4.1.0b野良公開

前々から他の人が登録したラリーの情報を地図上に表示して誰が一番か、 を見たいという要望がありました。 ようやく面倒な実装なしで実現できる見込みが立ちましたので、 ベータ版ということで一時的に公開します。 今回のベータ版は正式版をリリースしたら公開やめます。 今回の試みでは新しいプラットフォームを使用したのでまだ慣れていません。 パフォーマンスの問題とか、料金発生の問題とか少しずつ様子見ながら展開していきます。 もちろん回避できない問題が発生したらこの機能は消えてなくなります。 その時はごめんねごめんねぇ~! ◇4.1.0bで変わったこと ・ラリー画面で他の人が公開しているラリーデータを表示することができます。  これでライバルと競争できるかもしれません。 ・ただし、現状のバージョンでは表示されるのは自分の前後5人のみです。  いずれ、こなれてきたらいろいろと検索表示条件を追加する予定です。 ・ラリーにトレーニングタイプの考え方を導入しました。  これまで、ラリーにはどんなトレーニングタイプの距離も加算できましたが、  これを「FREE」というトレーニングタイプ扱いにして、これとは別にトレーニングタイプごとにラリー登録できるようにしました。  「競争」という考え方からして、同じトレーニングタイプで比較しないと意味がないかな、と思ったからです。 ・ラリー登録するためには、設定>ラリー>ニックネームを登録する必要があります。 ・あと、ラリー登録=データ公開です。個人情報は公開されません。公開する情報は以下です。  ・端末ごとにランダム生成した概ね一意のキー。UUIDです。  ・タイムスタンプ(登録日時、ラリー開始・終了日時)。  ・距離と計算したラリーコース上の座標。 ◇注意事項  このバージョンは野良公開のみのベータ版です。  一応、データが消えてしまうことはないつもりですが、  いろいろとテスト的な実装が多いので保証できません。  (元々、正式版でもデータが消えない保証はないんですけど。。。)  そういう事情で、何か不具合があってデータが消えても泣かないでください。  寛大な心で許して下さい。  そのテストデータがSmartTrainingを進化させたのだということで。 ◇ダウンロード  例によって、  ・設定>アプリケーション設定>提供元不明のアプリのチェックONに...

LiveViewの不可思議な動き

SmartTrainingをLiveView対応させるべくごにょごにょやってみました。 丸一日かかってだいたい期待する動きをするようになってきました。 が、ちょっとだけよくわからない動きをする(または、こう動いて欲しいのに期待通り動かない)などあったので雑にまとめてみます。 とりあえず、Sandboxタイプのプラグインの話。 以下のメソッドが動かない。サンプルのSandboxで確認したんだよ? ・LiveViewAdapter.ledControl()  →LEDが光るのかと思ったが光らないよぉ? ・LiveViewAdapter.vibrateControl()  →任意のタイミングでバイブレートさせることができるのかと思ったら振動しないよぉ? ・LiveViewAdapter.screenOnAuto();  →ドキュメントによるとパワーセーブモードをデバイスに任せる的な説明があったが、Sandboxだといつでもスクリーン付きっぱなしだよぉ? ・LiveViewAdapter.screenOn(); ・LiveViewAdapter.screenOff();  →任意のタイミングでスクリーンON/OFFできるのかと思いきや、とりあえず、スクリーンOFFにはならないよぉ?そもそも、Sandboxプラグイン表示中に電源ボタン押してもスクリーンOFFってならなくね?時刻と電池マーク見えとりますよ。 なんかさ、根本的に勘違いしているような気がするけど。 LiveViewの開発者向けのコミュニティ探してみたけど見つからないし。 「【初心者です。教えてください】LiveView APIが動きません」とかいうタイトルでメール投げさせてくれ。 がおー。

万歩計の作り方(Ver.3.0.0)

イメージ
◇SmartTraining 3.0.0 Ver.3.0.0で万歩計ロジックを大幅に変更しました。 ザザっと解説。 ◇どうやって歩数を測るか SmartTrainingにおける万歩計は3次元の加速度データを利用します。 ◎加速度成分合成値の計算 携帯電話は本物の万歩計と違ってどうやって保持されるかわからないので、1次元の加速度だけでは、正確に計測できない可能性があります。このため、3次元の加速度(raw-x,raw-y,raw-z)を合成した値(raw-composit)を求めます。 ◎デジタルフィルタ raw-compositは基本的にセンサーから取得した生のデータです。生のデータには、歩数計算には邪魔な、様々な雑音が含まれます。歩行時の体の回転による加速度、ポケットの中での端末の振動などなど。余分な雑音は取り除いておいた方がより正確な歩数計測が行えるので、デジタルフィルタを適用して不要な成分を取り除きます。 今回は、 IIR によるLPFを作成し0.0030Hzより高い周波数成分を排除しています。デジタルフィルタを適用することでprocessed-compositを計算します。IIRのパラメータはフィルタ職人の腕の見せ所ということでうやむやにします。 ◎歩数のカウント processed-compositは、安静時の重力加速度(G)を中央値として、一定の振幅で振動しています。歩数計では、この加速度の振幅の山と谷を1サイクルとして認識してサイクルを検知することで歩数を数えることにします。サイクルの検知条件は下記のとおりです。 ・山の振幅が一定以上あること。 ・谷の振幅が一定以下あること。 ・山と谷の振幅が一定以上あること。 ・山と谷の時間差が一定時間内であること。 山の後でこれらの条件を満たさない場合、再び山の検知処理を続けます。 こうしてカウントをすると以下のグラフのshakeの値が歩数を表しています。 この方式に変更することで、以前の方式が20%程度の誤差だったのに対して、2%程度の誤差まで性能向上を図ることができました。 ◇注意事項 どんな方式で万歩計を作成するにしろ、計測条件は計測結果に大きく影響を与えます。 今回の方式では、どんな持ち方をしてもある程度計測できるように3次元の合成値を利用していますが、だからといって、端末が回転するような持ち方をするとノイ...

Android2.1(X06HT/Desire)でハマったこと

SmartTraining 2.2.1にバージョンアップするにあたり、3点ハマりました。 いずれもAndroid2.1側の問題かと思います。 ムカついたのでメモメモ。 1.画面OFF時に加速度変化イベントが取れない。  あちこちで書いていますが、開発者の間では Issue3708 として認識されているAndroid側の不具合という認識の問題です。様々なアプリケーションもこれにより影響を受けており、Smart Alarm ClockやCardioTrainerなどの超有名どころアプリケーションもこの問題を解決できていません。この中の投稿でBrunoさんという方が、問題を回避する方法を提案しています。実際にX06HT(Desire)とNexus Oneで試してみましたが現象が改善されませんでした。やり方が悪いのか、何なのかわかりませんが、Brunoさんの方法を試しても改善されないという報告がいくつか見られたので、この方法は疑わしいと考えています。  Android側を弁護するとしたら、バックグラウンドでセンサーを不用意に扱うアプリケーションがバッテリーを大量消費してしまうことを回避する、という意味ではこの動作変更は成功しているかもしれません。しかし、バックグラウンドでの動作に制限をかけるのであれば、よりバッテリ喰いのGPSにはこういった制限がありません、これでは中途半端でしょう。明らかに旧バージョンからダウングレードしています。  回避方法としては、PowerManagerでSCREEN_DIM_WAKE_LOCK以上に設定します。SCREEN_DIM_WAKE_LOCKというのは、画面の液晶が暗くなっているが、OFFではない状態です。当たり前ですがバッテリかなり喰います。かつ、この状態でポケットに入れたりすると当然誤操作の元となります。SmartTraining的にはこの対応はありえないので、結局「残念なお知らせ」を表示してこの問題がAndroid側の問題であることをアピールするに留めました。 2.画面OFF時にTimerが動作しない(ことがある)。  上記問題と少し似ているのですが、画面OFF時にTimerが動作しません。「しないことがある」としているのには、いくつか条件が必要なためです。こちらで確認している条件としては、以下の条件でTimerが動作しません。 ・画...

Google Maps Data APIの謎

SmartTraining 2.0.0のこと。 今回のバージョンアップは初期バージョンリリース以来ずっと実現したかったGoogle Mapsへのデータアップ機能実装がメイン。嬉しかったので自分へのご褒美という意味でメジャーバージョンをあげちゃいましたwバージョン管理なんてそんなもん。 Google Mapsへのデータアップロード、意外に手間取りました。つい最近までずっとMaps関連のAPIは Google Maps API だけだと思っていて、外部アプリからデータのアップロードなんてできないものだと思い込んでいました。 ところが先週、何気に情報探していたら Google Maps Data API なるものを発見。紛らわしー名前だなー。これ発見した時「勝てる!」思いましたよ。楽勝だってね。でもそこからが大変。 まずは、Androidアプリを開発してるわけなので、Javaライブラリを探す。 発見 。おおぉー、サンプルも載ってるし楽勝じゃねーか。と思いつつライブラリダウンロード。ダウンロードしたライブラリには普通のJava環境用のライブラリとandroid用のライブラリが格納されている。普通のJava環境用のものはjacksonやらkxmlやらcommons-loggingやらいろいろと依存ライブラリがあるらしく、Android上でそのまま動かすのはちょっとつらい。 そこでAndroid用ライブラリをためす。早速ライブラリを組み込み実験用アプリを作りマップのリストを取得してみる。が、なんかおかしい。Webサイト上のサンプルをそのまま書いてみてもEclipse上では赤い下線が出る。 「そんなメソッドねぇ」だと。そこでダウンロードしたJavaDocs見ると、Webサイト上のサンプルで使ってるメソッドなんてありません。Maps関連のクラスを見てもAUTH_TOKEN_TYPEとVERSIONのstaticなフィールドが定義されているだけ。んー、なんだこりゃ。ライブラリのソースをダウンロードしてみるがJavaDocs通りフィールドが2個定義されているだけ。。。オイw未実装かよwさんざん探したけどサンプルもありません。 一晩寝てわかりました。Webサイト上のサンプルはv1.4用のっぽいんですね。この当時のライブラリにAndroid版はない。ダウンロードしたのはv2.1。どおりでダ...

SmartTraining 1.9.0 リリース

先日リリースしたSmartTraining1.9.0のこと。  今回のバージョンアップは、以前Andronaviさんで 紹介 していただいた時に低かった評価の改善、Marketでいただいたコメントに対する対応を行ってみました。  歩数については、あの当時から万歩計ロジックを2度修正して多少はマシになっていると思います。一応、個人的な計測では悪くても2割程度の誤差。ロジックについてはさらに見直して精度アップの余地はあると思っています。ただ、なかなか試験に時間がかかるので、引き続き実験と計測を繰り返しつつ徐々に改善していこうかと思っています。  一時停止中の距離カウントを止める機能は、途中でトレーニング種別を変える機能と絡めてみました。例えば、将来的にはトライアスロンや、スキーでの滑走&リフトなど、途中で実施する運動が変化するケースでも計測の継続を容易にすることを想定しています。現実的には今のハードウェアが耐水的にも耐寒冷的にも弱いのでこの機能が真価を発揮するのはまだまだ先のことになりそうです。あと、本当は人が操作しなくても自動的に状況を認識して記録してくれるというのが理想ですが、こちらはもう少し研究が必要ですね。  Twitterにつぶやく機能は1.8.5で適当に実装(といっても他アプリに送るだけですが)してみたのをもう少し拡張してみました。っていうか、誰もハッシュタグ使ってつぶやいてくれないので消そうかと思いましたがwちょっとだけ悪あがき。  最後は、ContentProviderによるデータの公開。どうやって公開するのが一般的なのかわからなかったので、 サポートサイト に利用側コードを貼ってあります。マッシュアップで運動の計測にはこのアプリを活用していただけるととても嬉しいです。データアクセス手段の公開と外部へのエクスポートによるアプリマッシュアップはAndroidならではの機能ではないかなと思っています。  あと、おまけ。機能的には地味なのでどこにもコメントありませんが、設定画面で使っているトレーニングタイプの選択時に表示しているリストダイアログ。以前は標準のListPreferenceを使っていたのですが、結構殺風景だったので、リスト上にアイコンを表示するように機能拡張してみました。 やり方は、DialogPreferenceを継承したオリジナルのクラスを作成...