Perl + C + JavaScriptで動作するリアルタイムWebチャット

構想数年、着手約3ヶ月、やっとベータ版が完成しました。リアルタイムWebチャットサービスの “ChatPrompt” です。

まだ一部機能(Ajaxエラー発生時の再送等)が未実装ですが、C言語での作成部分が開発環境ではテストしきれないので、実環境にアップしてしまいました。

ChatPrompt
http://www.chatprompt.com/

さくっと個別のチャットを作れて、ユーザ登録等の面倒な手続きも不要なので、ぜひ使ってみてください。
ただし、まだベータ版です。いくつか不具合も出るかもしれませんがご了承くださいね。

とても質素なWebサイトにも関わらず、これでもだいぶん時間がかかってしまいました。作業時間があまり取れなかった事もありますが、けっこうこだわってじっくり作った自己満足の固まりです。

以前、シェル風のWebインターフェース(LFshell)とCometを使った簡易なWebチャット(LFchat)を作った後に、これらをミックスしたシンプルで高速なリアルタイムチャットを作りたいなぁ、とずっと思っていました。
この度やっと実現しました、しんどかった。。

以下、その自己満足さ加減がよく分かる説明を自己満足満載にしているので、ぜひ読んでください。

Comet処理をC言語で実装&カーネルイベントの使用で効率化

リアルタイムチャットを実現するためにロングポーリングのCometを使用しています。CGIベースのレンタルサーバでこれを実現しているので、利用中のユーザ数分のプロセスがWebサーバ側で動作する事になります。共用のレンタルサーバなので使用リソースを最小限にするために、Comet処理を担当する CGIはC言語で作成しています。また、メッセージの書き込みをカーネルイベントで取得しているので、待機中の負荷も最低限に抑えています。プロセス数を抑えるために、同時セッション数が一定以上になった場合は間欠ポーリングになります。

リクエストをキュー処理してセッション数を削減

高速なインターフェースを実現するためにAjaxを使っていますが、ユーザの入力の度にAjaxリクエストを行うとサーバが混んでいる等でレスポンスが遅い場合にセッションが重複してしまいます。ChatPromptでは送受信それぞれ1セッションのみに制限するようキュー処理を行っています。1回のAjax処理中にユーザの入力が複数回あっても、それらをキューに退避して、次のAjax処理でワーカーがまとめてリクエストします。

CSSとJavaScriptの縮小化

データ転送量を削減するために、CSSとJavaScriptを縮小化しています。これらコード自体を動的に変更しているので、縮小化もオンザフライで行っています。

各種ブラウザに対応

なんと今さらInternet Explorer 6にも対応。Firefox、Safari、Chrome(あ、Opera忘れてた。。)の他、iOSのMobile Safari、Androidにも対応させています。これらスマホ系のブラウザで実装されているViewportにも対応しており、画面の拡大縮小に合わせ てコンテンツの幅を自動調整します。

新たなにPerlのWebアプリケーションフレームワークを作成

これまで数年間Waftを使ってきましたが、Waftは上位互換と拡張性を意識しすぎてコードが複雑になりOOも活かしきれていませんでした。これを機に関数ベースでWaftの便 利機能のみを切り出していくつかの新機能を追加し、Oneという小さなフレームワークモジュールを作りました。デフォルトでContent-Lengthの出力に対応していたり、CGIクエリの展開変数にtieを使ってわざわざundef確認しないでもよくなったり、けっこういい感じのモジュールなんですよ。

まだまだ書き足りない。。