Perlでチャット(9) たのしいJavaScript

JavaScriptが楽しい・・・
掲示板のときにも多少はヒューマンインタフェース的なことこだわってたけど、(まあ自分に使いやすいように)チャットは細かいとこの気配りがもっと大事だと思った
例えばチャット開いたら名前入力欄にカーソルがあって、そのまま入力を始められる。入室後には発言欄にカーソルが合わさっている。
「小声」とか「炙り出し」とかそういうオプションを選択したあと、選択したものがそのままになっていたら戻さなければならないから自動で「普通」に戻るようにする。
いちいちタブキーとかクリックとかでこれらを手動でやってたら、地味にイライラする。
そういうのを手軽に実現できるのがJavaScript。こりゃあ便利だぞ・・・

Perlでチャット(8) 入室者リストと閲覧者数の実装完結編

できた・・・
閲覧者の方は、ログを読み込んだ人のIPを入室者リストに記録、
その人数を数えることで閲覧してる人数を数えるというもの。まあ本家もこんなもんだろ。
これも一定時間でリストから除外される。

とりあえずまあこれで、入室者リストと閲覧者リストが実装できたわけだ。
ついでに、色選択とかもつけてスタイルもcgiboyのものをパクって、見た目は相当完成に近づいた。
あとは余計な機能をつけつつ、携帯からの閲覧に対応しなきゃな。
他にやることいっぱいあるのでこれはほんと6月いっぱいにケリつけたい。
一応ある程度の機能はできたからもうチャットとしては使えるけどね。7月はもっと忙しくなるから。

Perlでチャット(7) 入室者リストと閲覧者数の実装実践編

とりあえず更新のたびにその時間をファイルに書き込み、その時間から一定時間経ったらその入室者をリストから消す、というのを実装しようとしたんだが・・・
思いのほか苦労した
発言や手動更新のときはいいんだけど、一定時間で自動更新する場合、METAタグで再読み込みしてるから名前などのデータを受け渡ししていない。
でまあとりあえず自動更新のたびにアドレスから変数を渡す(URL〜?変数名=○○)のを作ろうとしたんだけど、日本語の名前だとうまくいかない。
でまあ、一定時間ごとに送信とかやる時点でJavaScriptに頼るしかないと思い、ちょっと調べた。
JavaScriptはほんと勉強したことがないのであまりわからない。けどformの自動送信は調べたら出てきた
http://oshiete1.goo.ne.jp/qa949775.html?ans_count_asc=20

このsetTimeoutによる自動更新とdocument.form.submitを使うことで一定時間ごとの更新と名前などのデータの送信を実現できた。
というか入退室時のログ更新のときも思ったけど、JavaScript便利だわ・・・。
掲示板だと全然使わなかったけど、こういうある程度のリアルタイム性が必要なもの作るときはガンガン使うべきだな。
後でいろいろ学んでみよう。

Perlでチャット(10) 諸機能もろもろ色々実装

何度も言うけどJavaScript様様。
退室ボタンを、発言ボタンとは別フォームにしてるので(ターゲットを別にしてたってのと、同フォーム内でsubmit2つの処理方法がわからなかったので)入力欄に退室コメントを入力して退室してもそのコメントが引き渡されてなかったことに気づいた。
どうしたもんかと思ったけど困ったときのJavaScript
退室の方のフォームのonSubmitイベントで、発言の方のフォームのコメントを退室の方のフォームに引き渡す関数を作成する。ということで解決。
フォームの内容を共有あるいは引渡しできないかなあと思ってたらほんとにできてマジ感動。
いろいろやってるうちにJavaScriptのこともわかってきた。ソラで書けなくても、できること、できないことが予測できるようにはなったので開発が楽になるぞ。

あとはいろいろやっていろいろ実装した。細かいこと。
次はURL自動リンクやって、携帯からの閲覧ページの作成だな・・・
URL自動リンクは考えとしては単純だけど、どこまでをURLと判断するかは先駆者のコードを参考にしよう・・・
URLってアルファベットや数字だけじゃなくて記号なんかも含まれるものな

Perlでチャット(6) 入室者リストと閲覧者数の実装について

入室者リストを作成していて気づいた。
退室ボタンを押さないでウィンドウを消した場合はどうするんだろう・・・
cgiboyでは、一定時間経つとリストから消えていたけど・・・
これを実現するためには、参加者がログ更新をするたびにその人が「生存している」ということを確認する必要がある。
閲覧者数に関しても同様のことが言える。
うーん、実現する方法は思いつくんだけど・・・参加者(閲覧者)がログを更新するたびにメンバリストファイルを更新するなりなんなりすればいい
でもこんなにホイホイファイル読み書きするのには抵抗あるな・・・発言だけじゃなくてログ更新時もなんて。
しかしそれ以外に思いつかない。他に何か方法があるんだろうか・・・他のチャットのソースコードを見てみるしかないかな。

Perlでチャット(5) 今後の方針

一応最低限のチャットの機能ができたので次を考える。
・入室者の名前表示
・ログ管理(一定数以上で消去)
・携帯からの閲覧に対応
とりあえずこの3つかな・・・
もちろん他に細かいことはあるけど、細かいことはいつでもできる。
入室者の名前表示に関しては、こちらで名前を管理しなければならない。参考にしたチャットは最低限の機能しかなかったから、この機能はなかった。
一般的なチャットがどうやっているのかはわからないけど、まあ入室者リストをファイル出力するしかないよな。少なくとも俺の知識じゃそれ以外の方法は思いつかん。

ログ管理に関しては、まあ最も単純なのは一行書き込まれたら一行消せばいい・・というか行数の上限作ってそれより下の行は切る、ってほうが効率的で問題が少ないか。(新しい書き込みほど上の行にくる作りなので)

携帯に関しては未知数。まったくやったことがない。
まあ処理するのはサーバだから、表示上の制限があるだけで、Perlの制限はそんなになさそうだけど・・・とりあえず要勉強。

Perlでチャット(4) 入退室時の自動更新

で無意味に苦労したのでメモ。
発言フォームとログ表示部でフレームを分けているけど、普通に発言するときはログ表示部さえ更新されればいい。(formのターゲットがログ表示部のフレームであればいい)
しかし入退室時はどちらも更新させたい。今まで複数のフォームに同時送信とかやったことなかったからいろいろ考えた。
結局フォームうんぬん関係なしにJavaScriptで強制リロード
onLoad=parent.[フレーム名].location.reload(true)
で実装。しかしこれだと入退室を繰り返すとフォームの再送が発生してしまう・・・ということで
parent.[フレーム名].location.href=〜(指定のアドレスへ)
を併用することで解決。
実際は入退室時に更新されなかろうとなんだろうとどうでもいいことなんだけどね・・・