2012年2月アーカイブ

Facebookアプリケーションへの許可を求めるダイアログ

スマホ、ソーシャルメディア... PCやMacを使っていなくてもアプリケーションをインストールすることってどんどん増えてきてますよね。最近Facebook APIを利用したアプリ開発のプラットフォームというか、ライブラリのコードを書いていた関係で色々調べてたんですが、これ、許可したものによっては何でもできちゃうように見えませんか?

最近、Facebookで、

このアプリインストールしたことで、友人に勝手にメッセージ送られてるみたいです。パスワードを抜かれるみたい。このアプリ使ったことある人はパスワードの変更をお勧めします。

とか書いてる人がいてちょっとした拡散騒ぎ? になってたのを見て思ったんですが、パスワード抜けないですよ。パスワード抜かなくても投稿したりメッセージ送れたりするんですよこれ(メッセージ送る方法はちょっと調べきれなかったんですが、チャット利用できるAPIあるみたいだから送れるよきっと)。ウォールへの投稿はできるよね。みんな診断系のゲーム? とかプレゼント応募してシェアとか、普通にやってるじゃん。

中でも"publish_stream"とか"offline_access"とかこのあたりを許可すると...(冒頭の画像ではoffline_accessを求めると「データへのアクセスを常に許可」の欄が出ます)

アプリケーションからコンテンツ、コメント、likeをユーザや友達のstreamに投稿できます。このpermisiionがあれば、offline_accessが無くとも、いつでも好きな時に投稿することが可能です。ただし、Facebookはユーザの関知する形で投稿が行われることを勧めています。

いつでもユーザの代わりに、ユーザから許可されたアクションを行うことができます。デフォルトでは、ユーザが実際にアプリケーションを使っている間にのみリクエストが送られることを保証するため、ほとんどのaccess tokenは短い期間で無効になってしまいます。このpermissionがあると、OAuthで返されるaccess tokenは長い期間有効になります。

アンケートポチった時とかはまだユーザー側が理解できるし何が起こったかをリアルタイムに見てるからいいんですが、要するにこれ許可すると後日、とか自分が何もやってないときに(Facebook利用していないときに)投稿とかメッセージとか要するにアプリの側に権限を渡してしまうってことなんですよね。OAuthはパスワードを必要としないけどアプリケーションがユーザーとして振る舞えるってことです(だから本当に悪質なアプリがあったとして、ユーザーがとるべき行動はパスワード変更ではなく、アプリのアンインストールです)。

Androidのアプリにしても...

ここでAndroidとiOS(iPhoneやiPad)とどちらがいいとか言うつもりはないんですが、iOSのアプリは審査があります。もちろん審査があってもすり抜けてしまうケースもあって、時々プライバシー情報を勝手に送るみたいなアプリがあって問題になったりしてるわけです。Androidのアプリとか、どれだけ気を遣ってユーザーはインストールしているんだろうか? この間もなんか恋人の行動履歴をどうこうってアプリが問題になってましたよね?

これはもう、Linux管理してるくらいの意識がいると思うんですよねスマホにアプリ入れるのって。OSSのソフトウェアを評価したりできるスキル(スキルといってもコードを読めるというレベルではなくて、これ、入れても大丈夫だよなっていう判断ができるスキル)がなければサポート付きのディストリビューション(RedHatとか)入れてアプリはRPMでインストールするだけにする、みたいな考え方しないといけないんじゃないの? と思うのですけど、どうなんでしょう?

ソーシャルメディアのアプリもスマホのアプリでも、個人情報以上のものを委ねるということを知っておいたほうが良いのでは?

アプリをインストールすることで、何を許可しているのか、ってことをもっと意識したほうがいいと思うんですよね。Facebookのプレゼントキャンペーンにしてもメーカー自身が運営してるわけじゃないケースもあります。これ、単に応募時の個人情報を与えているだけじゃなくて、"Facebook上で自分としてふるまう許可"を与えているケースもあるのでね。

7月17日追記:正規表現がおかしかったのと、Referrer→Refererに修正(互換性のためにタグ名は残しています)

こんな連載が始まっちゃったので僕もひとつ(忙しくて中々追いつかんのですが)。

検索エンジンからの流入時に検索ワードを拾ってサイト内検索をリアルタイムに実行する例なんかも面白いのですが、単純に流入元のドメインによって分岐するなんて例も面白いんじゃないかと。Twitterからの流入だったら「フォローしてね」って表示させてみたりFacebookからの流入時に「いいね!」ボタンをわかりやすく配置したり外部サイトからの流入時にサイトの利用規約を表示するとか、まーアイデア次第で。

<MTIfTheHTTPReferrer domain="www.google.com">
www.google.comからの流入
</MTIfTheHTTPReferrer>

<MTIfTheHTTPReferrer domain="google.com" scope="backward">
*google.comからの流入
</MTIfTheHTTPReferrer>

<MTIfTheHTTPReferrer domain="www.google" scope="foward">
www.google* からの流入(www.google.com や www.google.co.jp)
</MTIfTheHTTPReferrer>

<MTIfTheHTTPReferrer domain="google" scope="contains">
googleを含むドメインからの流入
</MTIfTheHTTPReferrer>

<MTIfTheHTTPReferrer scope="empty">
リファラが空の場合
</MTIfTheHTTPReferrer>

プラグインのダウンロード

藤本さんが書かれていたのでDynamicMTMLに絞って初期化の軽量化について書きます。

真新しいMacBook Air(13インチモデル 1.8GHz Intel Core i7 メモリ4GB 1333 MHz DDR3)上のMAMP2.0.5、PHP Version 5.3.6+MySQL5.5.9で計測しました。

計測はDynamicMTML、PowerCMSを突っ込んだ状態でSmart Blogテーマのトプページで計測します。まずは素の状態で計測(単なるPHPファイル)。

...数字に差がない...ときどき0.0001くらいの数値が出ます。ということで仮に0.0001秒としましょう(速いよMBA)。

前提条件

さてここからいよいよ計測していくわけですが、まず、DynamicMTMLはファイルキャッシュのしくみを持っていて、キャッシュが使える状況であればそれを使えということになります(管理画面でチェックボックスにチェック入れるだけです)。今回は当然ですが、それが使えない場合の軽量化、がテーマです。尚、条件付きGETの有効チェックボックスは必要に応じて入れると良いと思います。

条件付きGETってなに?という方はこちらを。

DynamicMTMLの初期化の流れ

DynamicMTML及びMTのダイナミックの初期化の流れを以下におおまかに書きます。

  • mt-config.cgiの設定値などを読み込む
  • ダイナミックパブリッシングのライブラリ(mt/php以下のファイル群)、プラグイン、addons以下のphpライブラリをスキャンする。
  • この時、グローバルモディファイア等を登録する
  • 各プラグインのphpディレクトリ以下の init.foo.php があればこれを実行する。
  • DB接続して、設定値等を読み込み、ブログをロードする
  • ファイルパスからmt_fileinfoレコードを取得して、どのアーカイブかを判断、エントリー等をロードしてコンテクストをセットする
  • テンプレートをビルドする

正確には上記の処理の各所でコールバックが呼ばれ、コールバックプラグインが登録されていればそいつが処理されます。

さて、「ダイナミックパブリッシングのライブラリ(mt/php以下のファイル群)、プラグイン、addons以下のphpライブラリをスキャンする。」ってさりげなく書きましたけど、mt_dir_以下のphp/libディレクト以下のphpファイルいくつありますか? 500以上ありますね。PowerCMSやプラグインやDynamicMTMLも...あわせると1000超えますよね。つまり、初期化の際にこれらすべてスキャンして、init.foo.phpがないか、modifier.foo.phpがないか調べてます。実際は微々たる時間ですけどね。ただ、この辺はeAcceleratorなんかを使うことで多少は改善されます。

また、init.foo.phpの件については、例えば Commercial.pack/php/init.CustomFields.php は何をしているかというと、DBに登録されているカスタムフィールドをロードして、タグ名をsmartyに動的に登録しています(つまりSQLのクエリが投げられてんですね)。カスタムフィールドのタグからの出力をダイナミックに行わない場合、こいつは要らないことになります。他にMultiBlog/php/init.MultiBlog.phpなんかもタグ登録系です。

また「ブログのロード」「mt_fileinfoレコードを取得」ってありますが、例えば携帯、スマホ分岐のみにDynamicMTMLを使っている場合、DB要らないですよね。これ、実はDB接続なしでDynamicMTMLを実行する方法があります。ドキュメントルート以下に生成されている .mtview.phpの先頭付近

    $blog_id      = 1; // 1はブログ/ウェブサイトのID

こいつをコメントアウトすると、DBの初期化をスキップして処理を続行するんですね。

ここら辺から、以下の施策によって初期化の軽量化を図ることにします。

  • eAcceleratorやXcacheを有効にする
  • プラグインの数を減らす
  • DB接続しない

以下、DynamicMTML利用時の各計測結果(10回計測した平均値です)。実際の効果についてはサーバーやDBの状態、運用しているサイトによって違うと思いますし、必要に応じてこういうアプローチがとれる、という程度の参考にしてください。

デフォルトの状態

    0.001767516

※気になるってほどの時間じゃないですけどね...続けます。

Xcacheを有効にした状態で計測

    0.001712704

Xcacheの代わりにeAccelerator(以下、eAccelerator有効で継続)

追記:あまり効果が出ていないように見えるのはSSDのため。HDD環境では高速化が期待できます

    0.001612711

標準以外のプラグインなし

    0.000941825

各プラグインディレクトリ以下のphp/init.foo.phpのみ削除

    0.000869989

プラグイン(addon)なし

    0.000636888

blog_id指定なし

    0.000617242

Facebook

Twitter

このアーカイブについて

このページには、2012年2月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年1月です。

次のアーカイブは2012年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6