★ INCM Plug-in開発掲示板 ★ TinyGrass Ver0.32a [戻る]
[0487] 03/07/07 01:36 しみづ(32VYqR6kkEI): cm_mail.plで送信できず
一 五明さん
はじめまして、いつもお世話になっております。
cm_mail.pl Ver0.13d を使わせていただくようになって数ヶ月になりましたが、初めて不具合に出会いましたので、報告させていただきます。
今回ある方からメールをいただいて、まず発言者の蘭が「=?ISO....」になっていたので驚きました。
今まで漢字の発言者名のメールはいくつか受け取れていたのですが。
次に、返信しようとすると送れずに未送信のまま残ってしまいます。
最初の件は、次のように応急手当てしました。
*** cm_mail.pl
174a175,177
> $name=&isjcnv($name);
> $rpath=&isjcnv($rpath);
>
未送信の件は、001.cmtのP:部分をテキストエディタで書き換えて、対処しました。
たぶん相手のメーラーとの相性だとは思いますが、何か必要な資料がありましたら、お送りしたいと思うのですが。
[0486] 03/06/21 21:39 すい(QdNpFGWmwV.): Re:485)RE2: Perl(非JPerl)で日本語を扱うコツ−quotemeta関数
「perl で正規表現でエラーになる全角文字を全部抜き出すのは面倒だ」
と思っていたのですが、やってみたら意外にとっても簡単でした。(笑)
単純に Windows環境上で Shift_JIS コード中で文字が割り当てられている
領域のうち、エラーになる物の一覧を作ってみただけですが。
んで、その一覧を関数化してみたっすよぉ。↓
----------
# ↓変換
&__kanji($meshdr_ptn);
&__kanji($reshdr_ptn);
<以下メイン処理>
sub __kanji{
$_ = $_[0];
s/\x81\x5b/\\x81\\x5b/go; # 「ー」⇒「\x81\x5b」
s/\x81\x5c/\\x81\\x5c/go; # 「―」⇒「\x81\x5c」
s/\x83\x5b/\\x83\\x5b/go; # 「ゼ」⇒「\x83\x5b」
s/\x83\x5c/\\x83\\x5c/go; # 「ソ」⇒「\x83\x5c」
<以下数十行>
s/\xfb\x5c/\\xfb\\x5c/go; # 「\」⇒「\xfb\x5c」
$_[0] = $_;
}
----------
一応、動くには動くけど頭悪すぎな みっともない関数だなコレは。置換の お化け。
# 置換処理の行数が 84行。
おまけに "メ[" みたいに「2バイト目が全角文字の1バイト目になり得る文字(メ)」
に [ (\x5b)が続いている場合なんかに異常な変換結果を招くので、使い物にならなかったり。(;^^;)
で、そのうちに
「ん!?単純に全角文字を全部 \x?? 表記に変換する関数を作れば良いんじゃん」
という事に ようやくさ気付き。 (;^O^;ゞ (←バカ)
↓こうすりゃ良いんじゃんか、と。
----------
<値の取得処理(67行目近辺)>
&_kanji_hex_($meshdr_ptn); # 全角文字を全て \x?? 表記に変換する。 by P,H,M
&_kanji_hex_($reshdr_ptn); # 全角文字を全て \x?? 表記に変換する。 by P,H,M
#---- 初期化
<以下メイン処理>
##### サブルーチン #######################################################
# 全角文字のみを全て \x?? 表記に変換する。 by P,H,M
sub _kanji_hex_{
$_[0] =~ s/([\x81-\x9f\xe0-\xfc])([\x40-\x7e\x80-\xfc])/sprintf("\\x%02x\\x%02x",unpack("C",$1),unpack("C",$2))/ge;
}
----------
これで文字列中の Shift_JIS 2バイト文字だけを全て一括して \x?? 表記に変換しちゃうようにしてみました。
試してみたら、これでうまく動くみたいだわさ。
[0485] 03/06/21 18:42 すい(QdNpFGWmwV.): Re:484)RE: Perl(非JPerl)で日本語を扱うコツ−quotemeta関数
>一番簡単なのは、quotemeta関数を使うこと。
このプラグインの設定箇所は正規表現を指定する所です。例えば
1,.*氏の投稿「\s*<a href=\"(\d+).html\">[^<]*<\/a>」に対するフォロー記事です
# ↑私が実際に使っている記述です
なんていう正規表現文字列を設定するわけで。
quotemeta だと正規表現の記述が \ で死んじゃうので使い物にならないかと。 (;^^A
面倒でも不味い文字だけを1種ずつ(あるいは引っかかる文字のパターンから、そのルールで)
それらの文字だけを置換するようにしていくしかないでしょう。 (^^;
そういう関数を作れば完璧版として名乗りを。。。
でも、そこまでやるのは面倒くさくって。
# 要望があるようなら考えなくも無いですが。。。(笑)
[0484] 03/06/21 17:39 Buckeye(IWcyoI6XJKE): Re:483)Perl(非JPerl)で日本語を扱うコツ−quotemeta関数
☆ すいさん、みなさん、
>>さらに INCM の フォルダ プロパティ → 詳細 にて「メッセージのヘッダー形式」
>>「レスのヘッダー形式」の指定に「ー」が含まれていた場合(ちょっと書式が異なる
>>“フォロー記事です”とか)のために「ー」⇒「\x81\x5b」の置換処理を入れておけば
>>なお良し。
2バイト非対応のPerlで日本語を扱ったとき、正規表現で落ちてしまうのは「ー」だけじゃありません。なので、決め打ちとなるプログラム中の正規表現以外は、別の処理が必要です。
一番簡単なのは、quotemeta関数を使うこと。これで、2バイト文字の後半部分までちゃんとエスケープしてくれます。ま、2バイト文字を考慮していないんだから、2バイト文字の後半部分を特別扱いしないのは当然なんですが(^^;)
$RegMatchString = 'うんたらかんたら'; ←ここは、プロパティ設定などいろいろ
$RegMatchString = quotemeta $RegMatchString;
if ($page =~m/$RegMatchString/i) {
各種処理
}
私は、実行形式Perlを作るプログラムが2バイト非対応なので、そのプラグインを公開している関係から、他のケースの日本語処理もすべてPerlで行っています(一応、JPerlもインストールしてあるけど、使っていない)。なので、このquotemeta関数のお世話によくなります。
Best regards,
Buckeye
[0483] 03/06/21 16:13 すい(QdNpFGWmwV.): cm_WWWBoard.pl について
はじめまして、こんにちは。
INCM 便利に使わせていただいています。
私は Plugin を色々改造して利用させてもらっているのですが、、、
# 私の環境の都合とか、私が巡回している掲示板のカスタマイズ具合
# によるもの、という個人的な理由の改造がほとんどなのですが。 (;^^;ゞ
で、その改造のうちの幾つか汎用的そうな物を開発元へフィードバック(?)
しておこうと思って書き込んでおきます。
ちなみに利用しているのは ActivePerl 5.22 ですので、以下、その環境でのお話しという事で。
まさかさん作の「cm_WWWBoard.pl Ver0.04 2000/09/19 by まさか」ですが、
「perlでは動作しない。JPerl必須」になっていますが、1箇所書き換えれば
perl でも動作します。
perl で動作しない理由は正規表現中に仮名の長音が含まれているからで、これを
\x?? 表記に直せば perl でもきちんと動作します。具体的には 280行目近辺の
「フォロー記事です」を「フォロ\x81\x5b記事です」に書き換え。これだけで
perl で動作してくれます。JPerl不要。もちろん記事中の「フォロー記事です」にも
きちんとマッチしてくれます。
これで perl で数ヶ月使っていますが、特に問題無さげです。
# 私が行っていない掲示板では どうだか分かりませんが。(;^^;)
さらに INCM の フォルダ プロパティ → 詳細 にて「メッセージのヘッダー形式」
「レスのヘッダー形式」の指定に「ー」が含まれていた場合(ちょっと書式が異なる
“フォロー記事です”とか)のために「ー」⇒「\x81\x5b」の置換処理を入れておけば
なお良し。
具体的には取得した $meshdr_ptn と $reshdr_ptn に対して s/\x81\x5b/\\x81\\x5b/go; しておく。
あと、116行目近辺の sort 部
> $meslist = sort 〜〜
ですが、、、これって明らかにバグ。(汗)
行頭の $meslist は @meslist ですね。(1文字目 $ じゃなくて @ でしょう)
これのお陰で初回巡回時に、記事番号が飛び飛びに30個(しかも古いのとかが)
取得されたり、という わけ分からない状況になってしまったりして悩みました。(;^^;)
「未読ポインタ未指定時(または0指定時)は、最新の30記事のみ取得する」つもり
だったんですよね、きっと。 (;*^^*;)
ついでに cmt ファイル内も、記事番号順通りに取得されていくようになるつもり...
他にも書き換えて利用しているのですが、他の方には、あまり関係無さそうな
私の個人的な変更なので略、という事で、このくらいで。m(_ _)m
# so-net のパソスクみたいに、記事中に画像<IMG SRC="〜">やアンカー<A HREF="〜"></A>を
# 貼れる所で、画像やアンカーの URLアドレスをcmt中に残して分かるように、とか、
# 掲示板によっては記事中に改行が2個連続していたら<P>1個に置き換える所があるので
# <P>は改行2個に置換するように戻した、とか、そんなくだらないのばっか。(^^;
[0482] 03/06/17 11:46 GETWILD'74(QpXyZT5qYs2): Re:480)Re: RSS 用プラグイン ver. 1.2 について
ここはプラグイン開発の掲示板なので、ご質問の内容がちょっと
沿わない気がします。
>RSS 用プラグイン ver. 1.2 を、どなたかBecky2(BKCMプラグイン)で読み取りされてる方はいらっしゃいますでしょうか?
私は使ってないので全く分からないです。(^^;
[0481] 03/06/17 11:46 GETWILD'74(QpXyZT5qYs2): Re:479)Re: ealis 3.0.8 を読めるplug-inを教えてください。
次回からは質問系掲示板に投稿をお願いします。
プラグインはたぶんないと思います。
ある程度読めているなら、改造すれば行けるかもしれません。
[0480] 03/06/05 23:29 ian(xUehsxJ27IA): RSS 用プラグイン ver. 1.2 について
こんにちは。
RSS 用プラグイン ver. 1.2 を、どなたかBecky2(BKCMプラグイン)で読み取りされてる方はいらっしゃいますでしょうか?
もし可能なら、方法を教えてください。
宜しくお願いします。
[0479] 03/05/21 13:56 KAI(sQl8qckJUUE): ealis 3.0.8 を読めるplug-inを教えてください。
こんにちは。
ealis 3.0.8 の掲示板を読み込もうとしています。
http://elm-kai.virtualave.net/cgi-bin/ealis.cgi
http://kano.feena.jp/erial/
T.Taさんの INCM用Plug-in: ealis用 Ver0.0.4 2000/2/22 by T.Ta
一 五明さんの ぷち☆ボード,ErialBBS
を使ってみたのですが、一行ずつしか読み取りが出来ない上、文字化けしてしまいました。
該当プラグインは存在するのでしょうか?
[0478] 03/04/03 19:47 Buckeye(IWcyoI6XJKE): Re:477)Re: プロキシ関連で不具合か?
☆ GETWILD'74さん
あー、そういうことなんだぁ。
テストしてみたら、たしかに"PROXY="パラメータが増えていました。これ、INCM側が書き足すわけなんですね。
これでとっかかりというか、どうしたらいいかの方向性が見えた気がします。
ありがとうございました。
Best regards,
Buckeye
[0477] 03/04/03 18:12 GETWILD'74(7ewbH5F8/fA): Re:476)Re2: プロキシ関連で不具合か?
★Buckeyeさん
>ただ、いずれにしても、incm_bbs.iniに"PROXY="パラメータがないと設定されないわけで……ダイアログを見てもincm_bbs.iniを直接開いてみても、PROXYパラメータは見あたらないんです。
IEのほうでプロキシの設定をするか、INCMのオプションでIEの設定を使用するのオプションをはずしてプロキシの設定をしてから巡回してみるとincm_bbs.iniに"PROXY="パラメータが設定されると思います。
[0476] 03/04/03 17:35 Buckeye(IWcyoI6XJKE): Re:475)Re: プロキシ関連で不具合か?
☆ GETWILD'74さん
そっか、CMLIB15.PL側でやってるんですね。
ただ、いずれにしても、incm_bbs.iniに"PROXY="パラメータがないと設定されないわけで……ダイアログを見てもincm_bbs.iniを直接開いてみても、PROXYパラメータは見あたらないんです。
Best regards,
Buckeye
[0475] 03/04/03 17:07 GETWILD'74(7ewbH5F8/fA): Re:474)Re: プロキシ関連で不具合か?
★Buckeyeさん
>if($proxy){}という処理はあるけど、その$proxyを設定している部分がないように思うんです。
CMLIB15.PLで代入してるみたいですよ。
incm_bbs.iniからパラメータを取得する際に
elsif(/^PROXY=.*http=([^:]+):(\d+)[ \n]/){ ($proxy,$port)=($1,$2); }
elsif(/^PROXY=([^:]+):(.+)\n$/){ ($proxy,$port)=($1,$2); }
の部分で代入されてるようです。
[0474] 03/04/03 16:01 Buckeye(IWcyoI6XJKE): プロキシ関連で不具合か?
私が公開しているcm_@nifty-FORUMプラグインで、プロキシが設定されているためか、うまく動かないという不具合報告をもらいました。これに対し、正常にアクセスできているプラグインとして、↓などがあげられていました。
§ *INCM用Plug-in(ライブラリ): Yahoo掲示板用(新版)
§ Ver0.13b 2002/3/1 by 一 五明 cm_Yahoo_new.pl
で、一五明さんのプラグインのソースも見てみたのですが、cm_Yahoo_new.plって、実際にはプロキシ処理をしていないことになるんじゃないかと思ったんですけど……この理解、間違っているでしょうか。if($proxy){}という処理はあるけど、その$proxyを設定している部分がないように思うんです。
Best regards,
Buckeye
[0473] 02/12/12 22:50 ???(bOpLiVe293Y): 無題
[0472] 02/12/07 01:57 一 五明(0iDqLDdaPWc): Re:469)INCMページのアップローダー
>スペースの件はここにコピーする時に文章を整形したので入ってしまったのだと思います。
掲示板だとtabが飛んだりしますからね(^^;
INCMページのアップローダーのEtc辺りを使うのがいいかも。
http://ka.sakura.ne.jp/~nikeno/incm/upload/
http://kt.sakura.ne.jp/~timeflow/M/
[0471] 02/12/06 21:08 Buckeye(IWcyoI6XJKE): Re:470)RE: 表示方法はないはず…
☆ 3382:GETWILD'74 さん
おー、ソースを公開していたかいがありましたねぇ(^^)
Best regards,
Buckeye
[0470] 02/12/06 16:21 GETWILD'74(Vy2HhQBvukc): Re:468)RE2: 表示方法はないはず…
Buckeyeさん、レスありがとうございます。
Perlで出来ると分かっただけでも収穫でした。
改めてcm_@nifty-FORUMプラグインを見ていて問題点が分かりました。
[DIALOG]だとプロパティを開いた時にプラグインが実行されないみたいですね。
前もその辺りは疑っていたのですが、処理に何か問題があったのでしょう。
もしかしたら書き込む際に[DIALOG]に戻し忘れていたのかもしれません。
とにかく成功して嬉しい限りです。
BuckeyeさんのPerlでも出来るというレスがなかったら、もう一度挑戦して
みようと思うことはなかったでしょう、ありがとうございました。
これでKENT-WEBプラグインなどで、余分な詳細設定をカットできそうです。
[0469] 02/12/06 13:44 ゆう(yxtrs31Q3CY): Re:467)Re2: ソース見ないと理由は不明ですが…
ありがとうございます!
\nを挿入したら読むことができました!
スペースの件はここにコピーする時に文章を整形したので入ってしまったのだと思います。
まだまだ対応したい掲示板があります。
わからなかったらまたお聞きすることがあるかもしれません。
これからもよろしくお願いいたします。
[0468] 02/12/06 13:25 Buckeye(IWcyoI6XJKE): Re:466)RE: 表示方法はないはず…
☆ 7988:GETWILD'74 さん
変ですね、私のところではできてますよ。
開発は、ず〜っとPerlでやって、最後にexeにして動作確認という形だから、Perlでできないことはしていません。今も、動作確認という意味もあって、私の手元では、exe版とPerl版の両方を使っていますが、動きに違いがあると感じたことはありません。
Best regards,
Buckeye
[0467] 02/12/06 12:43 GETWILD'74(FkAfNAHAw2U): Re:463)Re2: ソース見ないと理由は不明ですが…
001.cm$を見てみました。
M:
本文
http://*****.pdf.
S:***********
となっていて、記事の区切りの「\n.\n」になってません。
$udataへの代入を独自にされている部分に問題があります。
s/<a href=\"(.*?)\" target=\"new\">//; $udata="$uribase$1";
を
s/<a href=\"(.*?)\" target=\"new\">//; $udata="$uribase$1\n";
にすれば記事の取得は出来るようになりました。
それとここに掲載されたスクリプトの74行目に全角空白が混入していて
最初はエラーになりました。
[0466] 02/12/06 12:43 GETWILD'74(FkAfNAHAw2U): Re:464)RE2: 表示方法はないはず…
>私のcm_@nifty-FORUMプラグインは、Perlで詳細設定をガシガシ書き換えてますけど。なにか違うものを指しているのかなぁ。
もちろん存じております。
なのでPerl版でも出来ると思ってcm_@nifty-FORUMプラグインも参考に
色々とやってみたのですが、どうしてもダメなんですよね。
cm_@nifty-FORUMプラグインではコンパイル前のPerlの状態で実行
しても詳細設定の書き換えは出来てますか?
私のやり方に問題があるのかなぁ?(^^;
[0465] 02/12/06 11:19 Buckeye(IWcyoI6XJKE): Re:461)RE: ソース見ないと理由は不明ですが…
具体的な手順は、
・PerlプラグインとINCM_BBS.iniを適当なフォルダにコピー
・Windowsの「スタート」メニューから「プログラム」→「MS DOSプロンプト」
とか「コマンドプロンプト」というものを選ぶ
・黒いウィンドウが現れる(DOS窓)。
実行したいPerlプログラムを、エクスプローラからドラッグして、この
・DOS窓にドロップ
・Enterキーを押す
私は、上記が面倒なんで、">001.cm$"を">001.txt"と書き換えて実行するっていうのをよくやります。で、これが簡単にできるように、出力ファイルの指定は変数にしておいて、プログラムの頭で指定するようにしています。
ただ、今回の件だと、タイトルは出るのに記事本文がエラーログ側に出力されるとのことなので、エラーログの出力ルーチンを調べたほうがいいのかなと思います。
Best regards,
Buckeye
[0464] 02/12/06 11:19 Buckeye(IWcyoI6XJKE): Re:459)RE: 表示方法はないはず…
☆ 7988:GETWILD'74 さん
すいません、ここんとこ、きちんと読めていないんではずしているかもしれませんが……
>>iオプションでの詳細設定書き換えもexeでないと出来ないみたいですし。
私のcm_@nifty-FORUMプラグインは、Perlで詳細設定をガシガシ書き換えてますけど。なにか違うものを指しているのかなぁ。
Best regards,
Buckeye
[0463] 02/12/06 11:12 ゆう(ye95RRuO3ZA): Re:461)Re: ソース見ないと理由は不明ですが…
お返事ありがとうございます。ソースは130行くらいですので失礼して・・・
##### INCM用plug-in for 東経投資クラブ用 ver0.1.0
#
# 東経投資クラブ用対応 2002/12/05 by jk
# http://www.tktoushi.com/cgi-bin/stock/info.cgi?key=
#
# 一 五明さんの YY-BOARD plug-in をベースに修正しました。
# ナカタさんの INCM用plug-in for OTD bbs-plain#14アイコン用 ver0.1.0をベースに修正しました。
# ☆返信は出来ません。あしからず。
$_=$0; s/[^\\]+$//; require($_."CMLIB15.PL");
##### フォルダプロパティの設定 ###########################################
$_= <<"#[/DIALOG]";
#[DIALOG]
#URL=1\nUPURL=0\nNAME=0\nEMAIL=0\nHP=0\nKEY=0
#USER=0\nPASS=0\nPARAM1=1\nPARAM2=1
#_URL=掲示板のアドレス(URL)(&A):
#_UPURL=書き込み先のアドレス(URL):
#_NAME=名前:
#_EMAIL=メールアドレス:
#_HP=ホームページ(URL):
#_KEY=削除キー:
#_USER=
#_PASS=
#_PARAM1=読み取りページ数(無指定:1)
#_PARAM2=未読ポインタ(例:01/11/28,06:07)
#[/DIALOG]
#L000=L,,未読ポインタの有効/無効
#L001=R,L_PTR=0,有効(デフォルト)
#L002=R,L_PTR=1,無効
#L003=.
if(&init){
##### 接続/その他の初期設定 ##############################################
unless($local){ # ローカル変換でなければ接続
&httpget('>001.cm$',"") || exit;
}
print &gettitle; # CMTヘッダ出力 ※出力される
$lastptr=$param2 || 0;
$newptr=$lastptr;
##### 記事の出力 #########################################################
$param2=$param2 || 1; # 何ページ読むか
$atclmax=0; # 1ページに最大いくつの記事が有るか
ATCL:{
$atclcnt=0; # 各ページ毎の記事数
$page+=1; print STDOUT "\nPage $page:";
$/="<\/tr>"; # 区切り
while(<HTTP>){ # 区切り毎に、ファイル終端まで $_に読む
s/\r\n?/\n/g;
print LOG $_;
if(/<a href=.*?.pdf.*?target=\"new\">/){ # $_に「pdf」が取得出来たら記事とみなす
if(/<div style=\"font-size:14px\;\">(\d{4}\.\d{2}\.\d{2})<\/div>/){ $tempdate=$1; $tempdate.=" ";}
if(/<div style=\"font-size:14px\;\">(\d{2}:\d{2})<\/div>/){ $tempdate.=$1; }
$date=&getdate($tempdate);
$date=~s/^..//; # 年を2桁化
$usave=$_;
# 未読管理
if($date lt $lastptr){last}
if($date gt $newptr){$newptr=$date}
$num=$rnum="*"; # 記事No
$head=""; # head初期化
s/<div style=\"font-size:14px\;\">(\d+)<\/div>//; $uTempNo=$1; # 番号 使用しない
s/<div style=\"font-size:14px\;\">(\d{4})<\/div>//; $utitle=$1; # タイトル
s/<div style=\"font-size:14px\;\">(.*?)<\/div>//; $utitle.=":$1"; # タイトル
$utitleM=$utitle;
$utitle=~s/ //g;
if (/<tr>/){
$atclcnt+=1;
print STDOUT "."; # 読み取り状況
}else{
$atclcnt+=1;
print STDOUT "*"; # 読み取り状況
}
# $head.="F:$form\&no=$root\&reno=$root\n"; # 返信param
$head.="T:$utitle\n"; # タイトル
$head.="N:東洋経済新報社\n"; # 名前
s/\n//g;
$uribase="http://$host";
s/<a href=\"(.*?)\" target=\"new\">//; $udata="$uribase$1";
s/<div style=\"font-size:14px\;\">(.*?)<\/div><\/a>//; $_="$utitleM $1";
print STDERR "\n==========\n";
print STDERR "S:$num,$rnum,$date,\n"; # 記事ヘッダ出力
print STDERR "$head";
print STDERR "M:\n$_\n$udata\n\."; # 本文の出力
print "S:$num,$rnum,$date,\n",$head; # 記事ヘッダ出力 ※出力されない
&wrtmes($_,$udata); # 本文の出力 ※出力されない
# print "S:$num,$rnum,$date,\n"; # 記事ヘッダ出力 ※出力されない
# print "$head";
# print "M:\n$_\n$udata\n\."; # 本文の出力 ※出力されない
}
} # ← while(<HTTP>)の終わり
##### 次のページ #########################################################
last ATCL if $local; # ローカルファイルなら抜ける
$param2-=1; last unless $param2;
$atclmax=$atclcnt unless $atclmax; # 最初のページの数がページ毎の最大値に
last ATCL if($atclcnt != $atclmax); # 最大値より少ないなら最終ページ(終了)
print STDOUT "\nConnecting...";
if(&httpreq("page=".($page*$atclmax))){ &gettitle; redo ATCL; }
print STDOUT "\nPage ",$page+1," and before cannot read."; # 読めなかった
} # ← ATCL: の終わり
##### 終了 ###############################################################
&fin;
print STDOUT "\ndone.";
}
exit;
##### 覚え書き ###########################################################
__END__
以上です。なにかお気づきな点がありましたらご教授下さい。
人のプラグインをカスタマイズして作っています。
お返事頂いた内容でも調べてみます。
[次のページ]