過去ログの生成が出来る、日記のCGIスクリプト、もしくはPHPスクリプトを探しております。理想としては[http://www.ausystem.org/~aushacho/cgi-bin/wwwnikki.cgi/mem_kako.html]のように過去ログが15日ずつ表示される物が良いのですが、なかなか見つかりません。例に挙げたスクリプトを「最新の1件のみ表示」という風に改造出来れば一番良いのですが、どなかたご教授頂けませんでしょうか。ちなみに、このスクリプトは[http://www.ausystem.org/~aushacho/dl/14.html]で配布されております。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2003/08/07 13:11:58
  • 終了:--

回答(2件)

id:sasada No.1

sasada回答回数1482ベストアンサー獲得回数1332003/08/07 18:54:18

ポイント10pt

>◎過去ログ機能を設定できます

>M*Diaryの過去ログファイル(datファイル)をhtmlに変換するためのスクリプト

 カスタマイズすれば、お尋ねの機能が実現できるかもしれません。

 下記URLは、サンプルです

>Diary 1.5a 日記帳 フリーソフトウエア

 これも、いい線一定いると思います。

 下記URLは、サンプルです

 お尋ねのCGIの改造は、理屈は難しくなさそうですが、あちこち修正する必要がありそうです。

 クールな方法が有ると良いのですけど、まだ思いつきません。

id:sasada No.2

sasada回答回数1482ベストアンサー獲得回数1332003/08/07 19:25:42

ポイント40pt

 URLはダミーです。

 お尋ねのCGIの改造について考えてみました。

 まず、ダメな案から順に説明します。

 「最新の1件のみ表示」という風に改造するだけなら、「wwwnikki.cgi」の「sub output_log」ルーティンの1076-1077行目の

foreach $key (sort { $asc ? $a cmp $b : $b cmp $a} keys %data) {

next if(!$new and $key gt $QUERY{end});

を、

my $displayed = false;

foreach $key (sort { $asc ? $a cmp $b : $b cmp $a} keys %data) {

next if(!$new and $key gt $QUERY{end});

next if( $new and !$displayed);

$displayed = true;

とかすれば済みそうです。

 しかし、これだけだと、2件目から先、過去ログになっていない分が表示できなくなりますね。

 ブー! 不採用!!(笑)

 2件目から先を過去ログ送りにして、さらに15日づつログファイルを分けるのは可能ですが、そうとうCGIを修正しなければいけません。

 これも不採用。

 次に、今ある処理とは別に、一日分だけ表示する処理を追加する案もあります。

 「wwwnikki.cgi?action=view」という処理を改造するのではなく、一件分だけ表示する「wwwnikki.cgi?action=view_one」とかを作る案です。

 この場合、307行目から308行目の

&save_referer;

&kako_execute($path);

の前に、

(/^view_one$/) and do {

&save_referer;

&display_log_one;

last SWITCH;

};

とか挿入します。

 その上で「display_log_one」サブルーティンを作ります。

sub display_log_one {

print $html_header;

print &output_log(2);

exit;

}

くらいですね。

 注目点は、output_logの引数に2を新設しているところです。

 (元のスクリプトは0と1しか対応していません)

 で、「sub output_log」ルーティンの1076-1077行目の

foreach $key (sort { $asc ? $a cmp $b : $b cmp $a} keys %data) {

next if(!$new and $key gt $QUERY{end});

を、

my $displayed = false;

foreach $key (sort { $asc ? $a cmp $b : $b cmp $a} keys %data) {

next if(!$new and $key gt $QUERY{end});

next if( $new == 2 and !$displayed);

$displayed = true;

とかする案です。

 これでうまくいくかもしれませんが、使い勝手は良くないのではないかと思います。

 更に、別のアプローチを考えてみましょう。

 いっそ、生きているログの表示は触らずに、過去ログの作り方を変えるのはどうでしょう?

 今のスクリプトでは、過去ログの新規書き出しはできても、追加書き出しが出来ないのがネックなのかと。

 過去ログの追加書き出しが出来れば、最新データ以外は、どんどん(最新)過去ログに書き出せばよいので、運用でカバーできるかもしれません。

 過去ログを同一ファイルに追加可能にするだけなら、「output_execute」ルーティンの1219行目から1220行目を、

open OUT, ”>$ddir$QUERY{fname}”

or &error_form( ’過去ログの保存に失敗しました’ );

から、

if ( -s ”$ddir$QUERY{fname}” ) {

open OUT, ”>>$ddir$QUERY{fname}”

or &error_form( ’過去ログの追加に失敗しました’ );

} else {

open OUT, ”>$ddir$QUERY{fname}”

or &error_form( ’過去ログの保存に失敗しました’ );

}

に変えるだけで いけそうです。

 これで、こまめに過去ログファイルを作るというのはダメですか?

 (過去ログのファイル名に工夫が要るかもしれませんが・・・)

 クールな解決策とは言えませんが、私に考えつくのは せいぜいこの程度です。

 どうも、すみません。

id:cocoro

有り難う御座いますm(__)mやってみます

2003/08/07 19:31:53
  • id:sasada
    バグ発見 m(_ _;m

    >next if( $new == 2 and !$displayed);
     next if( $new == 2 and $displayed);
    の間違いですね。!マークつけちゃダメじゃん(T_T)
  • id:cocoro
    やってみました。

    一番最後の、過去ログに追加書き込みをする方法が一番良いかと思ったので

    output_executeルーティンの

    open OUT, ”>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの保存に失敗しました’ );



    if ( -s ”$ddir$QUERY{fname}” ) {
    open OUT, ”>>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの追加に失敗しました’ );
    } else {
    open OUT, ”>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの保存に失敗しました’ );
    }

    に変えてみました。
    過去ログへの追加書き込みは出来るようになったのですが、
    追加する度に過去ログ一覧画面のリンクも増えてしまいます(^^;)
    これは、どうしたら解決するか、もしお分かりになるようであればアドバイスいただきたいのですが…
  • id:cocoro
    Re:やってみました。

    ちなみに、現在はこのようになっております
    http://pinky.s31.xrea.com/log.jpg

    どちらをクリックしても、5日と6日の2日分の過去ログが表示されているページへ飛びます。
  • id:sasada
    あわわわわ

    >ちなみに、現在はこのようになっております
    >http://pinky.s31.xrea.com/log.jpg

     今からダウンロードしなおして調べます。
     もうちょっとだけ待ってください。
     すみません。
  • id:sasada
    バグ修正その2(^^;

     お待たせしました。
     え〜とですね。
     元ファイルで言うところの1237行目から1252行目に当たる「過去ログ一覧の更新」の処理が原因です。
     これ全体をif文で囲みます。

    if ( !$append ) {
    # 過去ログ一覧の更新
    # 1237行目から1252行目
    #
    # my $st_date = &cnv_ymd1($QUERY{start});
    # から
    # close OUT;
    }

    とします。

     で、元に戻って、

    if ( -s ”$ddir$QUERY{fname}” ) {
    open OUT, ”>>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの追加に失敗しました’ );
    } else {
    open OUT, ”>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの保存に失敗しました’ );
    }

    は、

    my ($append);
    ( -s ”$ddir$QUERY{fname}” ) ? $append = true : $append = false;

    if ( $append ) {
    open OUT, ”>>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの追加に失敗しました’ );
    } else {
    open OUT, ”>$ddir$QUERY{fname}”
    or &error_form( ’過去ログの保存に失敗しました’ );
    }

    と修正してしまいましょう。
     これで、どうでしょうか?
  • id:cocoro
    やってみました^^;

    修正してみたのですが、どうも500エラーになってしまいます^^;
  • id:sasada
    Re:やってみました^^;

     うぅ、度々すみません。

     ひとつ、バグ発見。
    「過去ログ一覧の更新」1237-1238行の
    my $st_date = &cnv_ymd1($QUERY{start});
    my $ed_date = &cnv_ymd1($QUERY{end});
    の2行は、if文の外に出してください。

     500エラーになるかどうかはビミョーですが、-wオプションがあれば警告にはなるはずです。

     あと、
    ( -s ”$ddir$QUERY{fname}” ) ? $append = true : $append = false;

    $append = ( -s ”$ddir$QUERY{fname}” ) ? true : false;
    でしたね。
     元の例でも、エラーにはならずに動くはずなんですけど。。。

     あるいは、

    if ( -s ”$ddir$QUERY{fname}” ) {
    $append = true;
    } else {
    $append = false;
    }

    でも良いです。

     コーテーション「’」やダブルコーテーション「”」の半角変換は、うまくいっていますか?
     今まで動いていたのですから、各ファイルのパーミッションは大丈夫ですよね。。。

     これでだめなら、Webサーバーのエラーログを転載してみてもらえますか?
     それで見当がつくと思います。
  • id:cocoro
    Re(2):やってみました^^;

    えぇっと、

    Script Error
    The script did not produce proper HTTP headers. Please see the error log to see the detail of the errors. Depending on the server configuration, you can also run this script under CGIWrap debugging. Usually, either rename or link the script temporarily to a file which ends with .cgid extension, or add a AddHandler cgi-script-debug .cgi line to your .htaccess file

    というのが出てしまいました;
  • id:sasada
    はて?

    >The script did not produce proper HTTP headers.
     ということですから、元スクリプトの106行目で設定されている
     my $html_header = ”content-type: text/html; charset=Shift_JIS¥n¥n”;
    が、正しく送信されていないということだと思います。

     あるいは、これが送信される前に、何かが送信されているか。。。

     今回の改造で言えば、元スクリプトの1254行目から1255行目にかけての
     print <<”OUT_HTML”;
     $html_header
    が、このとおり抜けもなく、余分なものもなく実行されていれば、問題なさそうです。
     過去ログをif文で囲むときに、この2行の間に改行を入れたりしていませんよね?

     過去ログのif文近辺は、

    my $st_date = &cnv_ymd1($QUERY{start});
    my $ed_date = &cnv_ymd1($QUERY{end});

    if ( !$append ) {
    my @templ = ();
    open IN, ”$ddir$old_html”;
    @templ = <IN>;
    close IN;

    my $anchor = ”<a href=’$me/$QUERY{fname}’>・$st_date 〜 $ed_date</a>
    ¥n<!--<<APPEND>>-->”;

    for(@templ) {
    s/<!--<<APPEND>>-->/$anchor/e;
    }
    open OUT, ”>$ddir$old_html”;
    print OUT @templ;
    close OUT;
    }

    print <<”OUT_HTML”;
    $html_header

    となっていますか?

     本来、今回の改造で出るはずのないエラーですので、Apacheのエラーログを参照したいところです。
     あるいは、wwwnikki.cgiをwwwnikki.cgidと改名して、デバッグモードで実行して、エラー表示を確認してみてください。

  • id:sasada
    お願い

     もうひとつ、リクエストしても良いですか?
     当該のスクリプトのURLを、下記リンクのサイトでチェックしてみてください。
     そのとき、「URL指定のときHTTPレスポンスヘッダを表示します。」をonにしてチェックすると、ヘッダ情報を見ることが出来ます。

     わたしのサイトでやると、こんな感じ(笑)

    =========================================================

    http://(略)/(略) を XHTML1.0 Strict としてチェックしました。
    3個のエラーがありましたが、このHTMLは 100点です。タグが 21種類 84組使われています。文字コードは EUC-JP のようです。

    Connection: close

    Date: Fri, 08 Aug 2003 02:28:35 GMT

    Server: Apache/1.3.20 Sun Cobalt (Unix) mod_jk mod_ssl/2.8.4 OpenSSL/0.9.6 PHP/4.0.6 FrontPage/5.0.2.2510 mod_perl/1.26

    Content-Type: text/html

    Client-Date: Fri, 08 Aug 2003 02:28:35 GMT

    Client-Peer: 61.120.201.10:80

    X-Powered-By: PHP/4.0.6

    先頭の数字はエラーのおおまかな重要度を 0〜9 で示しています

    ============================================================

     で、この、「Connection: close」から「先頭の数字は〜」までの間の記述を、教えていただけませんでしょうか?


    http://ring.aist.go.jp/openlab/k16/htmllint/htmllint.html
  • id:cocoro
    Re:お願い

    前者のデバッグモードの方はこのようになりました
    http://pinky.s31.xrea.com/001.txt

    後者のチェックは、
    指定されたHTMLを取得することができませんでした。
    500 Internal Server Error
    となってしまいました;
  • id:sasada
    犯人は my ($append); と見た!!

    >Global symbol ”$append” requires explicit package name at (略) line 1219.
    >Global symbol ”$append” requires explicit package name at (略) line 1221.
    >Global symbol ”$append” requires explicit package name at (略) line 1246.

     これですね。
     Lineナンバーから察するに、

     1219行目が
     $append = ( -s ”$ddir$QUERY{fname}” ) ? true : false;

     1221行目が
     if ( $append ) {

     1246行目が
     if ( !$append ) {

    になっているのではないでしょうか?

     だとすれば、1219行目の直前にあるはずの
     my ($append);
    が効いていません。
     入力モレか、タイプミスではないでしょうか?

     あるいは、$appendって、予約されている名前でしょうか?
     念のため、違う名前に変えてみますか。$tsuika_modeとか。。。

     もしはずしていたら、こんどは、ソースコードの
     1215行目近辺から1250近辺を教えていただけますでしょうか?

     ちなみに、投げ銭システムで送ったメッセージも届いてますよね?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません