掲示板につくNEWマークについて

[上に] [前に] [次に]
サクライ 2000/05/26(金) 03:13:45
こんにちは。
KENT-WEBサンのYYBBSって言う掲示板を使っているのですが
レスが増えると見にくくなり発言に気付かないという自体が出てきたので
改造してツリー表示っぽく出きるようにしてるのです。
それでなんとか発言がツリー状になるところまで来たのですが、
これだけだとあまり意味が無いって事でNEWマークをつけようと思った所でとまってしまいました
http://hpcgi1.nifty.com/isobel/bbs/bbs.cgi?mode=titles
普通表示は http://hpcgi1.nifty.com/isobel/bbs/bbs.cgi

例えば最新10発言にだけNEWマークをつけたいって言うときにログに通し番号がついていない状況で
そういった事をするにはどう言った手段があるでしょうか?
もしくは一定時間だけ(12時間)にNEWをつけるっていう事も考えていて
$year$mon$mday$hour$min$sec
ってのを例えば20000526030800みたいにして現在時間から引けばいいような気がするんですが
もうちょっとスマートな方法があったら教えてください

S-pore [HomePage] 2000/05/26(金) 10:54:45
> $year$mon$mday$hour$min$sec
> ってのを例えば20000526030800みたいにして現在時間から引けばいいような気がするんですが

time() の戻り値をそのまま使ったほうがいいと思いますが・・・。(^^;

ml7j 2000/05/26(金) 11:26:25
クッキーを使うってのはどうでしょう?
発言時に日付をクッキーに入れておいて、それより新しいものに
newマークを付けるとかすると、みんなに有効だと思う。

サクライ 2000/05/26(金) 12:31:35
>time()
localtime(time)も同じよううな事ですよね?
なるほどというか意味ない事しようとしてましたね(汗)

>クッキー
なるほど、いいですね。
クッキーはいつまでたっても苦手なんですがなんとかやってみます。
ただクッキーオフらしき人が多いので(URLとか毎回入ってないから)
クッキーを使うにしても他に方法が必要かな…

取りあえず今perl落としてるのでいろいろやってみます。

ml7j [E-Mail] 2000/05/26(金) 13:02:14
>サクライ 2000/05/26(金) 12:31:35
>クッキーはいつまでたっても苦手なんですがなんとかやってみます。

メールアドレス教えていただければ私の作った掲示板さしあげます。
クッキー使った[未読][既読]表示をやってます。参考になるかと思います。

>ただクッキーオフらしき人が多いので(URLとか毎回入ってないから)
>クッキーを使うにしても他に方法が必要かな…

組み合わせで行きましょう :-)
日付や時間で[New]を表示、クッキーで[未読][既読]とか・・・

サクライ 2000/05/26(金) 14:15:04
>ml7jサン
じゃあお願いします。
取りあえずメールしました。

サクライ 2000/05/26(金) 21:50:15
[[解決]]
取りあえずNEWは出来たので解決で。
クッキーの方はころあいを見てとりかかります。
S-poreサン、ml7jサンありがとうございました。

ちなみに結果的に20000526030800にして引き算してます。

S-pore [HomePage] 2000/05/26(金) 22:26:17
> ちなみに結果的に20000526030800にして引き算してます。

一体どんな引き算してるんだろ・・・。(^^;
まあいいや。(謎)

サクライ 2000/05/26(金) 23:17:00
一応
現在時間から書きこみのあった時間をひいてるんですが、
やっぱり結構負担大きいんですかね。
でもそう思って他のNEWマーク使ってる掲示板参考までに見たんですが
同じような計算してたのでいいかなと。
あとは今後の課題ですかね

S-pore [HomePage] 2000/05/27(土) 00:09:44
"20000526230000" の時刻に書き込まれたものを
"20000527010000" の時刻に見たときも
ちゃんとNEWマークが付きますかっていう意味なのですが,大丈夫ですか?
単純に「差が120000以下ならNEW」なんていう処理ではダメだと思います。

なので,上に書いたように time() の戻り値をそのまま使うか(桁数も減りますし),
"20000526030800" の形式にこだわるのなら,
「現在から12時間前の時刻」をこの形式に変換して,
書き込み日時と大小比較するようにしないとうまくいかないと思います。

それとも,何か引き算を使ったうまい判定法でもあるんでしょうか・・・。

とくめい 2000/05/27(土) 00:29:20
ファイルが何秒前に作成されたかを知るには、こんなので出来ると思うよ。
($mtime) = (stat($file))[9];
$diff = time() - $mtime;

$sec, $min, $hourを秒数に変換するなら、とほほさんの
http://www.tohoho-web.com/cgi-bin/wwwlng.txt
の最後にmktimeというサブルーチンがあるみたいです。

ActivePerlの標準ライブラリでもmktimeはあるみたいだけど、
use POSIX;
$time_t = POSIX::mktime($sec, $min, $hour, $mday, $mon, $year);
この$time_tをprintしたら何も表示されなかった。なぜ?

水影 [HomePage] 2000/05/27(土) 00:29:49
> ちなみに結果的に20000526030800にして引き算してます。

S-pore さんが指摘した通りでこれはまずいでしょ。
どうしてもこの方法でやりたいんだったら
$n 月は $m 日あるっていうデータベースも用意しなくては
ならないし… ( より正確にするならうるう年の判定も… )

素直に time() をつかうのが楽だと思いますけど…

水影 [HomePage] 2000/05/27(土) 00:37:00
> $sec, $min, $hourを秒数に変換するなら、とほほさんの
> http://www.tohoho-web.com/cgi-bin/wwwlng.txt
> の最後にmktimeというサブルーチンがあるみたいです。

このサブルーチンいいですねぇ。
これまでは、表示するときに time() を localtime に
直して表示してましたけど、書きこみの回数と表示のみの回数
を考えると、こちらの方が負担が少なくて済みますね。

つかわせてもらいま〜す♪

サクライ 2000/05/27(土) 00:41:35
>単純に「差が120000以下ならNEW」なんていう処理ではダメだと思います。
あ、そうか。そうですね
それを考えていなかったですね。確かに今NEW消えちゃってました
やっぱりtime()ですかね。
ただログには余り手を出したくないので
現在のログ、例えば2000/05/26(Fri) 21:06:52を
time()の形式に直さなきゃ行けない訳か…
うーん。
ちょっと他のスクリプトとか参考にしつつ考えてみます。

サクライ 2000/05/27(土) 00:44:40
と書きこんだら他の方の発言が。
ちょっと単純に考えすぎてましたね。
今日はちょっともう出来ないんですが明日いじってみます
折角いい本もある事だし…よまなきゃ

S-pore [HomePage] 2000/05/27(土) 01:51:25
> ただログには余り手を出したくないので

ということなら,

> "20000526030800" の形式にこだわるのなら,
> 「現在から12時間前の時刻」をこの形式に変換して,
> 書き込み日時と大小比較するようにしないとうまくいかないと思います。

こっちの方法を使えばOKでしょう。大小比較なら問題ありません。

> ActivePerlの標準ライブラリでもmktimeはあるみたいだけど、
> use POSIX;
> $time_t = POSIX::mktime($s

S-pore [HomePage] 2000/05/27(土) 01:53:36
> ActivePerlの標準ライブラリでもmktimeはあるみたいだけど、
> use POSIX;
> $time_t = POSIX::mktime($sec, $min, $hour, $mday, $mon, $year);
> この$time_tをprintしたら何も表示されなかった。なぜ?

これでいいはずですけど・・・変な値渡してませんか?
$mon は,月 - 1
$year は,年 - 1900
あたりがひっかかりやすいです。
うっかり $year に 2000 とか渡しちゃうと undef が返ってきます。(^^;

サクライ 2000/05/27(土) 08:24:23
>「現在から12時間前の時刻」をこの形式に変換して,
あ、これなら平気なんですね?
ちょっとやってみますが、12時間前の計算ってどうやるんですかね
$ENV{'TZ'} = "JST-12";
とかやれば出来そうな気もするんですが、これだとスクリプト全体に影響しませんかね?

S-pore [HomePage] 2000/05/27(土) 10:39:31
> $ENV{'TZ'} = "JST-12";
> とかやれば出来そうな気もするんですが、これだとスクリプト全体に影響しませんかね?

12時間前の時刻を計算した直後に $ENV{'TZ'} を元に戻せばスクリプトの他の部分には影響しませんが,
これだと,「48時間以内の記事にNEW」にしたい場合はダメですね。
(できたとしても気持ち悪い^^;)

スクリプトの他の部分で localtime() を使っているのなら,

@tmtime = localtime(time() - 12 * 3600);
$timestr = sprintf("%d" . ("%02d" x 5), $tmtime[5] + 1900, $tmtime[4] + 1, @tmtime[3, 2, 1, 0]);

これで,12時間前の時刻を "20000526030800" の形式で表したものが
$timestr に入ると思います。

# gmtime() 派の方は,
# @tmtime = gmtime(time() + (9 - 12) * 3600);

8bird 2000/05/27(土) 14:56:51
> とほほさんのmktimeというサブルーチン

これのところ何度読み返してもアルゴリズムがおかしいような気がするのですが
(うるう年のあたりです。動作は正常なんですが・・・)
どなたか解説していただけないでしょうか?

サクライ 2000/05/27(土) 14:59:27
>S-poreサン
ナルホド、何かのスクリプトで * 3600
見たいなのを見つけた事があったんですが、こういう事してたんですね。
おかげさまでNEWがちゃんと出るようになりました。
日付変わっても大丈夫だと思います

取りあえず自分の質問の方は解決!

とほほ 2000/05/28(日) 02:10:29
> これのところ何度読み返してもアルゴリズムがおかしいような気がするのですが
> (うるう年のあたりです。動作は正常なんですが・・・)
$uru = int(($year - 72) / 4);
if (((($year + 1900) % 4) == 0) && ($mon < 2)) { $uru--; }
の個所ですね。

72は、1970年以降の最初のうるう年である1972年を意味しています。
(現在の年数−1972年)/4年で、1970年以降のうるう年の数を求め、
次の行で、うるう年だけどまだ3月ではない場合に1減算しています。
2000年は100の倍数でうるう年じゃないけど、400の倍数なのでうるう年。
だから特別な処理は行っていません。
2100年は100の倍数なので特別処理しなくちゃいけないけど、
これはサボっています。(2100年問題?)
どうせ、2038年には大幅に見直しかけなきゃいけないだろうし・・・

・・・という訳で、8birdさんが納得されたら、解決マーク押してください。

[上に] [前に] [次に]