管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || アンテナ || PUT || more≫ ≫omit
shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage ||[edit]
category: WebsiteWork/CgiPerl/KoroboRoom

WebsiteWork/CgiPerl/KoroboRoom/2 - 掲示板兼用チャット改造計画。2002/11/17-2002/11/26

LastModified :
[管理]

掲示板兼用チャット改造計画。2002/11/17-2002/11/26

| むず痒いパソコン日記 | WebsiteWork | WebsiteWork/CgiPerl || 関連ページ:KoroboRoom |

2002/11/17(sun)(深夜)

[TOP↑] [管理]

NN4.xユーザーと使っているチャットがある。 スクリプトの配布サイトの掲示板でチャット用のスキンを見つけたのでもらってきて、差し替える。

その NN ユーザーが、差し替えたチャットでは [Enter] で書き込みが出来ないと言うので、原因調査。

前のチャットは入室画面があって、そこで名前を記入していたので、書き込みフォームにはメッセージ用のテキストボックスが一つしかなかった。差し替えた korobo のチャットスキンでは、名前とパスワードとメッセージ用のテキストボックスがある。

というわけで、入室画面を作ることにする。ところがどういうわけかうまく行かない。メッセージ入力の画面から「名前」のテキストボックスを撤去すると、書き込めなくなってしまう。必須項目から外したけど、うまく行かない。そもそも [名前が入力されてません] というメッセージが出るわけではないので、ソレとコレとは関係がない。

しばらくして、最初は本当に書き込みが出来なかったが、後段は書き込みが出来ないのではなく、[Enter]キーで書き込みが出来ないだけだと気付く。「書き込みボタン」を押せば書き込める。 …なんでだ…? しばらく考えたけど、諦めて放棄。

2002/11/17(sun)(夕方)

[TOP↑] [管理]

[Enter]入力解決編

[TOP↑] [管理]

どうやら、書込みには[name="mode.regist"]というのが必要らしい。最初はこれが抜けていたので、全く書き込みができなかった。 ところが、 <input type="submit" name="mode.regist" value="書く"> とすると、例の [Enter] 書き込みが出来ない状態になってしまう。

1行掲示板のほうでは、名前を削ろうが[Enter]で書き込めるわけなので、目を皿のようにして form 内のタグを比較する。夕べ長々と格闘していたことが、ものの数分で解決。犯人は、↓の1行。

<INPUT TYPE="hidden" NAME="mode.regist" VALUE="1">

hidden で送ってやればよかったんだって。 夕べももちろん比較はしたんだけど、集中力がなくて、「見落とす」のを覚悟で ナナメ読みをしていたのだった。眠いときにやってもダメね。

入室画面作成編

[TOP↑] [管理]

とりあえず、名前とパスを入力するテキストボックスを作る。さて、[入室する]ボタンで、クッキーを送り、同時に書き込みフォームに移動したいわけだが、できない…。 action のURLに引数を与えてみたがダメ。なんでだ。

普通の HTML では form タグなんか滅多に使わないので、実はよく解っていない。 しょうがないので、JavaSciptで [onClick="form.location='$script?form=***';"] なんて事をしてみたが、やっぱりダメ。なんでだ。

どうせ人員2名のチャットなので、他約1名のコンセンサスが得られればいいのだ。 クッキー保存のボタンと分けて、入室用のリンクを作るという不体裁な仕様のまま放置。

2002/11/17(Sun)(夜)

[TOP↑] [管理]

前のチャットには、「顔文字機能」というおもちゃがついていた。 セレクトボックスから文末に顔文字を挿入する顔文字を選べるわけである。 顔文字なんぞ滅多に使わないのでどうでもよいのだが、 せっかく korobo にはオプションの項目がある。あるものは使ってみたい。 顔文字機能をつけることにしてみる。

1回目の試技。書き込んだ後も顔文字が残ってしまう。 もともと JavaScript で書き込み後に書き込みフォームの文字列がクリアされるようになっているので、 ここにセレクトボックスもクリアする処理を加える。

で、なんなくうまくいったように見えたが、突然、IEで書き込みが参照文字に化けてしまう現象が発生。 …な…なんでだ…。 NNだと大丈夫なんだけど。

追加した顔文字用のセレクトボックスを削除すると現象が消える。さっきはうまく行ってたのに、どこで間違えたんだろう。ややしばらく実験して、opt ファイルの

@ITEMS_opt1 = qw(&nbsp; *** *** ...)

コレが犯人と判明。何でかは知らないが、とにかく空白に参照文字を使ってはいけないらしい。 じゃあ、配列の中に半角スペースを使いたいときはどうしたらいいの? っていうか、よくダブルクォーテーションで括って、カンマで区切ってる配列があるんだけど、 ああするにはどうすればいいの? よく解らないので、先頭には全角スペースを入れてゴマかす。

ついでに今日のワンポイント。 [$tt_chk] コレ入れ忘れると、チェックボックスの選択項目がクッキーに残りません。 セレクトボックスの場合は[$tt_cel]。 セレクトボックスは、前に1行掲示板のスキンを作っていたときに発見したんだけど。

2002/11/19(tue)

[TOP↑] [管理]

辞書機能を使ってみる。とりあえず、句点を「だぴょん。」読点を「にゃ、」に変換。 バカだ…。しかし、読点の「にゃ、」は付く場所によって文意が変わってしまったり意味が不明になったりするトコロがある。例えば「そうか、」が「そうかにゃ、」では疑問文のようだし、 「あ、」が「あにゃ、」では意味不明だ。 というわけで、「そうかにゃ、」を「そっかぁo(・o・)o″、」に、 「あにゃ、」を「゛(・o・)アっ、」に再変換。 まあ、句点の前に「あ」が来ると意図しない変換をされそうだが、 適当に作った「゛(・o・)アっ、」の顔文字が、小さい文字で見ると妙にカワイイのでOKだ。 変換された文章をざっと読みながら、他にも「゛(・o・)アっ、ココもヘンだぴょん。」と思ったら適宜修正を加える。たいへんバカバカしい辞書が出来ました。

2002/11/21(thu)

[TOP↑] [管理]

辞書の続き編

[TOP↑] [管理]

テストに「窓の杜」の文章を適当に貼り付けて変換してみた。辞書のアナが発覚。たまたま括弧書きの多い文章だったのだが、括弧直前と括弧内の最後に句読点がないため、非常にマトモな文章になってしまう部分が多い。許せない。

そんなわけで、[です)]「である(] のような語尾と括弧の組み合わせで辞書を追加。ついでにそのままコピーして置換、カギ括弧も変換。一気に登録単語数が増えてしまった。

ところで wiki をいじっていたときに、変換するのに「順番がある」のが今ひとつ理解できなかったんだけど 、この辞書を作っていてよく解った。 つまり、「長い文字列を最初に、短い文字列を後に書く」という順番なんだけど、そうか、短い方を先に変換したら、長い文字列が変換できなくなるのは当たり前か。 [123]を[あいう]に変換した後、[12345]を[あいうえお]には変換できないよね。 既に[あいう45]という文字列しか存在しないんだから。それにしてもつくづく 数学脳 がないアタマ…。

掲示板機能追加編

[TOP↑] [管理]

個人用に作った、1行レスつき掲示板がメモ用にとっても便利、というわけで、1行掲示板として使われることの多いチャットに「掲示板機能」を追加。 つまり、チャットは親記事を延々作っていて、子記事のデータスペースが余っているわけで、ここを利用しようというわけ。従来はコピーして返信というようなことをしていたりしたわけだけど、直接返信できれば便利。

ただちょっと問題があって、返信してスレッドが上がるのはあまり好ましくない。 何行かにわたる伝言をチャット画面に書いたりした場合、それらが離れ離れになると困ったことになる。 返信でスレッドを先頭に移動しないようにするにはどうしたらいいのでしょう? 多分出来そうな気がするんだけど。

メインの CGI を漁って、['ddate']というソート順があるのを発見。 何順かは知らないが、ためしに指定してみる。どうやらソートしない模様。 なんか違う指定があるような気がするけど、とりあえずはコレで。

でも、一方では下のほうに返信した場合には見逃されてしまう可能性がある。 一々、「下の何番に返信した」と書くのも、アレだ。 何より、せっかく1行掲示板なのに、後ろのページに返信すると一々先頭のページに戻ってしまい、連続して返信が出来ないのも不便。

2002/11/22(fri)

[TOP↑] [管理]

korobo ユーザーのサイトで、別のチャット用スキンは見つけていたのだけど、まだサンプルがあるだけで配布されていなかった。今日行ってみたら配布が始まっていたので、試しにもらってきてみる。

なんと、「入室者」の表示が出来るのだ。 実は珍しく連続で3回程かち合ったんだけど、しばらく相手がいることに気付かない。 3レスぐらい伝言を書いてから、ふと、文字色の違う行があることに気付いて「あら、いたの」ということになる。というわけで、入室者の表示は欲しい。 「いらっしゃいませ」「また来てね」のメッセージは、人員2名だし通常は伝言板なのでどうでもよいが。

さて、サンプルではメッセージを表示するフレームに [enter][Exit] のボタンがあって、それをクリックすると入室者と「ようこそ」のメッセージが出るようになっている。 でも、こちらは[Enter]ボタン相当のものを外に出してしまったので、構造から変えるのは面倒だ。 どうしたもんか。

試しにスクリプトの部分、

<KOROSCRIPT>
<!--
$c_name or $g_name = ""; 
$in_message = "『$g_nameさん、いらっしゃいませ』";
$exit_message = "『$g_nameさん、またいらっしゃいませ』";

open(LOG, "$data_dir/korobbs.dat") or error("ログが開けません");
$line = <LOG>;
@line = <LOG>;
close(LOG);
chomp $line;
foreach $line (@line){
 ($num,$oya,$name,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectime,$rc,$rl,$gc1,$gc2) = split /<>/, $line;
    if($time-$rectime < 600){
         push @inname, $name;
         if($opt1 eq 'in'){push @inname, $name;}
    }
    if($opt1 eq 'exit' and $time-$rectime < 600){push @exitname, $name;}
}
@inname = grep(!$seen{$_}++, @inname);
@exitname = grep(!$count{$_}++, @exitname);
foreach $exitname (@exitname){@inname = grep {$_ ne $exitname} @inname;}
$inname = join(" ", @inname);
-->
</KOROSCRIPT>

をそのまま貼り付けたら、最初の発言をすると勝手に入室者が表示されるようになった。どうやら、掲示板のほうにもぐって発言していても表示される模様。あ、それはいい。

あっけなかったので、「ようこそ」と「さよなら」のメッセージを出そうと考える。 というか、「ようこそ」はさておき、都合上入室者の表示を長めにしてしまったのとで、 「さよなら」で明示的に「入室者」から名前を消せたほうがいいかと思ったんだけど。

しかし、どういうわけか、名前のところに自分の名前が出てしまう。 opt ファイルの [$master] で指定した名前になるはずなんだけど。 さらに、[exit] ボタンをつけてみたら、なぜか発言しても入室者が表示されなくなった。 ソレは困る。というわけで、[Enter][Exit] ボタンは放置。

それより、何のタイミングでそんなことになったのか知らないが、現行ログを200に指定していたのに(チャットの画面では20、伝言版用途にも使うので、掲示板の前にもログを見るスキンをつくってあった)、40発言以降が飛んでいる…。過去ログにもない。 なんてことでしょう。まだ「他1名」に読まれていない部分があったのに(テストの発言が沢山あったので、用件のログが後ろに追いやられていて、その部分が飛んだのだった)。

慌てず騒がず、別のパソコンのキャッシュから引っ張り出してアップする。

後日談。

[TOP↑] [管理]

これを書いている 2002/11/25(mon)。上のスクリプトに [$master] の変数格納場所がないことに気付く(笑)。 元のスキンを開いて $master で検索したら、最初の<!-- CHOP -->の下に、もう一つスクリプトがあった…。

<KOROSCRIPT>
<!-- 
if($opt1 eq 'in' or $opt1 eq 'exit'){$name = "$master"}
-->
</KOROSCRIPT>

だ、そうです。

今日のワンポイント。辞書で小さい「ぇ」が、「aE」に化けている。半角文字を使うと化けるのは配布元の掲示板で見たけど、なぜ? ちなみに小さい「ぁ」は無事なんだけど。

2002/11/23(sat)

[TOP↑] [管理]

新しいお遊びのテーマ2つ。

返信件数の表示編

[TOP↑] [管理]

またまた、参考にというか、スクリプトをもらうためにkorobo ユーザーの配布してるスキンをもらってくる。

ところが、今度はそのまま貼り付けたらエラーが出る。 おお、エラーの数で返信件数が判るようになったぞ。違う。

下の引用返信と平行しながら、格闘すること3時間。エラーの原因判明。 …どうやら、<KOROSCRIPT><!--をインデントしてはいけなかったらしい…。スクリプトは、

<!-- CHOP -->
<KOROSCRIPT>
<!--
$num_res_message = 0;
-->
</KOROSCRIPT>

<!-- CHOP -->
<KOROSCRIPT>
<!--
$num_res_message ++;
-->
</KOROSCRIPT>

<!-- CHOP -->
<KOROSCRIPT>
<!--
if ($num_res_message == 0) {
$res_count_message = "";
} else {
$res_count_message = "返信:<span style=\"color:#cc3333\">$num_res_message</span>件";
}
-->
</KOROSCRIPT>

$res_count_message

という、比較的私にも「何をやっているのか」解りやすいものだったので、逆にエラーの原因が全然見当つかなかったんだけど、どんなにスクリプトの中身を考えても見当がつかないわけなのだった。

さて、今度は返信件数にリンクをつけて、記事に飛べるようにしたい。 掲示板の画面にジャンプするのは、「タイトル一覧」の「2ページ目以降問題」の件で挫折済みなので、 返信専用の画面を表示することにする。

<a href="$script?res_num=$num&form=$form_name&mode.thread=1">$res_count_message</a> 

ところがなぜか、うまく行かない。一つずれて、次のスレッドの返信画面が出てしまう。 どうやら、[返信 * 件]という文字列にリンクを貼ったのがイケナイらしい。この表示は子記事の最後の <!-- CHOP --> の後、スレッド終わりの <!-- CHOP --> の前にある。 多分そのせいでずれるんだろう。 しょうがないので、記事の後ろに[res]というリンクを作ることにして一件落着。

ところが今度は、NNでこの返信画面から返信をすると、[Found The document has moved here.] という画面が出てしまうことが発覚。なんでだ。 [here] にリンクがあって、それをクリックするとログ画面に戻れるけど。…3秒考え、放置を決める。 NN の相手なんかしてられるか

引用つき返信編

[TOP↑] [管理]

<a href="$script?res_num=$num&form=$form_name&mode.thread=1"> として [引用つき返信] というのを作ってみる。ところがなぜか、新規書き込み用のフォームではなく、それぞれの記事の返信用フォームに引用が入ってしまう。いやぁん。

上の件数表示と平行しながら格闘すること2時間。原因判明。ほとんどただのHTMLの問題。 だから、他からタグをコピーして使いまわすのはいいけど、属性をよく確認してください。

<input type="text" name="message" value="$res_msg">

何よ、返信フォームのvalue="$res_msg"って。これを新規投稿フォームのほうに移動させ、一件落着。

と思ったところが、間違いを発見。タグを許可してあるので、<input type="text" name="message" value="[0898]* wrote: > <span style="color:red">驚き呆れる</span>。" size="70"> という無茶苦茶なことになってしまう。そんなわけで新規投稿のフォームだけ<textarea>に変更(ホントは参照文字に変換するようにすればいいのかもしれないけど、そんなことができるものか)。

さて、後ろの発言に返信するときはこれを使って新規の発言にしてもらえれば、返信を見逃すことはなくなるわけだが、引っかかるのは、「こういうときはこうしてください」というのを周知徹底させなくてはいけない、という方針のありかた。 「説明しなくても、ユーザーがこちらの意図通りの操作をする」ように構築するのが、「うえぶますたぁ」のあるべき姿だろう。 むぅ。ただでさえ、自分が使いやすいようにと掲示板なんかを兼用して、第三者からは「なんだかよくわからない」ことになっているのだ。

* * *

今日のワンポイント。 21日に悩んでいた、返信で記事をソートしない方法。その後、[ddate]というのが、「日記用の日付順ソート」である、というのは判っていた。多分、その日記用のデータがないので、ソートできなかった、それがまあ、結果的に目的に適ってしまったわけだ。「ソートしない」は、[$do_not_move = 1;]デシタ!

後日談

[TOP↑] [管理]

Perlのソートについて検索しているときに、「引用返信でタグを無効にしたほうがよい」というようなことが書いてある講座があった。なるほど。

2002/11/24(sun)

[TOP↑] [管理]

なんとか、「返信のあった記事順」と「親記事の発言順」に切り替えて表示できないもんかと考えていたところ、発見。ただし、スキンが配布されているわけではなく、 korobo ユーザーの掲示板そのものにソート機能がついている。むむむ、教えてくれ、それはどうやっているのだ。 perl のお勉強をしている人らしいので、掲示板の過去ログを漁る漁る。

発見。

<KOROSCRIPT>
<!--
#表示のために・・
$new_sort = $in{'new_sort'};
$old_sort = $in{'old_sort'};
$thread_old_sort = $in{'thread_old_sort'};
$name_sort = $in{'name_sort'};

#各ソート
@sort_time = sort {&hikaku} @data;
@sort_old = reverse @sort_time;
@sort_name = sort {&hikaku1} @data;
@sort_thread_old = sort {&hikaku2} @data;

#ソートのためのサブルーチン(ここはかさばるので、オプションに書くといいかもしれない)
sub hikaku{
($num,$oya,$name,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectimea,$rc,$rl,$gc1,$gc2) = split /<>/, $a;
($num,$oya,$name,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectimeb,$rc,$rl,$gc1,$gc2) = split /<>/, $b;
$rectimeb <=> $rectimea;
}
sub hikaku1{
($num,$oya,$namea,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectimea,$rc,$rl,$gc1,$gc2) = split /<>/, $a;
($num,$oya,$nameb,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectimeb,$rc,$rl,$gc1,$gc2) = split /<>/, $b;
$nameb cmp $namea || $rectimeb <=> $rectimea;
}
sub hikaku2{
($num,$oyaa,$name,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectimea,$rc,$rl,$gc1,$gc2) = split /<>/, $a;
($num,$oyab,$name,$email,$url,$pwd,$date,$host,$archive,$subject,$message,$icon,$color,$image,$opt1,$opt2,$opt3,$rectimeb,$rc,$rl,$gc1,$gc2) = split /<>/, $b;
$oyaa <=> $oyab || $rectimea <=> $rectimeb;
}

#データの切り替え
if($in{'new_sort'}){@data = @sort_time;$index = 3;}
elsif($in{'name_sort'}){@data = @sort_name;$index = 5;}
elsif($in{'old_sort'}){@data = @sort_old;$index = 4;}
elsif($in{'thread_old_sort'}){@data = @sort_thread_old;$index = 2;}
else{$index = 1;}
-->
</KOROSCRIPT>
<form name="sort"><SELECT name="select" onChange="document.location.href=this.options[this.selectedIndex].value">
<option value="$script?form=$form_name" selected>ソート選択してください
<option value="$script?form=$form_name">Threadごと(降順=新着)
<option value="$script?form=$form_name&thread_old_sort=1">Threadごと(昇順=古い順)
<option value="$script?form=$form_name&new_sort=1">Thread無視(降順=新着)
<option value="$script?form=$form_name&old_sort=1">Thread無視(昇順=古い順)
<option value="$script?form=$form_name&name_sort=1">名前ごと(新着)
</SELECT></form>

長!

さて、問題は、この中に私のソートしたい順番がないことだ。 よぉくみると、配列の所々に a とか b とかなっていて、並べる基準のデータにソレをくっつける。 後、$oyaa <=> $oyab || $rectimea <=> $rectimeb; なのだそうだ。確か[||]は、「且つ」なのだ。ソレしかわからん。[<=>]とは何だ? [=>]という矢印のようなのは見たことあるけど、見たことがあるだけで意味は知らない。

しばらくいじりまわし、ヘンなソートをして、挫折。

「返信時に新着順にソートされてしまったのを、親記事順に並べる」というのはできたんだけど。

と一旦思ったが、間違いだった。 なぜか、「一部」返信記事が迷子になる。別な親記事のところに引っ付いてしまうのだ。むむ。なぜ?

再開。返信時に、「返信のあったスレッド順」にソートされるということは、本体の CGI にそういう処理が書いてあるワケで、漁る。あわよくば、ソレをそのまま呼び出すようなことは出来ないもんかと思ったが、とりあえず私には出来ない。多分この辺なんじゃないかとは思ったが、

sub sort_data {
if ($sort_order eq 'old' or $sort_order eq 'new' or $sort_item eq 'ddate') {
	my @data;
	my %dd;
	foreach (@_) {
		my ($num, $oya, $ddate) = get_item($_, qw[num oya ddate]);
		$num == $oya and $dd{$oya} = "$ddate$oya";
		push @data, [$_, $num, $oya];
	}
	if ($sort_item eq 'ddate') {
		foreach (@data) { $_->[2] = $dd{$_->[2]} }
	}
	if ($sort_order eq 'old') {
		return
			map  { $_->[0] }
			sort { $a->[2] <=> $b->[2] or $a->[1] <=> $b->[1] }
			@data;
	} else {
		return
			map  { $_->[0] }
			sort { $b->[2] <=> $a->[2] or $a->[1] <=> $b->[1] }
			@data;
	}
} else {
	my (@max, @num, @oya, @tmp);
	foreach (@_) {
		@tmp = (split /<>/)[$id{'num'}, $id{$sort_item}];
		push (@num, $tmp[0]);
		push (@oya, $tmp[1]);
	}
	for (0 .. $#num) { $max[$oya[$_]] = $num[$_] if $num[$_] > $max[$oya[$_]] }
	return @_[sort { $max[$oya[$b]] <=> $max[$oya[$a]] or $num[$a] <=> $num[$b] } 0 .. $#num];
}
}

特に最後の2行が激しくソレっぽいのだが、コレをそのまま貼り付けるワケには行かないだろうというのは、判る。
[||]ではなく[or] というのはミソなのだろうか。
[]で括ってあるのは何か意味があるのだろうか。
$max というのはナニを意味しているのだろうか。

あてずっぽうにいじりまわしてみるが、やっぱりうまくいかない。

2002/11/25(mon)

[TOP↑] [管理]

ソートの続き編

[TOP↑] [管理]

昨日散々いじりまわしたソート。しばらく離れている間に、頭の中で会議が行われたようだ。

多分、「迷子」になった返信の記事は、$rectime をソートの基準にしたからじゃないかしら。 多分「記録された時間」のことだと思って、だから問題ないと思ったんだけど、 投稿後に編集した場合は、編集した時間かもしれない。素直に $num でソートしたらいいんじゃないかしら。

考えてみたら、「返信のあったスレッド順」というのは、結構複雑なソートだ。 人間相手なら、「新しい投稿があったスレッドは、親記事ごと上にあげてね」で通じると思うんだけど、 「親記事ごと」を機械相手に何て言っていいのかが、解らない。

ここはやっぱり、返信時にソートしてもらって、親記事順を私が担当しよう。 というわけで、上の長いスクリプトから必要な部分だけを切り出す。迷子の返信記事も出ず、成功。

最終返信の日付表示編

[TOP↑] [管理]

どこかの korobo の掲示板で、「最終投稿のあった時間を、トップページに表示したい」なんて話が出てたような、出てないような。 ともかく、[返信件数] に並べて、[最終返信] の日付を表示したいと思い立つ。 多分、出来ないはずは、ないはずなのだ。

配布元の掲示板へ行き、「最終」「最新」「日付」「表示」「返信」などのキーワードでちょっと検索してみるが、目的のスクリプトは出て来ない。

「どうすればいいか」は、何となく判るのだ。

よし、多分、できる。 とうとう、買ったまま放ってあった Perl の本を役立てるときが来たらしい。 リファレンスの「文字列処理」というところを見る。 どれだ。「substr 部分文字列を取り出す」多分コレだ。 ていうか、substr って JavaScript と同じだ。

substr(対象文字列, 取り出す最初の文字[,取り出す長さ])

と書けばいいらしい。 「取り出す最初の文字」を末尾から数えたいときは、[-]をつければいい。 取り出す長さは指定しなければ最後までらしいので、書かなくてよし。

というわけで、表示件数をカウントしているらしいトコロの下に、ひっそりと文字列切り出しのお願いを書く。

<!-- CHOP -->
<KOROSCRIPT>
<!--
$num_res_message ++;
-->
</KOROSCRIPT>

<KOROSCRIPT>
<!--
$last_date = substr($date,-21);
-->
</KOROSCRIPT>

次に、「もし返信があったら、こう。なかったら、こう」というお願いを、件数表示をそっくり真似て恥ずかしげに追加。

<!-- CHOP -->
<KOROSCRIPT>
<!--
if ($num_res_message == 0) {
$res_count_message = "";
} else {
$res_count_message = "返信:<span style=\"color:#cc3333\">$num_res_message</span>件";
}
-->
</KOROSCRIPT>

<KOROSCRIPT>
<!--
if ($last_date == 0) {
$last_date = "";
} else {
$last_date = "最終返信:<span style=\"color:#cc3333\">$last_date</span>";
}
-->
</KOROSCRIPT>

最後に、「ここに表示しておくれ」と丁重にお願い。

<div class="res-count">$last_date $res_count_message</div>

どきどき。うまくいくかしら。

どきどき。サーバーにput。

どきどき。上書き。

どきどき。リロード。

どきどき

あ。

すごい。

成功

そんなわけで、実質的にはたった1行の、初めての自力 Perl なのでした。

* * *

本日のワンポイント。 昨日の夜、例によって掲示板の過去ログ漁りをしていて、

METHOD が POST なので、URLのあとにパラメータを書いても渡せません。

という発言を発見。そうだたのかっ。

というわけで、17日に判らなかった、「移動できない問題」を解決。

<input type="hidden" name="location" value="$script?form=chat_form">

としてみる。 location というのも、掲示板でそんなのがある、というのを知った。 name の属性値の一覧が欲しい。同じ17日、[name=mode.resist]で悩んでるし。 ナニのときにナニと書くというのが、漸う判ってきた。 というか、「何かしたかったら、何か書かなくてはいけない」というのが解ってきた。

ところで、23日だったか、こちらも掲示板のログ漁りで発見。配列の書き方。

@list = ("aaa","bbb","ccc");
@list = qw(aaa bbb ccc);
@list = qw(
aaa
bbb
ccc
);

という書き方があるんだそうだ。最初のやつが、私が「よく見かける」と思ったやつだ。 これで顔文字のセレクトボックスに半角スペースが使える。

2002/11/26(tue)

[TOP↑] [管理]

深夜というか早朝、突然クッキーが。

[TOP↑] [管理]

突然、入室画面で入力した名前がクッキーに保存されなくなった。 書き込み時に名前を入力できないので、名前は空欄のままになってしまう。 ソートのテスト用に

原因究明をし始めたところで、こんなときに限って知人とかち合う。

私の脳みそは既に臨戦体勢、ちょっと落ち着いて考えたいんで、放っておいてくんねぇか? 知人が面白がってウロウロするので、ソートの実験用に作ってあったスキンをアップして、 そっちで遊んでもらうことにする。

ところが、途中でクッキーが保存できなくなってしまったスキンと、臨時に上げたスキンのログが混ざってしまった。何でそんなことになるのか知らないが、臨時で上げたほうに書き込んだものが、クッキーがだめになっているスキンのほうに書き込まれる。

ああああああ。もう、イライラ。泣きたい。

復旧作業

[TOP↑] [管理]

編集中。

| むず痒いパソコン日記 | WebsiteWork | WebsiteWork/CgiPerl || KoroboRoom1へ | KoroboRoom3へ |

shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage || [edit]
select css: default | sakura | mono | greenheck | snow | NN4.x用(多分) || LinuZau!! | VikiWiki!? || others |

管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || PUT