KENT-WEB サポートコーナー 過去ログ [ 0130 ]


記事No: 9555
投稿日: 2011/11/05(Sat) 09:34:21
タイトルプログラムのモジュール化について
ID情報: Fuyuki
投稿者: BAL
URLhttp://f43.aaa.livedoor.jp/~sumure/

現在のプログラムはモジュール化されていますが、これによりモジュールが使えない@niftyでプログラムをバージョンアップするとサーバーエラーでプログラムが作動しなくなる現象が発生しています。
幸いプログラムは簡単な修正で作動可能です。
但し、画像認証だけは使えなくなりますのでテキスト表示も追加されてはいかがかと思います。


記事No: 9556
投稿日: 2011/11/05(Sat) 21:39:15
タイトルRe: プログラムのモジュール化について
ID情報: teketen
投稿者: てけてん

> 但し、画像認証だけは使えなくなりますのでテキスト表示も追加されてはいかがかと思います。

libディレクトリに格納されているモジュールを呼び出すなら、例えば、

use strict;
をコメントアウトして、

use lib "./lib";



unshift @INC, "./lib";

に変更し、libディレクトリ内のモジュールの呼び出し部分をuseではなく

require CGI::Minimal;
require Jcode;
require Crypt::RC4;

のように、requireで呼び出せば、niftyでも使えると思いますよ。


記事No: 9557
投稿日: 2011/11/05(Sat) 22:42:31
タイトルRe^2: プログラムのモジュール化について
ID情報: Fuyuki
投稿者: BAL
URLhttp://f43.aaa.livedoor.jp/~sumure/

早速試してみましたがプログラム自体がサーバーエラーになります。
Jcodeを使用しなければ表示されますが画像認証を有効にすると同様にサーバーエラーになります。

unshift @INC, "./lib";
require Jcode; ## ここでサーバーエラーになる


記事No: 9558
投稿日: 2011/11/06(Sun) 00:56:01
タイトルRe^3: プログラムのモジュール化について
ID情報: teketen
投稿者: てけてん

> 早速試してみましたがプログラム自体がサーバーエラーになります。
> Jcodeを使用しなければ表示されますが画像認証を有効にすると同様にサーバーエラーになります。

ああ、見逃していました。
モジュールの方でも、useで呼び出すモジュールがありますね。
Jcode.pmはniftyで使うのは、色々変更しなくてはいけないですね。
jcode.plか、他の同様のライブラリに変更する必要があると思います。

Crypt::RC4を使用する場合は、Exporter.pm
http://search.cpan.org/~toddr/Exporter-5.65/
をダウンロードして、解凍したlibディレクトリに入っているExporterディレクトリとExporter.pmを、使用するスクリプトのlibディレクトリに格納すると良いかと。
その際、Exporter.pmとHeavy.pmに記述されている
use strict;
no strict 'refs';
をコメントアウトするのを忘れずに。
あと、Crypt::RC(RC4.pm)内にある
use strict;
use vars qw( $VERSION @ISA @EXPORT $MAX_CHUNK_SIZE );
も同様です。

ただ、私はniftyユーザーではないので、実際に動作テストが出来ませんので、これでエラーが解消するかは判りませんが。


記事No: 9559
投稿日: 2011/11/06(Sun) 10:36:40
タイトルRe^4: プログラムのモジュール化について
ID情報: Fuyuki
投稿者: BAL
URLhttp://f43.aaa.livedoor.jp/~sumure/

RC4.pmは少々面倒ですね。
代わりにExporterを除いたArcfour.pmで試してみましたが結果は同じでした。
テキスト表示でも数字を全角にすれば解析され難くなりますし何よりも簡単です。

ASKA BBS

# 画像認証作成
my ($str_plain,$str_crypt,$plain);
my $caplen = $cf{cap_len};
if ($cf{use_captcha} > 0) {
# 任意の数字を生成
my @num = (0 .. 9);
srand;
foreach (1 .. $caplen) {
$plain .= $num[int(rand(@num))];
}
$str_plain = &h_z($plain);
$str_crypt = &encrypt($plain);
} else {
$head =~ s/<!-- captcha_begin -->.+<!-- captcha_end -->//s;
}

sub h_z {
local($_) = @_;

s/0/0/g;
s/1/1/g;
s/2/2/g;
s/3/3/g;
s/4/4/g;
s/5/5/g;
s/6/6/g;
s/7/7/g;
s/8/8/g;
s/9/9/g;
$_;
}

# 文字置換
foreach ($head,$foot) {
s/!([a-z]+_cgi)!/$cf{$1}/g;
s/!homepage!/$cf{homepage}/g;
s/!page_btn!/$page_btn/g;
s/!name!/$cook[0]/;
s/!email!/$cook[1]/;
s/!url!/$cook[2]/;
s/!sub!/$res{sub}/;
s/!comment!/$res{com}/;
s/!bbs_title!/$cf{bbs_title}/g;
s/!str_crypt!/$str_crypt/g;
s/!str_plain!/$str_plain/g; ## 追加
}


# 画像認証チェック
if ($cf{use_captcha} > 0) {
if ($in{captcha} !~ /^\d{$cf{cap_len}}$/) {
&error("認証が入力不備です。<br>投稿フォームに戻って再読込み後、再入力してください");
}
if (&decrypt($in{captcha}, $in{str_crypt}) != 1) {
&error("認証できません");
}
}


追伸
unshift @INC, "./lib";
require CGI::Minimal;
おかげでアップロー型プログラムも作動するようになりました。


記事No: 9564
投稿日: 2011/11/06(Sun) 20:48:23
タイトルRe^5: プログラムのモジュール化について
ID情報: teketen
投稿者: てけてん

Crypt::RC4(RC4.pm)

#use strict;
#use vars qw( $VERSION @ISA @EXPORT $MAX_CHUNK_SIZE );

#require Exporter;

#@ISA = qw(Exporter);
#@EXPORT = qw(RC4);

とします。
あとは、KENTさんのCrypt::RC4を使っているスクリプトで、

my $plain = RC4( $cf{captcha_key}, $buf );

のように、Functional Styleではなく、全て

my $plain = Crypt::RC4->new($cf{captcha_key})->RC4($buf);

のように、OO Styleで呼び出せば、Exporter.pmなしで、niftyでも動作するような気がしますね。

追記:

検索して知ったのですが、@niftyは、Perlのバージョンが古いようで、ourが使えないみたいですね(^^;
だから、修正しても、Exporter.pmがエラーになったのか。
Exporter.pm内の

our $Debug = 0;
our $ExportLevel = 0;
our $Verbose ||= 0;
our $VERSION = '5.65';
our (%Cache);

の部分の、ourだけを全て削除し、Crypt::RC4(RC4.pm)は、

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(RC4);

のコメントアウトはしなくて良いはず。
これだと、KENTさんのスクリプトを修正しなくても良いかと思います。
これで駄目なら、先に提示した方法を取ってみるとか。


記事No: 9568
投稿日: 2011/11/07(Mon) 13:09:27
タイトルRe^6: プログラムのモジュール化について
ID情報: Fuyuki
投稿者: BAL
URLhttp://f43.aaa.livedoor.jp/~sumure/

やっと原因が分かりました。
「package Crypt::RC4;」をコメントアウトしたら作動しました。
Exporter.pmは無くても問題ないようですのでExporter箇所はコメントアウトします。

ASKA BBSの場合

●Crypt::RC4.pm

#package Crypt::RC4; ## これがサーバーエラーの原因でした

#use strict;
#use vars qw( $VERSION @ISA @EXPORT $MAX_CHUNK_SIZE );

$MAX_CHUNK_SIZE = 1024 unless $MAX_CHUNK_SIZE;

#require Exporter;

#@ISA = qw(Exporter);
#@EXPORT = qw(RC4);
$VERSION = '2.02';


●captcha.cgi及びcaptcha.pl

# モジュール宣言
#use strict;
#use lib "./lib";
#use Crypt::RC4;
unshift @INC, "./lib"; ## 追加
require Crypt::RC4; ## 追加


●init.cgi

# モジュール宣言/変数初期化
#use strict;

●aska.cgi
#-----------------------------------------------------------
# 記事書込
#-----------------------------------------------------------

# コード変換
#Jcode::convert(\$in{name}, 'sjis');
#Jcode::convert(\$in{sub}, 'sjis');
#Jcode::convert(\$in{comment}, 'sjis');

#-----------------------------------------------------------
# ワード検索
#-----------------------------------------------------------
# 検索実行
#Jcode::convert(\$in{word}, 'sjis');

●admin.cgi

# モジュール宣言
#use strict;
#use CGI::Carp qw(fatalsToBrowser);
#use lib "./lib";
#use Jcode;

#-----------------------------------------------------------
# 管理モード
#-----------------------------------------------------------
# コード変換
#Jcode::convert(\$in{name},'sjis');
#Jcode::convert(\$in{sub},'sjis');
#Jcode::convert(\$in{comment},'sjis');


記事No: 9570
投稿日: 2011/11/07(Mon) 16:08:23
タイトルRe^7: プログラムのモジュール化について
ID情報: teketen
投稿者: てけてん

> やっと原因が分かりました。
> 「package Crypt::RC4;」をコメントアウトしたら作動しました。

ああ、確かに。
useで呼び出す場合は、packageで宣言しなくてはいけないが、requireですからね。
一番簡単な作業を忘れてました。

ただ、私が提示した方法で、動作するのかが判らないのが残念ですが、でも、ご自分で解決が出来たなら、そちらの方が良いです。

# あと、申し訳ないのですが、今後は私のコメントの全文引用は止めてください。
# 必要な部分のみ引用して下さい。お願い致します。


記事No: 9562
投稿日: 2011/11/06(Sun) 19:00:35
タイトルRe: プログラムのモジュール化について
ID情報: kent
投稿者: KENT

> 現在のプログラムはモジュール化されていますが、これによりモジュールが使えない@niftyでプログラムをバージョンアップするとサーバーエラーでプログラムが作動しなくなる現象が発生しています。
> 幸いプログラムは簡単な修正で作動可能です。
> 但し、画像認証だけは使えなくなりますのでテキスト表示も追加されてはいかがかと思います。

お二方(BALさん、てけてんさん)とも、高度な会話をありがとうございます。お世辞抜きに、感動しました。
@niftyで動作させようとすると、なかなか大変なんですね。

ちなみに、テキスト表示とは、日本語で表示させてそれを数字で入力させるようなタイプですね?

画像認証については、前バージョン(GIFアニメタイプ)であれば動作はするのでしょうね。


記事No: 9566
投稿日: 2011/11/07(Mon) 08:57:07
タイトルRe^2: プログラムのモジュール化について
ID情報: Fuyuki
投稿者: BAL
URLhttp://f43.aaa.livedoor.jp/~sumure/

> ちなみに、テキスト表示とは、日本語で表示させてそれを数字で入力させるようなタイプですね?

全角の数字もしくは漢数字を表示して算数字で入力させるタイプです。

> 画像認証については、前バージョン(GIFアニメタイプ)であれば動作はするのでしょうね。

試行錯誤の末やっと問題が解決しました。
詳細はNo.9568の記事を参照ください。
テキスト表示の方は、画像認証が将来OCRによって解析される可能性もありますのでその時にでも・・・


記事No: 9576
投稿日: 2011/11/08(Tue) 07:55:51
タイトルRe^3: プログラムのモジュール化について
ID情報: kent
投稿者: KENT

> > ちなみに、テキスト表示とは、日本語で表示させてそれを数字で入力させるようなタイプですね?
>
> 全角の数字もしくは漢数字を表示して算数字で入力させるタイプです。
>
> > 画像認証については、前バージョン(GIFアニメタイプ)であれば動作はするのでしょうね。
>
> 試行錯誤の末やっと問題が解決しました。
> 詳細はNo.9568の記事を参照ください。
> テキスト表示の方は、画像認証が将来OCRによって解析される可能性もありますのでその時にでも・・・

これは高度な解析&検証を感謝いたします。
@nifty向けには貴重な貴重な情報ですね。
ありがとうございました。


[検索ページ]