トップページ⇒php
982コメント439KB

【 スクリプト改造工房 PART 7 】

■ このスレッドは過去ログ倉庫に格納されています
0001sage03/09/17 15:28ID:ZcvVdw5C
 
#================================
# スレッドの説明
#================================

「スクリプトを改造したいけどやりかたわかんないよー」という人がいましたら
ここで聞いてください。ひょっとしたらアドバイス出来るかもしれません。

質問するときは以下の点に注意して書いて下さい

(1) そのスクリプトの内容と置いてある場所を明記する (txtファイルでUPすればなお良い)
(2) どんな風に改造して欲しいのか? (完成イメージHTMLを用意すればなお良し)
(3) 出来るだけ詳しく書くこと。少しは自分で考えること。できれば御礼も言ったほうが良い

※答えてくれないからといって逆ギレする厨はお断り

過去ログ>>2
0784nobodyさん04/01/31 02:35ID:???
>>1ぐらい読んでください。
0785nobodyさん04/01/31 02:57ID:???
>>783そのArseno ver2.1.4のソースのありかぐらい教えてくれ……
0786nobodyさん04/01/31 03:22ID:???
>>785
失礼しました。辞書といえば大抵これなので有名なものかと思ってしまいました。
現在、制作者さんのHPが閉鎖されてしまっているため、下記ページで再配布されています。
ttp://www.geocities.co.jp/SiliconValley/1781/arseno/
再配布については、作者さんの許可はあるようです。
0787nobodyさん04/01/31 04:08ID:???
>>786
dr.cgiのsub show_def内の、print "Content-Type: text/html\n\n";の直前か直後に、
@defs = reverse @defs;
これで良いと思う。
078878304/01/31 04:38ID:???
>>787
直後につけることで変更させることができました。
乏しい情報の中でわざわざすいませんでした。
本当にありがとうございました。
0789nobodyさん04/01/31 13:04ID:???
最近パッチワークCGIが多いな。
0790nobodyさん04/01/31 22:58ID:???
こんなCGI探してますスレッドより誘導されてきました。

現在某画像UP掲示板を運営しており、利用者の増加に伴うCGIの入替を検討しています。
現在はimgboad.cgiを利用しておりますが、評判が良くない事とまれに正常に動作しない場合があるのが理由です。

新しいCGIには、「Child Treeマルチファイルアップ掲示板」
ttp://www.cj-c.com/cgi_s/cbbs.htmを検討しておりますが、どうしても必須な機能が1つ足りません。

連続投稿規制に関する機能なのですが、「1つ投稿したら*分は投稿できない」ではなく、「*分以内には*回まで投稿可能」
という制限機能が必須なのです。(本機能はimgboad.cgiには実装されていますが、Child Treeにはありませんでした…)

「Child Treeマルチファイルアップ掲示板」のインターフェイスは気に入っており、是非利用したいのですが、何とか上記の機能を実装できませんでしょうか?
テンブレの指示通り http://homepage3.nifty.com/qvga/ftp/cbbs.txt にCGIをテキストでUPしておきました。
丸投げでの依頼をする所でない事は重々承知ですが、自分の力ではどうにもならない為、藁にもすがる気持ちで書き込みさせて頂きます。
長文となってしまいましたが、知識のある方のご協力をお願い致します。
0791nobodyさん04/01/31 23:55ID:???
>>790
>丸投げでの依頼をする所でない事は重々承知ですが。

分かっているなら(略

俺?知識があるなんて恐れ多くて言えないから協力せんけど。
0792nobodyさん04/02/01 08:07ID:???
>>791
それじゃなんで来たんだ?屑
分からないならだまっとけよ塵
0793未承諾広告※ ◆aiY4htt2.2 04/02/01 10:07ID:???
>>790
ご予算は如何ほどに?( ̄ー ̄)ニヤリ
変数の扱いが無茶苦茶なので割高になるかと思いますけれども。。。(哀)
取り敢えず、 BBQ が落ち着いてから。
079479104/02/01 11:53ID:???
>>793
なるほど。
納期を長く頂ければ格安でご提供することも可能ですが、いかが致しますか?

よく考えると人件費含めて他人の資産を使おうとしてるんだから、対価が発生するのがデフォルトだよな。
死にかけてる奴とかなら情で無償の奉仕が発生してもそれは人間として正しいわけだが。
それなりの生活水準の奴を無償で助ける義理ってのは無いよな。

まぁ、やな世の中だってこった。
0795nobodyさん04/02/01 16:55ID:???
>>793
禿同。
ただでさえ他人が書いたものはいじる気にならんのに
これだけ汚いスクリプトは読むまえにリタイアだよw
まぁ、知識がないおれには読む書く以前の問題だけどね。
0796nobodyさん04/02/01 17:25ID:???
既にその機能が実装されている掲示板のソースがあるならそこから自力で移植すれば?
その程度ならさして難しくないだろう。
俺なら元のCGIを使いつづけるがな。
0797誘導した本人04/02/01 17:37ID:???
>>790
誘導した本人だ。
君にもレスくれたみんなにも迷惑かけたな。スマン。
責任とって俺がやろう・・・と言いたいが・・・。
そんな安請け合いが出来ないほどcbbs.cgiはすごいな。
かなり気合を入れないと読み下せない。
と言うわけで時間をくれ。
対価はいらんが、もしかしたら逃げてしまうかもしれないと思われ。

それで質問だが、、「*分以内には*回まで投稿可能」 と言うのは一人一人に対してか?
それとも全員合わせてなのか?
例えば5分以内に5回という制限としよう。
ひとりで5分以内に5回投稿したら、他の人は最初の投稿だが投稿できないのでいいのか?
それでいいのなら割と簡単ぽいが、一人一人別制限だったらちょっと辛いかも・・・。
079879004/02/02 16:45ID:???
>>793氏
ご予算ですか…。
掲示板からの収入は全く無いのでポケットマネーからという事になりますが、ウン十万とかは無理です。
1〜2万円でしたらなんとか捻出できるとは思いますが安すぎますよね。
相場とはどのくらいなんでしょうか?

>>794氏
納期を長く、とはどのくらいになりますでしょうか?
リッチな生活をしている訳ではないので安ければ安いにこした事は無いです。
>よく考えると人件費含めて他人の資産を使おうとしてるんだから、対価が発生するのがデフォルトだよな。
私も当然そう思います。
引き受けて頂けるのでしたら代金はお支払いするつもりですが、↑にも書いた通り予算はかなり厳しいです。
この程度の予算では話にならないでしょうか?

>>795氏
私は掲示版を設置する事はできますが、cgiの中身を理解する事はできません。
そんなに酷いのでしょうか?評判が良いらしいのでChild Treeにしようと思ったのですが。。。

>>797氏
わざわざこちらでもレス頂きありがとうございます。
お時間はいくらかかってもOKです。ご協力頂ける事に感謝致します。
対価はいらないとの事ですが、上の皆さんもおっしゃっているようにかなり大変そうですので、無事に完成させて頂ければ
予算内での代金をお支払いさせて頂きたいと考えております。

投稿制限に関してですが
>例えば5分以内に5回という制限としよう。 ひとりで5分以内に5回投稿したら、他の人は最初の投稿だが投稿できないのでいいのか?
>それでいいのなら割と簡単ぽいが、一人一人別制限だったらちょっと辛いかも・・・。
では残念ながらダメですね。全員合わせてではなく、1人1人に対して*分以内には*回まで投稿可能という機能が欲しいのです。
Child TreeのサポートBBSにも書き込みしてみましたが、作者からの返答で
>それは難しいですね。cookie等を用いて投稿回数の記録か、ログに投稿回数などを取得しておかなければなりません。
との返答を頂きました。やっぱり難しそうです。。。
0799未承諾広告※ ◆aiY4htt2.2 04/02/02 21:30ID:???
時間掛けても良いんだったら、勉強汁。
0800nobodyさん04/02/03 00:56ID:???
>>799
ああ、自分が勉強すればその後一切他人に対価を支払う必要はなくなるよな。
確かにその通りだ。
0801nobodyさん04/02/03 07:02ID:7G9Cx1i0
某スレッドよりご紹介を受けて参りました。
テキストエリアから飛ばしたデータを、htmlスキンのテキストエリアで読み込もうとしたら
改行のタグがそのまま出てしまうので、本などで調べてたら、

 $comment =~ s/\r\n/<BR>/g;
 $comment =~ s/\r/\<BR>/g;
 $comment =~ s/\n/<BR>/g;
 $comment =~ s/\t/ /g;
 $comment=~ s/<BR><BR>/<BR> <BR>/g;

 がテキストエリアの改行コードをタグ化する命令文だということが分かりました。で、テキストエリアの改行コードが「\r\n」であるのなら、
ログへもこのコードを飛ばせば、うまくいくんじゃないかと思って、

 $comment =~ s/\r\n/\r\n/g;

という形にしてみたのですが、これだとログ上では改行されていましたが、読み込む際にその改行部分で読み込みが途切れてしまい、後の情報は
全て読み込まれなくなるなどの不具合が生じてしまいました。書き込みした直後はうまく改行された状態でテキストエリアに
表示されるのですが、どこかに移動して戻ってきたり、更新するとダメになります。最初の読み込み時と、二度目の読み込み時で
コメント部分が違う読み込みが行われるので、2重更新まで結果的に許可されてしまう状態となり、もうどうしようもない状態になりました。

 で、2ちゃんで質問させて頂き、こちらを紹介して頂いたのですが、それとほぼ同じごろに、ググりまくった成果がようやく出てきて、
メモ帳などでいじる際のテキストエリアの改行タグ?は「?」であるということが分かり、

 $comment =~ s/\r\n/?/g;
 $comment =~ s/\r/?/g;
 $comment =~ s/\n/?/g;
 $comment =~ s/\t/ /g;
 $comment=~ s/<BR><BR>/<BR> <BR>/g;

 という形に変更したら、見事、二重更新もされず、ログ上にもちゃんと「?」が残った状態で、読み込みの際にだけ
改行が行われるようになり、最初に意図してた通りのhtmlを吐き出してくれました。
0802本題です04/02/03 07:02ID:7G9Cx1i0
 で、ここまできてひとつ気になることが生まれて
質問させていただきたいのですが、\r\nと\rと\nは
winやマックの改行コードとして調べていて分かったのですが、
$comment =~ s/\t/ /g; は一体なんなのでしょうか?
しかも空白になっています。なぜ空白なのでしょうか?

$comment=~ s/<BR><BR>/<BR> <BR>/g; もイメージがつかめません。

 これはこのままにしておいたほうがよろしいのですか?
ちなみにttp://hp.bird.to/info/bbsking.html のCGIを
改造しています。
0803本題です04/02/03 07:04ID:7G9Cx1i0
 あれ??
「&#13;」って書いたところが「?」になってますね…。
奥が深そう・・・。
0804未承諾広告※ ◆aiY4htt2.2 04/02/03 09:56ID:???
perlre でも読んでみませう。
http://rananim.ie.u-ryukyu.ac.jp/~kono/perlman/cat1/perlre.html
とかほかいろいろ
0805nobodyさん04/02/03 16:06ID:???
> <br><br>
バグか仕様か宗教上の問題かは知らんが、<br>を連続で書くと1つの<br>としてしか認識しないブラウザが稀にある。
間にスペースを挟むのはそういうときの対策だな。
消しても問題ないと思う。レアなトラブルと1空行あたり1バイトの無駄データ、どっちを優先するかの話。

>&#13;
&#(数字);は実体参照。意味はぐぐってくれ。
10が\nだと思ったから13は\rなのかな。
&#13;は"&13;"であって「改行」ではないから、例えばそのデータを再び送信するとおかしなことになる。
吐き出したHTMLのソースを読むとその場所で改行されてないって事が分かると思う。
(表示しかしないのであれば問題は無い)

\tについては804を参照。

改行部分で途切れていたのは、perlが改行をデータ間の区切り文字として認識してるから。
ログでは<br>として保存しておいて、表示の直前に<br>を\n(あるいは\r\n)に置換するのが定石。
あるいはperlの区切り文字($/)を一時的に変えてしまうというトリッキーな手もある。
0806nobodyさん04/02/03 16:07ID:???
ところどころ#を書き忘れた、&13;は&#13;と脳内補完してくれ。
0807nobodyさん04/02/03 16:51ID:???
 未承諾広告さん、>805さん、どうもありがとうございました。
 
 未承諾広告さんに教えて頂いたページを読んだのですが、
HP作成歴は、それなりにあるものの、CGIを勉強しだして2週間しか
経っていない私には、正直申し上げて、\tの説明以外の部分は今はまだ
いくら読んでも頭に入ってきませんでした…(お気に入りには登録しておきました)
 
 私のHPの掲示板は、長文を書かれる方が非常に多いので、
レスのコメント部分がテキストエリアで表示されるようにしたら、
1つ1つのレスの大きさも均等化されて、新規レスが上がった際に、
目的のレスまで遠くなるというような問題を解消できると思って、
この改造を思い立ちました。
 
 読み込み専用ですので、これで問題なく動かせそうです。

 「実体参照」、調べてみましたが面白いですね。
また世界が広がったような気がします。ありがとうございました。

 それにしてもどうして>805さんのレスには「&#13;」が
半角でちゃんと表示されているんだ??? 

 「?」←半角で「&#13;」を書いてみた。
0808nobodyさん04/02/03 18:05ID:???
?
0809nobodyさん04/02/03 18:27ID:???
&amp;#13
081079704/02/03 20:00ID:???
>>798
一応出来た。
imgboardのようにクッキーを使おうかと思ったが、それだとcbbsを弄る必要がある。
それは超マンドクセーので、追加記述で出来る別ログに記録しる方式にしてみた。
IPで個人を識別しているので、一旦接続を切ってIPを変えたり、プロクシを刺したりしたら制限が効かない事もある。
クッキーにしたってクライアントがクッキーを破棄すれば制限が効かない事もあるで、個人的にはこれでOKかなと。。。
どうしてもクッキーでやりたいのなら、俺はパスだ。

つづく。
0811nobodyさん04/02/03 20:03ID:???
まず、
cbbs.cgi と同じディレクトリに、空ファイル hiroyuki.txt を600か606でUPしる。

cbbs.cgi の1227行目が空行になっているが、そこに
&fusianasan;
と記述しる。


つづく
0812nobodyさん04/02/03 20:07ID:???
以下をコピペして、スクリプトの一番最後にペーストしる。

sub fusianasan{
    $limit_log = 'hiroyuki.txt' ;    # エポック秒とIPアドレスを記録しるファイル
    $limit_type = '600' ;        # 連続投稿回数制限 サンプリング期間 (秒数)
    $limit_time = '3' ;        # 連続投稿回数制限 回数 (この回数までOK)
    $count = '' ;
    open(LOG,"$limit_log") || &er_("Can't open $limit_log");
    @line= <LOG>;
    close(LOG);
    foreach (@line){
        chomp;
        @_ = split /\t/,$_ ;
        time - $limit_type < $_[0] or next;
        $count++ if $ENV{REMOTE_ADDR} eq $_[1];
        push @line2,$_ . "\n" ;
    }
    &er_("overtimes 掲示板管理者が設定した連続投稿回数をオーバーしました。<BR>しばらく投稿できません","1") if $count >= $limit_time ;
    open(LOG,">$limit_log") || &er_("Can't write $limit_log","1");
    print LOG @line2;
    print LOG time . "\t" . $ENV{REMOTE_ADDR} . "\n";
    close(LOG);
}
0813nobodyさん04/02/03 20:13ID:???
chomp使っているから、perl5 以上でな。
元スクがuse strict してなかったから、俺も適当に書いた。
対価は前にも言ったがいらねー。

どうしても払いたいと言うのなら、>>798の名前で日本赤十字社に寄付してくれ。
金額はお前に任せる。
俺はそれでいい。
0814nobodyさん04/02/03 21:36ID:TrK4Nuwe
改造のアドバイスをお願いしたく、書き込みさせていただきます。
実際のカウント数よりワザと大幅にカウントを多く表示する
「水増しカウンタ」というスクリプトなんですが
http://dekachin.at.infoseek.co.jp/counter.txt
これを日付けが変わると同時にカウンタ数値を000にリセットするようにしたいのですが
どこをどうイジったらいいのかサッパリ…

海外サーバで使用する場合にも追加加工が必要なんでしょうか?
要領を得ない質問のしかたで申し訳ありませんが
どうかアドバイスよろしくお願いいたします。
0815未承諾広告※ ◆aiY4htt2.2 04/02/03 22:35ID:???
>>814
> どこをどうイジったらいいのかサッパリ…
こんなに短いソースなのに漏れもさっぱり。。。
0816nobodyさん04/02/03 22:49ID:???
ファイルの更新日時をstatで取得して、(アクセス時点から見て)前の日だったらリセット。
$ENV{'TZ'}をスクリプト内で適切に設定すれば海外でも国内でも問題ない。
081781404/02/03 22:58ID:TrK4Nuwe
>>815様
やはりかなり特殊な物なんでしょうか…

>>816様
レスありがとうございます。「statで取得」…
ググって頑張ってみます…
0818nobodyさん04/02/03 23:11ID:???
至って不真面目なやり方だが

32行目
旧:($count,$truth,$times,$ips,$i) = split(/<>/,$data[0]);
新:($count,$truth,$times,$ips,$mod) = split(/<>/,$data[0]);

58行目と60行目の間に追加

my ($now_day) = (localtime(time()))[3];
my $old_day = $mod;
my $new_day = '';

if ($now_day ne $old_day){
$count = 0;
$new_day = $now_day;
}else{
$new_day = $old_day;
}


77行目

旧:$data[0]="$count<>$truth<>$tm<>$ip<>\n";
新:$data[0]="$count<>$truth<>$tm<>$ip<>$new_day<>\n";

以上。

>>817
特殊なんじゃなくて汚いわけで<ソース
081981404/02/03 23:39ID:TrK4Nuwe
>>818様
わあ!ありがとうございます!
>特殊なんじゃなくて汚いわけで<ソース
そうなんですか…

自分の使ってるエディタですと多少行数が違って表示されるんですが
該当箇所を教えてくださった通りに書き換えてみました。

これを海外サーバで動かす場合は
$ENV{'TZ'} = "JST-9";
を、どこかに追加すればいいのでしょうか?
0820nobodyさん04/02/04 17:24ID:???
皆様、初めまして
唐突ですみません、
質問させて下さい!
apeボードで書き込みの親記事部分にホスト表示をさせたいのですけれど、、、
こんなことって可能でしょうか
もしこちらでするべき質問ではなかったなら、本当に失礼しました
0821nobodyさん04/02/04 17:39ID:???
>>820
>>1を読んで退場
0822ИТО04/02/04 23:16ID:rVneR8vT
掲示板を作ってるんですが、レス投稿者にトップソートするかしないかを選択できるようにするにはどうすればいいのでしょうか?
2chの場合はE-mailにsageと書くとトップソートしませんよね。
0823nobodyさん04/02/04 23:28ID:???
>>822
質問の前に>>1をみるなり、ネチケット守りましょう。。

自作してるんならわかるんじゃないの?
単にifで条件分岐すればいいだけの話では?
0824nobodyさん04/02/05 01:26ID:???
頭文字だけ書いておくよ。
例えばiとmとsあたりかな。
0825nobodyさん04/02/05 03:38ID:???
自動でトップソートしてくれるような便利な機能は無い。
0826nobodyさん04/02/05 06:03ID:???
・名前を入れている
・本文が2〜3行
・sageない

こういう奴って間違いなくマルチポストしてる
082770604/02/05 08:06ID:???
前回、写メールBBSでお世話になった706です。

あれからphpを勉強して、なんとか5つ星評価スクリプトを作ってみたんですけど
それをcgiに組み込むことって出来ますか?
試しにdatabese.cgiが吐き出すテンプレート用htmlの拡張子をphpに変えて
日付のスクリプト書いてみても日付は表示されませんでした…ムリなんですかね?

http://yellow.ribbon.to/~mush/star.php
0828nobodyさん04/02/05 11:06ID:TYkaMAsn
KENTWEBさんのWEB FORUMを利用しています。
ttp://www.kent-web.com/bbs/wforum.html

この掲示板に2chのような、投稿者別にIDを振って表示させたいのですが何かいい方法はありませんか?
もし何かアドバイスがあればよろしくお願いします。
0829nobodyさん04/02/05 15:17ID:???
>>828
生IP表示しちゃえば良いじゃん
0830nobodyさん04/02/05 16:42ID:???
はじめまして。
ウェブ作成にakiaryという日記作成cgiを使用しています。
http://www.hi-ho.ne.jp/yakira/akiary/

ウェブ上で文章編集し、最新ページ作成と月別のページを自動作成してくれるツールなのですが、
そこに追加で、月別のページに日付とタイトルリストを追加しようとしてもなかなかうまくいきません。
このcgi独自のタグをいじってみても、エラーが出るばかりです。

テンプレートをいじった見本としてあげられているサイトを見ると
あっさりそれを実現している方もいるのですが、テンプレ公開などはされていません。
ttp://nanako.pekori.to/diary/200311.html (左側にちゃんとページ内インデックスが!)

サポート掲示板でもこのことが話題になっているようなのですが、
どうもまだやり方は不明のようです。

どなたか、教えて下さいませ。
0831nobodyさん04/02/05 19:39ID:???
>>706
ちょっと状況が分かりません。

>>830
まず、テンプレート(tmpbn.html)の、リストを入れたい場所に「<!-- list -->」を追加。
次に、akiary.cgiのsub MakeBNDiary内について、
・「head部作成」を「# 日付でソート」の下に移動。
・その間に、以下を挿入
foreach (@k) {
 my($y,$m,$d) = unpack("A4A2A2", $bndate{$_});
 my $w = &GetWdayZeller($y,$m,$d);
 my $wday = ('日','月','火','水','木','金','土')[$w];
 $date = substr($y,2,2)."/$m/$d($wday)"; //この行と
 $list .= "<a href=\"#$bndate{$_}\">$date$bntitle{$}</a><br>\n"; //この行を適宜変更
}
$tmpbnhead =~ s/<!-- list -->/$list/;
083283104/02/05 19:41ID:???
いかん、perlのコメントは#だった。
083383004/02/05 20:40ID:???
>>831さん

素早い返信本当にありがとうございます!

さっそくやってみたのですが、パスワード入力画面ででHTTP 500 - 内部サーバー エラーが出てしまいます。
最初の「head部作成」を「# 日付でソート」の下に移動、だけだとちゃんとアクセスできるので
はりつける際にどうもわたしはなにか変なミスをしているみたいです。
//は832を見て#に変更したり、コメント部分を全部消してみたりしたのですがそれでもだめです。

cgiの変更部分のやり方は

# 日付でソート
@k=&SortedDID(*bndate);
@k=reverse(@k) if ($tmpbnrev==1);

ここに(以下)の部分

# head部作成
print FH $tmpbnhead;

であっていますでしょうか。自分では原因がつかめず悩んでいます。
(長文になりすみません)
0834nobodyさん04/02/05 20:52ID:???
>>833
全角スペース
083583004/02/05 21:18ID:???
>>834さん、ありがとうございます。
全角スペース、すごく基本的なことなのに5個もありました。
早速消し去り、ついでに「;」「"」等もチェックし、よし、と思ったのですが……。
夢に見たゴールはもうすぐな気がするだけに、メモ帳をにらみつつ格闘です。
がんばります。
0836nobodyさん04/02/05 22:28ID:???
>>835
メモ帳よりhttp://www.vector.co.jp/soft/win95/util/se169799.htmlこっちのほうがいい
たまに落ちるのが難点だが
0837nobodyさん04/02/05 22:33ID:???
834の指摘のような単純ミスをしないためにも、エディタはそれなりのものを使ったほうがいい。
無料でイイのがいくらでもあるんだから、面倒くさがんないでとりあえず入れとけ。
0838nobodyさん04/02/05 22:56ID:???
>827
CGIとは何かから説明しないとって話な気もするけど、結論から言うと無理。
htmlファイルにphpを組み込むのは可能だけど、perlスクリプトの処理結果をPHPでさらに処理する事は出来ない。
CGI側でphpスクリプトを含むhtml(拡張子は*.php)ファイルを作る、とかになると思う。
あるいはPHPスクリプトをperlで書き直して移植するか、その逆か。
0839nobodyさん04/02/05 23:03ID:???
場合によってはPerlからPHPに投げればできなくもない。
084083104/02/05 23:26ID:???
>>830
すまん、"_"が一つ抜けていた。
foreach (@k) {
my($y,$m,$d) = unpack("A4A2A2", $bndate{$_});
my $w = &GetWdayZeller($y,$m,$d);
my $wday = ('日','月','火','水','木','金','土')[$w];
$date = substr($y,2,2)."/$m/$d($wday)";
$list .= "<a href=\"#$bndate{$_}\">$date$bntitle{$_}</a><br>\n";
}
$tmpbnhead =~ s/<!-- list -->/$list/;
084183004/02/06 18:09ID:???
みなさん、ありがとうございます。教えてもらったソフトを入れてみました。
そしてまた840をコピーさせてもらい、はりつけて、UP。
エラーではなくちゃんとパスワード画面が1回で出ました!

なのですが、リストの表示がなぜかされません。
テンプレートの読み込み直しはちゃんと出来ているので、
わたしがテンプレートに追加した「<!-- list -->」の位置がまずいのかも(そんなのないかな?)。
cgiはうまくいったので(ありがとうです)、今度はそこのところをいろいろ試してみようと思います。
831さん、ほかみなさん、本当にいろいろありがとうございます。

週末はちょっとパソコンがさわれないので、うまくいったら月曜以降に報告させてください〜。
084283104/02/06 19:57ID:???
>>830
<!-- list -->は、メインの日記部分より前なら、どこでも平気なはずです。
日記より後に入れる場合は、
$tmpbnfoot =~ s/<!-- list -->/$list/;
とりあえず作られたHTMLのソースを見て、<!-- list -->がそのまま残っていないかどうかをチェック。
084383004/02/06 20:44ID:???
>>831さん
できましたー!!
なぜか思ったとおり「<!-- list -->」の位置がまずかったみたいで(野生の感?)位置を変えたらできました!

・・・と、報告に来たらまた831さんのレスが!
842で教えていただいたように変更し、最初にやりたかった「<!-- list -->」の位置で
ばっちり「こうしたいなあ」と思っていたようになりました。
もうほんとにほんとにありがとうございます。
あーすごくうれしいです。

831さん、ほかアドバイスくれたみなさん、本当にありがとうございましたー!
084482704/02/07 00:55ID:???
706です。
>>837さん>>838さん 返事ありがとうございます。

PHPっていうのは外部(database.cgi内)のform actionからコールしても
input情報を渡すことできますか?拡張子が*.phpのページからしかダメなのかな。

もし外部からでも渡すことが出来るなら、5つ星評価スクリプトの表示部分だけ
Perlで書いて、データの書き込みはPHPにやらせればできそうかなぁ。
本当はPerl内にぜんぶ書いたほうがスマートだと思うんですけど。

下のPHPスクリプトをPerlに移植してもらえたら嬉しいんですけど甘ちゃんですか…?お願いします。m(_ _;)m


★表示箇所
$log = "data.log";
$fd = fopen($log, "r");
$buffer = fgets($fd, 1024);
list($line, $st, $ct) = explode("|", $buffer);
fclose($fd);

$ave = round($st/$ct, 2);
if(!$__1__){
echo "データがありません";
}elseif($line==$__1__){
if($ave>=5) $star="★★★★★";
elseif($ave>=4) $star="★★★★";
elseif($ave>=3) $star="★★★";
elseif($ave>=2) $star="★★";
elseif($ave>=1) $star="★";
}
$result = "Rating:$star ".$ave."<br>Vote : $ct";
084582704/02/07 00:56ID:???
つづきです。

__1__ はdatabase.datのタブ区切りで記入されている各配列の1番目のキーを入れたい。
database.cgiのテンプレートに __1__ を記入すれば1番目のキーを呼び出せるので
テンプレートに書いたフォームのinput valueに__1__を指定すれば、phpに情報を
渡せるかも。でもcgi内で★評価対象配列の1番目のキーを参照させるには?

database.cgiが処理したページのURLを見ると下記のようになってます。
hxxp://pc2.2ch.net/php/database.cgi?sline=1&print=1&keys2=スクリプト改造工房&tid=list2

sline=1のパラメーターがdatabase.datの上から1番目の配列ということです。
説明不足があったら突っ込んで下さい。

▽database.cgi テキスト
http://yellow.ribbon.to/~mush/database.txt
▽完成イメージ
http://yellow.ribbon.to/~mush/abc.htm
0846nobodyさん04/02/07 04:17ID:???
>>827
refererの制限をしていない限り、どこからPHPを呼び出しても問題ない。

$log = "data.log";
open(FH, $log);
$buffer = <FH>;
($line, $st, $ct) = split("|", $buffer);
close(FH);

$ave = sprintf("%1.2f", $st/$ct);
if(!$__1__){
print "データがありません";
}elsif($line==$__1__){
if($ave>=5) $star="★★★★★";
elsif($ave>=4) $star="★★★★";
elsif($ave>=3) $star="★★★";
elsif($ave>=2) $star="★★";
elsif($ave>=1) $star="★";
}
$result = "Rating:$star ".$ave."<br>Vote : $ct";
0847nobodyさん04/02/07 09:30ID:fzL4+sPl
ttp://hp.bird.to/cgi-bin/bbsking.cgi

↑このサンプルの元となっているCGIを利用したいのですが、
新着レスを上げる機能がついている、とあるのですが、
投稿した直後は上がってるんですが、更新すると
また親記事のナンバーの順に並んでしまいます。
一度、下の方のツリーにレスを入れた後、更新してみてもらえると
分かるかと思います。

 こちらで配っているCGIの元ソースは、
http://csx.jp/~minamonami/
にアップしておきました。

もうほとんどBBSのスキンや他の部分の改造は完成していて、
ようやく使えると思ったら、今になってこのバグに気がつきました。

 でもこちらのサイトではユーザーサポートをもうほとんどしていないようなので、
他のCGIの「レス上げ機能」を記述しているらしき部分を抜き出して、
比較検討等をしてみたのですが、私にはどうしても原因が分からず、
いくらコピペして加えてみても、エラーが出るばかりで…。

 もしこのまま新規レスを上げることが出来ないのであれば、
今になってこのCGIの使用を諦めざるを得ない状況に陥っています。

 もし大変な作業になるのでしたら、素直に諦めますが、
もし比較的簡単な変更で「新規レス上げ」が可能になるのであれば、
どうかお知恵を貸して下さい。よろしくお願いいたします。
0848nobodyさん04/02/07 10:41ID:???
>>847
sub data_openの終わりの辺りの、
push(@true_nums,$_) if($res_nums{$_} eq $_);
の後に、
@true_nums = sort {$last_times{$b} <=> $last_times{$a}} @true_nums;
を追加。
084984704/02/07 10:55ID:???
 >>848様へ
 
 もう感動のあまり言葉が出ません!
信じられないスピードで回答を頂き、本当にうまく成功いたしました!

 今からじっくりこの構文の意味を分かるまで
勉強していきたいと思います! 本当に本当にありがとうございました!

 あぁ! 諦めなくてよかった!!
0850ひと ◆/FoolZy9t. 04/02/07 14:20ID:DTKZ/Kh0
えーと、質問です。トリップの事はここでは結構出ていますが、
#------------------#
# トリップ処理  #
#------------------#
sub trips {
my $trip;
$_[0] =~ s/◆/◇/g;
if ($_[0] =~ /#(.*)$/){
my $key = $1;
my $salt = substr($key."H.", 1, 2);
$salt =~ s/[^\.-z]/\./g;
$salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
$trip = substr(crypt($key, $salt), -10);

# トリップを名前に追加
$_[0] =~ s/#.*/◆$trip/ if ($trip);

}
}
のような方法でYYBBSにトリップを入れようとしているのですが、
(&trips($in{'name'})で呼び出す)
何故かトリップが2chのものと異なってしまいます。ローカルでもです...
なので、Joyful2ch-Me(http://www.nunokawa.soft.iwate-pu.ac.jp/~kaz/)
をローカルで実行してみたら、正常に2chのトリップを出したのですが、
(こっちのトリップ生産方法も試しましたが、無理でした...)
何故結果が変わってしまうのでしょうか...
0851nobodyさん04/02/07 14:22ID:???
>>850
criptにはいくつかアルゴリズムがあります。
要は文字列を不可逆変換できればいいのでそんな感じになってるんでしょうな。
その後の文字列をどうこうするまでは考えられてないんでしょうな。
0852nobodyさん04/02/07 15:06ID:peAnhjoK
初めまして。
「もっと書き込み隊」で、
ホストでなく名前で書き込み禁止にしたいのですが。
改造部分を教えて頂けないでしょうか。
0853nobodyさん04/02/07 15:42ID:???
>>850
Joyful2ch-Meと比べたけど、★の処理以外同じなので、別の所に問題があるのでは?
無理でしたというが、なぜ無理なのかよく分からないが。
サブルーチン内をコピペし、いらない$passの行を除くだけだが。
0854ひと ◆/FoolZy9t. 04/02/07 16:47ID:???
>>851
アルゴリズムですか...
確かに文字列をどうするか考えて無かったです...
>>853
一応、無改造のスクリプトに組み込んでみたのですが、トリップが
異なってしまいました。

分かりにくかったですね...すみません。plとcgiをtxtにしたURL貼ります。
http://khitoshi-web.hp.infoseek.co.jp/trip.txt
trip.pl(サブルーチンです。)
http://khitoshi-web.hp.infoseek.co.jp/yyregi.txt
yyregi.cgiです。
0855nobodyさん04/02/07 17:12ID:???
>>850
同じ環境でcryptの結果が変わることは無いはず。
(Perlの場合、違う環境でも同じかな)
サブルーチン中の、$saltや$tripをprintして比べてみたら?
0856nobodyさん04/02/07 17:27ID:???
my $salt = substr($key."H.", 1, 2);

ひょっとしてsaltの取得が一文字ずれてやしませんか奥さん。
0857nobodyさん04/02/07 17:34ID:???
2文字目と3文字目で良かったと思う。
0858ひと ◆/FoolZy9t. 04/02/07 18:00ID:???
>>855のをやってみましたが、
◆45WAt2004s(#esq-i@a`)のトリップでやってみたところ、
YYBBS→sq 45WAt2004s
Joyful2ch-Me→sq 45WAt2004sでした。
(sqは$saltです。)
◆fs2004piwk(#S}QR%dIN)でもやってみましたが、結果は同じです。
でも何故かこのトリップ(◆/FoolZy9t.)をやると、
ub TkQu1fW4UYとなり、Joyful2ch-Meだとub /FoolZy9t.でした。
何故かYYBBSでは$saltは正常なのに、何故か$tripが変わってしまいました...

>>856-857
正常なトリップは出ませんでした。。。
0859nobodyさん04/02/07 19:28ID:???
トリップなんて物は検索したり、配布している2ch型掲示板のソース見れば分かるだろう
0860nobodyさん04/02/08 03:47ID:???
>>858
◆ 全サーバトリップ統一作戦
http://qb3.2ch.net/test/read.cgi/operate/1067245837/l50
このあたりを読んでみるとか。
0861ひと ◆/FoolZy9t. 04/02/08 20:20ID:???
>>860
読んで見ました。しかし、いまいち原因が分かりません、、、
原因はcryptの結果だと思います。。。
でも、結果が異なるのは何故だろう。。。
スクリプトを見直して色々考えてみます...
0862nobodyさん04/02/08 20:47ID:???
>>861
「&"<>」のようなの使って、トリップ処理前に&とかに変換されてるってことはないか?
086386204/02/08 20:49ID:???
失敗した。&→&amp;。これでどうだ。
0864nobodyさん04/02/08 21:06ID:???
cryptは文字というよりバイナリから結果をつくりますので
見た目同じ2バイト文字であってもコードが違えばバイナリが違います。
ですので違う結果になります。ソースはShiftJISで書かれていますが
デコード部分が確認できませんので確実にShiftJISにされているか
確認してみると良いかもです。フォームの内容はフォームがあるHTMLの
文字コードで送信されますので表示するHTMLの文字コードもShiftJISに
なっている必要があります。

ただ試されてる文字列では2バイト文字含んでないので関係無いかもしれません。

あと考えられるのは、8ケタトリップの頃にしか確認していませんが
トリップを生成するまえに<や>,&のエスケープをしていたはずです。
逆に、そのBBSのスクリプトのデコード部分でなにか余計な変換を
していないか確かめるべきだと思います。
0865ひと ◆/FoolZy9t. 04/02/08 21:06ID:???
>>862
http://qb3.2ch.net/test/read.cgi/operate/1067245837/76
これですね。いまいち意味がはっきりわかりませんでした...
変換されている様です。変換されている場合とされていない場合で試しましたが、
やっぱりTkQu1fW4UYでした。。。もう少し考えてみます。
0866nobodyさん04/02/08 21:08ID:???
ちょっと日本語がわかりにくかったので書き直し
俺が知ってる限りは、8ケタトリップ時代には
<や>,&のエスケープはトリップ作成前になされて
&とかになってたはずです。

10桁のは知らないですが・・
0867nobodyさん04/02/08 21:10ID:???
修正
エスケープはトリップ作成前になされて&amp;とかになってたはずです。

何度もすみません
0868ひと ◆/FoolZy9t. 04/02/08 21:35ID:???
>>864 >>866-867
http://khitoshi-web.hp.infoseek.co.jp/yyini.txt
yyini.cgiです。一応出しておきます。
# S-JISコード変換
&jcode'convert(*val, "sjis", "", "z");

# タグ処理
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/</</g;
$val =~ s/>/>/g;
$val =~ s/\0//g;
#$val =~ s/<>/<>/g;
のようになっているので特に変な変換などはされていないようです。
コードはShiftJISになってしました。もう少し確認などしてみます。
0869nobodyさん04/02/09 15:00ID:???
掲示板で書き込みが横に長い場合にブラウザの横スクロールバーが出たり、<table>
が物凄く横に長くなってしまうのが嫌なので対策しようと思っています。

考え方としては、2chのように書き込み時に横に長い場合エラーを出すのがよいかと
思うのですが、どのようなコードを書けばよいのでしょうか?

正規表現である長さごとに改行コードがない場合はエラーでよいのでしょうか?

0chスクリプトなど読んで見たのですが該当する部分が見つからず頓挫してしまいました
このスクリプト見ろでもよいので、ヒントを頂ければと思います。
0870nobodyさん04/02/09 15:25ID:???
>>869
いくら横に長くても、全角文字なら改行されると思うので、
if ($text =~ /[\w]{100}/m) { エラー処理 }
という感じでいいんじゃない。
まあ ' とか . とかでも改行されないので、[ ]の中は適当に増やして。
0871nobodyさん04/02/09 15:34ID:???
>>869
# 例:80文字以上の行があればエラー
die "Error\n" if (grep{80<length}split(/\n/,$msg));
087286904/02/09 16:08ID:???
>>870
if ($text =~ /[\w|'|\.|\*]{100}/m) { エラー処理 }
みたいな感じですね。
すっごくシンプルにできるんですね。ちょっと感動しました。
全角なら確かに改行をブラウザが勝手にしてくれるのでこれでOKっぽい気がします。

>>871
僕が始め考えていたのはこっちの方ですね。
全角でも一行に80文字以上ある場合はエラーにしたい場合はこっちでしょうか。

僕の掲示板では870の方が好ましいので、こちらを使わせて頂きます。
わざわざありがとうございました。
0873nobodyさん04/02/09 16:42ID:???
>>870
書き方がおかしいぞ。
/["#\$&'=~^|\\`\@+;*:<>\/]{100}/m
このくらいかな。
087487304/02/09 16:43ID:???
間違えた。>>872
087586904/02/09 17:11ID:???
>>873
あぁ、間違ったと思って書きに来たらすでにレスが...
何から何まですみません...
0876nobodyさん04/02/09 18:19ID:???
yybbsだったら

$in{'name'} =~ s/◆/◇/;

$in{'name'}のデータを変換するんじゃないの?
0877nobodyさん04/02/09 18:20ID:???
>>869
スタイルシートで制御出来ない?
087886904/02/09 18:50ID:???
>>873
.と,もですかね。

>>877
cssで制御できるんですか?初耳でした。調べてみます。
0879nobodyさん04/02/09 20:04ID:???
>>858
http://yaoobuoo.2ch-trip.com/page010.html
0880ひと ◆/FoolZy9t. 04/02/10 14:09ID:???
えーと、jcodeg.pl(http://mirai.strangeworld.jp/script/)
を入れたら直りました。どうやら半角カナは勝手に全角に変換されてしまっていた様です。
おさわがせさせてすみませんでした...
0881nobodyさん04/02/10 15:48ID:???
>>880
>半角カナは勝手に全角に
勝手?ぬぁにを無礼な。
jcode.plの中身を読んで>868のコードの意味をちゃんと理解しろ。
0882ひと ◆/FoolZy9t. 04/02/10 17:18ID:???
>>881
失礼しました。&jcode'convert(*val, "sjis", "", "z");の
部分の意味がないですね。。。そうしたらeucなどにならず化けませんし...
どうもすみませんでした。さらに違っていたらすみません。。。
0883ひと ◆/FoolZy9t. 04/02/10 17:21ID:???
あと、解決したので言うの忘れてました...
皆様、どうもありがとうございました。
どうもすみませんでした...
■ このスレッドは過去ログ倉庫に格納されています