レベル: 初級 Edward J Pring (pring@us.ibm.com), Senior Software Engineer, IBM
2007年 3月 13日
この連載では、有限状態マシンを使用して、単純な Web ウィジェット
(ビューでフェードイン、フェードアウトする動画化されたツールチップ)
の複雑な振る舞いを体系づけて設計する方法を説明しています。作成されるコードはコンパクトかつ簡潔でロジックもわかりやすく、その動画は負荷の高いプロセッサーでも滑らかに動作するものとなります。今回の記事では、よく使われているすべてのWeb
ブラウザーで実装を動作させるようにする上での実用上の問題に対処する方法を説明して、この連載の締めくくりとします。
連載第 1 回
では、有限状態マシンを使用して単純な Web
ウィジェットの複雑な振る舞いを体系づけて設計する方法を説明しました。
第 2 回
では、第 1 回で設計したウィジェットを JavaScript
で実装し、連想配列や関数クロージャーをはじめとした JavaScript
言語独特の機能を最大限活用する方法について説明しました。
有限状態マシンは長年の間、イベント駆動型プログラムの複雑な振る舞いを設計して実装する人によって、設計と実装を体系づける方式として使われてきました。今ではプログラム可能なWeb
ブラウザーが、新世代のアプリケーションに新しいイベント駆動型環境を提供しています。このようなブラウザー・ベースのアプリケーションは
Ajax
によって普及し、ますます複雑になってきています。そこで設計者や実装者の助けとなるのが、有限状態マシンが提供する規則と構造です。
連載第 1 回
では、よく使われている Web ブラウザーに組み込まれている実装よりも手の込んだ振る舞いを持つ Web
ページ用のツールチップ・ウィジェットについて説明しました。この振る舞いには、さまざまなイベントに応答するFadingTooltip
ウィジェットが必要となります。あるイベントに適切な応答がその前のイベントに依存する場合はありますが、このような振る舞いを設計するために使用したのが、有限状態マシンのパターンです。その結果出来上がった状態図と
状態表
が、各状態でのそれぞれのイベントに応じて実行されるアクションを示します。さらに第 1
回では関連アクションを実行するためにイベント間で記憶する変数のリストもコンパイルしています。
第 2 回
では関数クロージャーと連想配列を最大限に利用して、第 1 回で完成した設計を JavaScript
に変換しました。この実装は、効率性や簡潔さを損なうことなく、よく使われているブラウザーの特徴に対応します。実装したコードは、3つすべてのブラウザー・イベント・モデルのカーソル・イベントをフックし、2
種類のタイマーを起動およびキャンセルしてタイマー・イベントをフックします。さらに、すべてのイベントの共通ハンドラーとして状態表を実装し、すべてのアクションと状態遷移を対象とした関数配列も実装しました。このツールチップは完全にパラメーター化されたHTML
Division
要素で、カーソル・イベントとタイマー・イベントに応答して、状態表で指定されているように移動し、フェードイン、フェードアウトします。
連載最終回となるこの記事では、よく使われているいくつかのブラウザーで実装のテストを行います。必要な作業は、複数の
FadingTooltipウィジェットを作成して HTML
要素にバインドする単純なテスト・ページを構成することです。このテスト・ページにはFadingTooltipウィジェットと比較できるように、組み込みツールチップも表示されます。テストを始めるとすぐに発生するはずのない事態に次々と遭遇することになるので、それを機会に設計を徐々に適応させていく方法がわかるはずです。そして記事の最後では、パフォーマンスの観測をするとともに、ブラウザー・ベース・アプリケーション向けの一歩進んだ有限状態マシンの開発を提案して、この連載の締めくくりとします。
ブラウザーでのアプリケーションの実行
アプリケーションは考えられるすべての実行環境でテストするのが理想的ですが、JavaScript
アプリケーションとなると、使用できるブラウザーは多種多様で、さらに数多くのバージョンが普及しているため、テストは気が遠くなるほど面倒なタスクになります。技術を説明するためだけに設計したFadingTooltip
ウィジェットはこの連載以外では使用しないので、ここでのテストは、よく使われている以下の 4
つのブラウザーの現行バージョンに絞って行いました。
 | |
テストに使用するブラウザーをダウンロードするには、
「参考文献」
を参照してください。
|
|
- Netscape Navigator 8.1
- Microsoft® Internet Explorer® 6.0
- Opera 9.0
- Mozilla Firefox 1.5
このウィジェットは次のセクションで説明する単純なハーネスだけでテストしましたが、実動アプリケーションの場合は当然、包括的なテストが必要となります。
単純なテスト・ハーネス
実装を簡単にテストする 1 つの方法は、HTML Web
ページにコードを組み込むことです。このコードはコンストラクターを使って
FadingTooltipオブジェクトを作成し、これらのオブジェクトを HTML
要素にバインドするものでなければなりません。その簡単な方法は、Web ページの HTMLhead
要素内に定義された関数を使用する方法で、この関数は、HTML 要素の
id
属性を使用した関数を定義します (リスト 1 を参照)。
リスト 1. FadingTooltip ウィジェットを作成する JavaScript コード
<head>
...
<script src='FadingTooltip.js' content='text/javascript'></script>
<script content='text/javascript'>
function createFadingTooltip(id, content, parameters) {
new FadingTooltip(document.getElementById(id), content, parameters);
}
</script>
...
</head>
|
createFadingTooltip
関数の引数は、HTML 要素の
ID、ツールチップのコンテンツ、そして一連のオプション・パラメーターです。この関数は要素 ID
だけをポインターに変換し、残りの引数はそのまま渡してコンストラクターを呼び出します。
第 2 回
の
「カーソル・イベントをフックする」
で説明したように、コンストラクターはコンストラクターが定義しているイベント関数でオブジェクトへのポインターを囲むため、コンストラクターから返されたオブジェクトへのポインターは廃棄されます。
次に、Web ページの HTML body 要素に
id
属性を持つ HTML 要素を定義します (リスト 2 を参照)。
リスト 2. サンプル HTML 要素の HTML コード
<body>
...
<p>These elements have tooltips defined with the FadingTooltip widget:
<div id='tests' class='TestStyle'>
Here are some <span id='TestLabel'>more elaborate tooltips</span>:
<input type='text' id='TestInput' size=25>
<input type='button' id='TestButton' value='Press this button'>
</div>
...
|
最後に必要なのは、HTML 要素それぞれに適切な引数で
createFadingTooltip
関数を呼び出すコードです (リスト 3 を参照)。
リスト 3. FadingTooltip ウィジェットを HTML 要素にバインドする
JavaScript コード
<body>
...
<script content='text/javascript'>
createFadingTooltip('TestLabel',
'Move your cursor a bit to the right, please ...');
createFadingTooltip('TestInput',
'Type the following, <i>please</i>:' +
'<ul compact style='margin-top: 0; margin-bottom: 0'>' +
'<li>your bank account number' +
'<li>your PIN number' +
'</ul>' +
'<i>Thank you</i> in advance.',
{ fadeinTime: 3,
fadeoutTime: 3 } );
createFadingTooltip('TestButton',
'<img src='smiley.gif' align='absmiddle'>' +
'<big>Go ahead.</big> ' +
'Press it. ' +
'<small>What's the harm? <small>Trust me.</small></small>',
{ tooltipOpacity: 1,
tooltipClass: 'AnotherTestStyle',
pauseTime: 2,
fadeinTime: 0.5,
displayTime: 0,
fadeoutTime: 10,
trace: true } );
/script>
...
|
最初のツールチップは
TestLabel
として識別される HTML
要素のツールチップで、最も単純な引数で作成されています。つまり、コンテンツはテキストのみで、パラメーター引数は省略されるため、すべてのパラメーターにはデフォルト値が使用されます。2番目のツールチップは
TestInput
HTML
要素用で、マークアップを使ってコンテンツのフォーマットを設定し、フェードイン時間とフェードアウト時間を指定しています
(秒単位)。3 番目のツールチップは
TestButton
HTML
要素用で、フォーマット設定されたコンテンツに画像を組み込み、ツールチップをスタイル設定するカスケーディング・スタイル・シート
(CSS)クラスをはじめとするパラメーターを追加で指定しています。
Mozilla Firefox
は最も新しく最も流行っているブラウザーで、他のブラウザーよりもオープン・スタンダードに近いため、まずはこのブラウザーでテストに取り掛かります(Microsoft
Internet Explorer をお使いの場合は、
発生するはずのない状態
と
フェードイン、フェードアウト効果が機能しない
場合について説明している次の 2 つのセクションを読んでから、ここに戻っても構いません)。
早速
テスト・ハーネス
を試してみてください。テスト・ハーネスには、あらかじめツールチップが組み込まれた HTML 要素と上述の
FadingTooltip のサンプルが含まれているので、この2 つを比較対照することができます。注目すべき点は
FadingTooltip の複雑な振る舞いです。FadingTooltip
は突然ポップアップ表示されて突然消えるのではなく、カーソルをHTML
要素に重ねるとビューにフェードインし、要素から離すとフェードアウトします。FadingTooltip
はカーソルに連動し、キーボード・イベントが発生しても消えません。また、外観も手が込んでいます。スタイル設定されたFadingTooltip
では、テキストもフォーマット設定されていて、画像を含めることもできます。
このような違いを改善として捉えるかどうか、そして独自のツールチップ・ウィジェットの開発に時間と労力を費やす価値があるかどうかを判断するのはあなた自身です。価値があると思ったら、実装とテスト・ハーネス用のソース・ファイルをディスク・ドライブにコピーして、パラメーター、スタイル、あるいはコードを修正できるようにしてください(
「ダウンロード」
を参照)。この作業に専用の Web サーバーは必要ありません。file://... URL
を使用するだけで、修正したテスト・ハーネスをブラウザーにロードできます。
発生するはずのないイベントが発生した場合
Microsoft Internet Explorer
は飛びぬけて普及率の高いブラウザーなので、このブラウザーでも実装をテストしなければなりません。InternetExplorer
でテストすると、まもなく問題が見つかります。それは、図 1 に示すアラートです。FadingTooltip
ウィジェットを持つHTML 要素のいずれかにカーソルを重ねると、直ちにこのアラートが表示されます。
図 1. Internet Explore での予期しない
mousemove
イベント
連載第 1 回
の
「状態表の仕上げ」
に記載した状態表 (図 2 にそれと同じものを作りました) を参照してください。Inactive 状態で
mousemove
イベントが発生するとは考えられていなかったので、
第 2 回
の
「アクション/状態遷移の表を作成する」
で作成した
actionTransitionFunctions
表の実装では、該当するセルを空白のままにしました。
図 2. FadingTooltip ウィジェットの初期の状態表
直感的には、
mousemove
イベントの前には
mouseover
イベントが発生するはずで、その結果 Pause 状態に遷移します。Pause 状態で期待されるのは、
mousemove
イベントです (第 1 回の
図 5
を参照)。明らかに Firefox ではこの直感の通りに動作しますが、Internet Explorer
では違います。その原因として考えられるのは、カーソル・イベントを生成するInternet Explorer
内の有限状態マシンにバグがあるか、あるいはブラウザーの状態がブラウザー内部で追跡されていないためです。いずれの場合にしても、有限状態マシンでこの事態に対処しなければなりません。
ここで効を奏するのが、有限状態マシンのパターンを適用するための手順です。この手順によって、このような変更も簡単に行うことができます。まず、Inactive状態で
mousemove
イベントが発生した場合に必要となる振る舞いを考えてみてください。必要なアクションと状態遷移は Inactive
状態での
mouseover
イベントの場合と同じです。
actionTransitionFunctions
表
を実装したときのことを振り返ると、doActionTransition
メソッドを使用すれば、表内のどの関数でも別の関数のアクションと状態遷移を複製できました。このメソッドを使用してInactive
状態での予期しない
mousemove
イベントに対処するには、リスト 4 に
太字
で強調表示した関数を
actionTransitionFunctions
表に追加します。
リスト 4. Inactive 状態での予期しないmousemoveイベントに対処するJavaScript コード
FadingTooltip.prototype = {
...
actionTransitionFunctions: {
...
Inactive: {
mousemove: function(event) {
return this.doActionTransition('Inactive', 'mouseover', event);
},
...
|
Internet Explorer でのテストをさらに進めていくと、早速同じような予期しない事態が起こります
(図 3 を参照)。
図 3. Internet Explore での予期しない mouseoutイベント
ここでもまた、直感的には、
mouseout
イベントの前には
mouseover
イベントが発生し、Inactive 状態 では
mouseout
イベントが発生しないことが、予想されますが、幸いこの予期しないイベントにも簡単に対処できます。この場合に必要なアクションや状態遷移はないので、有限状態マシンにInactive
状態での
mouseout
イベントを無視させればいいだけの話です (リスト 5 を参照)。
リスト 5. Inactive 状態での予期しない mouseoutイベントに対処する
JavaScript コード
FadingTooltip.prototype = {
...
actionTransitionFunctions: {
...
Inactive: {
mouseout: function(event) {
return this.currentState; // do nothing
},
...
|
設計段階では、
Inactive
状態で
mousemove
や
mouseout
イベントが発生するとは考えられていませんでした。ここで、
Inactive
状態で
mouseover
イベントが発生するからといって Microsoft のブラウザーを批判する前に、カーソルを
FadingTooltip
ウィジェットがビューにフェードインし、しばらく表示されてからフェードアウトするまでHTML
要素上に重ねた場合、他のブラウザーではどうなるかを想像してみてください。この場合、有限状態マシンはそれぞれの状態を循環し、カーソルがまだHTML
要素に重なっているのに Inactive 状態に戻ります。その後にカーソルが動かされると、どのブラウザーでも
Inactive
状態で
mousemove
あるいは
mouseout
イベントを生成することになります。これは実際、Firefox
を含めた他のブラウザーにも当てはまります。Internet Explorer
で考えられるバグとは関係なく、この記事で設計した有限状態マシンには何らかの設計上の欠陥があるためです(図 4
を参照)。
図 4. Firefox での予期しない mousemove イベント
幸い、Internet Explorer 用にすでに実装した
Inactive
状態に対する変更によってこの予期しない事態は正しく処理されるため、この設計上の欠陥を補うために追加で変更する必要はありません。
ただし、これらの変更を実装した後にテストを続けると、残念ながら Internet Explorer ではもう 1
つ発生するはずのない事態が発生します。それは、Pause状態での
mouseover
イベントです。
Pause 状態での
mouseover
イベントには
Inactive
状態での
mouseover
イベントの場合と同じアクションと状態遷移が必要なので、この事態は
doActionTransaction
メソッドを呼び出して処理することができます。ただし、他のブラウザーをこのような事態に至らせるイベント・シーケンスは論理的にないため
(私が考えられる限り)、リスト6 に示す設計変更は Internet Explorer
に対してだけ実装することにします。
リスト 6. Internet Explorer のみでの予期しないイベントに対処するJavaScript コード
FadingTooltip.prototype = {
...
actionTransitionFunctions: {
...
},
...
};
if ( (window.navigator.userAgent).indexOf('MSIE')!=-1 ) {
FadingTooltip.prototype.actionTransitionFunctions["Pause"]["mouseover"] =
function(event) { return
this.doActionTransition('Inactive', 'mouseover', event);
};
}
|
ブラウザーがいずれかのバージョンの Internet Explorer である場合、
FadingTooltips
プロトタイプの
actionTransitionFunctions
表を変更して (この表を定義した後。ただし使用する前)、Pause 状態での
mouseover
イベントが
Inactive
状態での
mouseover
イベントと同じように処理されるようにします。JavaScript
では連想配列とオブジェクトは同等なので、表を修正する際にはどちらの表記を使用しても構いません。
ツールチップがフェードイン、フェードアウトしない場合
前のセクションでの設計変更で予期しないイベントについてのすべてのアラートを排除しても、Internet
Explorer
でテストを続けると予期しないイベントとは別の問題が見つかります。それは、FadingTooltipウィジェットで定義されたツールチップが、フェードイン、フェードアウトしないで唐突にビューに表示され、唐突に消えるという問題です。残念ながら、InternetExplorer
では標準として提案されている CSS
opacity
スタイルをサポートしていないためです (
「参考文献」
を参照)。
Internet Explorer では、同様の機能を持つ
filter
という非標準スタイルをサポートしています (
「参考文献」
を参照)。これを採用するには、
createTooltip
メソッドにリスト 7 に
bold
で強調表示した行を挿入して変更します。
リスト 7. Internet Explorer でツールチップを作成する追加 JavaScript
コード
FadingTooltip.prototype = {
...
createTooltip: function() {
this.tooltipDivision = document.createElement('div');
...
this.currentOpacity = this.tooltipDivision.style.opacity = 0;
if (this.tooltipDivision.filters) { // for MSIE only
this.tooltipDivision.style.filter = 'alpha(opacity=0)';
}
...
},
...
|
fadeTooltip
メソッドにも、対応する行を挿入する必要があります (リスト 8 を参照)。
リスト 8. Internet Explorer でツールチップをフェードイン、フェードアウトする追加
JavaScript コード
FadingTooltip.prototype = {
...
fadeTooltip: function(opacityDelta) {
...
this.tooltipDivision.style.opacity = this.currentOpacity;
if (this.tooltipDivision.filters) { // for MSIE only
this.tooltipDivision.filters.item('alpha').opacity =
100*this.currentOpacity;
}
},
...
|
捕捉として付け加えると、Opera
はブラウザーとして知名度が限られたブランド名ですが、技術者の中では高く評価されています。ただし
Operaでは比較的遅れてCSS opacity スタイルをサポートするようになったので、Opera バージョン
9 以前でも
FadingTooltipウィジェットはフェードイン、フェードアウトする代わりに、突然ビューに表示されて突然消えます。Internet
Explorer
とは異なり、Operaの初期バージョンには透明度として代用できる構文がありません。唯一のソリューションは、現行バージョンにアップグレードすることです。
パフォーマンスについての捕捉説明
よく使われているブラウザーで FadingTooltip
ウィジェットが滑らかに動作するようになったところで、プロセッサー使用率を最小限に抑えるというパフォーマンス目標にどれくらい近づいているかを調べてみましょう。Windowsでこれを簡単に調べる方法は、ウィジェットの動画を実行しているときに
Windows タスクマネージャのパフォーマンス・パネルを監視することです。
通常、ほとんどのワークステーションではアプリケーションを 1
つも開始していないとしても、複数のプログラムが常にバックグラウンドで実行されています。これらのプログラムには、Windowsタスクバーの時計の近くに小さなアイコンを表示しているものもあれば、目に見える表示が一切ないものもありますが、Windows
タスクマネージャのパフォーマンス・パネルには、すべてのプログラムのアクティビティーが表示されます(図 5
を参照)。
図 5. 標準バックグラウンド・アクティビティーが表示された Windows タスクマネージャ
FadingTooltip
ウィジェットを実行する前に、このバックグラウンド・アクティビティーの一部を取り除くと、ウィジェットのプロセッサー使用率が確かめやすくなります。Windowsタスクバーにアイコンを表示しているプログラムは大抵の場合、それぞれのコンテキスト・メニューから終了することができます。その他のバックグラウンド・プログラムについては、Windowsのコントロール
パネルでサービスを停止できます。
図 6 に示すように、静止した状態の 1.1GHz の Intel Pentium-III
プロセッサー搭載システムでは FadingTooltipウィジェットのプロセッサー使用率はごくわずかです。
図 6. ウィジェットの動画化アクティビティーが表示された Windows タスクマネージャ
ウィジェットの動画化に必要なプロセッサー使用量はごくわずかであるため、他のアクティビティーでプロセッサーに高い負荷がかかっていとしてもウィジェットは円滑に動作すると自信を持って言うことができます。
設計ドキュメンテーションの更新をお忘れなく
実装のテストが完了したら、ドキュメンテーションを更新して設計と実装に行った変更を反映させなければなりません。テストで発生した予期しないイベントは状態表の空のセルに対応するため、該当する空のセル(青で強調表示)
に、予期しないイベントに対処するために行ったアクションを記入します (図 7 を参照)。
図 7. テスト結果を反映した FadingTooltip ウィジェットの状態表
図 8 に示すように、対応する更新を状態図に加えるのも同じく簡単です。
図 8. テスト結果を反映した FadingTooltip ウィジェットの状態図
Internet Explorer の不透明度のスタイル設定方法に対応するために
createTooltip
および
fadeTooltip
メソッドに挿入したコードの行は、設計を変更するほどのレベルではないので、これについてはソースのコメントに記載します
(
「ダウンロード」
を参照)。
より高度な開発
この連載で目的としていたのは、有限状態マシンの設計パターンをブラウザー・ベースのアプリケーションに適用する方法、そして
JavaScript言語の 2
つの機能を利用して簡潔かつ効率的なプログラムを作成する方法を具体的に説明することです。この主旨に従って、FadingTooltipウィジェットを必要なものをすべて備えた
1 つの JavaScript
オブジェクトとして開発しました。このコードは堅固なものとなりましたが、それほど柔軟ではありません。そこでこの連載を終える前に、開発に磨きをかける方法をいくつか検討してみたいと思います。
その他の視覚的なウィジェットは、FadingTooltip
ウィジェットと同様の体裁と振る舞いをして、その恩恵を被ることができます。例えば、入力フィールドでの入力ミスに対する構文エラー・メッセージ、複雑なフォームを記入する際の補足事項、あるいは馴染みのないワークフローを案内するスタイル設定されたツールチップのようなボックス、といったものを表示する際に、イベントに応じてビューにフェードインさせ、カーソルと連動させて最終的にはイベントに応じてビューからフェードアウトさせるのも一案です。あるいは次の開発ステップとして、FadingTooltipコードをリファクタリングし、有限状態マシンの基本機構を個別のオブジェクトに移行させることもできます。リファクタリングの対象には、イベント・フック、イベント・ハンドラー、エラー・メソッド、そしてタイマー・メソッドが含まれます。FadingTooltipウィジェットをはじめ、リファクタリングした一連の視覚的なウィジェットを個別のオブジェクトとして実装すれば、基本オブジェクトのデータとメソッドを継承しつつ、それぞれのウィジェット・タイプに必要な状態変数、遷移表、そしてアクション・メソッドを追加したオブジェクトを実現できるというわけです。
ツールチップのようなウィジェットやその他の視覚的なウィジェットで、フェードイン、フェードアウトのような別の動画化効果を活用することも可能です。例えば、ツールチップをウィンドウの端からビューに滑り込ませたり、ある点からズームインするかのように拡大させるという効果もあれば、折り紙を広げていくようにアイコンから展開させたり、カーソルの動きに合わせてゼリーのように揺らすという効果もあります。このような動画化は、コンテキスト・メニュー、ダイアログ・ボックス、入力プロンプトで使用しても、ツールチップのようなウィジェットの場合と同じく効果的です。また、視覚的なウィジェットのフレームワークを作成し、それぞれの動画化タイプに応じた有限状態マシンとウィジェット・タイプごとの振る舞いを別々のオブジェクトに分けることによって、あらゆる組み合わせを特定のHTML
要素にバインドできるようにするという方法も考えられます。
当然、キーボードやネットワークによって発生するイベントなど、この連載では取り上げていないイベント・タイプもあります。例えば、テキスト入力フィールドに入力したそれぞれの文字が、有限状態マシンとして表現された正式文法を基にして入力時に値を検証したり、残りの有効な値を選択リストに表示するというアクションをトリガーするという場合です。あるいは失敗またはタイムアウトしたネットワーク要求を処理するために、プロトコル図として表現された代替サービスを再試行するという場合もあります。そこで考えられる次の開発ステップには、以下が関わってきます。
-
キーボード・イベントとネットワーク・イベントのフックを組み込んだ有限状態マシンのフレームワーク拡張
- 正式言語文法とネットワーク・プロトコルの図または表による表現
- テキストの値を検証するアクション、およびネットワーク・セッションを管理するアクション
同じプロセッサー上で実行中の他のアプリケーションがイベントを生成して、対象のアクションをブラウザーで実行中のプログラムに公開することもあります。その一例として、Voice-over-IP電話アプリケーションは
ring-in
、
ring-out
、
connect
、および
disconnect
イベントを生成し、
call
、
hold
、
hang-up
アクションを公開します。さらに別の開発ステップとして考えられるのは、フレームワークを拡張して、他のアプリケーションでのイベントをフックし、そのアプリケーション内でアクションを行うメソッドを組み込むことです。これには、ブラウザーで実行中の有限状態マシンが他のプロセスでのイベントとアクションにアクセスできるようにするためのJava™
プラグインが必要になります。JavaScript は Java
プラグインのスクリプト言語として始まったので、この連載を締めくくるにはまさにぴったりです。
参考文献
著者について  | 
|  | Edward Pring は、ニューヨーク大学でコンピューター・サイエンスの理学修士号を、スタンフォード大学で数学の理学士号を取得しています。IBM Research の一員として、オペレーティング・システム、パブリッシング・アプリケーション、メインフレーム用端末エミュレーター、パーソナル・コンピューター向けウィルス監視機能、Digital Immune System 対応のネットワーク・オートメーション、そして Web サービスの視覚化およびパフォーマンス分析など、広範な IBM 製品および技術に貢献しています。彼の特許ポートフォリオは、これらの分野すべてにまたがります。 |
記事の評価
|