2013年7月9日火曜日

Navigation DrawerをActionBarSherlockで使ってみたい(デザインガイド非準拠)・・・コンテンツ操作用を作成

前々回記事(リンク)前回記事(リンク)の続きです。

 

前回までのあらすじ

前回のラブライブ!
ついにスクールアイドルとしてはじめてのライブに挑むことになったニクニクと(ry

以下本編

何回かに分けてNavigationDrawerを触ってきましたが、本来の目的は
  「NavigationDrawerを右だししてコンテンツ操作用にカスタマイズしたDrawerが欲しい」
でした。
今回は、そのドロワー作成をしましたという記事。

その前にナビゲーションドロワーとは?

NavigationDrawerのガイド(リンク)を見たところ、その特徴としては

  • ドロワーを出せるときはアップナビゲーションアイコンをドロワー有り表示とする
  • 画面外からの操作(左からエッジスワイプ)で表示できること
  • アップナビゲーションアイコンからドロワーを呼び出せること
  • ドロワー表示中はアイコン、アクセシビリティの表示を変更すること

などがあります。

→このあたりはテクブさんの記事(リンク)がとても参考になります!

コンテンツ操作用のドロワーとしてはどうするか?

ActionBarDrawerToggle.javaやDrawerLayout.javaを見ればわかりますが、安易に右だしするのはやめて!という意図が伝わってきます。
ユーザーを混乱させるなということですよね。
じゃぁどうするかですが、上記のNavigationDrawerの特徴をはずしていけばいいのかなということで以下の対処をしてみます。

  • アップナビゲーションアイコンの表示を変更しない
  • 画面外からの操作(エッジスワイプ)で表示させない
  • アップナビゲーションアイコンから呼び出させない
  • ドロワー表示中はアイコン表示を変更しない(アクセシビリティの表示はお好みで

 

実行時画面

ContentDrawer選択して、ボタン選択で、右だしドロワー表示まで。

image image image

 

実装サンプル

上記対応を行ったサンプルをGitHubにあっぷしておきました。
参考にどうぞ。

https://github.com/miquniqu/AbsNavigationDrawerSample

前回からの変更箇所はこちら

https://github.com/miquniqu/AbsNavigationDrawerSample/commit/94b4ebdcf929c7fd3b9c9fc21deca2f5b5cb8681

 

修正したソースの概要

ActionBarContentDrawerToggle.java
→ActionBarDrawerToggle.javaをベースにコンテンツ用にアイコン操作を削除、ドロワー呼び出しとしてpublic void toggleDrawer()追加

ContentDrawerLayout.java
→DrawerLayout.javaをベースにエッジスワイプ操作を削除(setEdgeTrackingEnabledをコメント化しただけ

ContentDrawerActivity.java
→サンプルアプリから、ドロワー呼び出し方法としてボタン追加
※FragmentからActivityのドロワー呼び出しするにはyanzmさんの記事(リンク)が参考になります。

 

NavigationDrawerがらみはこれでおわり!

2013年7月7日日曜日

Navigation DrawerをActionBarSherlockで使ってみたい(デザインガイド非準拠)・・・その後

 

前回記事(リンク)の続きです。

 

前回までのあらすじ

妖精の森エクレアで安穏と暮らしていたニクニクは、異世界でえろい人が開発した武器ナビゲーションドロアーが楽しそうといううわさを耳にした。
しかし、ニクニクの愛車アクションバーシェーロック号にはそのナビゲーションドロアーが搭載できない。
こまったニクニクはいつものように(検索)窓に向かって「ナビゲーションドロアー!ナビゲーションドロアー!」と連呼していたところ、「パッチを感じるんだ」と神の声が聞こえてきた。
ニクニクは恐れながらも声のする方向へ歩いていくと、そこには恐るべき試練が待ち受けていたのであったニク。

 

本編

前回助けてっていってた件が暫定自己解決したのでその内容をうpしときます。
よくわかってない部分だれか教えてくれたらいいと思います。

 

何を変えたか

以下、見てきてください。

API7で動作版
android:attrの利用を直接指定とする
invalidateOptionMenu→supportInvalidateOptionMenuに変更
https://github.com/miquniqu/AbsNavigationDrawerSample/commit/80aff00c0567aa2a0d371f527e0eb8bdc8aac674

 

修正箇所の説明1

DrawerActivity.java

  1:              public void onDrawerClosed(View view) {
  2:                  getSupportActionBar().setTitle(mTitle);
  3: -                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
  4: +                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
  5:              }
  6: 

→invalidateOptionsMenuをsupportInvalidateOptionsMenuに変更しわすれてたので一応。


 


修正箇所の説明2


drawer_list_item.xml


  1: <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  2:     android:id="@android:id/text1"
  3:     android:layout_width="match_parent"
  4:     android:layout_height="wrap_content"
  5:     android:textAppearance="?android:attr/textAppearanceListItemSmall"
  6:     android:gravity="center_vertical"
  7:     android:paddingLeft="16dp"
  8:     android:paddingRight="16dp"
  9:     android:textColor="#fff"
 10: -    android:background="?android:attr/activatedBackgroundIndicator"
 11: -    android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
 12: +    android:background="@drawable/abs__activated_background_holo_dark"
 13: +    android:minHeight="48dp"/>
 14: 

これが正直よくわからない。
android:attrはテーマで設定している属性値を利用するってことで、今回利用しているActionBarSherlockのテーマでも、

  1: <style name="Theme.Sherlock" parent="Sherlock.__Theme">
  2:   ~
  3:   <item name="activatedBackgroundIndicator">@drawable/abs__activated_background_holo_dark</item>
  4: 

と宣言されている。
今回の対処は、テーマ属性経由ではなく、abs__activated_background_holo_darkを直接指定するように変更したら
そのセレクターで指定しているres/drawable-hdpi/abs__ic_ab_back_holo_dark.pngが読み込めるようになったというもの。


うーん。。


ともあれ、パッチが適用されたActionBarSherlockに追加修正することなくAPI7~17で利用できたのでよしとしよう。


[2013.07.07 追記]
なんておもってたのだけれど、sdk\extras\android\support\samples\Support4Demosにあるサンプルソースでは、
android.R.layout.simple_list_item_1を利用していたのでdrawer_list_item.xmlのカスタムレイアウトはやめて、
こっちに変更することにしました。


パッチ入手先とか



Android : Navigation Drawer をActionBarSherlockで使う
http://d.hatena.ne.jp/esmasui/20130606/1370517111
https://github.com/esmasui/ActionBarSherlock/commits/ActionBarDrawerToggle
※ABS4.2.0へのぱっち


上記ブログであげられてる4.3.1のパッチ?
https://github.com/ianhanniballake/ActionBarSherlock

今回の修正をいれたサンプルアプリ
https://github.com/miquniqu/AbsNavigationDrawerSample


おわり。

2013年7月1日月曜日

Navigation DrawerをActionBarSherlockで使ってみたい(デザインガイド非準拠)

けど失敗したのでだれか助けて(*´^`*)
という話です。

参考記事

参考にしたのはこのあたりの記事です。

Android : Navigation Drawer を使う
http://y-anz-m.blogspot.jp/2013/05/android-navigation-drawer.html

Android : Navigation Drawer をActionBarSherlockで使う
http://d.hatena.ne.jp/esmasui/20130606/1370517111

[Android] Navigation Drawerを画面上側から表示させる
http://lily-light.blogspot.jp/2013/06/android-navigation-drawer.html

 

やったこと

1、yanzmさんの記事を元にしたesmasuiさんのupしてるパッチ入りActionBarSherlockをベースにサンプル作成
→API 17だとうまくいくけど、API7、10で例外

2、lilylightさんの記事、githubソース(Vertical系)も取り込んで、Horizonも追加してみた

追加ソース
src/com/actionbarsherlock/custom/app/ActionBarHorizonDrawerToggle.java←esmasuiさんのソースへlilylightさんの差分追加
src/com/actionbarsherlock/custom/app/ActionBarVerticalDrawerToggle.java←上記を参考に修正
src/com/actionbarsherlock/custom/widget/VerticalDrawerLayout.java←lilylightさんの差分追加そのまま
src/com/actionbarsherlock/custom/widget/HorizonDrawerLayout.java←上記を参考に修正

→結局一緒。

やりたかったこと

ほんとうにやりたかったことは、ActionBarのアイコンは変更せず(Navigationぽく感じるので)に、
コンテンツ操作時にそのメニューをRIGHTかBOTTOMあたりにスライド移動以外のアニメーションで
Drawer表示かつ、複数Drawer切り替えみたいなことをしたかったんだけど。。ぐぬぬ。

実装サンプル

できてない版としてGitHubにあっぷしておきました。
lilylightさんの記事にもありますが、デザインガイド非準拠なので、利用は要検討。

https://github.com/miquniqu/AbsNavigationDrawerSample

 

できてること

API Level 17 のAVDで一通り操作できる。

・メニュー/デフォルト
image image

・Horizon LEFT/Horizon RIGHT
imageimage

・Vertical TOP/Vertical BOTTOM
image image

 

できてないこと

API Level 10、7 のAVDでandroid.view.InflateException。

image 

以下LogCat

06-30 23:32:44.912: E/AndroidRuntime(219): Uncaught handler: thread main exiting due to uncaught exception
06-30 23:32:44.962: E/AndroidRuntime(219): android.view.InflateException: Binary XML file line #17: Error inflating class <unknown>
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.LayoutInflater.createView(LayoutInflater.java:513)
06-30 23:32:44.962: E/AndroidRuntime(219):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.LayoutInflater.inflate(LayoutInflater.java:385)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:332)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.AbsListView.obtainView(AbsListView.java:1274)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.ListView.makeAndAddView(ListView.java:1668)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.ListView.fillDown(ListView.java:637)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.ListView.fillFromTop(ListView.java:694)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.ListView.layoutChildren(ListView.java:1507)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.layout(View.java:6830)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:672)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.layout(View.java:6830)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.layout(View.java:6830)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.layout(View.java:6830)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.layout(View.java:6830)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.layout(View.java:6830)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.os.Looper.loop(Looper.java:123)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.app.ActivityThread.main(ActivityThread.java:4363)
06-30 23:32:44.962: E/AndroidRuntime(219):     at java.lang.reflect.Method.invokeNative(Native Method)
06-30 23:32:44.962: E/AndroidRuntime(219):     at java.lang.reflect.Method.invoke(Method.java:521)
06-30 23:32:44.962: E/AndroidRuntime(219):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-30 23:32:44.962: E/AndroidRuntime(219):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-30 23:32:44.962: E/AndroidRuntime(219):     at dalvik.system.NativeStart.main(Native Method)
06-30 23:32:44.962: E/AndroidRuntime(219): Caused by: java.lang.reflect.InvocationTargetException
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.TextView.<init>(TextView.java:320)
06-30 23:32:44.962: E/AndroidRuntime(219):     at java.lang.reflect.Constructor.constructNative(Native Method)
06-30 23:32:44.962: E/AndroidRuntime(219):     at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.LayoutInflater.createView(LayoutInflater.java:500)
06-30 23:32:44.962: E/AndroidRuntime(219):     ... 35 more
06-30 23:32:44.962: E/AndroidRuntime(219): Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/abs__ic_ab_back_holo_dark.png from drawable resource ID #0x0
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.content.res.Resources.loadDrawable(Resources.java:1710)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.view.View.<init>(View.java:1850)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.widget.TextView.<init>(TextView.java:326)
06-30 23:32:44.962: E/AndroidRuntime(219):     ... 39 more
06-30 23:32:44.962: E/AndroidRuntime(219): Caused by: java.io.FileNotFoundException: res/drawable-hdpi/abs__ic_ab_back_holo_dark.png
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.content.res.AssetManager.openNonAssetNative(Native Method)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.content.res.AssetManager.openNonAsset(AssetManager.java:390)
06-30 23:32:44.962: E/AndroidRuntime(219):     at android.content.res.Resources.loadDrawable(Resources.java:1702)
06-30 23:32:44.962: E/AndroidRuntime(219):     ... 42 more

2013年3月3日日曜日

SQLiteでALTER RENAMEしたときのINDEX動作確認

先日「あにすと」のアプデして失敗したので、そのメモです。

■失敗内容

前回の記事で、DBのマイグレーションだーってことで、

SQLiteOpenHelper でテーブルカラム変更時にデータを引き継ぐ
http://www.ecoop.net/memo/archives/2011-01-28-1.html

を参考に元テーブル名を変更後、新規テーブルを作成してINSERTしなおすという対応したのですが。
実は、当該テーブルはKEYこそ変わらないものの、UNIQUE INDEXを設定していてその考慮が漏れてました。

簡単に絵にするとこんな感じ。

image

まぁ、マイグレーション自体もそうだし、実施後でも2重登録されない確認テストコード書いておけばよかったろって話に尽きます。
この状態でTABLE BにINSERTすると、ちゃんとUNIQUE INDEX効くのですよね。
いや、もちろんRENAME+新テーブル作成したら前のINDEXがそのまま利用できると思っていたわけじゃないですが。

■というわけで。。

今リリース中の「あにすと」でストリームログ→ストックログへコピーを繰り返すと、その回数分ツイートが増えていきます。
1800件あるストリームログだと2回で3600件になります。お得ですね。てへぺろ(・ω<)

■あと

動作確認のために簡単なプロジェクト作って登録しておきました。

Tips04 SQLiteでTABLE RENAME時のINDEXとON CONFLICTの動作確認
https://github.com/miquniqu/AndroidTips/tree/master/Tips04

device-2013-03-03-164933

参考までにどうぞ。

2013年2月24日日曜日

「あにすと」の更新しました。(主にTwitter API v1.1対応)

いつもは更新のたびにブログ書いたりしませんが、TwitterAPI v1.1対応するにあたり参考にした情報とかあったのでまとめておきます。

■ダウンロード先

肝心のダウンロード先はココ!

あにすと - アニメ番組表&実況ストリーミング
https://play.google.com/store/apps/details?id=com.miquniqu.animestreamfree

■参考にした情報一覧

今回の変更にあたり、各ライブラリを利用、情報を参考にしました。

これがないと始まらない。Twitter4Jのライブラリ
http://twitter4j.org/ja/index.html

悪m、必ず目を通さないとなTwitter本家のDeveloper Display Requirements
https://dev.twitter.com/terms/display-requirements

とその日本語訳に取り組んでる方々
Developer Display Requirementsを日本語訳してみた
http://abcang.hotcom-web.com/wordpress/?p=123
TwitterAPI/v1.1
http://www.srcw.net/wiki/index.php?TwitterAPI%2Fv1.1

birdロゴの配布元。Twitterの商標およびコンテンツの表示ポリシー
https://twitter.com/logo

以下、ツイート表示方法の参考

レイアウトXMLの参考に、

Android再入門 - Twitterクライアントを作ってみよう - 目次
http://qiita.com/items/70689560618f8e67e726
※の、タイムラインを表示のあたり
※「Android Smart Image View」のライブラリは便利そうだなと思ったけど、諸事情で使ってません。

デザイナーがコードから読み解く、Androidアプリのデザインの幅を広げるコツとTips
http://www.ladybeetle-design.com/androidappdesigns/
※第1回と第2回のあたり

イメージ画像の角丸画像化に

Androidでリソースの画像を角丸に変換するやり方メモ
http://d.hatena.ne.jp/lagos_on/20100709/1278695834

あとは、SQLiteの簡単なマイグレーション方法。

SQLiteOpenHelper でテーブルカラム変更時にデータを引き継ぐ
http://www.ecoop.net/memo/archives/2011-01-28-1.html

■今後の対応

個別機能としては欲しいものはそろった気がしているので、あとは見た目、設定項目、安定動作(スクラッチでテストも考慮して作り直したほうがいいような、、、)てあたりに手をつけていきます。
そのあたりでバージョン1.0?

そこから先は無償じゃなくなるかもなーとか。手法は未定ですががが。
今の機能でアクティブ1000超え程度のアプリに広告入れてもなぁとは思うわけで、そういう意味では本当に自分の欲しいものを実装してる現状です。

2013年1月9日水曜日

もくもくAWS:AWS SDK for Androidを触ってみた(IdentityTVM編)

サンプル触ってブログ書くだけの仕事最終回。
IdentityTVMを利用したAWSアクセスデモアプリを触ってみます。

■参考にするスライドとか記事とか

作業手順は前回と同じですが、一応貼り付けておきます。

AWS SDK for Android and iOS
http://www.slideshare.net/AmazonWebServicesJapan/aws-sdk-for-android-and-ios

@ITスマホ×クラウド連載 第2回 AWS×Android:補足記事(2)Token Vending MachineとSecurity Token Service
http://dev.classmethod.jp/cloud/atmarkit_smartphone_cloud_02_supplement_02/

■IdentityTVMの公開サイト

以下のサイトでIdentityTVMとその設定方法が記載されているのでこのとおり進めます。

Token Vending Machine for Identity Registration - Sample Java Web Application
http://aws.amazon.com/code/7351543942956566

■TVMの用意

とにかく記事どおり、進めていく。

・TVM ZIPファイルのダウンロード
・TVM用のIAMユーザーを作成する
・AWS Elastic Beanstalkアプリケーションの作成
・Configureの設定
AnonymousTVMと違うのがここです。
PARAM1にさっき作成したアプリケーション名を設定します。
(※追記:と思ったけど、TVM側とAndroidアプリ側のアプリケーション名があっていればいいだけかも。)

image

・TVM Androidデモアプリケーションを実行する
ここも、AnonymousTVMとは異なり、アプリケーション名をAwsCredentials.propertiesに定義します。

  1: 
  2: # This is the App Name you may have provided in the AWS Elastic Beanstalk 
  3: # configuration.  It was the value provided for PARAM1.  If no value was 
  4: # provided it should be defaulted to "MyMobileAppName".
  5: appName=IdentityTVM
  6: 
  7: 

起動した画面が以下です。


起動~ブラウザー表示まで。


device-2013-01-09-230958device-2013-01-09-231044device-2013-01-09-231107


ユーザ登録~成功まで。


device-2013-01-09-231126device-2013-01-09-231236device-2013-01-09-231256


再度起動~再度ログイン操作まで


device-2013-01-09-230958device-2013-01-09-231101device-2013-01-09-231343


ログイン後、DB表示まで


device-2013-01-09-231409device-2013-01-09-231438


で、ユーザ登録されたSimpleDBのデータがこれ。


image


とりあえず動作確認完了です。


■とりあえずまとめ


これで、とりあえずはAndroidアプリからユーザ登録画面をブラウザ表示して、登録し終わったらそのユーザで認証できる仕組みの確認ができました。888.
実際アプリに使うには、SSLの設定、ユーザID衝突時の仕組みやら、まぁあれこれやることありそうですが。おいおいやっていきます。


Twitter認証連携で簡単にできないかなー。
メアドとか管理したくないんだよなぁ。

もくもくAWS:AWS SDK for Androidを触ってみた(AnonymousTVM編)

前回に引き続きのAWSです。
今回はAnonymousTVMを利用したサンプルデモアプリの動作確認。
前回まではアプリ内にキーを埋め込んでてアレだなーといった感じでしたが、

■参考にするスライドとか記事とか

イカでげそ。

AWS SDK for Android and iOS
http://www.slideshare.net/AmazonWebServicesJapan/aws-sdk-for-android-and-ios

@ITスマホ×クラウド連載 第2回 AWS×Android:補足記事(2)Token Vending MachineとSecurity Token Service
http://dev.classmethod.jp/cloud/atmarkit_smartphone_cloud_02_supplement_02/

二つ目の記事はまさにそのままの手順で実行しているので、基本このとおり確認します。

■TVMの用意

とにかく記事どおり、進めていく。

・TVM ZIPファイルのダウンロード
・TVM用のIAMユーザーを作成する
・AWS Elastic Beanstalkアプリケーションの作成

AWS Management Consoleを開き、(一番左の)Elastic Beanstalkタブを開く。
「Launch Application」ボタンをクリックする。すでにBeanstalkアプリがある場合は、右上の「Create New Application」ボタンで開始する。

とあるけど、刷新されたのかそんな画面はない。

image

一番右のCustomizeを選択して「Start」を押す。
あとはそのまま進める。

この際、「Environment URL」を「http://xxx-xxxxtvm.elasticbeanstalk.com」といった形式にしたら「Response contains invalid JSON」が発生して作成できなかった。長すぎるか、ハイフンが悪いのかなということで短め・ハイフンなしにしたところ通りました。真相は不明ですが。誰かおせーて?

image

この後、「Environment URL」にアクセスしたらこうなった。

image

「SSL」はおいといて、「is not properly configured」?

この文字列を吐き出しているJSPでは、

  1: 		<% if( Utilities.isEmpty(Configuration.AWS_ACCESS_KEY_ID) || Utilities.isEmpty(Configuration.AWS_SECRET_KEY) ) {%>
  2: 		<p class="warning">Warning: Your Token Vending Machine is not properly configured.</p>
  3: 		<%} %>
  4: 

となっていて、判定値であるConfigurationクラスは

  1: 	/**
  2: 	 * The AWS Access Key Id for the AWS account from which to generate sessions.
  3: 	 */
  4: 	public static final String AWS_ACCESS_KEY_ID = System.getProperty( "AWS_ACCESS_KEY_ID" );
  5: 	
  6: 	/**
  7: 	 * The AWS Secret Key for the AWS account from which to generate sessions.
  8: 	 */
  9: 	public static final String AWS_SECRET_KEY = System.getProperty( "AWS_SECRET_KEY" );
 10: 

となっていた。
取得できてないのはわかるけど、どこで設定するんだーとTVMをDownloadしたサイトみてたらちゃんとかいてあった。(よく読め。



Token Vending Machine for Anonymous Registration - Sample Java Web Application
http://aws.amazon.com/code/8872061742402990
「Configure the TVM for your application」のあたり


 


image


できた!


・TVM Androidデモアプリケーションを実行する


device-2013-01-09-043213


登録されたデバイス情報


image






動いたっぽいですね。


■とりあえずのまとめ


サンプル実行しただけですが、SSL周りほったらかしですが。
これでようやくアプリに認証キーを保管せずにアクセスできるようになりました。
やったー。次は念願のIdentityTVMです。

もうちょっとだけ続くんじゃよ。

2013年1月6日日曜日

もくもくAWS:AWS SDK for Androidを触ってみた(AWSAndroidDemo編)

前回に引き続きのAWSです。
今回は、記事で紹介されていたTVMを使わない各種DBアクセスのデモ版であるAWSAndroidDemoの確認。

もくもくAWS:AWS SDK for Androidを触ってみた(SimpleDB編)
http://miquniqu.blogspot.jp/2013/01/awsaws-sdk-for-androidsimpledb.html

 

■なにするの?

前回、以下の記事を参考にしましたが、実行したプロジェクトはSimpleDB単体のデモアプリでした。

スマホ×クラウドなアプリの新しい開発スタイル
http://www.atmarkit.co.jp/fsmart/articles/smaphocloud02/01.html

今回はAWSAndroidDemoを触ってみます。

 

■AWSAndroidDemoをeclipseに設定

SDKをDLして解凍したフォルダ内の「aws-android-sdk-1.4.4\samples」にある以下のプロジェクトをeclipseで開きます。

・S3_SimpleDB_SNS_SQS_Demo
This sample demonstrates how Android can interact with Amazon AWS.
→AWSを利用したSNSデモサンプル(旧AWSAndroidDemo?)

■ソース修正箇所

記事やReadMeに書いてますが、AwsCredentials.propertiesに

  1: # Fill in your AWS Access Key ID and Secret Access Key
  2: # http://aws.amazon.com/security-credentials
  3: 
  4: #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  5: # This sample App is for demonstration purposes only.
  6: # It is not secure to embed your credentials into source code.
  7: # Please read the following article for getting credentials
  8: # to devices securely.
  9: # http://aws.amazon.com/articles/Mobile/4611615499399490
 10: #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 11: 
 12: ACCESS_KEY_ID=CHANGE ME
 13: SECRET_KEY=CHANGE ME
 14: 
 15: 

とあるので、「CHANGE ME」とある箇所を取得しておいたアクセスキーに変更します。


あと、必要に応じてリージョンを変えておきます。
都合のいいことにAmazonClientManager.javaのクラスでまとめて処理を行っているのでなるべく近いリージョン(東京)にしときます。
各種サービスのリージョンはココで確認。



Regions and Endpoints
http://docs.amazonwebservices.com/general/latest/gr/rande.html


AmazonClientManager.javaの修正箇所

  1: public class AmazonClientManager {
  2:     private static final String LOG_TAG = "AmazonClientManager";
  3: 
  4:     private AmazonS3Client s3Client = null;
  5:     private AmazonSQSClient sqsClient = null;
  6:     private AmazonSimpleDBClient sdbClient = null;
  7:     private AmazonSNSClient snsClient = null;
  8:     
  9:     public AmazonClientManager() {
 10:     }
 11: 
 12: ~
 13: 
 14:     public void validateCredentials() {
 15:         if ( s3Client == null || sqsClient == null || sdbClient == null || snsClient == null ) {        
 16:             Log.i( LOG_TAG, "Creating New Clients." );
 17:         
 18:             AWSCredentials credentials = new BasicAWSCredentials( PropertyLoader.getInstance().getAccessKey(), PropertyLoader.getInstance().getSecretKey() );
 19: 		    s3Client = new AmazonS3Client(credentials);
 20: 			s3Client.setEndpoint("s3-ap-northeast-1.amazonaws.com");
 21: 			sqsClient = new AmazonSQSClient(credentials);
 22: 			sqsClient.setEndpoint("sqs.ap-northeast-1.amazonaws.com");
 23: 			sdbClient = new AmazonSimpleDBClient(credentials);
 24: 			sdbClient.setEndpoint("sdb.ap-northeast-1.amazonaws.com");
 25: 			snsClient = new AmazonSNSClient(credentials);
 26: 			snsClient.setEndpoint("sns.ap-northeast-1.amazonaws.com");
 27:         }
 28:     }
 29:     
 30:     public void clearClients() {
 31:         s3Client = null;
 32:         sqsClient = null;
 33:         sdbClient = null;
 34:         snsClient = null;    
 35:     }
 36: }
 37: 

 

■ビルド、起動、操作


これもReadMeにあるとおり、CleanなりBuild Allしてから実行します。


device-2013-01-06-223834


起動しましたね。
あとは@ITの記事通りやっていけばなんとなくわかります。


device-2013-01-06-230939device-2013-01-06-231010


以下の画像はAWS Management ConsoleのS3管理画面


image


■AWS Management Consoleのショートカット機能と、各種リソースの削除


画面上部にあるナビゲーションメニュー。Editを押すと対象となるサービス一覧が表示されるので、よく使う機能をドラッグするとショートカットが配置できます。


image


その他はまぁ、見たまま触ってみてということで。
大体、項目を選んで「~ Action」みたいなメニューがあったら項目の削除機能がでてくるので削除しときましょう。
残ってると課金されるようなので。


■まとめ


SimpleDB版と大差なかったです。
次はAnonymousTVMあたりやります。

もくもくAWS:AWS SDK for Androidを触ってみた(SimpleDB編)

せっかくの冬季休みですが、紅白でモモクロ見たり(タカシーっ)、正月空けてドリームマッチ見たり(スギちゃんひどかった)、huluでプリズンブレイク延々みたり(シーズン1でやめとけばよかったのでは)、MHFで剛チケ・HC素材救済クエストしたり(桃と黒紫ってクエストは運営にモモクロ好きでもいるんですかね)とまぁ無駄に過ごしておりました。
で、わざわざ書くほどの内容でもないですが、冬休み中にAWS触るぞと言った手前、何かしとかないとなって内容が以下になります。

■AWS SDKとは?

とりあえず以下のスライドがあるのでそれで確認する。

AWS meets Android - "AWS SDK for Android"で開発を楽にしよう!
http://www.slideshare.net/kentamagawa/aws-meets-android-aws-sdk-for-android

AWS SDK for Android and iOS
http://www.slideshare.net/AmazonWebServicesJapan/aws-sdk-for-android-and-ios

※最終的には2番目のスライドにあるTVMがらみをやりたい。

■どっからはじめるか

とりあえず目に付いた

スマホ×クラウドなアプリの新しい開発スタイル
http://www.atmarkit.co.jp/fsmart/articles/smaphocloud02/01.html

のとおり進めていきます。
ただ、この記事(2012年2月)から1年近くたってるせいかちょいちょい詰まったところもあるので、そのあたりを書いていきます。

■AWSアカウント作成

記事の中に、AWSの作成手順があるので記載どおり作成します。
といっても、公式に手順があるのでそっちを見たほうがいいかもしれません。

アカウント作成の流れ
http://aws.amazon.com/jp/register-flow/

氏名、住所記載必要、電話でのやり取りが必要(機械音声)、クレカ登録が必要なのでそのあたり注意。

サンプルの動作確認用に、アクセスキーIDと、シークレットアクセスキーを入手。

■AWS SDK for Androidのダウンロード、内容確認

AWS SDK for Androidが公開されているので入手します。
ファイルがaws-android-sdk-1.4.4.zipなので現在のバージョンは1.4.4なのですかね。

AWS SDK for Android
http://aws.amazon.com/jp/sdkforandroid/

解凍したフォルダ内の「aws-android-sdk-1.4.4\samples」を開くと以下のようになってます。

image

見たとおり、記事にあったAWSAndroidDemoなんつうプロジェクトがないですね。
各プロジェクトにReadmeファイルが入っていて、簡単な説明があったので抜き出してみます。

・DynamoDB_UserPreference
This sample demonstrates how Android can interact with Amazon DynamoDB to store user preferences. For a detailed description of the code, open and read the UserPreference.html file.
→ユーザー設定情報をDynamoDBに登録するサンプル

・DynamoDBMapper_UserPreference
This sample demonstrates how Android can interact with Amazon DynamoDB to store user preferences. For a detailed description of the code, open and read the UserPreference.html file.
→ユーザー設定情報をDynamoDBに登録するサンプル(マッピング版?)

・S3_SimpleDB_SNS_SQS_Demo
This sample demonstrates how Android can interact with Amazon AWS.
→AWSを利用したSNSデモサンプル(旧AWSAndroidDemo?)

・S3_SimpleDB_SNS_SQS_DemoTVM
This sample demonstrates interaction with the AnonymousTVM.  It is assumed that you were able to
previously run the AWSAndroidDemo sample.  Also, you need to be running an AnonymousTVM which this
sample App will connect to. 
→AWSを利用したSNSデモサンプル、AnonymousTVM版

・S3_SimpleDB_SNS_SQS_DemoTVMIdentity
This sample demonstrates interaction with the IdentityTVM.  The IdentityTVM requires the user to register with the
App by first connecting to an external website and provide a username and password.  The username and username will
then be required to log into the sample App.  In this sample the registration website is a specific page on the
IdentityTVM. 
→AWSを利用したSNSデモサンプル、IdentityTVM版(本命)

・S3_Uploader
This sample demonstrates how Android can interact with Amazon S3.  For a detailed description of the code, open and read the S3Uploader.html file.
→Amazon S3へのアップローダデモサンプル

・SES_FeedbackForm
This sample demonstrates how Android can interact with Amazon SES to record user feedback.  For a detailed description of the code, open and read the FeedbackForm.html file.
→ユーザフィードバックデモサンプル

・SimpleDB_HighScores
This sample demonstrates how Android can interact with Amazon SimpleDB to store a high score list.  For a detailed description of the code, open and read the HighScores.html file.
→SimpleDBを利用したハイスコアリスト管理デモサンプル

・SNS_SQS_MessageBoard
This sample demonstrates how Android can interact with Amazon SNS and Amazon SQS to create a message board.  For a detailed description of the code, open and read the MessageBoard.html file.
→Amazon SNSとAmazon SQSを利用したメッセージボードデモサンプル

どうもS3_SimpleDB_SNS_SQS_DemoTVMが以前のAWSAndroidDemoぽいのですが、SimpleDBが簡単そうかな。

■SimpleDBってどんなの

公式のドキュメント読んどけって話ですが。

Amazon SimpleDB(ベータ版)
http://aws.amazon.com/jp/simpledb/

SimpleDBで検索するとそれっぽい記事があったのでざっと読む。

SimpleDBを使ってみました
http://blog.serverworks.co.jp/tech/2012/03/01/simpledb/

AWS SDK for JavaでAmazon SimpleDBを使う
http://blog.flect.co.jp/cto/2010/12/aws-sdk-for-jav.html

Amazon SimpleDBについて調べたことをまとめました
http://blog.flect.co.jp/cto/2010/11/amazon-simpledb.html

Amazon Web Services 1ヶ月導入記 part 1 データベース編
http://tech.furyu.jp/blog/?p=188

Amazon Web Services 1ヶ月導入記 part 2 アーキテクチャ設計編
http://tech.furyu.jp/blog/?p=190

Amazon Web Services 1ヶ月導入記 part 3 SimpleDBの特徴と制限
http://tech.furyu.jp/blog/?p=516

Amazon Web Services 1ヶ月導入記 part 4 SimpleDBの制限を回避する
http://tech.furyu.jp/blog/?p=661

とか。

■サンプルプロジェクトをビルド

てことで、一番簡単そうなSimpleDB_HighScoresプロジェクトを動かしてみます。

EclipseのFile>New>ProjectでAndroid>Android Project From Existing Code
とかから取り込みます。

※関係ないかもですが、AWS関係のプロジェクトを投入したらeclipseのメモリがたらないよエラーだらけになったので、eclipse.iniのメモリ設定を変更しました。

■ソース修正箇所

ReadMeに書いてありますが、Constants.javaに

  1: public class Constants {
  2:     //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  3:     // This sample App is for demonstration purposes only.
  4:     // It is not secure to embed your credentials into source code.
  5:     // Please read the following article for getting credentials
  6:     // to devices securely.
  7:     // http://aws.amazon.com/articles/Mobile/4611615499399490
  8:     //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  9: 	public static final String ACCESS_KEY_ID = "CHANGE ME";
 10: 	public static final String SECRET_KEY = "CHANGE ME";
 11: 

とあるので、「CHANGE ME」とある箇所を取得しておいたアクセスキーに変更します。


■ビルド、起動、操作


これもReadMeにあるとおり、CleanなりBuild Allしてから実行します。


device-2013-01-06-011926


起動できました。
上のメニューからざっくりと説明すると、


Populate High Score List
→Domain作成して、サンプルItemを10件登録


Add Single Score
→任意のItemを登録


View Scores
→登録済みデータの表示(Sort指定有無)


Clear High Score List
→Domain削除


Domain作ってないとエラーになるので、一番上から操作するといいです。


device-2013-01-06-021149


上の画像は登録した結果を表示してみたところですが、簡単にクラウド経由で登録した情報が表示できたりと(アカウント管理をはしょってるとはいえ)こんなに簡単にできるんだーって感じですね。


■リソースどうなってんの?


記事の最後に、作成したリソースは削除しないと課金されるぞなってあったので、あわあわしてAWS Management Consoleを確認しましたが、どうもSimpleDBは対応してないらしい。ベータだから?



@ITスマホ×クラウド連載 第2回 AWS×Android:補足記事(1)S3、SimpleDBを試す
http://dev.classmethod.jp/cloud/atmarkit_smartphone_cloud_02_supplement/


そしたら補足記事があって、アクセス用のClientが提供されてるみたい。(非公式


無料だしChromeアプリだしってことで、SdbNavigatorを使ってみる。
アクセスキーとシークレットキー入力するのは仕方ないよなーと思いつつ、入力。
リージョンはデフォルトがUS-East見たいです。


image


それぽいのが登録されてましたね。
左のメニューからドメイン削除すれば無かったことにしてくれるのかなー。(なぞ


■それはそれとして重すぎる


目測で1アクセスに4秒ぐらいかかってるけどなんなの?っておもったので、簡単に計測してみました。


<リージョン:デフォルト(US-East)の場合:3G接続>
ドメイン作成=8697ミリ秒
アイテム10件作成=16337ミリ秒


何回かやってみたけど、ドメイン作成が6秒~8秒、アイテム10件作成(1件ずつループ)で10秒~20秒ぐらいでした。


これは遅い。ま、デフォルトがUSじゃしょうがないよなってことで、東京指定にしてみる。



Regions and Endpoints
http://docs.amazonwebservices.com/general/latest/gr/rande.html


上記に、各種Endpointが乗ってる。


image


SimpleDB、東京リージョンのEndpointがわかった。(sdb.ap-northeast-1.amazonaws.com)
ので、HighScoreList.javaを以下のとおり修正。

  1: 
  2: 	public HighScoreList(int sortMethod) {
  3: 		// Initial the SimpleDB Client.
  4: 		AWSCredentials credentials = new BasicAWSCredentials(Constants.ACCESS_KEY_ID, Constants.SECRET_KEY);
  5: 		this.sdbClient = new AmazonSimpleDBClient(credentials);
  6: 		this.sdbClient.setEndpoint("https://sdb.ap-northeast-1.amazonaws.com");
  7: 		this.nextToken = null;
  8: 		this.sortMethod = sortMethod;
  9: 		this.count = -1;
 10: 	}
 11: 

<リージョン:Asia Pacific (Tokyo) Region の場合:3G接続>


ドメイン作成=2037ミリ秒
アイテム10件作成=7308ミリ秒


だいぶ早くなりました。(遅い気もするけど。)
何回かやった結果は、ドメイン作成が1秒後半~2秒前半、アイテム10件作成(1件ずつループ)で5秒~10秒ぐらいでした。
あ、3G接続だからかな。ってことで、お次はWi-Fi


<リージョン:Asia Pacific (Tokyo) Region の場合:Wi-Fi接続>


ドメイン作成=1461ミリ秒
アイテム10件作成=3068ミリ秒


このあたりが限界っぽいですね。


■とりあえずまとめ


本来の目的(IdentityTVMのあたり?)には程遠いですが、触りとして面白かったです。
しかし、簡易データの登録でWi-Fiでも1件0.3秒ぐらいかかってるのでとにかくバックグラウンド処理であれこれするんでしょうねーって感触でした。