
お暇を縫いこの質問を閲覧してくださり誠にありがとうございます。
Perlとプログラミング関連のほぼ初心者です。勉強そして修行中です…。
とあるちょっとした理由から今現在、最低限の機能のみを備えた極簡単なスレッド式の掲示板を作ろうとしています。
おそらく想定できる方法は幾つかあると思うのですが、スレッド(=すなわち一つ一つ独立したページとして存在する記事(の集まり))そのものを作り、その一つ一つへリンクさせ内容を閲覧するには具体的にどうすればいいでしょうか。
具体的にとは難しいかもしれませんが、重要なポイントを教えて頂ければ嬉しいです。
例えばWebPatioでは、スレッド一つ一つのリンクのURLの最後の部分が read.cgi “ ?no=(スレッド番号) ” となっているのですが、この部分のスレッド番号および“?no”はどういう風に割り振られているのでしょうか。
用意すべきログファイルは、インデックス(=トップページ、各スレッドへのリンクを表示する一覧・インデックス)に表示するスレッドの情報(スレッドタイトルと投稿者)を保存するものと、各スレッド内で返信された記事の投稿情報を保存するものが必要なのかなと考えています。
仮に一つ一つのスレッドのページを作るような処理を成功させ、そのリンクをインデックスに貼れたとして、各スレッド内にてコメントを返信しその内容を反映させるにはどういう処理を施すのが手っ取り早いのでしょうか。
それから素朴な疑問なのですが、スレッドを作成した際の親記事(=仮にNo0とする)もスレッド内の記事の一つ(No1以降の記事)と考えるべきですよね?
現在はまだ、トップのページのフォームから入力したもの(投稿者名、件名、コメント内容)をトップのページにポンと、上から投稿順に表示させるだけ、単一の記事を表示させるだけの状態です。とてもスレッド式とはいえないただの掲示板なので、この状態からどうすればスレッド式(っぽい)の状態を作り出せるのか、初心者なので至らないところもあると思いますが、何でも良いのでアドバイスをくだされば嬉しいです。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
データの保存形式にはCSVを使うのが基本です。
Text::CSVというモジュールを使っても良いですが、それ以外ならsplitとjoinを使います。
一行に纏めた形式で書き込んで、表示するときはそれを復元して使います。
my $name = "名前";
my $mail = "a@test.com";
my $str = join("<>", $name, $mail);
print "$str\n"; # 名前<>a@test.com
my @a = split("<>", $str);
print "$a[0]\n"; # 名前
print "$a[1]\n"; # a@test.com
ファイルのフォーマットはこんな感じでしょうか。
# THREAD
id<>datetime<>name<>email<>message<>password
# INDEX
id<>datetime<>title<>count
もし難しいようなら、入門書を一冊購入することをお勧めします。
私のお勧めは「10日でおぼえる Perl/CGI 入門教室」です。
これ一冊で、基本的な部分はすべて押さえられると思います。
http://www.amazon.co.jp/dp/4798109703/
No.2
- 回答日時:
コードを見る限り突っ込みところはあるのですが
サーバの環境がわからないので・・・
#けどいまさら jcode.pl はないだろうし・・・
#ライブラリの拡張子が「cgi」なのもあれです.
#warning/strictもお約束としていれておくほうがいいのかなとか
#サブルーチン呼び出しに接頭辞「&」とか・・
#・・・全体的にperl4の雰囲気
アルゴリズムとデータ構造を考えましょう.
「IOの手間」とか
そういうことは一切抜きにして
一つの考え方を.
ある記事Aに対して,子供記事「B」がついたときに
A -> B
のように「方向つきリンク」がつくわけです.
さらに,同じ記事「A」に,子供「C」がつけば
A -> B
-> C
のように「枝分かれする」ことになります.
となると,「記事」に必要なのはまずは
「本文」と「子供が何かを指すポインタ」です.
さらに「記事」が別の記事の子供であることも示したいですので,
結局,一つの「記事」に対して
・自分自身のID
・「本文」
・「親へのポインタ」
・「子供へのポインタ」
の三つのものが必要です.これはハッシュとかオブジェクトにするのが
お約束ですけど,とりあえずハッシュですか.
%article = {
ID -> "idnumber", #記事を一意に特定する番号
text => "本文", #本文を別ファイルにしてばらしているならそのファイル名とか
parent => "親のID",
children => ["子のID", "子のID"], # 子のIDで構築される無名配列
}
こういうような構造をつくっておく必要があるでしょう.
こういうデータ構造をつくっておけば,
IDを指定することで
・記事の表示
・親の提示
・子供の提示
は可能です.また,ある記事「A」に対して,子供記事「B」を作る場合は
・記事「B」にIDをふって,
・本文を記録し,
・親が「A]であることを記録し
・子供が存在しないことを記録,
・記事「A」の子供ポインタに「B」を追加する
ことで,できます.
記事の削除に関しては仕様を明確にすることが必要ですが,
たとえば「記事」のデータ構造「%article」に
「表示」「非表示」のフラグをいれて「削除=非表示」とするとかが考えられます.
ある記事を「削除」した場合に,それに子供があった場合にどうするのかとか
そこは仕様を明確にしないといけません.
何はともあれ,「記事」とは「本文とポインタのセット」としおけば
それで「ツリー」は構築できるわけで,
あとは,巷の「アルゴリズム本」で「ツリー構造」の扱いを学べば
どうとでもできるでしょう.
記事のタイトルや投稿時間・投稿者とかの追加は容易なので
適宜処理すればいいのだと思います.
No.1
- 回答日時:
見た限りでは問題ないと思います。
スレッド単位で一つのファイルに出来れば、I/O処理は増えますが簡単になると思います。
スレッドIDと書き込みIDを組み合わせれば、書き込みまで特定出来ます。
#例えば52100番なら、52番スレッドの100番の書き込み
レスポンス先の書き込みIDも記録すれば、後々ツリー式にも変更出来て便利だと思います。
そのくらいでしょうか。
特に問題はないですから、とりあえずやってみて、問題が出たら対応するでいいと思います。
この回答への補足
早速のご回答ありがとうございます。参考になりました。
仰るようにスレッド単位で一つのファイルを生成し保存できれば良いと思っております。
IDを分ければ書き込みも特定できるとのことで確かに便利だと思いましたので、後々にじっくり考えてみようかなと思います。
では、とりあえずどうにか初心者なりにやってみます…。
以下拙いですが現在のメイン表示部分のコードです。
外側からsetup.cgiを読み込んでデコード処理等を通しています。
もしご参考になれば、ここからどういう変更をすればスレッド式を確立できるか、重要なポイントをご教授頂ければ嬉しいです。
#!/usr/bin/perl --
require 'setup.cgi';
require 'jcode.pl';
&decode;
if ( $FORM{'mode'} eq "regist" ) { ®ist; }
&main;
sub main{
&HTMLheader;
print <<"FREE";
<div style="text-align:center; font-size:35">$title</div>
<br>
<hr>
<div style="text-align:left; margin-left:30">
<table bgcolor="#F8EDCC" cellpaddi7ng="6">
<tr><td width="150"><a href="form.cgi">新しいスレッド</a></td><td><a href="">管理者</a></td></tr></table>
</div>
<hr>
<div style="margin:45px">
<table width="80%" cellpadding="10"><tr bgcolor="#99CC99">
<td><span style="font-size:25; color:#ED6755"><b>スレッド一覧</b></span></td><td></td></tr>
<tr><td width="55%"<span style="font-size:23">スレッド名</span></td><td width="25%"><span style="font-size:23">作成者</td></tr>
FREE
open(IN,"$data_file");
print <IN>;
close(IN);
print <<END;
</table></div></BODY></HTML>
END
}
sub regist{
open(OUT,">> $data_file");
print OUT "<tr><td>$FORM{'subt'}</td>\n";
print OUT "<td>$FORM{'name'}</td></tr>\n";
close(OUT);
}
↓setup.cgiから
sub decode {
local($buf);
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
foreach ( split(/&/, $buf) ) {
local($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
&jcode'convert(*val, 'sjis');
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/</</g;
$val =~ s/>/>/g;
$val =~ s/\r\n/<br>/g;
$val =~ s/\r/<br>/g;
$val =~ s/\n/<br>/g;
$FORM{$key} = $val;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
- 倫理・人権 酔っ払いが他人にたくさん迷惑を掛けているので、もっとお酒規制を厳しくした方が良いのでは? 2 2022/04/11 11:54
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- WordPress(ワードプレス) ワードプレスで、投稿一覧ページにタグを表示する方法 投稿につけたタグを、記事一覧ページにもカテゴリと 1 2023/05/10 21:41
- Gmail gmailについて gmailで届いた順にメールが一通一通表示されているのを何とかしたいです。 今使 2 2022/08/12 22:18
- 2ちゃんねる 5ちゃんねるへの書き込み これは誹謗中傷→開示請求できますか 3 2023/03/14 07:10
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCスレッド CriticalSection
-
VBAで行をコピーして別のシート...
-
スレッドの安全な終了のさせ方
-
自作クラスのイベントを外部ハ...
-
スレッドの監視方法について
-
CWnd::OnTimerのスレッドの取得
-
画面の更新とスレッド
-
複数スレッドを動作させるのに...
-
スレッドの監視方法
-
excelvbaでCreateThreadの動作
-
マルチスレッド内のループについて
-
マルチスレッドプログラミング...
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
MACアドレスの調べ方
-
VBAの配列サイズとメモリに関して
-
SendMessageが失敗するときがある
-
シリアル通信エラー
-
VBSの処理中一旦処理を止めて再...
-
PDFからTIFFに変換できるフリー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
スレッドにて同一メモリの書き...
-
スレッドの終了の仕方
-
VB2005 シリアル通信のClose処理
-
WaitForSingleObjectの使い方に...
-
別スレッドのデータを受信できない
-
同一スレッドで、ロックをかけ...
-
CWnd::OnTimerのスレッドの取得
-
スレッドの安全な終了のさせ方
-
メインダイアログが最背面に表...
-
スレッド一覧の取得
-
Windows上で、シグナル(SIGTERM...
-
C言語で一定時間待機後、再実行
-
C#でスレッド実行中のイベント...
-
複数スレッドを動作させるのに...
-
.netアプリへのSendMessageでフ...
-
DirectX LPDIRECT3DDEVICE9のマ...
-
スレッド内でコントロールやWin...
-
DirectX 11のConsntanBuffer
おすすめ情報