投稿

2012の投稿を表示しています

2012振り返り

ついこの前2012年年明けたと思って気づいたらもう年末。この時間の流れの速さは異常です。残り少ない人生、多少なりとも振り返りをしておかないと、あっと言う間に終わってしまいそうです。そういうわけで、時間もないのでちゃちゃっと振り返ってみます。 昨年書いたエントリー によると、2012年の目標としては、 ・データのクラウドへの移行 だったようです。 目標は達成しました。SmartTrainingに「同期」機能を盛り込みました。 同期機能は、AndroidアプリケーションのデータをGoogle Fusion Tablesと双方向同期する機能です。個人的にはそれなりに便利になったと思っているのですが、思ったほど利用はされていないようです。というのは、2012/12くらいから、Fusion Tables APIの挙動が変わり、さらにBeta版のAPIが利用できなくなったことにより同期機能が利用できなくなっているにもかかわらず、全く問い合わせが無いためです。設定が深いところにあるので、既存のユーザさんは気付かないんでしょうね。 その他にやったことといえば、 ・ググれカス Plug-in for twiccaのリリース ・SmartWatch MN2対応 ・ACE資格取得 という感じ。 MN2対応を行った2012/5以降、SmartTrainingは大きなリリースは無く、バグ修正を2回ほどやっただけです。それまではほぼ毎週リリースしていたので、開発おわっちゃったんじゃないかというペースですが、そんなことはありません。ActionBarSherlockベースの新UIへの変更に思ったより時間がかかっています。何回か作って気に入らないので作り直したりしています。もうかれこれFragmentを30-40個くらい作っては捨てています。とても仕事じゃできないやり方です。一応、もうほとんど完了してリリースしてもいいレベルまでは来ているのですが、先に述べたFusion Tables APIのDeprecateされたことより、新API対応をする必要が出てきてリリースはもう少し先になりそうです。あと、リリース前にDeploy Gateを使ってテストもやってみたいです。そうこうしているうちに、Android Map API v2が出てきて早く使いたかったり、先延ばしにして

AndroidからGoogle Service OAuth2.0の利用で詰んでいる

詰んでます。 この投稿は結局現状解決していません。 あしからず。 ※2013/3/13追記 解決しました。 結局、「2.」の方法でうまくいきました。ただ、この記事を書いていたタイミングでは確かにICSでのみNPEが起きていたのですが、全く同じコードを今実行しても問題が再現しなくなっています。端末をフルリセットしてからも再現しないので、まぁ、大丈夫なんじゃないかと思います。というわけで、このケースは「2.」で対応しましょう。 ---- Google Fusion Tables API v1を使いたい。今すぐ。 Google Fusion Tables API v1はprivateなデータにアクセスするのにOAuth2必須。(たぶん、他のGoogle Serviceも同様にOAuth2を標準的な認証方式としていく流れだと思います) いろいろ調べた結果、OAuth2するためには、以下の4種類の方法があると考えている。 1.  AndroidでGoogleのOAuth2認証を行うには?(外部ライブラリ完全非依存版) 2. AndroidのAccountManager経由でGoogleのOAuth2認証を行うには?(外部ライブラリ完全非依存版) 3. http://localhostなコールバックURLを処理する方法 4. ブラウザ上に表示された認証コードを手入力する方法 「1.」の方法はWebViewを使っている。 WebViewは本来的に脆弱性があるため、デリケートな認証情報を扱うOAuth2では利用しづらい。 Androidセキュリティ勉強会~WebViewの脆弱性編~ でも、海外では余裕で利用している。 Oauth 2.0 flow in Android 大丈夫? 「2.」の方法は ICSだとGrantCredentialsPermissionActivityがNPEを起こす ので利用できない。それより前のOSもしくはそれより後のOSでは発生しないらしい。しかし、ICS全盛の今ICSを無視するわけにはいかない。なのでアウト。 「3.」の方法は、仮にTwitterだったら OAuthの認証にWebViewを使うのはやめよう にあるように「getOAuthRequestToken 呼び出し時に Callback UR

Intent anywhere

1. はじめに たまたま抱えていた問題が解決したタイミングで「Android Advent Calendar 2012」の案内が飛んでいたので思わずエントリーしてしまいました。ということで12月29日担当します@awwa500です。よろしくお願いいたします。 2. 概要 CGIからのIntentの送信について書きます。ネタは薄いです。 3. きっかけ Androidのアプリ開発を初めて3年ちょっとくらいになりますが、Intentの仕組みを知った当時、衝撃を受けました。Intentが世界を変える、とまで思ったのはそれほど大げさではありません。 ところが、そんな信念を打ち砕かんとする事態が発生しました。今回はその辺の話を書いてみようと思います。 4. Intentは最強だよね IntentについてググるとTechBoosterさんのブログがヒットします。Intentを使えば画面遷移も、アプリ間連携も、サービスの利用も、とにかくいろいろとできるわけです。 Intentで画面遷移する(明示的Intent) Intentで画面遷移する(暗黙的Intent) Serviceを使う(1) LocalServiceによる常駐型アプリ JNIを介してNativeなコードからもIntentを投げることもできます。 Android: How to broadcast intent from native code? IntentServiceと組み合わせるとキューも簡単に実装できちゃいます。 IntentServiceを使って非同期処理を行う コマンドラインからもIntentを投げることもできちゃいます。 ターミナルからIntentを投げる だんだんTechBoosterさんのリンク集みたいになってきましたね。このまま終わってしまってもいい感じになってきました。 5. 挫折 というわけで、どんな状況でもIntentがなんとかしてくれると思っていました。でもこれまでの情報では解決できない事態になりました。例えば、たまにAndroid上でApacheを動かしたくなることがありますよね?(ちょっとこの設定に無理があるような気がしますが、まあ、あるんです)このApacheが駆動するCGIと通常のAndroidアプリケーションを連携させた

Activityに別名をつける

「 <activity-alias>の使い道 」 についてはそちらを参照していただくと使い方の例はとてもわかりやすいですが、もっと単純な使い方をしてみたのでメモ。 ここでは、いいかげんな設計の結果、ショートカットで起動するActivityの名称およびパッケージが変更したくなった場合に<activity-alias>を使ってリンク切れを回避してみます。その名のとおり、activityにエイリアスを付けられるってことです。 例えば、既にリリース済みのバージョンの機能で生成されるショートカットが明示的Intentによって起動先を指定しているActivityが途中から気が変わってパッケージ構成とか変更したくなることってよくありますよね?(あんまりあっちゃいけませんが、無いとなったら話が進まないのであることにします。)こういったときに<activity-alias>を使わないと、旧バージョンで作成したショートカットを選択した時に「そんなActivity無い」と怒られます。感のいいユーザさんならショートカット作成しなおしますが、そうではないユーザさんはアプリの再インストールをしちゃったりします、データのバックアップもせずに。それで怒りのメールが飛んで来るわけです。 怖い。 そういうわけで回避方法を考えます。 例えば、 旧バージョンのショートカットは、 com.awwa.view.ControlActivity2 を呼び出しているのに、新バージョンでは、 com.awwa.ui.TrainActivity を呼び出したい。 なんてときに<activity-alias>が使えます。 こんなかんじ(AndroidManifest.xml)。 要はandroid:nameに外から見える名前をつけて、android:targetActivityに実際のActivityを指定します。 android:nameに指定するActivityは実在しなくても構いません。 これで心置きなく適当な設計をして、後から好きなように名前を変更しても旧バージョンとの互換性が保たれるというわけです。めでたし。 

複数のIntentServiceを使って非同期処理を同期化する

IntentServiceの特徴はTechBoosterさんの「 IntentServiceを使って非同期処理を行う 」が最高にわかりやすいのでそちらを参照。 ここでは複数のIntentServiceを同期化してみます。 複数のキュー処理を同期化したい、みたいな用途に使えるかもしれません。 まずはIntentServiceその1。 public class XIntentService extends IntentService { @SuppressWarnings("unused") private static final String TAG = XIntentService.class.getSimpleName(); private final XIntentService self = this; public static final String KEY_ACTION = "action"; public static final String KEY = "key"; public XIntentService() { super(TAG); } public XIntentService(String name) { super(name); } @Override protected void onHandleIntent(Intent data) { Lock lock = Lock.getInstance(); synchronized (lock) { int value = data.getIntExtra(KEY, -1); Log.i(TAG, "onHandleIntent() start " + value); int wait = (int) (Math.random() * 1000); try { Thread.sleep(wa

MBA + Windows + VirtualBoxでcontrolキーとcommandキーの入れ替え

イメージ
MBAのcontrolキーとcommandキーを入れ替えている。 左小指の位置にcontrolが欲しいからだ。 いつからこれが身についたのかは覚えていないけど、学生時代にいじっていたDECやらSoralisやらについていたキーボードがそうだったからだと思う。 Windowsで106/109日本語キーボード使うときは、Caps LockとCtrlを入れ替える。 MBAではcontrolとcommandを入れ替える。 というわけで、MBA上のVM上でWindowsを動かすときは、Windows上の設定でさらにcontrolとcommandを入れ替える。 面倒な身体だ。 全部OS標準で馴染んでいる身体の方がこういう無駄な設定に時間を使わなくていいから効率が良い。 でも、いまさら元に戻れないので設定変更する。 今後も何回も同じことするだろうからメモ書き。 これでよし。 ほかのキーを入れ替えたいときはこっちをみて考えること。 http://uguisu.skr.jp/Windows/winCaps.html 以上。

DeployGateで一般の方(テストの知識が無い方)にテストしてもらう時の流れ

ちょっと前にMixiさんが DeployGate というサービスを開始しました。 ちょうど困っていた課題を解決してくれそうだったので、使ってみたくなりました。 サービスに関する詳しい話は上のリンクを見るとして、ここでは、DeployGateを使って一般の方(テストの知識が無い方)にテストに協力してもらう時の流れをまとめてみました。バグ管理とか、テスト管理なんかは必要に応じて適当にやってください。ここでは書きません。 実際、自分のアプリはまだテストできる段階ではないので、とりあえず、トライアルで使ってみた限りで思いつくことをまとめてみました。あとちょっとでトライアル期間が終わってしまうので、いつの日か、自分のアプリがテストできるレベルになったら使ってみたいと思います。 というわけで覚え書きです。 実際使った方で「そんなんじゃ回んねぇよ」とかあったら是非教えて下さい。 尚、ここでやろうとしているのはどっちかというとフィールドテストとかユーザからのフィードバックを期待するテストかもしれません。ついでにいろんな端末でいろんな環境でちゃんと動くよね、みたいなのを確認するのが目的です。 ---- 1 開発者側の準備  1-1 β版程度の品質(とりあえず、動くものが必要)のテスト対象を作成する。  1-2 テスト対象をDeployGateにアップロードする。  1-3 テスタ募集する。募集の際、伝えるべきことは以下。   1-3-1 DeployGateサービスにユーザ登録してもらう必要がある。   1-3-2 テスト端末にDeployGateアプリをインストールしてもらう必要がある。   1-3-3 テスタへの連絡手段(DeployGate登録ユーザ名またはメールアドレス)を教えてもらう必要がある。   1-3-4 テスト対象をそれなりに使ってもらう必要がある。   1-3-5 あくまでもテストなんだから、最悪の場合アプリのデータが消えてしまうかもしれないので必要に応じてバックアップを取ってもらう必要がある。   1-3-6 あくまでもテストなんだから、アプリが異常終了しても泣かずに我慢してもらう必要がある。   1-3-7 提供元不明のアプリインストール許

アンドロイド始めました3

イメージ
ACE受けてきました。 結果は、 合格しました。 合否判定基準が70%なので、神がかり的なギリさかげんです。ネタかと思いました。 とりあえず、受かったので良しとします。 得点がギリギリだった原因として思い当たるのは、 ・試験問題自体を疑いの目で見ている。 ・EclipseやADTがアシストしてくれる開発ツールのコマンドラインの引数なんか覚える気はない。 ・APIなんかリファレンスをググればいいと思っているので覚える気はない。 ・何よりも試験勉強をする気力がない。 といったあたりです。 「なんだ?この問題突っ込みどころがありすぎて意味わかんね。なんでGUIで使えるツールのコマンドラインの引数なんか覚えなきゃいけないんだよ?リファレンスググればAPI覚える必要ないだろ。そもそも受かっても全然メリットないじゃん。こんなの時間の無駄だ。」などと思ってるわけです。受験する者の精神状態としては最悪ですよね。客観的に見て最悪だと思います。 また、中途半端に知識があるので自分が開発に不要だと思う知識が頭に入ってこないのだと思います。 これはとても不幸なことです。反省しなければいけませんねー。 と、やる気が無い無い言いながら、Twitterで思わぬ方からオススメ情報を頂いたり、祝福のお言葉を頂いたりと、実はそういうのが素で嬉しかったです。 それと、試験受付のおねぇさん(推定20代後半、色白、細め、結構美人、未婚(左手薬指より判断))が受験時の注意事項を説明してくれるのですが、もの凄い高速でマシンガン的に説明するのが機械みたいでした。すごく萌えました。また、何か受験しに行きたいと思いました。 あのおねぇさんをAndroidで作ればいいんじゃないか。

Galaxy Note

auのIS03からGalaxy NoteにMNP乗り換えしました。 5月末までのDの乗り換えキャンペーンに乗せられました。 最近IS03は全く使っていないので、月額費用が下がってXiの(もしかして)高速な通信がテザリングで使えたらいいか、ぐらいの目的です。 Galaxy Noteそのものについては、SPenでなんか作ろうかな、という目的もあったりしますが、今のところ特にネタはありません。とりあえず、テザリング向けに電池の容量がデカかったのがこの端末を選んだ理由です。 というわけで、端末自体にはそれほど興味なかったのですが、実際触ってみるとデカくて電車でさっと出してメール見る、とかの用途には使いにくい。Xperia Activeの方が圧倒的にフットワーク軽く使えます。 テーブルなんかがある落ち着いた場所で使うにはデカイので見やすいです。 ま、あたりまえですな。 そういえば、SmartWatch向けの画面が巨大化してしまう不具合を再現するのに役立ちました。

アンドロイド始めました2

前回、査定期限まで1週間、とか書きました。実は期限は過ぎましたが、まだ受験していません。 先週、受験チケットが届いて早速翌日受験するぜー、という勢いで予約サイト行ったら、1週間後からしか予約受付してくれませんでした。ガーン。あっさりと査定は終了しました。結局、合格でも不合格でも特に何の影響もない状況になってしまいました。 一応、明日5/31に受験予定です。 せっかくお金払って、勉強もしたので受験するつもりです。 先週、受験チケットが届いた時点ですっかりモチベーションは下がり切っていました。あれから、テキストは1回も開いていません。明日の受験までにテキストを開くかどうかはわかりません。(今のところ開くつもりはありません。) そんなことよりSmartTrainingの次期改造で頭がいっぱいです。

アンドロイド始めました1

イメージ
タイトル怪しいですが、Androidの 資格試験ACE を受けることにしました。 査定の条件でACE合格という目標を立てたためです。 目標を立てたのは2011/8。 査定期限は5/25。あと1週間しか無いことに昨日気づきました。 早速Amazonで資格教科書をポチったら届きました。 AndroidはDev Phone 1が発売された頃からなんだかんだで触っているので、わりと慣れているつもりです。何を今更資格取る必要あるのよ、という気持ちも正直ありますが、まぁ、査定のためなので仕方ありません。それがサラリーマンというものです。 そういうわけであまり、モチベーションは高くなかったのですが、ACE受けることをTwitterに投稿したらお薦め参考書情報をいただいたりしました。意外とそんなことでモチベーションはグーンと上がりました。頑張ります。 早速、1章から教科書を読み始めます。1章読み終えた時点で眠い。ちょっとヤバいなーと思っていたら、教科書の内容がちょっと変。 ListViewとSpinnerのイメージが間違ってないかい? なんか、楽しくなってきました。頑張ります。 その後も、 https://twitter.com/#!/awwa500/status/203483553718210561 とか、 https://twitter.com/#!/awwa500/status/203485216394854400 とか、ちょいちょい突っ込みたい内容が。 これまで、Androidに関して体系的に勉強したことはありませんでした。勉強してみると意外と知らないことはあるな、ということに気付きました。全くの無駄な行為というわけではなさそうです。 とりあえず、全14章のうち、初日で4章まで読破しました。 引き続き頑張ります。

SmartWatch MN2に対応してみました

SmartTrainingがVer7.1.0で SmartWatch MN2 に対応しました。 できることと画面イメージは 公式サイト を見て下さい。 LiveView対応と同じノリでサクッと2~3日で対応しようと思っていたら2週間以上もかかってしまいました。 その理由と今回特にこだわったところをまとめてみます。 まず、MN2は以下のような特徴があります。 ・直射日光下では画面がほとんど見えない。 ・操作はタッチパネルで行うしかない。 ・バイブレータが利用できる。 ・直射日光下で見えない画面 本当に見えません。困りました。適当に字を描画しても、とにかく見えません。周囲が暗ければ普通に見えますが、明るくなると極端に見えづらくなります。親機Xperiaの液晶は明るい直射日光下でも比較的見えやすい液晶なので非常に残念です。残念残念ばかり言ってても始まらないので、アプリケーション側でできる対策を考えます。というわけでハイコントラストをかなり意識しました。 ・字は白。 ・背景は黒。 ・アイコンデザインも変更して、他アイコンと判別したい『人の形』の部分を白(以前のアイコンは若干グレーのフィルタをかけてありました)にしました。ほんのちょっとのグレーでも極端に見えなくなります。白黒配色は一見殺風景ですが、そういった理由があります。ちなみに、背景を白、字を黒にしなかったのは、バッテリー消費を少しでも抑えるためです。(そうしろと、ガイドラインに書いてありました) ・タッチパネルで行うしかないI/F LiveViewには、端末右上にハードキーがありました。 ハードキーと左右キーとを組み合わせたUIとしていましたが、SmartWatchはタッチパネルのみ。 画面が小さい上にその小さい画面を指で触るとほとんど覆われて何も見えない状態になります。 ユーザの操作を認識したのかどうかがわかりにくい。これから気持よくランニングを開始しよう、とか、ランニングが終わって疲れてヘロヘロ~、という状態で操作できたのかどうかを見づらい画面を触って操作するなんて耐えられません。というわけでユーザに操作できたことをフィードバックすることにしました。 ・操作受付が可能な部分を触った瞬間、振動させることにしました。 ・特に重要な操作の場合、振動パターンを切り替える

SyncAdapterのススメ

SyncAdapterの練習用にSmartTrainingにSyncAdapter機能を実装してみました。これを基にざっくりSyncAdapterについてまとめてみました。細かい実装方法は面倒なのでここでは載せませんので、以下のキーワードから自分で調べてください。(と、突き放す。) 宝くじでも当たって仕事しなくて良くなるくらい暇になったらもっと細かい実装方法についても書くかもしれません。 SyncAdapterの定義 SampleSyncAdapter のように、クラウド上のデータと端末上のデータを相互に連携するための一連の仕組みを指します。 SyncAdapterの概要 アプリケーション内データとクラウド上データの連携をサポートしてくれる仕組み。 端末のアカウント設定(AccountManager)と連動する。 API Level 5以上で利用可。 SyncAdapterがやってくれること Syncのトリガを提供してくれる。 Sync中にシステムSyncアイコンを表示してくれる。 SyncAdapterがやってくれないこと Sync処理(Syncロジック)そのもの 認証処理そのもの メリット アカウント管理を端末のアカウント設定と統合できる。 システムSyncアイコンが使える。 同期中の状態をユーザに通知するのにNotificationではちょっと主張が強すぎる。通知領域以外で、バックグラウンドでタスクが実行されていることを表現するのに適している。 Sync開始したときに通信不可状態だった場合、通信が復活したら自動的にsyncをしてくれる。 個人的にはこれがSyncAdapterを実装する最大のモチベーション。 一応、ネットワークの状態監視とキュー管理を自前で作れないことはないけど。 デメリット 実装しなければいけないことがわりと多い。一般的には以下の実装が必要。 SyncAdapter SyncService Authenticator DataProvider SyncServiceのXML定義 AuthenticatorのXML定義 Syncロジック 認証画面 SyncAdapterに必要な実装 SyncAdapter Sync動作のエントリポ

SyncAdapterで同期時にSyncアイコンを表示したい。 出来ればすぐに。

SyncAdapterを実装してrequestSync()したときに、通知領域にSyncアイコンが表示される条件。 extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); してから、 ContentResolver.requestSync(mAccount, AUTHORITY, extras); とすればいい。  SYNC_EXTRAS_MANUALを使わないと、 authorityにCALLER_IS_SYNCADAPTER = trueが付加されててかつ、 ContentResolver経由でローカルのDBを更新している処理が一定時間以上かかると 適当なタイミングで表示される。 これだとリモートデータにアクセスしているときや、ローカルデータへのアクセス時間が短いときはSyncアイコンが表示されない。 リファレンスのどこにもこんな説明はないようだが。。。 ま、そんな感じ。

既存のアカウントタイプにサービスを追加する

イメージ
AndroidでSyncAdapterを作成する際、自前でアカウントを作成するには、 ここ に掲載されているようにAccount-authenticatorを設定すればOKです。こんな感じ。 "typeOfAuthenticator"の部分を自前のアカウントタイプに変更すればいいわけです。が、例えばGoogleのアカウントを利用したサービスを作りたい場合、自前のアカウントタイプにしてしまうと、AccountManagerやSyncAdapterを利用したときに端末に既存で設定してある認証情報を利用できなくなってしまいます。そんなときは、既存のアカウントタイプに自前のサービスだけ追加することでができます。ある意味寄生してるみたいですな。例えば、アカウントタイプcom.googleに寄生するときはこんな感じ。 合わせてsync-adapterのaccountTypeもcom.googleに変更してやります。 画面的にはこんな感じになります。 めでたくGoogleのアカウント設定内に自前のサービスを追加することが出来ました。

Android SDKのSampleSyncAdapterを図解してみた

イメージ
SyncAdapterの使い方を調べていてあまりわかり易い解説が無い中、こんなのを見つけた。「 Android SDKのSampleSyncAdapterの使い方 」 。 確かにここに書いてある通りな雰囲気。 でも、やっぱりSampleSyncAdapterはわかりにくい。文字で追ってて混乱してくるので、絵にしてみた。こんな感じ。 間違ってたらコメントください。自分も100%理解しているとは言い難いので。

ググれカス plug-in for twicca 1.1 リリースしました

ググれカス plug-in for twicca の新バージョン1.1をリリースしました。今回のバージョンでは、以下を修正しています。 - 英語リソース追加 - 日本語単語抽出ロジック変更 - バグ修正 思いつきの小ネタだったので、日本語での利用しか想定していませんでしたが、非日本語圏でも使えそうなのでとりあえず英語リソースと英語での紹介文を追加してみました。その他の言語については把握しきれないので放置の方向で。ちなみに、英語向けの紹介文はこんな感じ。英語ユーザーじゃないのでこういう表現が妥当かよくわからないけど。 ---- ggrks plug-in enables to search the words in tweet . This plug-in is for twicca. ggrks means "You should search the word in google before ask other. fuckin' novice!". ---- あと、他の修正は微調整ということで。 その他としては、「ggrks」、「ググれカス」あたりでも検索に引っかかるように紹介文を変更してみたり。 もちろん私はググれカスだなんて思ったことはないですよ。 あくまでネタですから。

ググれカス plug-in for twicca 公開

イメージ
新年明けましておめでとうございます。正月はTVを全く観ていないせいか、正月気分には浸れませんでしたが、表題の件、 公開 しました。 twiccaで表示されているツイートの内容から単語を抽出し、ググるためのプラグインです。似たようなモノはありそうですが、まぁ、いいでしょう。 TL上のネットジャンキーのスラングがわけわかめー!という状況で使えるかもしれません。でも、わけわかめなスラングが単語として抽出できるかはわかりません。 ◆使い方 わけわかめなツイートを選択して、メニュー上から「ググれカス」を選択。 単語抽出されるまでしばし待つ。抽出されたら検索したい単語を選択する。 ググる。 以上。 ◆仕組み 1. twiccaからTweetの文字列を受け取る。 2. 形態素解析とキーフレーズ抽出により単語抽出を行う。 3. 抽出した単語を一覧表示。 4. 選択された単語をググる。 単純ですね。 難点は2.をWebサービスを利用して行っているので、 ・数秒待たされる。なんて致命的。 ・特に乱れた日本語の場合、思ったとおりに単語抽出してくれないことがある。なぁんて致命的。 って感じです。 ま、ネタなんで許してやってください。 そういうわけで、本年も小ネタで行きますが、よろしくお願いいたします。