Posted by & filed under いろいろ.


最近、「Facebookのことが分からないので教えてください」とよく頼まれます。ごめんなさい、嘘を言いました。よく、は頼まれません。よくある、とか、しばしばある、は実体以上に良く見せようとする時に使う常套句です。気をつけて使おうと思います。

それはともかくとして。

Facebookは確かに難しいです。REST API(名前がRESTですがまったくRESTfulではないWeb API)からGraph APIへの変遷、FBMLからXFBML(参照)への変遷、そしてXFBMLの存在を隠蔽するプラグインへの変遷、更に今をときめくLikeボタンからDislikeボタン(Dislike)への変遷、など諸々まとめて、「Facebook vs. OpenSocial」のお題で社内勉強会をしようと思っています。

しかし内容が多すぎるので、これらの技術の中で基盤となるOAuth 2.0(まだドラフト段階です)を取り出して、先にありえるえりあで文書を公開しようと思っていました。

と思っていたら、@ITでOAuth 2.0の記事を見つけました。通信プロトコルのフロー図も、アスキーアートで説明するつもりでしたが、@ITは綺麗な絵で説明しています。今更劣化版のフロー図を公開するのも気がひけるので、フロー図の説明は@ITの記事に譲ります。代わりに、OAuthまわりのもやもや感を払拭する記事を書きます。

説明の前に公式文書へのリンクを並べておきます。

OAuthまわりで一番(個人的に)困惑するのが次の説明です。

「OAuthは認可のためのプロトコルで認証のためのプロトコルではない」

特にOpenIDとの比較の文脈でこの説明を見ます。

しかし現実を見るとOAuthは事実上認証に使えている気がして困惑します。何が困惑の元なのか、結局実体は何なのかについて説明します。

最初に用語の定義です。認証(authentication)と認可(authorization)のふたつです。教科書的には次の定義です(昔、どこかから引き写した定義ですが、引用元を忘れました)。

認証
身元を判断するために個人やプロセスが提示する資格情報の検証
認可
何かを行う、またはある場所に存在するための権限を個人に与えること

抽象的な定義で分かりにくいので、多少厳密さを犠牲にして具体的に言い換えます。

Webアプリのユーザ認証は事実上ログイン処理のことです。ユーザIDとパスワードを入力してログインします。パスワードはその本人しか知りえない秘密情報です。その本人しか知りえない秘密情報を知っていればその人だ、という理屈です。パスワード以外にも、本人しか知りえない(持ちえない)秘密情報として、生体認証や秘密鍵認証(PKI認証)などもありますが、Webアプリに限ればパスワード認証がデファクト標準です。一般的なWebアプリの場合、ログイン中はセッションIDをクッキーなどで送ることでユーザ認証をします。いわば、セッションIDが一時的な秘密情報の肩代わりをします。

認可は、ログイン後に何ができるかを決めることです。他人の書いた文書を書き換える権限だったり、文書のコメントを削除する権限だったりします。

ここまでが認証と認可の話ですが、ここまでは、あるサービスと利用者の間の1対1の間の話です。

OpenIDやOAuthは違います。OpenIDは「認証伝達プロトコル」であり、OAuthは「認可伝達プロトコル」です。つまりサービスAで認証されたことをサービスBに伝達したり、サービスAで認可されたことをサービスBに伝達するためのプロトコル規格です。これらを「認証プロトコル」や「認可プロトコル」と呼ぶのは混乱の元なのでやめた方がいいと思います。認証プロトコルと呼ぶと、BASIC認証やフォーム認証のように、ユーザIDやパスワードを送信するやりとりを想起する危険があるからです。

OpenIDの話は別の機会に譲ります。OpenID終わったとまで言う人がいますが、これは言い過ぎだと思います。ただこれから書くようにOAuthで事実上の認証伝達ができるとOpenIDの存在価値に疑問符がつくのも事実です。

何を認可されたかの伝達そのものにはたいして意味がありません。OAuthの実体は認可された権限の委譲です。つまりOAuthは「権限委譲プロトコル」と呼ぶ方が適切です。サービスA(Facebookやtwitterを想定してください)で許可された権限を別のサービスBに委譲できます。この時、ユーザとサービスAの間の秘密情報(パスワードやセッションIDのクッキー値)をサービスBに渡しません。秘密情報を渡すことなく、サービスBに権限を委譲する実現方法は@ITの記事のフロー図や規格文書などを見てください。

どことどこの間で権限情報を伝達するかや、そのために事前にどこまで信頼関係を結んでおくか(事前に2者間で秘密情報を共有しておく)、などいくつか権限伝達のフローには派生があります。その辺が今回のOAuthで整理されています。OAuth 2.0を紹介する文書では6通りのフローとして列挙しています。

さて、冒頭の説明「OAuthは認可のためのプロトコルで認証のためのプロトコルではない」に戻ります。

OAuthが権限委譲(認可伝達)プロトコルなのは事実です。認証プロトコルでもないですし認証伝達プロトコルでもありません。しかし、サービスによっては、サービスAが誰々の文書への全権限を与える認可をサービスBに伝えたとしたら、事実上、そのユーザはサービスA上の誰々に他ならないと見なせます。サービスAの部分をFacebookやtwitterに読み替えて、誰々の部分をそれらのサービス上のIDに読み替えると、理解できると思います。Facebook上の誰々、twitterのidが何々の人、という形で認証伝達しています。事実追認の形でこれを「OAuth認証」と呼びます。ただ、これはOAuthの規格の範囲外で、どう利用するかの話です。なぜなら、誰々の文書への全権限を与えたことが誰々に他ならないかはサービス側の都合であって、権限委譲プロトコルのひとつの利用方法に過ぎないからです。

権限委譲プロトコルOAuthで、事実上、認証伝達ができることの説明は終わりです。以下、蛇足。

この手の話をすると、認証伝達は、要はSSO(シングルサインオン)のことですか、とよく聞かれます。ごめんなさい、よくは聞かれません。

これに対しては、強く関連はしても厳密に言えば認証伝達とSSOは別概念です、が回答になります。認証伝達を使いSSOを実現できますが、使わなくても実現できるからです。簡単な例を挙げると、サービスAとサービスBが同じディレクトリサービスを使う場合を考えます。ディレクトリサービスでユーザパスワードを管理して、ふたつのサービスへのログイン処理をなんらかの仕組みで透過に見せられればSSOを実現できます。サービスAで認証されたことをサービスBに伝達する仕組みがなくても透過に見せることは可能です。

同じく、ディレクトリサービスはSSOですか、の質問に対しても、ディレクトリサービスを構成要素としたSSOは実現できるが、使わなくてもSSOは実現できる、が回答になります。


関連文書:

  • 関連文書は見つからんがな

Posted by & filed under 開発.


gevent_request_profilerを試してみました。wsgiアプリケーションのhttpサーバをgeventを使って動かしていると、時々何かがブロックしているかも?って言うときがあります。また、ブロックしなくても、各処理にどれくらいの時間がかかっているのかプロファイルしたいことがよくあります。グリーンスレッドだと、何かが長時間ブロックするすると、他の処理がすべて待たされるので深刻です。普通のプロファイラだと、グリーンスレッドの本当の実行時間を教えてくれません。それをためのプロファイラです。まあ、greenletがどういう風に処理を実行しているのか垣間見れるのも面白いです。

[続きはこちら]


関連文書:

Posted by & filed under 開発.


おーたにさんに何か書けと言われたので何か書いてみます。

よくjavaで「+」つかって文字列結合すると遅いから止めた方がいいよって言われますよね?どんなケースでもまずいんでしょうか?気になったので調べてみました。

こんな感じでいくつか文字列を結合するサンプルを作ってそれをjavapにかけてみます。

javapにかけるとこんな感じの出力になります。全部だすとみづらいので、適当に整形したり抜き出したりしてます。

a, bの場合はよくいわれているように結合のたびにStringBuilderが作られてます。
cの場合のように全部「+」でつなげるだけだと、StringBuilderは一回だけしか作られないです。
dの場合のようにリテラルだけの場合は「+」でつないでも StringBuilder は作られず、そのままリテラルとして埋め込まれているようです。

どんな場合でも新しいStringBuilderが作られるわけじゃないらしいです。

というわけで、「パフォーマンスチューニングだぜ!」とかいってなんでもかんでもStringBuilderにすればいいってわけじゃないんだよってお話でした。

おしまい。


関連文書:

  • 関連文書は見つからんがな

Posted by & filed under いろいろ.


私はよくわからないのですが、アリエルは伝統的に他のサービスを利用して何かをすることが少なかったらしいです。Twitterにアカウントができたのは去年のことでした。「今後はもっとオープンに!」と、おおたにさんに 命令 じゃなくって、お願いされて、Facebookにありえるえりあのファンページを作りました。本当は「ソーシャルネットワーク」という映画の影響らしいです。

ファンページを作ったのですが、Facebookがよくわかりません。でも、上司の命令なのでがんばって作ってみました。岩永さんは自分で、「今日は岩永さんの誕生日らしいです。」と書き込んだりしています。どんだけw。

今後は、ありえるえりあの勉強会の告知もFacebookのファンページからアナウンスするそうです。もし、よかったら、「いいね!」を押してください。


関連文書:

Posted by & filed under 開発.


今年はうさぎ年なので、RabbitMQで遊んでいる今日この頃です。RabbitMQ自体は、クラスタリングに対応していて、クラスタ内でメッセージをルーティングして配信してくれます。ただ、AMQPのプロトコル自体にはクラスタについていの規定はありません。AMQPを利用しているサーバなりクライアントなりが独自に実装すべきもののようです。クライアントの実装としてJavaとPythonでは若干状況は異なる(開発元が違う)のですが、そのメモ。

[続きはこちら]


関連文書:

Posted by & filed under いろいろ.


asahi.comのIPv4アドレス枯渇の記事はなんだか品がありません。

そろそろIPv6バブルが再び来るのでしょうか。

再びと言うけど以前にバブルなんてあったのかと言われそうですが、アリエル的にはありました。マルスケがIPv6対応しているので、2004年ごろ、他にめぼしいIPv6対応ソフトもなかったことから、IPv6関連の集まりに色々と顔を出しました。もっとも、今でもIPv6関連のめぼしいソフトと言ったらping6と冗談を言いたいぐらいなので、当時から事情はあまり変わっていません。

5年前にアリエル社内は一度IPv6化しました。またバブルに乗るにはIPv6化しておいた方が良さそうです。


関連文書:

  • 関連文書は見つからんがな

Posted by & filed under 開発.


 自分が所属する研究室の教授はとってもお忙しい。「その教授が学内を歩いて移動することは無く、どこに行くにも常に走って移動している」というのは、学生の間では有名な話である。
 そんな教授の貴重な時間を蝕む一番の敵はメールである。一説によると、教授の時間の 4 割から 5 割程度がメールの確認と返信作業で奪われると聞いている。
 教授に恩義ある学生の一人として。この土日で、教授の問題解決に貢献する小さなアプリ(”tsukuba”)[1] を作ってみた。

 メール処理に手間取る要因の一つは、「(返信等の)処理対象メールの選別である」と推測する。つまりユーザは、INBOX に到着した全てのメールに対して返信等(以下、「処理」)を行うのではなく、このうち一部に対して処理を行うのだが。到着メールのうち、どのメールを(優先的に)処理するかという事を、いちいち中身を精査して確認しなければならない。
 もちろん日々、大量のメールを受け取る人間は、スパムフィルタはもちろんの事、各種メールヘッダを指定したフィルタリングを行って、中身の精読を行う時間を省いていることと思うが、教授のような多方面(学生、学内組織、官公庁、調達したプロジェクトに関連した民間企業等)から毎日のように様々なメールが到着するユーザにとっては、これのみによっては対応できない。

 ただし、これらのメールに対しても事前に読む必要がなさそうなメールを推定する事が可能である。
 Gmail の priority inbox などがこの問題を解決しようとしているのだろうが、恐らく多くの人間がこの機能を「イマイチ」だと思っている事だろう。その原因は、「(判断基準が)不明確である事」と「(判断基準がユーザ一般にとって)不確定である事」だと推測する。
 priority inbox の判定基準については、「ここ」に詳しく記載されているが。やっぱりわからない。。スパムフィルタでさえ、完全に信用されているとは言えない状況において、priority inbox のみを信用するというユーザは希有だろう。またそもそも判定基準は、個々のユーザの趣意に左右される為、どうがんばったって一意にパーフェクトなフィルタリングができるわけがない。
 
 なので。求められているのは、ユーザにとって仕組みが理解し易く、容易にカスタマイズ可能。それでいて且つ、既存のヘッダ情報を基にしたフィルタリングでは表すことができない条件を指定する事であると考える。
 そこで、次の2つの条件と、それを実現するアプリ(”tsukuba”)を提案する。tsukuba では、以下の条件を満たすメールを、INBOX から Tsukuba ラベルに対して移動(migrate)させる事で、返信等の処理対象から除外する。

 1. 返信率が 0 % で且つ、一定数以上溜まっているメールの送り元からのメール
 2. 自分の宛先が CC ないしは BCC で指定されたメール (以下「CC メール」)

 今まで到着しているメールに対して、一通も返信していないメールを処理対象から除外するというのは間違っていないだろうが。この理屈だと、これまで届いていないメール(以下、「新着メール」)も処理対象から除外されてしまう(仮に明日、redhat から「うちで働かない?」といったメールが届いたら、是が非でもレスポンスしたい)。なので返信率0の条件に対して、(デフォルトでは)5件溜まるまで新着メールを migrate させないという例外を設定した。
 また、返信処理対象から CC メールを除外する条件も盛り込んだ。メールの送り手にとって CC でアドレスを指定する事は「一応報告しておきますね」「目を通しておいてもらえるとうれしいです」といった、To ヘッダに指定したユーザのサブ的な位置づけに他ならない。これを、CC メールを受け取ったユーザが必ずしも reply しなければならない対象とはなり得ない(本命の送り手が居るわけだから)。

[1] http://ebisu.at/tsukuba/


関連文書:

  • 関連文書は見つからんがな

Posted by & filed under いろいろ.


ありえるえりあ新装後、初の「Emacsのトラノマキ」の原稿公開です。上のメニューの「原稿資料」からリンクをたどってください。過去に公開した原稿も同じページからたどれるようにしました。

今回の原稿は、松山さんによる「auto-completeを使おう」(Software Design 2010年1月号)の原稿です。あのauto-completeの話です。IPA未踏にEmacs枠を作ったと言われる伝説のソフトです。

原稿の中にelispのコードとシェルのコマンドプロンプト例があります。コードのハイライトをしたいのですが、Google Syntax Highlighterの対応言語にLispとShellがありません。困りました。対応言語で一番Lispに近いのはどれだろう、やはりカッコの多い言語か、いやそういう問題ではないな、と悩んだ挙句、class=”c”にしてしまいました。おそらくどの言語を選んでも結果は同じだと思うので気分の問題です。


関連文書:

  • 関連文書は見つからんがな

Posted by & filed under いろいろ.


開発者用のブログだったら、当然コードはのせるよね。シンタックスハイライトしないコードって見にくいので、コードのハイライトができるようにしてもらいました。次のように書くと上のように表示されます。

<pre name=”code” class=”java”>
class JavaLover {
    public JavaLover() {
        System.out.println(“くたー”);
    }
    public String love() {
        return “me, too”;
    }
}
</pre>

Google Syntax Highlighterというものらしいです。ハイライトしてくれる言語は、

  • C++ (cpp, c, c++)
  • C# (c#, c-sharp, csharp)
  • CSS (css)
  • Delphi (delphi, pascal)
  • Java (java)
  • Java Script (js, jscript, javascript)
  • PHP (php)
  • Python (py, python)
  • Ruby (rb, ruby, rails, ror)
  • Sql (sql)
  • VB (vb, vb.net)
  • XML/HTML (xml, html, xhtml, xslt)

いっぱいありますね。classのところに指定すればいいらしいです。でも、私の大好きなscalaやlispがいません。おおたにさん、何とかしてください。


関連文書:

Posted by & filed under 開発.


はい、MSラブなんですが、まだ、誰にもわかってもらえません。仕方ないので、昨日の続きで、MS Exchangeから指定したカレンダーの予定をAPIを使って抜き出します。こちらは、昨日の仕組みよりはちゃんとドキュメントになっているものが多いです。いやいや、単に、Exchange Sevice BindingとExchange Serviceの関連性のドキュメントがないだけかもしれません。それでは大好きなC++++じゃなくって、C#を使って早速はじめます。

[続きはこちら]


関連文書: