68user's page 掲示板

Prev< No. 86〜102> Next  [最新発言に戻る] [過去ログ一覧]
No. 86 # mm 1999/01/21 (木) 03:26
># perlにファイル自体を書き換えるオプションがあったかな?
    perl -pi.bak -e "s/a/b/g;" file[0-9]
では?

No. 87 # 68user 1999/01/21 (木) 05:12
> perl -pi.bak -e "s/a/b/g;" file[0-9]

うーん、簡単ですねぇ。ちなみに僕は最近までオプションは -wと-e
しか知りませんでした。でも最近-cを覚えました(^^;

分厚いマニュアルをめくってオプション調べるより自分で書いた方が
早いんで、なかなか覚えられないんですが、長い目で見るとさっさと
オプション覚えた方がいいんでしょうけどね…。

# 一番悪いのは、青ラクダ本の目次。「オプション一覧」とか
# 「スイッチ一覧」なんて項がない。どこに書いてあるかと
# 言えば「コマンドインタプリタとの協調」。毎回オプション解説を
# 探すのに苦労してます。…ま、言い訳ですな(^^;

> ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな…

CGIはnobody権限で動きますので、CGI経由で作られるファイルは
全て所有者がnobodyとなります。ファイル消せなくなってあわてない
ように(笑)

No. 88 # mm 1999/01/21 (木) 21:29
># 一番悪いのは、青ラクダ本の目次。

青いラクダは、確かに読みづらいですよね。
私の場合、普段は「日本語 perl texinfo バージョン 4.0.19.2」のプレーンテキ
スト版をオンラインマニュアルとしてを使ってます。高尾直弥さんという方の訳
ですが、リファレンス部分は赤いラクダとほぼ同内容だと思います。

ただ、今使ってるものはいろいろイジってて配布条件(GNU)上問題があるのと、
手元にオリジナルが見当たらないので、ちょっと探してみましたが、根性がない
ので↓のようなHTML版しか見つけられませんでした(^^;
    http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html
でも、どこかに必ずオリジナルのtexinfo やプレーンテキスト版もあると思いま
す(^o^;ゞ

WindowsのヘルプやHTMLよりも、やっぱりエディタで正規表現検索が可能な普通の
テキストが使い易い…

No. 89 # mm 1999/01/21 (木) 22:15
日本語 perl texinfo の1頁ものがありました。
http://main.ipc.fukushima-u.ac.jp/fdai/man/perl.html
テキスト版の前後を<pre></pre>で括っただけなので、ブラウザではちょっとヘンになりますが、
直ぐにテキストに戻せると思います。

No. 90 # 68user 1999/01/24 (日) 00:21
どうもです。早速GETさせていただきました。
これでちょっとは賢くなれる…かな?(^^;

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に関しては全くの素人です(^^;

No. 102 # M.Masuda [URL] 1999/01/29 (金) 21:21
詳しい解説ありがとうございます。

いまいちおバカな頭で理解できないけど、
local と my の違いは、

サブルーチンからさらにサブルーチンに呼ばれた時に。
local = 前のルーチンの値を保持する。
my = 最初のサブルーチンを呼ばれた時(定義した時)の値を示す。
と、解釈していいのかなぁ?

もしそうなら、具体的に使う時は再帰呼び出しの様な使い方を
した時に違いが出る。ということでしょうか?
それならmainルーチンから普通にサブルーチンを呼び出した時
(初期化ルーチンの様な)さらにルーチンを呼び出さなければ、
同じ結果ですね。

#localやmyで指定されたサブルーチン内の変数に当てられた分の
#メモリは、そのルーチンが終了すれば開放されるのだろうか?

>$a=$b=$c=100; は理解できました。
やっぱBASICが最初だと、Perlの構文は簡単に記述できるけど、
理解に時間がかかる!、単におバカなだけだったりして((((^^;

>というわけで、\&finishと書くわけです…と青ラクダ本に
何ページに載ってます?
よく言う青ラクダ本は持ってますが、あんまり読んでると眠く
なるので、必要な部分だけ拾い読みしてます。(^^;
#にしてもラクダ本って、何が何処に書いてあるのか解かりづら
#い...、しかもたまに書いてある英語のジョークが、真剣に読む
#と腰を砕くし....(; ;)

私は、恥ずかしいけど請け負いでホームページ製作をしてるんで
すが、製作作業と勉強に掛る時間が同じ位です。(>_<)

>こんな変なものには絶対手を付けまいと誓いました(笑)
すいませんこんな変なもの作ってます(爆)

Javascriptは、クライアント側のプログラムなんで、アクセス環
境で動いたり動かなかったりなので、大手サイトやアメリカのH
サイトで使用している物を、見ながら使ってます。
これは無断コピーの意味ではなく、「沢山のアクセスのあるサイ
トで使われているコードはエラーが少ないだろう」を前提にして
ます。もちろんそのまま使うのではなくコマンドの使われかたを
流用するだけだけど。

一応ネスケとIEは、3と4のバージョンで動作確認しながら作
ってますが、他のOSは環境が無いのでどうにもならないし..。

私のページも、68userさんの環境からアクセスすると、最悪かも
しれない。(^^ゞ

暇なら来た時BBSに書込みでもしていって下さい。

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