Project Aardvark Functional Specification (Jp)
From The Joel on Software Translation Project
Project Aardvark
機能仕様書
最終更新日: 2005年8月17日
公開版への序文 Joel Spolsky
Copilot.comの最終版(この仕様書では「Aardvark」と呼んでいる)が2005年8月始めに製造工程に入ったので、この仕様書はもはや歴史的な関心の対象でしかない。私はこれをJoel on Softwareの一部として公開することにした。Fog Creekで実際に書かれている仕様書のサンプルを見たがっている人たちがたくさんいたからだ。
この仕様書には1つ大きな誤りがあった。私がこれを書いた時、SSLで使われているポート443が、プロキシサーバを使うように構成されたネットワークでも開いているものだと思っていた。ブラウザから「マン・イン・ザ・ミドル」攻撃と見えるので、プロキシサーバでSSLトラフィックを転送することはできないと信じ込んでいたのだ。これは誤りで、不正確で、間違っており、最初のベータ版をリリースした後になって、それがいかに間違っているかを私たちは知ることになった。そのため、Copilot 1.0の最終的な実装には、プロキシを検出する処理やいろいろなプロキシサーバに対応させるための、多くの予期しない作業が必要となった。1.0のリリースまでには作業のほとんどを終え、残りはリリース1.1に向けて仕上げをしているところだ。
とはいえ、プロキシのための余分の作業は、開発全体からすると10%ほどに過ぎない。仕様書を書く理由は、起こりうるあらゆる問題をあらかじめ解決することではない。仕様書を書くのは、前もって解決できる問題を可能な限り解決しておき、開発中に生じるサプライズを最小限にするためだ。私たちの場合、時期が来たら文字通り出て行って学校に戻らなければならないサマーインターンと仕事していたため、プロジェクトAardvarkを構築するのに必要な作業量を過小評価することは文字通り許されなかった。そうでなければ私が9月半ばまでデバッグにかかりきりになって、その頃には若者たちはビールを飲みながらポーカーをやっているだろうが、私の方は遊ぶこともできないというわけだ。
前もって物事について考え抜くことで、後になって深刻な問題に陥るのを避けられたことは何度もある。私が仕様書の最初のドラフトを書いたとき、フローチャートはもっと複雑で、(救助者と遭難者の)どちら側からでもプロセスを開始できるようにしていた。様々な理由によって、それがフローチャートをはなはだ複雑で入り組んだものにしていた。どちら側からでもプロセスを開始できるようにするために必要となる画面について検討していたとき、プロセスは救助者が開始する必要があるというようにすれば、劇的にシンプルになり、しかもAardvarkの有用性は変わらないことに気付いた。仕様書の上でその変更をするには1時間か2時間しかかからなかった。この変更をコード上でやっていたとしたら、スケジュールが何週間も延びていたことだろう。エクストリームプログラミングの支持者たちの嫌っている、前もって大きなデザインをすること(Big Design Up Front)の有効性を、私は口で言い表せないくらい強く信じている。私はBDUFによっていつも時間を節約でき、よりよい製品を作ることができた。XPの狂信者たちがどう言おうと、私はBDUFを採用していることを誇りに思っている。この点に関してXP狂信者たちは単に誤っており、そのことは私にとってまったく明らかなことなのだ。
開発プロセスの後の方で行った重要な変更で、この仕様書には反映されていないものがもう1つある。ユーザビリティテストの結果、アプリケーションに自分自身のファイルを削除させるというポリシーが人々を混乱させていることがわかった。これはユーザが期待することではないのだ。私たちは最終版で修正を加え、救助者が遭難者の実行ファイルを削除するかどうかチェックボックスで選択できるようにし、デフォルトでは削除されないようにした。そうすることで、コンピュータに詳しい救助者は安全でない実行ファイルが遭難者のコンピュータに残らないようにすることができる。この変更は2時間くらいでできたので、スケジュールには影響しなかった。
最後に、仕様書の真ん中あたりに、大きな「コーディング規約」の節があるが、これは率直に言って機能仕様書ではなく、別なドキュメントに入れるべきものだ。
それでも、私が今日この仕様書を読み返してみると、Aardvarkチームがこれらすべてを実装する上でいかにいい仕事をしたかは、驚くばかりだ。私は機能をカットしなければならなくなるだろうと真剣に考えていた。実際にはバージョン1に入れたいと思っていたもののすべてに加え、この仕様書ではバージョン2の機能としているものの一部さえリリースに含めることができた。
--Joel Spolsky 2005年8月17日
この仕様書について
この仕様書はAardvark 1.0のデザインの出発点に過ぎず、最終的な設計というわけではない。製品を作り始めると、思った通りに機能しないところがたくさん見つかるだろう。私たちは新しい機能を考え出し、いろいろと変更し、言い回しを直すだろう。変更に応じて仕様書がアップデートされるように努めるつもりでいる。何にせよ、この仕様書を石に刻まれた神聖な律法みたいには思わないことだ。
概要
「プロジェクトAardvark」はFog Creekで2005年夏に開発される新製品のコードネームだ。実際の製品名は違ったものになるだろう。
- Aardvarkはインターネット越しにコンピュータを操作することによって、コンピュータの問題を抱えた友人や親戚や顧客を助けることができるようにする。
社内のドキュメントでは、助ける側の人を救助者、コンピュータをコントロールされる側の人を遭難者と呼ぶことにする。
Aardvarkの機能の仕方の概要は以下のようになる。
- 救助者はAardvarkのWebサイトに行き、登録と支払いの手配をする。
- 彼らは支払いをPayPalかクレジットカードで行え、無料で短時間の試用ができ、遭難者に支払いを頼むこともできる。
- Aardvarkは救助者に対して招待コードを発行する。彼らは電話で遭難者にそのコードを伝える。
- 救助者は小さなプログラムをダウンロードして実行する。
- 遭難者はAardvarkのWebサイトに行って招待コードを入力する。それから小さなプログラムをダウンロードして実行する。
- そのプログラムは、コンピュータをコントロールさせる許可を遭難者に求める。
- そのプログラムは、救助者が遭難者のコンピュータをコントロールできるようにする。
- 終わったら、それぞれ通信を切断する。プログラムは終了するときに、自身のファイルを削除する。
主な機能
- 簡単に使える
- ソフトウェアを恒久的にインストールする必要がない
- 支払いが簡単にすぐできて、拘束されない
- Version 1.0はWindows版のみとし、十分なネットワーク帯域が得られることを前提とする
- アウトバウンドの443ポートへの接続が可能な限り、あらゆるファイアウォールを突き抜けられる。ポート443というのはセキュアなWebサイト(https)で使われるポートで、実質的にすべてのファイアウォールがポート443のトラフィックを許可している。
- (願わくは)安全である
デザインゴール
すべてのデザイン上およびエンジニアリング上の決断は、次の原則に基づいて行われる。
ユーザがしなければならない選択をなくすべく常に努める。ユーザ体験に瘤があれば、いつでも削り落とさなければならない。ユーザはこう言うだろう。「こんなに簡単なものはないよ。ただ単にうまくいくんだ」。ユーザ体験のどこにもジャーゴンが残っていてはならない。
主要なコンポーネント
AardvarkシステムはFog Creek Softwareによりホストされるサーバ上で実行される。Aardvarkは大きく4つの部分から構成される。
ウェブサイト
バックエンドにデータベースを持つAardvarkのために登録されているWebサイトで、支払いのための手続きやリモートコントロールセッションの準備を行う。
遭難者プログラム
遭難者により実行されるソフトウェア。小さな独立したWindowsのEXEファイルで、遭難者がダウンロードして実行する。遭難者プログラムはGPLであるVNCをベースにしているため、このコンポーネント自体もGPLの元にリリースされる。
救助者プログラム
救助者が実行するソフトウェア。たぶん小さな独立したWindowsのEXEファイルとなる。救助者がダウンロードして実行する。しかしversion 2では、Webページ上で実行されるJavaアプレットか、ActiveXコントロールか、Firefoxのエクステンションか、あるいは何であれ、エンドユーザのユーザ体験がもっともシームレスとなるものを、合わせて提供するかもしれない。救助者プログラムもまたVNCをベースとする。
リフレクター
我々のサーバ上で実行するWindowsのサービスで、救助者と遭難者がそれぞれファイアウォールの裏にいる場合でも救助者が遭難者を助けられるようにする。救助者プログラムと遭難者プログラムはどちらもリフレクターに接続する。リフレクターは認証を行い、料金分の時間が来るまで救助者と遭難者の間のメッセージを中継する。
ライセンス
VNCはGPLライセンスで公開されている。我々の構築するコンポーネントのうちの2つ、救助者プログラムと遭難者プログラムはVNCをベースとしており、従ってGPLライセンスの元に公開する必要がある。
これはそれほど大きな問題ではない。これらのプログラムは我々の用途のために最適化されており、また動かすためにはGPLライセンスではないリフレクターを必要とするからだ。
公開について
我々の主なゴールはAardvarkのフル機能バージョンをひと夏で公開までもっていくことだ。最初のバージョンは最適化されてなかったり、すべての機能をサポートしてなかったりするかもしれない。この仕様書では(v2)というマークで、最初のバージョンには含まれないが後で追加される機能を示すことにする。
物理的アーキテクチャ
最初のリリースでは、我々のもとにある既存のWebサーバ群――ハイエンドの高性能なDell 2850だ――を使うことになるだろう。それぞれのサーバは1台でも必要とあらばAardvarkの負荷を処理できる。Aardvarkシステムはスケーラビリティが高く、負荷が増えた場合には順次サーバを追加して対応することができる。我々のサーバはweb1とweb2と名付けられている。このサービスが人気を博したらサーバをすぐに追加するつもりだ。
スケーラビリティ、負荷分散、フェールオーバー機能はWindows NLB(Network Load Balancer)により提供される。NLBはこれ以上ないくらい単純なものだ。web1とweb2はそれぞれIPアドレスを持っているが、3つめのアドレスwebnlb.fogcreek.comを共有している。そしてこの共有アドレスに対するソケット接続をどちらが処理するか調整する。現在のシステムでは、新しい接続を双方に50%ずつ振り分ける。一方のサーバがオフラインになった場合、接続が100%他方のサーバに割り当てられる。これはサーバ16台まで無理なく拡張することができる。16台より多く追加する必要が生じた場合は、ハードウェアロードバランサーを使って16台のブロック間の振り分けを行う。
ステートバグを回避するため、同じクラスCレンジのアドレスから来る要求は可能な限り同じサーバで処理される。これはNLBにある機能であり、すでにオンにしてある。
サーバはWindows Server 2003 SP1、IIS6、ASP.NETを実行する。データベースには既存のSQL Serverマシンを他のサービスと共用で使うことになるだろう。
それぞれのWebサーバでは、Webサイトとリフレクターの両方を実行する。
サーバはときどきアップグレードする必要があるため、システムはどのサーバを落としても残りのサーバを使って問題なく負荷を処理できるようにデザインされる。サーバを落とすためにはドレインの必要がある。すなわち、そのサーバの現在の接続を安全に終了させ、新たな接続要求は別なサーバに振り分ける。ドレインが完全にできたサーバは、アップグレードしてからオンラインに戻す。ドレインもNLB組み込みの機能であり、このために余分の作業は必要とならない。
(v2) リモートコントロールセッションは長時間に渡る可能性があるので、サーバを完全にドレインするにはかなりの時間がかかるだろう。数時間か、あるいは数日かかるかもしれない。これに対処するのに一番良いと私が考えている方法は、救助者プログラムと遭難者プログラムそれぞれに処理を追加して、リフレクターへの接続が切れた場合、自動的に再接続を試みるようにするというものだ。そのようにすれば、サーバをアップグレードする必要がある時は、そのWebセッションをすべて引き抜いてから(1分か2分しかかからないはずだ)、リフレクターのセッションを単に切ってリブートすればよい。救助者プログラムと遭難者プログラムはコネクションが切れたのを検出して、別なマシンを通して自動的に再接続する。
ソフトウェアアーキテクチャ
WebサイトはC#で書かれたASP.NETアプリケーションとする。我々はVisual Studio.NET 2003と.Net Framework 1.1を使う。
Webページ: Webページは、(ASP.NETで可能な範囲で)標準に準拠したものとする。我々はCSSを書式には使うが、配置のためには使わない。CSSによる配置に関して現在のブラウザは非常にバグが多いからだ。配置にはテーブルを使うことにする。国際化を容易にするため、文字列は最初から別扱いしておく。
救助者プログラムと遭難者プログラムはVNCをベースとするため、C++で書かれる。Visual Studio 2003版のC++でどうにかコンパイルできるかやってみるつもりだ。
(v2)最初のバージョンでは、救助者プログラムと遭難者プログラムはWindowsのEXEのみとする。将来は別なものも追加したくなるかもしれない:
- Javaアプレット版の救助者プログラム。
- ActiveX版の救助者プログラムと遭難者プログラム。最新版のInternet Explorerがこれらをどう扱うかによる。関心があるのは、EXEを渡すのと、ActiveXコントロールを渡すのとで、どちらがシームレスかということだ。
- Mac版およびUnix版の救助者プログラムと遭難者プログラム。
リフレクターはC#を使ってWindowsのサービスとして作成し、可能な限りWebサイトとコードを共有できるようにする。たとえばデータベースへの接続とか、ユーザ認証や登録といった部分だ。
コーディング規約
Webサイトは負荷分散されるので、ASP.Netのセッションステートは(デフォルトの)メモリ中ではなく、SQL Serverに保持すべきだ。
同じものにはいつも同じ名前を使うようにする。たとえば、HTMLのINPUTタグの名前は、その値が格納される変数の名前に対応すべきで、それはまたSQLデータベースのカラム名に対応しているべきだ。
C#のコードではアプリケーションハンガリアン記法、別名Aardvarkウクレイニアン記法を使う。名前について強いコーディング規約があるのは正しいコードを書く助けになる。名前のバラエティが減るので、変数名を覚えるのも楽になる。また、変数名を考え出すためにあまり苦労しなくなる。名前の多くは予測可能になるからだ。
変数名は小文字始まりのキャメルケースとする。例: prefixName よく使うプレフィックス: s = Unicode文字列 ch = Unicode文字 a = ANSI修飾子。as = ANSI文字列。ach = ANSI文字。 utf8 = UFT8文字列 c = 何かの個数。cb = バイト数(バッファサイズ)、cch = 文字列長 ix = インデックス――データベースの主キー、ループインデックス、配列 インデックス等 rg = 配列(range:範囲)を表わし、通常プレフィックスとして使う。たとえ ばrgsは文字列配列 f = ブール値のフラグで、値はtrueかfalse。もともとのアプリケーション ハンガリアンでは3値のフラグを許容しているが、我々は使わない。 fl = ファイル fn = 関数(関数ポインタの変数名) path = パス。ファイルのフルパス名 n = n値フラグ、あるいはenum b = バイト db = データベース dbl = 浮動小数点数(double) l = long。個数以外のlong型整数を表わすのに使う。 x, y = ピクセル単位でのx, y座標 d = 差(difference)。よく使うのはdxとdyで、幅と高さを表わす。また、 ddt(timespan)やdix(配列のオフセット)等も使う。 dt = 日付時刻(date/time、日付と時刻の両方を含む) rs = レコードセット sql = sql文 tbl = データベーステーブル url = (部分ではなく)完全なURL urls = URLエンコードされた文字列 html = HTMLを内容とする文字列で、そのままブラウザに渡せるもの p = ポインタを意味する修飾子。C/C++のポインタに使う。C#のコードでは 必要とならない。 o = オブジェクト 新しいクラスを定義する場合、2-4文字のウクレイニアンプレフィックスを 決めておき、クラス定義の頭に記述しておく。たとえばCSessionという名の クラスを定義するとき、"sess"をそのプレフィックスとして使う、という具 合だ。 よく使う名前/サフィックス: Min, Max = 最小値と最大値 Prev, Next, Curr = 前の値、次の値、現在値 Tmp = 一時的な値 Src, Dest = コピー元とコピー先 その型のローカル変数が1つしかない場合や特に重要な変数に対しては、しば しば名前の部分は省略される。たとえば1つの文字列型の引数を取る文字列処 理関数を書く場合、その引数名はsと名付けられるだろう。引数で与えられた ファイルに文字列を書き込む関数であれば、引数名は(fl, s)になる。 関数名は大文字始まりのキャメルケースとする。型変換を行う関数では TypeFromType(変換後の型From変換前の型)という形の名前にする。たとえば Utf8FromSはUnicodeをUTF-8に変換する関数である。 クラス名はCかEで始める。(クラスオブジェクトの変数名は、クラスに対して 決めたプレフィックスで始める。) Eはエンティティクラス(データベースのテ ーブルやビューの行に対応するクラス) を表わす。Cはそれ以外のクラスに使 う。 SQLテーブルは大文字始まりのキャメルケースを使い単数形の名前にする。た とえばCustomerとかPersonとし、CustomersとかPeopleとはしない。 ほぼすべてのテーブルは、左端のカラムにautonumber(identity)を持たせて主 キーにする。テーブル名Fooに対してixFooをその名前とする。たとえば Customerという名前のテーブルであれば、その最初のカラムにはixCustomerと いう名前の主キーがくる。このテーブルに対する外部キーの名前もixCustomer とする。ただし1つのテーブルに対する外部キーを複数持つテーブルについて は、修飾子を付加して、ixCustomerFirst、ixCustomerCurrent、 ixCustomerReferrerなどとする。 SQLテーブルでも、プログラムのコードと同じプレフィックスを使う。最もよ く使うのは、dt、f、n、c、ixだ。htmlやurlの方が適切な場合を別として、文 字列は通常sをプレフィックスとする。長いテキスト(memo型)フィールドに対 してはtxtも使う。データベーステーブル名はtbl、ビュー名はviewで始める。 ストアドプロジージャは使わずに済ませたい。
ユーザ体験
救助者と遭難者は電話やIMやSkypeのような手段によって、あらかじめ連絡を取っているものと仮定する。
救助者が遭難者を手助けすると決めたら、まず私たちのWebサイトへとやって来る。この仕様書ではそのドメイン名をaardvark.comだということにしておく。ドメインaardvark.comはあまり使われておらず、おそらく買うこともできるだろうが、最終的なドメイン名とはならないだろう。我々はドメイン名として、電話越しに簡単に伝えることができ、遭難者が聞き間違ったりタイプミスやスペルミスを犯しそうにない名前を探し、ありそうな打ち間違いも含めてドメイン登録するつもりだ。
そういうわけで、救助者はaardvark.comに行く。このページには主として3つの役割がある。すなわち、Aardvarkが何であり、何をするのかを説明すること、救助者か遭難者がヘルプセッションを開始する場所、招待コードの入力を行う場所、である。
救助者はヘルプセッションを開始するためにこのWebサイトに行く。彼らは支払い方法を選択する。料金がいくらで、どのようなオプションがあるのかについては、今後決定される。今のところは以下のオプションがあるものとする。
- 短時間のリモートコントロールセッション(3分くらいで、IPアドレスあたり24時間中に3セッションまでに制限する)。このアイデアは、込み入ったことをやるには短すぎるが、サービスがどのようなものか見ることはできるというものだ。サインアップやフォームの記入は一切要求しない。ただ招待コードを取得するためのリンクをクリックするだけでいい。v1で確実に実装される必要がある。
- 1回のリモートコントロールセッション。たぶん何時間以内という制限をつける。支払いはPayPalかクレジットカードを使う。PayPalだと個人情報をいちいち入力する必要がないというメリットがある。料金は5ドルから10ドルの間とする。
- 数回のリモートコントロールセッションのセット。10回、100回、1000回など。
- n時間パス。これはn時間の間に何人でも相手にすることができる。3時間、24時間、1ヵ月、1年といったものを用意する。
- 手助けをたくさん提供する人々向けの、同時ユーザあたり月Xドルという形のサブスクリプションサービス。アカウント(email/passwordの組)をたくさん用意して同時に使うことができるが、同時セッション数はサブスクリプションの内容により制限される。
簡単のため、ローンチの時点ではこれらのパターンを全部は提供しないだろう。
支払いをするのは救助者でも遭難者でもよいことに注意してほしい。典型的なテクニカルサポートのシナリオにおいては救助者が支払うことになると思われるが、一般消費者の用途では助けてもらう遭難者の方で支払うという方が理にかなっている。
ユーザは招待コードを知らせるページへと誘導され、遭難者にaardvark.comで招待コードを入力させるよう指示を受ける。
救助者も遭難者もソフトウェアのダウンロードページへと導かれ、そのソフトウェアを実行する。ダウンロードファイルはリフレクターに接続するのに必要なパラメタを含むようにカスタマイズされたEXEになっている。
ソフトウェアには2つのバージョンがある。救助者用と遭難者用だ。救助者プログラムは実質VNCクライアントであり、遭難者プログラムは実質VNCサーバである。
遭難者プログラムが実行されると、ユーザに対して救助者をコンピュータに接続させてもよいか許可を求める。
どちらのEXEもリフレクターに接続する。両方のプログラムが接続するまでの間、「相手が接続するのを待っています」という意味のメッセージを表示する。このダイアログはまた、相手の方がつまずいている場合のために、相手側でする必要のある作業についても記述しておく。
遭難者がアプリケーションを実行すると、救助者の氏名/組織(オプション)が表示され、救助者にコンピュータをコントロールさせてもよいかと聞く。"No"がクリックされた場合、プログラムは終了して自動的に削除される。
遭難者の方が先に接続した場合、「救助者が接続するのを待っています」というメッセージが表示される。
両者が接続すると、救助者プログラムは遭難者の画面のコピーを表示する。遭難者プログラムの方は接続を切るためのボタンが1つあるだけの小さなウィンドウに変わる。
両者が接続を終了すると、遭難者アプリケーションは自ら消滅する。つまり自身のファイルを削除する。
実装ノート
自分を削除するEXEを実装する方法として私の思いつく最良の方法は、削除のための小さなプログラムをFILE_FLAG_DELETE_ON_CLOSEフラグ付きで一時フォルダに作成する、というものだ。このプログラムは元のプログラムが終了するのを待ち、その削除を行ってから終了する。
将来的な機能
- (できればv1)すべての通信をSSL暗号化する。サーバに負荷をかけないように、処理はクライアント側で行う。
- (v2) 透過的なリブートのサポート。遭難者プログラムがWindowsのシャットダウンを検知すると、画面に再起動した後再び接続するか問うダイアログを表示するようにする。
- (v2) 救助者と遭難者の間で、ドラッグアンドドロップによるファイルの受け渡しができるようにする。
- (v2) ボイスチャットないしはIMスタイルのチャット機能。
- (v2) ファイアウォールにより妨げられない場合、あるいは一方向はブロックされていないという場合、リダイレクタを経由しない直接接続を試みる。
- (v2) VNCパケットをHTTPリクエストにのせることで、ファイアウォール貫通性を高める。ポート80や443がふさがっているが、HTTPプロキシでWebブラウズはできるという設定でもファイアウォールを通り抜けられるようにする。(これが必要かどうかまだわからない。)
- (v2) パフォーマンス統計とtracerouteが記録されるようにして、将来的にリフレクター選択時にパフォーマンス最適化が行えるようにする。たとえばいつかオーストラリアにもサーバを置くようになるかもしれない。救助者と遭難者が両方ともオーストラリアにいる場合は、オーストラリアのリフレクターを使う。
- (v2) テクニカルサポートや大きなヘルプデスク向けに、商用パッケージ版のリフレクターをリリースする。
- (v2) VNCプロトコルのパフォーマンスと忠実度を改善する。
- (v2) 不安を減らすため、EXEダウンロードに電子署名を付ける。
全体像
Aardvark Webサイトの概略のフローを示す:
ホームページ
ホームページのブランドとしては基本的にAardvarkブランドを使う。小さなFog Creekのロゴを一番下につけるにしても、人々にはAardvarkをもうひとつのFog Creek製品ということではなく、それ自体として受け取って欲しい。
ホームページを次に示す:
Aardvarkへようこそ!
Aardvarkは友達や親戚や顧客のかかえるコンピュータの問題を、一時的にインターネット越しに彼らのコンピュータをコントロールして解決できるようにします。1日パスは7.95ドルです。無料で5分間試用することもできます。もっと詳しい情報を見る。 | |
相手のコンピュータをコントロールする:
あなたの氏名: [ ] [] サービス規約に同意する | コンピュータを相手に操作させる:
招待コード: [ ] [] サービス規約に同意する |
|
画面上の言葉の表現は変更されるだろう。救助者は氏名を入力して「相手のコンピュータをコントロールする」をクリックする。遭難者は招待コードを入力する。
氏名はユニコード文字列で64字までとする。
Windows以外のコンピュータでアクセスしていないかブラウザ文字列をチェックする。これは必ず判断できるとは限らない。Windowsでないコンピュータを使っていると思われる人がこの画面にアクセスした場合、以下のように表示する:
AardvarkではどちらのコンピュータもWindows 95以降である必要があります。あなたのコンピュータがWindowsを実行していることを確認できませんでした。
|
ホームページでは、クッキーが有効か確認するため、テスト用のクッキーを設定する。クッキーが次のページで取得できなかった場合、以下のページを表示する:
Aardvarkはクッキーを使用します。これは接続が切れた時、再接続するために必要なものです。
あなたのWebブラウザでクッキーが無効になっているようです。クッキーを有効にしてからここをクリックしてください。 |
「サービス規約」リンクは小さな外部ウィンドウとしてポップアップする。
「サービス規約」のチェックボックスがチェックされていない場合、「サービス規約に同意しますか?」というメッセージと、はい/いいえのリンクがあるページへと遷移する。いいえをクリックするとホームページへ戻る。
もっと詳しい情報のページ
もっと詳しい情報のページは、システムの概要と、救助者向けと遭難者向けそれぞれのFAQからなる。このページではシステムの単純さ、安全性、簡単さを強調する。FAQは別なセクションにするかもしれない。その場合は、すべてのページの下端にFAQページへのリンクを付ける。
支払いページ
支払いページは以下のようになっている:
支払い方法を選択してください
Fog Creekからの約束: もし満足頂けなかった場合には、私たちはお金を頂きません。接続が成功するまで、課金は一切行いません。 Aardvarkを3分間無料で試用する 助ける相手に払ってもらう 3時間パスを8ドルで購入する: [PayPal/すぐ購入する] ( ) MasterCard ( ) Visa ( ) American Express ( ) Discover |
遭難者が支払いを求められている場合では、救助者が「助ける相手に払ってもらう」をすでに選択しているので、最初の2つの選択肢は表示されない。
- 「無料でAardvarkを試用する」を選ぶと、「助ける準備ができました」ページへと遷移する。
- 「助ける相手に払ってもらう」を選ぶと、「助ける準備ができました」ページへと遷移するが、未払いの招待コードが発行される。遭難者が未払いの招待コードを入力すると、支払いを要求される。
- PayPalリンクはPayPalのサイトへとリダイレクトされる。この場合、PayPalのメンバーは詳細な情報を入力せずに素早く支払いを済ませることができる。重要な問題――クレジットカードのように、PayPalで認証だけして課金は後ですることは可能か? そうしないとPayPalへの払い戻しが必要になる場合が生じるが、それは面倒だ。
- クレジットカードのどれかをクリックすると、支払いの詳細について入力するフォームが現われる:
支払い方法を選択してください
Fog Creekからの約束: もし満足頂けなかった場合には、私たちはお金を頂きません。接続が成功するまで、課金は一切行いません。 Aardvarkを3分間無料で試用する 助ける相手に払ってもらう 3時間パスを8ドルで購入する: [PayPal/すぐ購入する] ( ) MasterCard ( ) Visa ( ) American Express ( ) Discover Emailアドレス: [ ] Emailアドレス(確認): [ ] カード番号: [ ] 有効期限: (mm/yyyy) [ ] カード名義人氏名: [ ] 請求書送付先住所 [ ] 請求書送付先住所(続き) [ ] 市 [ ] 県 [ ] 郵便番号 [ ] 国 [ ] CVV: [ ] [支払いを確認してクリック] |
ここでクレジットカードの確認をするが、課金は行わない。カードの確認をしている間、以下のメッセージを表示する:
- クレジットカードを確認中です(+ アニメーション)
実装ノート
これはショップと同じように実装する。カードに課金が必要なことを示すエントリをデータベースに登録するだけだ。「あなたのクレジットカードが確認されました」と表示するHTMLページは5秒ごとに再読込みさせる。その間にSQL Serverで実行されているサービスが、データベースに新しいレコードを見つけると、クレジットカードの確認をして結果をテーブルに格納する。HTMLページが再読込みされてカードが承認/拒否されたのがわかると、それぞれに対応するページに遷移する。この方法の利点は、ブラウザの再読込みにより二重に課金されるのを避けられるということだ。
「未払い招待コード」として発行される招待コードは、「支払い方法を選択してください」画面に隠しフィールドとして埋め込まれている。これもまた二重課金を避けるためだ。送信のあとすぐにキャンセルをクリックし、何か修正してから送信し直したとしても、二重に課金されることはない。
クレジットカードの確認が失敗した場合、「支払い方法を選択してください」画面に戻り、カード番号を赤枠で囲んでエラーメッセージを表示する。
クレジットカードの確認ができた場合は、助ける準備ができました画面(あるいは助けてもらう準備ができました画面)へと遷移する。
助ける準備ができました
この画面は以下のような感じになっている:
|
この画面に付けるかもしれない機能:
- ブラウザをチェックして、ブラウザの種類に応じた、EXEのダウンロードと実行のための正確な手順をユーザに示す。
- 「30秒」の部分の数字を、実際の経験に基づいて算出する。
- ブラウザでJavaが使えるかチェックして(あるいはもっと前の画面でチェックしておき)、Javaクライアントをコントローラに使う。
助けてもらう準備ができました
|
遭難者ユーザインタフェース
EXEを実行した時、遭難者が最初に見るのは、小さなウィンドウだ。
[救助者の名前]にあなたのコンピュータを操作してもらいますか?
[はい] [いいえ] あなたは相手のしていることをすべて見ることができ、いつでも中断させることができます。 |
「いいえ」をクリックすると、プログラムはすぐに終了して削除される。
「はい」をクリックすると、サーバへの接続を確立する。遭難者が目にするのは次のような小さなウィンドウだ。
接続しています。
[終了] |
接続が確立されると、次のように変わる:
このコンピュータは遠隔操作されています。
[救助者を追い出す] |
「追い出す」ボタンがクリックされた場合、誤操作に備えて「本当に? はい/いいえ」メッセージボックスを表示する。追い出すことを確認した場合、EXEは終了して削除される。
遭難者のユーザインタフェースにはVNCサーバのようなタスクバーボタンは使用しない。通常のVNCのようにサーバとして実行はしない。
残り時間が2分以下になったら、UIは次のように変わる:
このコンピュータは遠隔操作されています。
[救助者を追い出す] 残り時間:1分16秒 |
サーバとの接続が切れた場合は、残り時間があるかどうかに応じてUIが変化する。残り時間がない場合は次のようになる。
時間切れです! このコンピュータはもう遠隔操作されていません。
[終了] |
残り時間がある場合、「再接続」画面に遷移する。
接続が切れました。再接続しています。
[終了] |
15分以内に再接続できなかった場合、次のようになる。
接続が切れました。再接続できません。
[もう一度試みる] [終了] |
救助者ユーザインタフェース
救助者のユーザインタフェースはTightVNC viewerを修正したものとなる。大きな変更点は2つあり、ダイアログが削除され、ツールバーが変更される。
ユーザに設定変更を許すダイアログはすべて削除する。接続するときに現われるダイアログも削除する。ステータスエリア(後述)とハードコーディングされた設定を代りに使う。
ツールバーの代わりとして、ステータスバーで何が起こっているのかを説明する。テキストが変わる時には、1秒間隔で3度フラッシュさせて、変化に気がつくようにする。ステータスバーに表示されるのは以下のようなメッセージだ:
- 接続しています
- リモートコンピュータを操作中です。残り時間:1分18秒
- 接続が切れました。再接続しています。
- 接続が切れました。再接続できません。
- 時間切れです! もうリモートコンピュータを操作していません。
招待コード
招待コードのデザインの目標は:
- 電話越しに簡単に読み上げられること
- 入力された時、間違いやタイプミスを簡単に検知できること
- 他の招待コードが何か推測できる情報を出さないこと
仕組みを説明しよう。招待コードは以下のような12桁の文字列にする:
- 999 999 999 999
入力されたスペースやハイフンやそのほかの区切り記号は無視されるが、表示するときには3桁ずつ区切って表示し、ユーザが3桁ずつ区切って読み上げるようにする。こうすることで人の短期記憶の誤りやすさによる間違いの可能性を最小化する。
招待コードはRNGCryptoServiceProviderでランダムに生成した単なる11桁の数字列だ。これをデータベースのユニークな主キーカラムに挿入する。失敗した場合は別なランダム数字列で5回まで試みる。これが全部失敗したとしたらパニックだ。
12番目の数字はチェックサムで、mod 10(LUHN)で算出する。これも便宜のためデータベースに格納しておく。
再接続
ユーザがパスを購入したが、Webブラウザを閉じたり、何かのために接続が切れてしまった場合、彼らはまたお金を払いたくはないだろう。
彼らがwww.aardvark.comに戻ってきたとき、クッキーを調べて、(招待コードと、救助者か遭難者かを識別するためのコードからなる)ユニークなIDを取り出す。
ユーザが救助者で招待コードに残り時間がある場合、「再開」オプションが追加され、「誰か」が「誰か他の人」に変更された、ホームページを若干修正したページが表示される。
Aardvarkへようこそ!
切断が切れたのでしたら、再開するには、ここをクリックしてください。 Aardvarkは友達や親戚や顧客がかかえるコンピュータの問題を、一時的にインターネット越しに操作して解決することができます。3時間パスが8ドルです。3分間無料で試すこともできます。 招待コードをお持ちでしたら、ここに入力してください: [ ] [開始] 誰か他の人のコンピュータを操作する場合は、ここに自分の氏名を入力してください: [ ] [開始] |
そしてもちろん救助者ダウンロードページに遷移する。
遭難者が招待コードに残り時間がある状態で戻ってきた場合は、ホームページが表示されるが、招待コードがすでに設定されている。そのため、開始ボタンをクリックすれば、ダウンロードページに遷移し、準備ができる。彼らはまた、次のようなメッセージを見る:
Aardvarkへようこそ!
接続が切れたのですか? ジョン・スミスが再びあなたのコンピュータを操作できるようにするには、ここをクリックしてください。 その他・・・ |
「接続が切れたのですか」というメッセージは、ポストイットメモのような形で表示され、その下にあるテキストを隠すので、見落とされることはない。これに閉じるボタンをつけ、JavaScriptで処理する。
セッションの計時方法
サーバは最初の接続が確立されたあと、タイマーのカウントダウンを開始する。
ユーザが意図的に切断した場合、時計は進み続ける。
意図しない要因で接続が切れた場合、再接続するまで時計を止める。
これは長時間のパス(8時間とか1日のパス)を用意することで劇的に単純になる。ユーザが残り時間を気にしなくなるからだ。その場合には時計を止める必要もないだろう。
データ収集
(優先度低) リフレクターはそれぞれの招待コードに対して、どれだけのバイトのデータを中継したか64ビット整数で記録する。このデータは帯域のコストを管理するのに使う。
ロギング
リフレクターとWebサイトは重要なイベントをすべてデータベースに記録する。ログは招待コードとタイムスタンプをキーとする。これにより問題の診断のためにセッションの履歴をすぐに調べられるようになる。以下のことについてログを記録する:
- 新しい招待コードの生成
- 救助者が3分間の無料セッションを選択
- 救助者が支払うことにした場合、クレジットカードの最後の4桁(AMEXなら5桁)を含む支払い情報を記録する
- 救助者が遭難者に支払いを求めた
- 救助者がPayPalでの支払いを選択
- PayPalがトランザクションを承認した
- クレジットカード会社がトランザクションを認証した
- 救助者がダウンロードページでダウンロードを開始した
- 遭難者がダウンロードページでダウンロードを開始した
- 救助者がリフレクターへの接続に成功した
- 遭難者がリフレクターへの接続に成功した
- クレジットカードへの課金が行われた
- ネゴシエーションプロトコルの各ステップ
- 救助者か遭難者の接続が切れた
- 相手の接続が切れたため、救助者か遭難者の接続を切断した
矛盾と通信上の問題について
シームレスな体験を確かにするため、この節では問題の起きうることをリストアップして、それぞれの場合にどうやって回復するかについて説明する。
問題 | 処理方法 |
DNSの問題のためソフトウェアがリフレクターに接続できない。 | 救助者プログラムも遭難者プログラムも接続すべきリフレクターのIPアドレスを知っており、DNSを使うことはない。 |
インターネット接続が失われたため、ソフトウェアが接続できない。 | メッセージを表示して15分間再接続を試みる。15分が過ぎたらあきらめる。
(v2) IEを使って我々のWebサイトから単純なテストページのダウンロードを試みるスレッドを起動する。それが成功したが本体の接続は失敗した場合、ファイアウォールでブロックされているためと推測し、そのことについてメッセージを表示する。 |
接続が切れた(一方のクライアント) | リフレクターは他方のクライアントの接続も切断するため、次に挙げるケースと同じになる。 |
接続が切れた(両方のクライアント) | クライアントは「接続が切れました。再接続します」と言うメッセージを表示し、そのウィンドウを最前面にもってくる(ああ、みんなそうされるのが好きだ)
プロトコルを最初からやり直す。 15分間試み続ける。15分が過ぎたらあきらめる。 |
一方のクライアントがEXEを紛失したが、AardvarkのWebページは開いている。 | EXEをダウンロードし直すだけでいい。 |
遭難者がEXEを紛失し、Webブラウザも閉じてしまった。 | 遭難者はAardvark.comに戻り、招待コードが設定済みなのを見る。
クッキーが無効になっているか、クッキーが削除されたためにこれが機能しない場合、救助者に招待コードをもう一度聞く。 |
救助者がEXEを紛失し、Webブラウザを閉じてしまった場合。 | Aardvark.comに戻り、時間がまだ残っていれば、以前のセッションを再開するための特別のリンクが出ている。 |
救助者がEXEを紛失し、Webブラウザを閉じていて、クッキーが削除されている場合。 | 払い戻しのため我々にコンタクトする必要がある。 |
クライアントの一方がリフレクターに接続し、セッションが確立する前に、別なクライアントが同じタイプの接続でリフレクターに接続した場合。 | 最初のクライアントに「別なクライアントが接続」と言うメッセージを表示して切断する。 |
セッションの最中に、他の救助者(あるいは遭難者)が来たとき。 | 後から来たクライアントに「セッション中につき接続不可」のメッセージを表示して切断する。 |
何らかの原因でセッションがハングしたか失われた。機能はしていないが、救助者と遭難者はどちらもリフレクターと接続されている。別なクライアントで接続を試みても「セッション中につき接続不可」のメッセージが出る。 | どうしたらそういう状態になるのかわからないが、このようなことが起りうるのではないかと疑っている。
アプリケーションを実行し直し、再度支払いを行い、払い戻しをする。 |
救助者と遭難者がロードバランサーにより別なサーバに接続された。 | 一方が接続したとき、接続したサーバのIPアドレスがデータベースに保存される。もう一方が接続したとき、別なサーバに接続された場合には、相手が待っているアドレスを含むバウンスメッセージを受け取る。 |
セキュリティ
VNCを単純なソケットでなくSSLを使うようにVNCを修正する。SSLセッションはエンドツーエンド、すなわち2つのクライアント間であり、リフレクターは関与しない。リフレクターは実際のところ暗号化されたバイト列を受け渡すだけだ。このデザインはセキュリティを最大化し、CPUに負担をかけるキージェネレーションを、サーバでなくクライアントで行われるようにする。
これは我々がいつカードに課金するか決めるためにVNCのトラフィックの中身を覗くことができないことになる。接続が双方向になっていることが確認できる時点(たとえば一定量のバイトがそれぞれの方向に流れたとか)を判断するため、プロトコルをよく検討する必要がある。
AardvarkのWebサイトは頭の先からつま先までSSLサイトとする。やがてSSLアクセラレータが必要になるかもしれない。
(オリジナル: The Project Aardvark Spec)