本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Ajax によるチャット

Judith Myerson, Systems Engineer and Architect
Judith M. Myerson はシステム・アーキテクト兼システム・エンジニアです。ミドルウェア・テクノロジー、エンタープライズ・ワイドのシステム、データベース・テクノロジー、アプリケーション開発、ネットワーク管理、セキュリティー、そしてプロジェクト管理を含む数多くの分野に関心を持っています。

概要: 皆さんは Ajax (Asynchronous JavaScript and XML) を使ってチャットをしてみたいと思いませんか。また、例えば保証されたサービス・レベルよりもパフォーマンスが下回った場合などのシステム・イベントに応答して、オープンソースの専用 Web チャットがポップアップ表示され、何が起きているのか通知してくれたら便利だと思いませんか。この記事では developerWorks 常連の寄稿者である Judith Myerson が、2 つのパネルによるシステム管理者用のチャットの考え方を紹介します。このチャットでは、一方のパネルでプライベートなメッセージを交換し、もう一方のパネルで一般ユーザーにメッセージをブロードキャストすることができます。またこの記事では、チャット・サーバーの過負荷に対するソリューション、Ajax Chat をダウンロードする際の問題、構成の変更方法、さらには必要な数だけチャネルを追加する方法についても説明します。

日付:  2009年 3月 17日
レベル:  中級 この記事の原文:  英語
アクティビティー: 4053 ビュー
お気軽にご意見・ご感想をお寄せください: 


はじめに

インスタント・メッセージングのチャット・ソフトウェアを使ってきた人達の中には、チャットのルック・アンド・フィールやサーバー上のデータベースにメッセージを送信する方法を独自のコードでカスタマイズできる、無料のオープンソース Web チャット・ソフトウェアを探している人がいるのではないでしょうか。それがまさに Ajax Chat です。Ajax Chat は JavaScript とPHP、MySQL で実装され、GNU Affero General Public License の下でリリースされているアプリケーションです。

Ajax Chat にはスタンドアロン・バージョンとフォーラム統合バージョンという 2 つがあり、好きなだけチャネルを追加することも、あるいはチャネル数を制限することもできます。ホスト環境でチャットの最大チャネル数が制限されることはなく、またチャネルを追加しても (ユーザーやデータベースを追加した場合と同様で)、既存のリソースに影響を与えない限りコストに影響することはありません。

Ajax Chat を使うとできることには、プライベート・メッセージを送信することや、ブロードキャスト・メッセージを送信すること、チャット内のメッセージを削除すること、チャットを開いておく時間を指定すること、長さカウンターを設定すること、CSS (Cascading Style Sheets) やテンプレート・システムを使ってレイアウトをカスタマイズすること、などがあります。Ajax Chat ではセキュリティーが考慮されており、コード・インジェクションや SQL インジェクション、クロスサイト・スクリプティング、セッション盗用、その他の攻撃を防ぐことができます。ただしお使いのシステムには、チャットの脆弱性を悪用したハッカーの攻撃を許さないように確実な対抗策を用意しておく必要があります。

チャネルに関するウィッシュリスト

1 つのチャネルをシステム管理者やユーザー管理者のチャット専用に用意し、システムのステータスに関するアラートをリアルタイムで送受信できると便利です。そうすれば、例えばシステム・イベントをトリガーとして、このチャネルをポップアップ表示し、数秒後、管理者がクライアントから離れた場所にいるとシステムが判断すると、即座に注意を引くために警告音を発して管理者に通知する、といったことができます。システム・イベントの例には以下のようなものがあります。

  • SLA (Service Level Agreement) で規定された保証サービス・レベルよりもパフォーマンスが低下し始めた場合。
  • パフォーマンスを適切なサービス・レベルに戻すためのツールを提案する場合。
  • ステータスのリカバリーが進行中の場合。
  • 保証されたサービス・レベルまでパフォーマンスが復帰した場合。
  • パフォーマンスが指定サービス・レベルを下回った期間、そしてそれが発生したシステム上の場所を通知する場合。

このウィッシュリストの中には、管理者のチャット用の第 2 のパネルも含まれます。このパネルを使って、例えばパフォーマンス・レベルのステータスや、修理や保守のためにソケット・サーバーを停止する日時と復帰する日時などのメッセージをユーザーにブロードキャストするのです。システムが正常に実行されている場合には、開発者や管理者は業界全体にわたって公開されているオープンソースの Ajax ライブラリーを示すために第 2 のパネルを使うことができます。

チャット・クライアントはソケット・サーバーとの間に永続的な接続を確立し、チャット・メッセージをリッスンする必要があります。デフォルトではメッセージをブロードキャストできるのはローカル・クライアント (127.0.0.1,::1) のみなので、デフォルトを変更し、他のクライアント (例えばシステム管理者の同僚など) がブロードキャスト・メッセージを送信できるようにする必要があるかもしれません。

Ajax Chat をダウンロードする

まず、SourceForge.net にある Blueimp の Ajax Chat にアクセスします。そこにはいくつかのファイルを含んだパッケージがあるので、もちろんメインのチャット・アプリケーションのファイルである ajax_chat-0.8.1.2.tar.gz を最初にダウンロードして解凍する必要があります。

圧縮ファイルを解凍すると、ファイル類は自動的に css、flash、img、js、lib、socket、sounds、src といったフォルダーに配置されます。他にもダウンロードが必要なファイルがあり、これらのファイルによって Ajax Chat が phpBB2、phpBB3、MyBB、PunBB、SMF、vBulletin その他の PHP コミュニティー・ファイルと統合されます。

サーバー・サイドのチャット・ファイルをアップロードしてインストールする前に、データベース、チャネル、ユーザーという 3 つの構成設定を編集する必要があります。チャット・ファイルをアップロードしたらデータベース・テーブルを作成し、インストール・スクリプトを削除します。サーバーには MySQL をインストールする必要があります。

データベースを設定する

Ajax Chat はサーバー上にスタンドアロン・バージョンとしてセットアップすることもでき、あるいはフォーラム統合バージョンの 1 つを使うこともできます。ただし、いずれの場合もデフォルトの構成を変更し、セキュリティーを強化する必要があります。

スタンドアロン・バージョンを使う

Ajax Chat を使うためには、まず lib/config.php ファイルの設定を行います。Ajax Chat をサーバー上でスタンドアロン・バージョンとして使用したい場合には、データベースの host、user、pass、name をそれぞれ localhost、user name、password、database name に設定します。リスト 1 はこの方法を示しています。


リスト 1. スタンドアロン・バージョン用のデータベース設定

$config['dbConnection']['host'] = 'localhost';
$config['dbConnection']['user'] = 'your_database_username';
$config['dbConnection']['pass'] = 'your_database_password':
$config['dbConnection']['name'] = 'your_database_name';
            

デフォルトで、データベース設定の typelink はヌルに設定されます。type がヌルに設定されると、データベースはデフォルトで mysqli になりますが、それを mysql に変更します。link は既存のデータベース接続のリンクまたはオブジェクトを参照するように設定します。link をヌルに設定すると、新しいデータベース接続が作成されます。

フォーラム統合バージョンを使う

フォーラム統合バージョンの 1 つを使いたい場合には、そのフォーラムの既存のデータベース接続を Ajax Chat が使うように設定します (そのためにはすべてのデータベース構成をヌルに設定します)。フォーラム統合バージョンに対して別のデータベースを使用する場合には、lib/class/CustAJAXChat.php ファイルの中の 1 行をコメントアウトする必要があります。例えば phpBB3 との統合バージョンの場合には下記の行をコメントアウトする必要があります。

$this->setConfig('dbConnection', 'link', $db->db_connect_id);

これが終わったら、スタンドアロン・バージョンの場合と同じようにデータベースの設定を行います。

フォーラムのシャウトボックスとしてチャットを使用したい場合には、chat ディレクトリーの URL とパスを変更する必要があります。そのためには、まず includes/functions.php ファイルを開き、chat フォルダーの URL とパスを探します。下記はその一例です。

define('AJAX_CHAT_URL', '/chat/');
define('AJAX_CHAT_PATH', realpath(dirname($_SERVER['SCRIPT_FILENAME']).'/chat').'/');

どちらのインスタンスの場合も ‘/chat/’‘../chat/’ に変更します。

チャネルを設定する

lib ディレクトリーの中で data サブディレクトリーまでナビゲートし、channels.php ファイルを探します。仮に、一意の ID と名前を持つ 3 つのチャネルが必要だとします。リスト 2 はそのための方法を示しています。


リスト 2. チャネルを設定する

$channels=array()
$channels[0]='Public'
$channels[1]='123'
$channels[2]='456'
            

次に、20 チャネルに拡張するとします。channels.php ファイルを編集する時間を節約するために、下記のように config.php ファイルの中でチャネルを 3 チャネルに制限します。

$config['limitChannelList'] = array(123,456,789);

この設定は、チャネルとして使用できる ID は 123、456、789 のみであり、他の 17 チャネルは使用しない、ということを言っています。これらのチャネルをカスタムのチャット・チャネルとして追加するためには、lib/class/CustomAJAXChat.php ファイルの中の getChannels() メソッドと getAllChannels() メソッドを調整する必要があります。getChannels() メソッドは現在のユーザーがアクセスできるチャネルの配列を返し、getAllChannels() メソッドは現在のユーザーがアクセスできるか否かによらず利用可能なすべてのチャネルの配列を返します。

チャネルを追加するためには、まず getChannels() メソッドに下記のコードを追加します。

$this->_channels = array_merge($this->_channels, 
 array('Extra_Public_Channel_1'=>123, 'Extra_Public_Channel_2'=>456, 
 'Extra_Public_Channel_3'=>789));

追加する場所は下記のコードの前です。

} return $this->_channels;

同じことを getAllChannels() メソッドに対しても行います (_channels_allChannels で置き換えます)。

設定を編集する

data サブディレクトリーの中で user.php ファイルを探します。各ユーザーが一意の ID と一意の名前を持っていることを確認します。リストの中にある最初のユーザーはゲスト・ユーザーとして設定され、すべてのゲスト・ユーザーは、ゲスト・ユーザー用に設定されたチャネル群とユーザー・ロール AJAX_CHAT_GUEST を利用することができます。ゲスト・ユーザーにはユーザー名とパスワードは割り当てられません。


リスト 3. デフォルトのゲスト・ユーザー

// List containing the registered chat users:
$users = array();

// Default guest user
$users[0] = array();
$users[0]['userRole'] = AJAX_CHAT_GUEST;
$users[0]['userName'] = null;
$users[0]['password'] = null;
$users[0]['channels'] = array(0);
            

登録されたユーザー、モデレーター、管理者に対してユーザー・ロールを許可する場合には、ゲスト・ユーザー用のユーザー設定を削除してはなりません。リスト 4 は管理者用のユーザー設定の例を示しています。


リスト 4. 管理者ユーザー

$users[1] = array();
$users[1]['userRole'] = AJAX_CHAT_ADMIN;
$users[1]['userName'] = 'admin';
$users[1]['password'] = 'admin';
$users[1]['channels'] = array(0,1);
            

必ずデフォルトのユーザー名を変更して、強力なパスワードを設定します。

ユーザーに管理者やモデレーターの権限を付与するには、lib/class/CustomAjaxChat.php ファイルの中の getValidLoginUserData() メソッドを調整します。例えば ID が 123456 の特定ユーザーにモデレーター権限を許可するためには下記のコードを追加します。

if($userData['userID'] == 123456)
   $userData['userRole'] = AJAX_CHAT_MODERATOR;
            

追加する場所は下記のコードの前です。

return $userData;

そして config.php ファイルを開き、下記のコードを追加します。

$config['customModeratorList'] = array(123,456,789);
            

追加する場所は下記のコードの前です。

?>

次に、lib/class/CustomAJAXChat.php ファイルの中の getValidLoginUserData() 関数に下記のコードを追加します。

if($this->getConfig('customModeratorList') && in_array($userData['userID'], 
  $this->getConfig('customModeratorList'))) {
  $userData['userRole'] = AJAX_CHAT_MODERATOR;
}
            

追加する場所は下記のコードの前です。

return $userData;

ファイルをアップロードする

フォーラム統合バージョンを使用する場合には、サーバーのドキュメント・ルートの下にファイル群をアップロードします (例えば http://example.org/forum/chat など)。

例えば (下記のように) forum ディレクトリーの中ではない別のディレクトリーでチャットを使いたいとします。

http://example.org/chat
http://example.org/forum
            

その場合には lib/custom.php ファイルを開き、$phpbb_root_path = AJAX_CHAT_PATH.'../';$phpbb_root_path = AJAX_CHAT_PATH.'../forum/'; に変更します。

データベース・テーブルを作成する

次に、chat フォルダーの中にデータベース・テーブルを作成します。そのためにはサーバー上で install.php を実行するか、あるいは phpMyAdmin を使ってテーブルを作成します。テーブルを使用する前に、インストール・スクリプトまたは phpMyAdmin を使って chat.sql を編集することができます。それが終わったら install.php を削除し、Web サイトの chat フォルダーへのリンクを用意します。

Ajax Chat の問題点とソリューション

Ajax Chat はリソース効率を高めるためのいくつかの要素を利用して設計されています。第 1 に、サーバーが実行する操作は複雑ではなく、データベース・クエリーは単純です。第 2 に、大部分の作業はクライアント・サイドで行われます (つまりコードを処理し、ハイパーリンクを実行し、そしてカスタムの顔文字を表示するのは JavaScript です)。そして第 3 に、更新データのみがサーバーからクライアントに送信され、トラフィックが低く保たれます。

こうしたことによる 1 つの問題として、サーバーの負荷が高い場合にはサーバーからクライアントにデータをプッシュするためのリソース効率があまりよくありません。そしてもう 1 つの問題は、デフォルトの構成ではセキュリティー・ホールがあるため、ハッカーに攻撃される恐れがあることです。

サーバーの過負荷に対するソリューション

サーバー負荷を軽減するための 1 つの方法は、ソケット・サーバーを使う方法です。そのためには、Flash ベース (クライアント・サイド) または Ruby ベース (サーバー・サイド) のソケット接続をインストールして使い、チャット・クライアントが永続的にサーバーから更新をプルするようにします。サーバー・サイドからイベントをプッシュするためには、クライアントとサーバーとの間に永続的な、あるいは長期間持続するソケット接続が必要です。そのためにはカスタムの HTTP サーバー (「comet」と呼ばれます) か、別のカスタム・ソケット・サーバーが必要です。しかし私の見解としては、この方法はサーバーが更新データをプッシュする方法としてはあまり効率的ではありません。

この問題を回避するために、Ajax Chat は JavaScript から Flash へのブリッジを使ってクライアント・サイドから永続的なソケット接続を確立します。そのためにはソケット・サーバーを実行するサービスとして Ruby スクリプトを実行できる必要があります。このサービスを最初に起動するためには、socket ディレクトリーの中にあるスクリプト・ファイルを実行する必要があります。下記はその一例です。

chmod +x server
chmod +x server.rb
            

ここで server は bash スクリプトであり、server.rb は Ruby によるソケット・サーバーのスクリプトです。

任意のタイミングでこのサービスを起動/停止するためには、./server start./server stop を実行します。チャット・サーバーを停止しようとしても停止できない場合には、$PID (そのサービスのプロセス ID) を -HUP オプションを使ってキルしてみます。

サーバー・サイドのチャット・スクリプトによって必ずチャット・メッセージがソケット・サーバーを介してブロードキャストされるためには、lib/config.php ファイルの中で $config['socketServerEnabled'] を「真」に設定します。メッセージをブロードキャストする場合でソケット・サーバーが別のホストで実行されている場合には、ブロードキャスト・クライアントのオプションをチャット・サーバーの IP に設定する必要があります。

ソケット・サーバーがない場合のソリューション

仮に、ソケット・サーバーが保守や修理のためにダウンしているとしましょう。そうした場合には、一時的に使用できないソケット・サーバーをエミュレートする必要があると同時に、サーバーからのトラフィックを低く抑え、クライアント・サイドからの応答時間を改善する必要があります。また、更新呼び出しの時間間隔の設定はありません。

そこで、更新呼び出しの時間間隔を設定し、チャットの更新を遅延させ、最大ユーザー数を設定する必要があります。まず、新しいチャット・メッセージを取得する間隔を js/config.js ファイルの中で 3 秒に設定します。下記はその一例です。

timerRate: 3000

デフォルトの時間は 2 秒です。

次に、JavaScript ファイルの中で StartChatOnLoad を false に設定してチャットの更新を遅延させます。チャットの更新は、チャットがロードされてチャット開始イベントが実行されるまで遅延されます。

オンライン・ユーザーの最大数は lib/config.php ファイルの中で下記のように設定します。

$config['maxUsersLoggedIn'] = 80;

チャットのユーザーの最大数を設定しても、モデレーターや管理者の最大数に影響することはありません。デフォルトの最大数は 100 です。

Flash のセキュリティー・エラーに対するソリューション

JavaScript からチャットへのブリッジを使用する場合には、Flash を使ってソケットを作成するための許可が必要です。9.0.115.0 以上のバージョンの Flash では、ソケット接続を作成するためには (xml 構文を使った) 明示的な許可が必要です。それ以前のバージョンの Flash を使用している場合には、ソケット・サーバーをアクティブにしてもブラウザーで Flash のセキュリティー・エラーが発生します。

この問題のソリューションとしては、サーバーのポート 843 の接続をリッスンするポリシー・ファイル・サーバーを使うことです。クライアントがチャットに接続しようとするたびに、Flash クライアントはサーバーに対してポリシーの許可を要求します。必要な場合には Flash のセキュリティー・ポリシーをダウンロードすることができます。

問題を修復しようとしているときにセキュリティー・エラーが表示されることが気になる場合には、js/chat.js ファイルの中の下記の行をコメントアウトすると、そうしたエラー・メッセージが表示されなくなります。

setTimeout('ajaxChat.addChatBotMessageToChatList(\'/error SocketSecurity\')', 0);
            

まとめ

この記事は皆さんの環境にチャット・システムを追加する上で役立つはずです。ユーザーはシステム・イベント (例えば保証されたサービス・レベルよりもパフォーマンスが下回った場合など) に対してポップアップ表示されるオープンソースのチャットを潜在的に求めていますが、プロジェクト・チームの開発者や他のメンバーは作業を楽にする方法を求めるため、そうした要求に応えることは簡単ではありません。Ajax Chat を設計する上での問題やプロジェクトに潜在するリスクを認識して解決することで、プロジェクト・チームのトラブルを回避することができます。そのためには、IBM Rational® Web Developer WebSphere® Software を Ajax アプリケーションの作成に、また IBM Rational ClearQuest を欠陥やアプリケーションの追跡に使用します。


参考文献

学ぶために

製品や技術を入手するために

議論するために

著者について

Judith M. Myerson はシステム・アーキテクト兼システム・エンジニアです。ミドルウェア・テクノロジー、エンタープライズ・ワイドのシステム、データベース・テクノロジー、アプリケーション開発、ネットワーク管理、セキュリティー、そしてプロジェクト管理を含む数多くの分野に関心を持っています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=381389
ArticleTitle=Ajax によるチャット
publish-date=03172009
author1-email=jmyerson@bellatlantic.net
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。