2011年6月16日木曜日

Androidアプリのテスト公開時にベーシック認証をかける(失敗)

また失敗シリーズですが、
EC2に立てたインスタンスにアパッチを入れて、ベーシック認証をかけた上で
アプリをテスト公開しようとしました。

ベーシック認証の設定についてはこのあたりを参考に設定しました

http://f29.aaa.livedoor.jp/~yamakan/index.php?LinuxSettingMemo%2FDebian%B7%CF%2FApache2.0.54

http://d.hatena.ne.jp/Fiore/20080307/1204917204

ただし、androidは認証用のプロセスとダウンロードのプロセスは分かれていて、認証情報を引き継いでいないらしくベーシック認証がことごとく失敗しました。
中には下記のような方法で動的に設定変更をしている方もいらっしゃいました。

http://onno.jp/dev/2011/01/android-1.html

2011年6月3日金曜日

WEB SOCKET勉強会Ustream視聴

5/28に行われていたWEB SOCKETの勉強会のUstreamを視聴しました。
詳細はこちら

WEB SOCKETとはそもそも何か?というところからWEB SOCKETとKINNECTをつなげてアプリケーションを作ったりかなり面白い内容でした。
元のサイトにも資料のリンクはありますが、以下に内容とリンクを記載します。

10:20~11:10(質問10分含む)
Kuruma @Kuruma
「WebSocketを見てみよう」(5/31資料更新)
WebSocketは,既存のWebとの親和性を強く志向したプロトコルです.その概要を中心に,第7版をベースとした通信内容を紹介します。

11:20~12:10(質問10分)
遠藤 隆尚(MiCHiLU.com) @MiCHiLU
「WebSocket事例紹介」(5/31資料更新)
どんなサービス?どんなアーキテクチャ?でWebSocketプロトコルが使われているのか、いくつかの事例を基に解説していきます。

↑に出てくるKaazingですが、XMPPなどのメッセージプロトコルをWEBSOCKET上に乗っけて配信してくれるサービスのようです。上限のメッセージ数が結構厳しい感じですが面白そう。
また、Pusherの資料もこちらです
また、Jettyで始めるWEBSOCKET超入門はこちら

13:10~14:00(質問10分)
小保田 規生 @nori0428
「NonBlock Socket and Asynchronous I/O」(6/2更新)
WebSocketを用いたアプリケーションと連動するサーバサイドアプリケーションでは最近、 nonblock socketとevent machineを用いたフレームワークが多く用いられますが、その基本的な動作の仕組みと、 サーバサイドアプリケーションを作成する際の注意点などについて簡単に。

↑このセッションの中で、言及していたnonblock IOの資料がこちらです。
shutdown -r now http://d.hatena.ne.jp/forest1040/
Node.js入門

14:10~14:50(質問10分)
菅 祐貴(さくらインターネット研究所) @kanreisa
「さくらのVPSでnode.jsを使ってみよう」(仮)(6/2更新)
さくらのVPSを使用した簡単なnode.jsのインストール方法、node.js+socket.ioで作られたWebアプリ ケーションのデモをご紹介いたします。

ここはUSTREAMで配信されなかった時間帯があり、気になりましたw

15:00~15:50(質問10分)
雪岡 重信 @ndruger
「ブラウザのハードウェア対応の未来を探る」(6/2更新)
Kinect / Wiiリモコン / HMDなどの各種ハードウェアの入力をNode.jsを経由してWebSocketでブラウザに渡し、それらの 入力とWebGLを使ったデモを行うことで、今後ブラウザが各種ハードウェアに対応していった場合の未来の可能性を話します。

16:00~16:40(質問10分)
かみやん @kamiyam
「Websocket Communication」
クライアント参加型プレゼンをWebSocketを使ってデモしたいと思います。

このプレゼンはプレゼンターがiPhoneでページをめくると、その動作と同期してリアルタイムで資料を見ている人のページもめくれるという非常に興味深いプレゼンでした。当然WEBSOCKETを使っています。今度私も挑戦してみたいです。

16:40~17:20(質問10分)
kanasan @kanasan 
「WebSocketでデバイス間連携」(5/31更新)
WebSocketを使ったデバイス間で連携するアプリケーションを実例にし、WebSocket、特にJettyをアプリで使う利点について紹介した いと思います。

また、Androidで使う場合が気になったので調べてみると既に挑戦された方がいらっしゃいました。
Androidからnode.jsとWebSocket通信をする実装


今はAndroid-XMPPの実装やってますが、こっちもやりたいな。

2011年4月12日火曜日

AWS EC2を使ったクラウドデスクトップ挑戦

先月にAWS東京リージョンが増え,遅延も少ないだろうということでクラウドデスクトップに挑戦してみました。

参考にしたのはこちらのエントリー
http://d.hatena.ne.jp/j3tm0t0/20110302/1299076190

  • インスタンスの立ち上げ

コミュニティのAMIがいっぱいありすぎて、どれ選んでいいかわからなかったけどとりあえず先人の真似をしてUBUNTUのAMI(ami-460fa447)を選択しました。当然タダのmicroインスタンスで…
その後のセキュリティーグループの設定やSSHでの接続とかはこちらのエントリーがわかりやすいかと思います。
http://www.studio-fix.com/blog/kaoru/2009/04/03/post156/


ちなみにUBUNTUログイン時はAWSのInstance actionのconnectをそのままコピペではなく、ユーザをubuntuに変更します。


ssh -i 〜 root@ ~ を、
ssh -i 〜 ubuntu@ 〜
に書き換えるということです。


  • リモートデスクトップ用ソフトのインストール
起動後は# apt-get install ubuntu-desktop をしてデスクトップ環境を入れます。

さらに、手持ちのノートPCやらデスクトップPCからリモート接続をするためにFreenxをインストールします。
以下のページが参考になります。
https://help.ubuntu.com/community/FreeNX

Freenxインストールの日本語のエントリとしては以下があります、
http://gihyo.jp/admin/serial/01/ubuntu-recipe/0098
ただ、こちらのサイトは10.10のリリース前なので記載してありませんが、今回は10.10(maverick)を使うためPPAを追加した後に以下を行う必要があります。

2.If you're using Maverick, run
sudo sed -i 's/maverick/lucid/g' /etc/apt/sources.list.d/freenx-team-ppa-maverick.list

  • 認証の設定
サーバ、クライアントでインストール後にいよいよ接続ですが、
そのままではauthentication failedになります。
freenxは1.ユーザnxでSSH接続(公開鍵認証),2.自分のユーザでlocalhostにSSH接続(パスワード認証)
の二段階で認証を行うらしく、デフォルトの状態ではパスワード認証がnoになっているのでsshd_configファイルをいじる必要があります。以下でlocalhostのみパスワード認証を許可しています。

/etc/ssh/sshd_config
 50 PasswordAuthentication no
... 
 83 Match Address 127.0.*.*
 84   PasswordAuthentication yes
 85 Match Host localhost
 86   PasswordAuthentication yes

パスワード設定後にリスタートをしてから、freenxクライアントで接続してください。

詳細はこちらのエントリーで、
http://d.hatena.ne.jp/takuya_1st/20091229/1262115454


ここまで設定してようやくクラウドリモートデスクトップを使えるようになります!
ブロードバンド環境であれば遅延も少なく結構快適に使えました。
AWSのmicroインスタンスは一年間タダなのでちょっと試してみてはいかがでしょうか?
私はこの後にXMPPサーバのOPENFIREを入れたいと思います。
(管理コンソールが便利なのでデスクトップ環境を使いたかったのです。)

2011年2月28日月曜日

AWS Amazon Linux AMIのメモ

ちょっとはまったのでメモメモ

rootで入れないのでec2-userでログインし、
sudo su -
でパスワードもなくroot権限取得

2011年2月17日木曜日

AndroidでのローカルHTMLファイルの見方


Androidでローカルに入れたHTMLファイルを見たい場合は、
以下をブラウザに入力すると見れる。
content://com.android.htmlfileprovider/sdcard/ファイル名

でもNexus SだとPermissionエラーが出た。
2.3ではできない?

2011年2月10日木曜日

AccountManagerService.addAccount での署名チェック先

さっきの記事の署名チェック箇所における
RegisteredServicesCache.ServiceInfoがどこにあるのか?
それを突き止めるためにさらに調査。

/frameworks/base/core/java/android/content/pm/RegisteredServicesCache.java


コンストラクタにこんなものが、


100         File dataDir = Environment.getDataDirectory();
101         File systemDir = new File(dataDir, "system");
102         File syncDir = new File(systemDir, "registered_services");
103         mPersistentServicesFile = new AtomicFile(new File(syncDir, interfaceName + ".xml"));


怪しいのでRoot化した端末で中を見てみる。

adb shell
su
cd /data/system/registerd_services
cat android.accounts.AccountAuthenticator.xml

こんなん出ました。


<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<services>
<service uid="10041" type="com.android.exchange" />
<service uid="10019" type="com.google" />
</services>


ここに追加すれば独自アカウントも入れられるかな?

あと同じフォルダに、
android.content.SyncAdapter.xml
なるものが、


<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<services>
<service uid="10041" authority="com.android.contacts" accountType="com.android.exchange" />
<service uid="10019" authority="com.android.contacts" accountType="com.google" />
<service uid="10038" authority="gmail-ls" accountType="com.google" />
<service uid="10019" authority="subscribedfeeds" accountType="com.google" />
<service uid="10041" authority="com.android.calendar" accountType="com.android.exchange" />
<service uid="10019" authority="com.android.calendar" accountType="com.google" />
</services>

ここに追加したらどうなるんだろう?同期してくれる?どうやって?

Account Managerを利用したアカウント登録について(失敗)

Account Managerについて調べる中で、
プログラムからアカウントが自動登録できないか挑戦してみました。

http://developer.android.com/reference/android/accounts/AccountManager.html#addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle)

このaddAccountExplicitlyと既存のアカウント、PWがあればいけるか?
と思いManifestにAUTHENTICATE_ACCOUNTSを追加してやってみたのですがSecurity Exception発生。
呼び出し元のアプリのUidが権限ありませんよ、とのこと。
ちなみに今回のアカウントはGoogleアカウント。

ソースをたどるとこんな感じ。
frameworks/base/core/java/android/accounts/AccountManager.java



482     public boolean addAccountExplicitly(Account account, String password, Bundle userdata) {
483         if (account == null) throw new IllegalArgumentException("account is null");
484         try {
485             return mService.addAccount(account, password, userdata);
486         } catch (RemoteException e) {
487             // won't ever happen
488             throw new RuntimeException(e);
489         }
490     }


mServiceはIAccountManagerのインスタンス。

79 public class AccountManagerService
80         extends IAccountManager.Stub
81         implements RegisteredServicesCacheListener<AuthenticatorDescription> {


そして、ソースを追ってAccountManagerServiceへ、


/frameworks/base/core/java/android/accounts/AccountManagerService.java
AddAccountメソッド


387     public boolean addAccount(Account account, String password, Bundle extras) {
388         if (account == null) throw new IllegalArgumentException("account is null");
389         checkAuthenticateAccountsPermission(account);
390
391         // fails if the account already exists
392         long identityToken = clearCallingIdentity();
393         try {
394             return insertAccountIntoDatabase(account, password, extras);
395         } finally {
396             restoreCallingIdentity(identityToken);
397         }
398     }

checkAuthenticateAccountsPermissionメソッド


1882     private void checkAuthenticateAccountsPermission(Account account) {
1883         checkBinderPermission(Manifest.permission.AUTHENTICATE_ACCOUNTS);
1884         checkCallingUidAgainstAuthenticator(account);
1885     }



Manifestのチェックと,Uidのチェック


checkCallingUidAgainstAuthenticatorメソッド

1838     private boolean hasAuthenticatorUid(String accountType, int callingUid) {
1839         for (RegisteredServicesCache.ServiceInfo<AuthenticatorDescription> serviceInfo :
1840                 mAuthenticatorCache.getAllServices()) {
1841             if (serviceInfo.type.type.equals(accountType)) {
1842                 return (serviceInfo.uid == callingUid) ||
1843                         (mContext.getPackageManager().checkSignatures(serviceInfo.uid, callingUid)
1844                                 == PackageManager.SIGNATURE_MATCH);
1845             }
1846         }
1847         return false;


serviceInfoに格納されているuidと呼び出し元のuidが同一かどうかチェックしています。
自家製のアプリではuidが同じではないので、Security Exception発生という流れ。

自前サービスのアカウントならいけるのか?というのは今後の検討。

Android サンプルコード集

Googleが提供しているサンプルコードです。

http://code.google.com/p/apps-for-android/

2008年の時点のものなので、それ以降のOSでは動かない、強制終了されてしまうものもあるかも。

とりあえず、PhotoStreamを使って写真共有アプリを作ってみよう。

2011年2月7日月曜日

Unparsed aapt error(s)

えらいハマった&良く出るエラーなのでメモ

aapt errorが出た場合、
エラーを右クリックで削除して、
プロジェクト→自動ビルドのチェックをオフ→クリーン→プロジェクトのビルド

http://stackoverflow.com/questions/4714711/android-packaging-problem-resources-ap-does-not-exist

これでほぼ直る。

ただ、さっきはこれでも直らなかったので、
ADTアップデートのせいか?とか、
Eclipseを入れなおしたら?とか奮闘しているうちに、
こないだAPKTOOL導入のためにaapt.exeを入れ替えてたことを思い出し、
前のaapt.exeに変えたらあっさり直った。

なんか悔しい。