また失敗シリーズですが、
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月16日木曜日
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の実装やってますが、こっちもやりたいな。
詳細はこちら
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@ 〜
に書き換えるということです。
さらに、手持ちのノート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を追加した後に以下を行う必要があります。
そのままではauthentication failedになります。
freenxは1.ユーザnxでSSH接続(公開鍵認証),2.自分のユーザでlocalhostにSSH接続(パスワード認証)
の二段階で認証を行うらしく、デフォルトの状態ではパスワード認証がnoになっているのでsshd_configファイルをいじる必要があります。以下でlocalhostのみパスワード認証を許可しています。
パスワード設定後にリスタートをしてから、freenxクライアントで接続してください。
詳細はこちらのエントリーで、
http://d.hatena.ne.jp/takuya_1st/20091229/1262115454
ここまで設定してようやくクラウドリモートデスクトップを使えるようになります!
ブロードバンド環境であれば遅延も少なく結構快適に使えました。
AWSのmicroインスタンスは一年間タダなのでちょっと試してみてはいかがでしょうか?
私はこの後にXMPPサーバのOPENFIREを入れたいと思います。
(管理コンソールが便利なのでデスクトップ環境を使いたかったのです。)
参考にしたのはこちらのエントリー
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@ 〜
に書き換えるということです。
- リモートデスクトップ用ソフトのインストール
さらに、手持ちのノート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日月曜日
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>
ここに追加したらどうなるんだろう?同期してくれる?どうやって?
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> {
/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発生という流れ。
自前サービスのアカウントならいけるのか?というのは今後の検討。
プログラムからアカウントが自動登録できないか挑戦してみました。
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を使って写真共有アプリを作ってみよう。
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に変えたらあっさり直った。
なんか悔しい。
aapt errorが出た場合、
エラーを右クリックで削除して、
プロジェクト→自動ビルドのチェックをオフ→クリーン→プロジェクトのビルド
http://stackoverflow.com/questions/4714711/android-packaging-problem-resources-ap-does-not-exist
これでほぼ直る。
ただ、さっきはこれでも直らなかったので、
ADTアップデートのせいか?とか、
Eclipseを入れなおしたら?とか奮闘しているうちに、
こないだAPKTOOL導入のためにaapt.exeを入れ替えてたことを思い出し、
前のaapt.exeに変えたらあっさり直った。
なんか悔しい。
登録:
投稿 (Atom)