2014年9月25日木曜日

資格情報プロバイダーの話

Windowsに資格情報プロバイダー(CP:Credential Providerてのがある。 カスタムしたログオン画面を提供するためのCOMコンポーネントをこう呼ぶ。 標準のID/パスワード方式以外のログオン方法の提供、たとえば

  • スマートカード認証
  • 生体認証(指紋・手のひら静脈・顔認証等々)

などで認証する機能を追加提供するために使用される。 導入効果として、セキュリティの堅牢性向上が見込める。 また応用として、

  • ハイブリッド認証(たとえば指紋とパスワードの両方パスしないとログオンできないとか)
  • シングルサインオン(ログオンユーザーを記憶しておき、ログオン後のデスクトップで発生する認証作業を全て代行することでユーザー負荷を軽減する)

などの機能を実現するのに利用することも考えられる。 結構ニッチな市場なのか、日本語化された情報が異様に少ない技術の一つ。 まったく無い分野もあるから取っ掛かりとなる資料があるだけマシと思わなければならないかもしれないけれど。
以下はMSDNプログに投稿されたエントリーで関連がありそうなもの。(いつもお世話になっております。)Filterは当面関係ないと思うけど一応掲載。

提供が始まったのはVistaから。 それ以前のXPではGINAという技術が同じ分野を担当していた。 で、Vista/7はCPなんだけど、8/8.1はバージョンが変わって v2 CP って呼ばれている。これに伴ってVista/7用のCPも便宜上 v1 CP って呼ばれるようになった。 なんでバージョンが変わったかっていうと、ユーザーの利便性を優先して、8からOS認証画面の動作をマイナーチェンジしたから、らしい。 だからそれに伴ってCPの実装も変更する必要が生じた、と。具体的には、7までが

  1. 認証方法の選択
  2. ユーザーの選択

だったのを、8から

  1. ユーザーの選択
  2. 認証方法の選択

に変更したため、CP もそれに追従した構造に作り変えないとOSが想定しているログオンシナリオ通りに動かなくなった、という経緯があって v2 CP が誕生したワケ。 まぁ、実はここまではv2 CP のドキュメントを入手すれば書いてある。

どういうわけか、Vistaがリリースになるちょっと前っくらいから、何の因果かずっとこのCPに関わり続けている。 そろそろちょっとしんどいんで、ノウハウとか放出して開発者人口を増やし、早く楽になりたい。

第一回は、このブログで過去に何の脈絡もなく唐突に取り上げたDirect2DとCPについて。

Direct2Dって普通にプログラマーやってるとほとんど接点がない。 デスクトップアプリでは、XAML だとどうしてもパフォーマンス出ない、かつパフォーマンス問題が顕在化したのが割りと開発初期で、 ゼロベースで作り直してもなんとか間に合いそうなタイミングの場合とか、 あるいは、もう開発末期だけど死んでも目標パフォーマンス達成しろという上からのお達しを受けた場合くらいしか出番がない。 いずれの場合にしても、XAML で速度が出ない場合により高速な Direct2D で代替しようってアプローチになる。 ほとんどの場合は XAML が開発効率と表現力を両立してくれるので、よほど速度面で困らない限りは、生産性が低い Direct2D の出番は無い。

モダンUIでゲーム作る場合にも出番はあるけど、これもXAMLとの相互運用の枠組み内での話。 この枠内ではあくまで XAML が主、Direct2D は従となり、XAML ではかゆいところに手が届かない部分を補助的に Direct2D が担当することになる。

あとはガッツリとゲームを作る場合だけど、この場合は基底技術の Direct3D を直接たたく場合が多い。 あんまし Direct2D メインでゲームを作るってことはない。

というわけで、タッチ操作にも対応し、見た目もアニメーションとかガンガン使ってユーザーに対する訴求力の高いアプリを造りたい場合はほぼ XAML だけあればいい。
・・・んだけど、どうしてもCPだけはそうはいかない。
CP から.NET部材を呼ぶだけなら何ら問題はないんだけど、XAML を使った部材を呼び出し、かつコールドスタート時のみ事情が異なる。
つまりロック解除画面とかはいいんだけど、OS起動して最初のログオン時とかがヤバイ。

XAML 部材(WPF のexeとか)はこのときだけ、起動に40~50秒も掛かる。

せいぜいユーザーを待たせられるのは5秒。それを過ぎれば「あれ?フリーズしてるかな?」と思うもんよ。
調整次第でこの50秒は短縮できるらしいんだけど、ためしに ngen.exe かけてみたくらいではほとんど変わらなかった。
それに、いろいろ手を尽くして仮に50%のパフォーマンス改善を達成したとしても、25秒。
普通、パフォーマンス改善で50%改善するってかなりすごいんだが、ここでは時間をかけても報われる公算は低い。

それにこの場合の目標である5秒を達成するには、50%どころか現状から90%ものパフォーマンス改善が必要になる。
90%の改善が出来るパターンなんてのは、改善前コードがよっぽど非効率な処理をしているか、 実行タイミングを他の場所に移せるかまたは遅延できる処理があるか、あるいは無駄なループがあるとか、 改善前のコードの品質が相当低い場合くらいしかない。
ましてここでボトルネックになっているのはフレームワーク側処理なので徒労に終わりそうな予測は容易に立つよね。

じゃぁ他の方法は?ということで白羽の矢が立つのがDirect2Dなわけです。
タッチ操作にもシームレスに反応するリッチUIのカスタムログオン機能を作ろうと思ったらほぼ一択。
C#ベースじゃなくてC++ベースの開発になっちゃうので生産効率は落ちるし、 XAML のメリットの一つである、MVVM モデルでのデザインとビジネスロジックの分離(分業・並列化による開発期間短縮)等の恩恵は一切受けられない。
Blend みたいなデザインツールの支援も無い。
マイナスばっかだけどこれでやるしかないの。
そのかわり、早いよ?

コード例とかソースとか、詳細については次のエントリーで。

0 件のコメント:

コメントを投稿