68user's page 掲示板

Prev< No. 91〜101> Next  [最新発言に戻る] [過去ログ一覧]
No. 91 # SRM2 1999/01/27 (水) 01:30
はじめまして(^^;
Perl関係で質問なのですが良いでしょうか。
Perlのみで画像(画像ファイル)の生成って出来ないんでしょうか?
いろいろ書けるほど情報が集まってないので、簡単ですがこれで。
よろしくおねがいします。

No. 92 # 68user 1999/01/27 (水) 02:36
はじめまして、SRM2さん(笑)

うっとこの
    http://X68000.startshop.co.jp/~68user/cgi-bin/view-count.cgi?log=sum0+sum1+sum2+sum3
は、flyというプログラムを利用していますが、perl単体で
ということなら、GD.pmというライブラリを使うといいでしょう。
    http://www.genome.wi.mit.edu/pub/software/WWW/GD.html
をどうぞ。英語ですが使い方は簡単にわかるはずです。

No. 93 # 山口 1999/01/27 (水) 18:38
はじめまして、山口といいます。
いきなりの質問で失礼ですが、.forwardの中にメールアドレスを書くと、届いたメールはその書き込んだメールアドレス当てに転送されますが、その時もとのメールアドレスでもみれるようにするにはどうすれば良いでしょうか。
    要するに転送する時に自分のところにオリジナルは置いておいて、そのコピーを転送するというぅような形にしたのですが。
    どなたかアドバイスを下さい。

No. 94 # M.Masuda [E-mail] 1999/01/27 (水) 21:59
はじめまして 68userさん M.Masudaです。

いや〜こちらのページにはじめてよらせていただきましたが
ずいぶんと勉強になります。

先ほど、CGIスクリプト関連をDOWNしたのでこれからおいおい
解析して勉強させていただきます。

にしても、PerlだけでなくUNIXやプロトコル・ネットワーク
関連の情報量には驚くばかりです。
これからも、宜しくお願いします。

ところで本題ですが。

自分で実験してみればいいのでしょうが、ファイルロックの
アルゴリズムには、一般的にflockを採用している物や、ロッ
クファイルを作成してスクリプト自身がロックを管理してい
る物が有りますが、今までの68userさんの経験上どういう手
法が一番効果が高いでしょうか。

あと、下の山口さんの質問は私も興味ありです(笑)
本屋さんでオライリーのsendmailかmailの本でも買って勉強
すればいいのでしょうが、それだけのためにはオライリーシ
リーズは高すぎる!!!
ここでうなずいた方は、沢山いるはず(爆笑)

#68userさんはレスの書込みの時間が遅い(早い?)ですが何
#をしてる方なのでしょうか?

そろそろ中級に足のかかってきた私ですが、宜しく御教授下
さい。

No. 95 # 68user 1999/01/27 (水) 23:27
はじめまして>山口さん、M.Masudaさん

山口さんのユーザ名がhoge、転送したいところがfoo@bar.com
だとしたら、.forwardに
    \hoge,foo@bar.com
と書けばいいです。カンマで区切ることで、複数の転送先を
指定できますから。しかし
    hoge,foo@bar.com
と書いてしまうと、hoge宛に(つまり自分自身)転送されますが、
再度 .forwardが参照されて、またhogeに送ろうとして…という
ふうに、無限ループに陥ります。

つまり、「\」を付けると「.forward を参照するな」という意味に
なりますので、無限ループが防げるわけです。

# ただ「\」を付けなくても、大抵のメールサーバだと数回ループ
# したら止まるでしょうし、最近のsendmailは賢いので一度もループ
# しないかもしれません。でも、念のため \ を付けておいた方が
# いいでしょう。


> 今までの68userさんの経験上どういう手法が一番効果が高いでしょうか。

特に詳しいわけではないんですが、選択肢としては
    1.flock
    2.mkdir
    3.シンボリックリンク
あたりでしょうか。うちのカウンタは3ですし、このBBSは2です。
flockはNFS環境では動かないところもある(動くところもある)
ということで、使ったことは一度もありません。

ただ2も3も、たま〜にロックが残ったままになることはあるんですよね。
でもOSレベルでは完璧に排他処理はできているはずです。
ですから、webサーバがシグナルを送って、CGIのプロセスを止めたとき
にロックが残るのではないかと思うんですが、本当にそうなのか、
どういう状況で起こるのか、などの検証はできていません。

完璧な方法があれば僕も知りたいです(^^;

> #68userさんはレスの書込みの時間が遅い(早い?)ですが何
> #をしてる方なのでしょうか?

ははは、生活リズムが不規則な ただの学生です(^^;

No. 96 # M.Masuda [E-mail] 1999/01/28 (木) 04:19
どうもありがレスとうございます。
.forwardの設定早速指定してみます。

>完璧な方法があれば僕も知りたいです(^^;
そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ
今、flyを使ったカウンターを作ってるんですが、残ってしまった
ロックファイルを削除する方法を考えてみます。

今までCUIはDOSしか触った事が無いのでUNIXのTABや矢印キーには
非常に驚き、非常によく作られたUNIXのシステムに感心しています。
おかげでキータッチがだいぶ早くなりました。(^_^)V

この掲示板のタイトルに有る「UNIX,CGI,ネットワークの...」
は、今の私が求めているばかりで、ここは情報の宝庫です。

学生という事は、私よりだいぶ若いのにかなりの知識を持って
いるようで恥ずかしいばかりですが、ぜひまた何かあったら教
えて下さい。m(_ _)m
宜しくお願いします。

No. 97 # M.Masuda [E-mail] 1999/01/28 (木) 04:21
訂正
誤:どうもありがレスとうございます。
正:どうもレスありがとうございます。
(^^ゞ

No. 98 # 山口 1999/01/28 (木) 15:01
68userさんご回答ありがとうございます。
68userさんの言う通りにやってみたところ、
¥hoge,foo@bar.comのhogeにはメールが残らず、
すべてfooに転送されてしまいました。
何が行けないのでしょうか?
hogeの前は「エンマーク」でいいのですよね。

No. 99 # 68user 1999/01/28 (木) 23:30
僕が現時点で一番いいと思う方法は、シンボリックリンク自身に
プロセス番号の情報を埋め込み、もしリンク作成できなかったら
リンク先を調べて、さらに「/proc/プロセス番号」が存在するか
どうかチェックする、ってのです。もし/proc/プロセス番号 が
あれば、本当に実行中なわけですが、存在しなければ誤って
ロック情報だけが残ってしまったわけで。

また、
    $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
    sub finish{
        ロックファイルを削除;exit;
    }
などと書くことで、誰か(WWWサーバなど)にシグナルを送られて
プロセスを止められた場合にも、ロックファイルの後始末だけは
行って終了できます。

ただ、うちのカウンタはいろいろ試しているんですが、いまいち…です。
# CGIの場合、排他処理の失敗自体がたまにしか起きないので、
# 動作チェックしにくいですよね。

例えばこんな感じ。

BEGIN { &lock_on; }
END { &lock_off; }

sub lock_on {
    $SIG{TERM}=$SIG{INT}=$SIG{HUP}=$SIG{QUIT}=\&lock_off;
    my $lock_flg = 0;
LOOP:
    foreach ( 1..3 ){
        foreach ( 1..5 ){
            $lock_flg = symlink("$$",$lockfile);
            if ( $lock_flg ){ last LOOP; }
            sleep 1;
        }
        if ( ! $lock_flg ){
            if ( ! -f "/proc/".readlink($lockfile) ){ # なぜかロックファイルが残ってた
                各種整合性のチェック;
                unlink($lockfile);
            }
        }
    }
    if ( ! $lock_flg ){
        print "ロックファイルを作成できませんでした。\n";
        exit;
    }
}

sub lock_off {
    unlink($lockfile);
    その他の後始末;
    exit;
}

> そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ

たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^;


> hogeの前は「エンマーク」でいいのですよね。

全角の「¥」ではないですよ。半角の「\」です。
エンマークかバックスラッシュかは、表示される環境によります。

No. 100 # M.Masuda [E-mail] 1999/01/29 (金) 15:52
>たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^;
いやいや、これだけ知ってれば十分じゃ....この概念は私的でした
ね(^^ゞ

私のプログラミングは、BASICから入ってるのでいまだに構文の書
き方は、BASIC風です。(^^;
しかも、Perlもフリーで配布しているCGIを解析して構文の記述を
勉強したりしてるので、Perl4やそれ以前の頃からプログラミング
している人から比べたら、恥ずかしくって自分のプログラムなんて
公開できない。(T_T)

まだまだ奥が深いPerlは、これだけを勉強して立派なPerl使いにな
りたいんだけど、仕事柄これだけをやってるわけにいかないのが辛
いところです。(^^;

今同時進行で勉強してるのが、Perl,JavaScript,DHTNL,ネットワーク
関連、最近勉強を始めたDHTMLは、IEとネスケの互換性の無さにあき
れています、ページを2重化したくないので同じページ内でIE・ネス
ケそれぞれ3と4のバージョンで無難に表示させるのにてこずってま
す。(^^;

ところで以下の構文がまだよく分からないので、教えて下さい(T_T)
【1】
$SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
↑何をしているのか解からない(恥)
シグナルハンドラをいじっているのは解かるんだけど、
hoge=foo=fuge=booの '=' の使い方の意味と、\&finishの'\'がリファ
レンスを指す事は解かるんだけど、なぜ'\'そうするのかが解からない
【2】
my $lock_flg = 0; ←localとmyの使い分けがまだ理解できない

アー恥ずかしかった。(^^ゞ


この使い方は勉強になりました。
>$lock_flg = symlink("$$",$lockfile);
>if ( $lock_flg ){ last LOOP; }
こんなに簡単に書けるんですね!φ(._.)

># CGIの場合、排他処理の失敗自体がたまにしか起きないので、
># 動作チェックしにくいですよね。
早いマシンより、遅いマシンに負荷が集中する時にエラーが出やす
いんでしょうね。

ちなみに私の試験方法は、同じページ上に同じカウンタのURLを沢山
書いて、ブラウザのキャッシュを無効にしてリロードです。
#本当にこれでいいのか解からないけど、他に手段を知らない(^^ゞ

ではまた。

No. 101 # 68user 1999/01/29 (金) 17:23
>> $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
    $a=$b=$c=100;
    print "$a,$b,$c\n";
の結果は100,100,100となります。つまり$a=100;$b=100;$c=100;と
等価なわけですね。そもそもperlの(Cもそうですが)代入文自体は
値を持っています。
    print $a=100;
の結果は100です。また=(イコール)演算子は右から順に
評価されますので、
    $a=$b=$c=100;

    $a=($b=($c=100));
と等価です。というわけで、
    $a=($b=($c=100));
        ↓$cに100を代入
    $a=($b=100);
        ↓$bに100を代入
    $a=100;
という流れになっているはずです(たぶん)。

シグナルハンドラですが、perl4なら $SIG{HUP}="finish"
ですけど、この書き方では 関数finishが別ファイルにあった
場合(それをrequireやuseで使っている場合)は呼べません。
というわけで、\&finishと書くわけです…と青ラクダ本に
書いてありました(^^;

あとlocalとmyは
    local $local=1;
    my $my=2;
    &f;
    sub f {
        local $local=3;
        my $my=4;
        print "f: \$local=$local\n";
        print "f: \$my=$my\n";
        &g;
    }
    sub g {
        print "g: \$local=$local\n";
        print "g: \$my=$my\n";
    }
実行結果:
    f: $local=3
    f: $my=4
    g: $local=3
    g: $my=2
ということでどうでしょう?

> IEとネスケの互換性の無さにあきれています

DHTMLはわかりませんが、Javascriptを使っていて、
Winでは動くのだろうけど FreeBSD+NetscapeNavigatorでは
エラーが出まくるようなページが たくさんあるので、
こんな変なものには絶対手を付けまいと誓いました(笑)

というわけで僕はJavascript、DHTMLに関しては全くの素人です(^^;

Prev< No. 91〜101> Next  [最新発言に戻る] [過去ログ一覧]