インスタント・メッセージングのチャット・ソフトウェアを使ってきた人達の中には、チャットのルック・アンド・フィールやサーバー上のデータベースにメッセージを送信する方法を独自のコードでカスタマイズできる、無料のオープンソース 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) のみなので、デフォルトを変更し、他のクライアント (例えばシステム管理者の同僚など) がブロードキャスト・メッセージを送信できるようにする必要があるかもしれません。
まず、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';
|
デフォルトで、データベース設定の type と link はヌルに設定されます。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 はリソース効率を高めるためのいくつかの要素を利用して設計されています。第 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 です。
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 を欠陥やアプリケーションの追跡に使用します。
学ぶために
- Ajax Chat のインストールと構成に関するヘルプとして、SourceForge.net の Wiki セクションを利用してください。
- GNU Affero General Public License に関する資料を読んでください。
- 業界全体にわたって公開されている Ajax ライブラリーを調べたい場合には OpenAjax Registry を調べてみてください。
- Judith M. Myerson による「エンタープライズ規模の SOA における Web サービスの取り扱い」シリーズの記事は、エンタープライズ全体にわたる SOA の中で Web サービスを扱う方法を解説しています。
- Judith M. Myerson による「WebサービスのコンテキストにてSLAを使用する」シリーズの記事は SLA に関する詳細を解説しています。
- Ajax ツールに関する情報が必要な場合には「Ajax - 困っている人のためのガイド、第 1 回: Ajax のツールと手法の調査」(developerWorks、2007年7月) を読んでください。
- 「SOA における密結合の Web サービス」(developerWorks、2008年1月) は密結合の Web サービスと疎結合の Web サービスの両方について利害得失を解説しています。
- 『Enterprise Systems Integration, Second Edition』を読み、システム統合を確実に成功させるためのビジネス分析の方法と技術的なノウハウを得てください。
- technology bookstore には、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。
- developerWorks の Technical events and webcasts で最新情報を入手してください。
製品や技術を入手するために
- アーキテクチャー管理のための IBM Rational Web Developer for WebSphere Software、変更管理とリリース管理のための IBM Rational ClearQuest、品質管理のための IBM Rational Functional Tester Plus が Ajax その他のアプリケーション開発をどのように支援するかを学んでください。IBM によるこうしたツールによって企業のテスト・ラボでのテスト時間やコストを削減できるため、生産性を高めることができます。
- developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を利用して皆さんの次期開発プロジェクトを構築してください。
議論するために
- developerWorks blogs から developerWorks のコミュニティーに加わってください。