68user's page 掲示板

Prev< No. 1208〜1224> Next  [最新発言に戻る] [過去ログ一覧]
No. 1208 # ふくし [E-mail] 2000/09/29 (金) 13:17:13
すいません、、。

−−−−−−−−−−−−−−−
「Perl 5 パワフルテクニック大全集」(インプレス)
、、コード参照は、おもに、コールバック関数(後で呼び出してもらう関数)を指定するときに使う。、、

#! /usr/local/bin/perl

# コールバック関数の定義
sub callback
{
        my $mesg = shift;
        print "$mesg\n";
}

# 関数への参照を作成
my $coderef = \&callback;

# 異なるパラメータで関数を呼び出す
&$coderef("Hi Mike!");
&$coderef("How are you?");
−−−−−−−−−−−−−−−−−−−−
「Perl 5 マスターブック」(翔泳社)

サブルーチン関数の一般的な用途としてはコールバック関数があります。コールバック関数では、サブルーチンの配列をテーブル内に作成し、Perl プログラムから1つまたは複数呼び出します。、、

sub central_greeting {
        print "Hello!";
}
sub eastern_greeting {
        print "Yo!";
}
sub western_greeting {
        print "Howdy!";
}
%greetings = (
        "Central" => central_greeting,
        "Eastern" => eastern_greeting,
        "Western" => western_greeting,
)
(中略、どこの土地のひとかを $where に入れて)
$hash_ref = \%greetings;
$sub_ref = $hash_ref=>($where);
&$sub_ref();
−−−−−−−−−−−−−−−−−−−−
「実用Perlプログラミング」(オライリー)

コールバック関数とは、リファレンスとしてあちこちに渡され必要に応じて呼び出されるようなサブルーチンです。そうしたものが構文的に用意されているわけではなく、使い方としての名称に過ぎません。呼び出す(リファレンスを使用する)側のコードでは、そのサブルーチンが何をするものかを意識する必要はありません。本節では、ディスパッチテーブル、シグナルハンドラ、描画関数の3つの例を通して、コールバック関数の使い方を説明します。
−−−−−−−−−−−−−−−−−−−−

うーん、用例にしても呼び出しのレベルがいたずらに増えてるだけで、いまいち便利になった実感が。

No. 1209 # hsj 2000/09/29 (金) 14:17:27
こんにちは。

@ふくしさん
ぼくの少ない経験でしか言えませんが、
今までぼくは「コールバック関数」(もしくはハンドラ)の名称は、
「何らかのアクションを要求した際に呼び出される関数」
に対して使ってきました。
#ボタン押下のイベントに対して呼び出されるモノであったり
#シグナルイベントに対して呼び出されるモノであったり
ふくしさんが例に出されている、それぞれの本では、
>「実用Perlプログラミング」(オライリー)
の説明がほぼ的確だと思います。
>「Perl 5 パワフルテクニック大全集」(インプレス)

>「Perl 5 マスターブック」(翔泳社)
の説明は、これらの部分だけを見ると
コールバック関数と呼ぶのはおかしいような気はしますね。
どちらかと言うと、コールバック関数として使う際に便利に呼び出せるように
準備をしているところに見えます。
あくまでもそれぞれ、コード参照とサブルーチンの説明なのではないでしょうか。

No. 1210 # 68user 2000/09/29 (金) 19:42:54
全くもって同感です<hsj さん

> 「何らかのアクションを要求した際に呼び出される関数」
あと、このアクションは「非同期に発生する」というのも
重要な要素なのかな? (違うかも)

No. 1211 # ふくし [E-mail] 2000/09/30 (土) 12:54:33
なるほどー(知恵熱)
ひとつわからないのが、Tkやシグナルハンドラのように、
そのアクションをキャッチする機構がシステムによって用意されているもの
(BASICのON命令みたいなもんですね)
だけをコールバックと呼ぶんでしょうか?
それとも、呼び出し元も自前のPerlコードで書いた例がなにかあるでしょうか?
あと非同期ってどういう意味なんでしょう。
あとなんでコールバック(電話を掛けなおすこと)っていうんでしょね。
すいませんずうずうしくお伺いして、、。

No. 1212 # 68user 2000/10/03 (火) 01:47:46
ん〜、こういうのは自分の中で納得できるかどうかなので、
うまく説明するのは僕には難しいなぁ。

> あと非同期ってどういう意味なんでしょう。
プログラム側から「いつそのアクションが起きるか」を
知ることができないということです。たとえば、マウスの
クリックがいつ発生するだとか、シグナルがいつ飛んで
くるかを、プログラムの側から予想することはできません。

> Tkやシグナルハンドラのように、そのアクションをキャッチする機構が
> システムによって用意されているものだけをコールバックと呼ぶんで
> しょうか?
そうだと思います。というより、システム (OS) の手助けを
借りなければ、非同期なアクションに応答することはできません。

signal は非同期でやってきますので、シグナルハンドラという
機構が OS にあります。

ボタンの押下は、結局は X Window System のイベントとして
socket 経由でデータが送られてきます。これは select で
データが送られてきているかどうかを調べます (たぶん)。

結局どちらも OS の手助けを借りている (=システムコール
を使う) わけです。

No. 1213 # ふくし [E-mail] 2000/10/03 (火) 03:15:10
にゃるほどー、わかりました。
非同期というのがユーザープログラムでわからない、
システムがキャッチする、
それを処理するのがコールバック、というのであれば納得できます。
あとはシグナルハンドラやTkのプログラムを勉強するなかで
勉強しようと思います。

どうもありがとうございます!>68userさん、hsjさん

No. 1214 # yuji 2000/10/03 (火) 03:49:55
FreeBSDでネットワークプログラミング(カーネル)を
しているのですが、たくさんの構造体が
でてきてすこし混乱しています。

わかりそうでわからないので
構造体を日本語で具体的に説明しているHP、本などを
知っている方がいらっしゃいましたら
どうか教えてください。HPの方がありがたいです。
乱文ですが、よろしくお願いします。

No. 1215 # UNIX見習い 2000/10/04 (水) 01:46:01
はじめまして、UNIX見習いです。

今まではke◯t氏の有名な掲示板や、ゆいチャ◯トのソース等を参考に
Perlの勉強をしていましたが、68userさんのスクリプトを見て
目からウロコが落ちた感じでした。
変数のネーミングセンスも良く、可読性も高いスクリプトを初めて見て、
今まで参考にしていた人のスクリプトって何だったんだろうと思っちゃいました。
あと、Perlでネットワークプログラミングが出来るとは知らなかったし(爆)

さっそくechoサーバのサンプルスクリプトを使わせてもらって勉強していますが、
IO::Socketを使ったechoサーバの場合、外部からのアクセスが出来なくて悩んでいます。

現在の状況は、
echo-server.pl・echo-server-fork.pl・echo-server-select.pl
は外部からのアクセスでも動きますが、
IO::Socketを使ったechoサーバのサンプルスクリプトは全部
外部からのアクセスには反応しません。localhostからだと、ちゃんと機能するのですが…。

サーバの環境は、Perl 5.005_03 on Linux2.2.14で、
echoサーバのサンプルスクリプトは全てデフォルトのまま設置です。
IO::Socketを使った場合、なぜ外部からのアクセスが出来ないのか
原因が分からずに悩んでいます。

あと、標準モジュールの使い方の学習で効果的なリソースって何でしょうか?
私の手持ちの書籍では、標準モジュールの利用に関して載っていないので
何かオススメの書籍、もしくはネット上のリソースで参考になるところがあれば
紹介していただきたいと思います。なるべく日本語のリソースで(←贅沢かな?)

長々と書いちゃってすみませんが、ご指導の程、よろしくお願いいたします。

No. 1216 # 68user 2000/10/04 (水) 02:47:24
こんどは canna が かんじに へんかんしてくれなくなりました。やれやれ、
こどもみたいな ぶんしょうだ。

> IO::Socketを使ったechoサーバのサンプルスクリプトは全部
> 外部からのアクセスには反応しません。
おお、ほんとだ。というわけで しらべてみたところ、
    LocalAddr => 'localhost',
がわるいです。

ふつう、マシンには じぶんじしんあてへのインタフェイスがあります。
これをループバックとよび、127.0.0.1 という IP アドレスがふられて
います (127.0.0.1 がループバックという きまりはありません。
(IPv4 では) ただのかんれいです)。

そして、インターネットにつながっているならば、さらにインターネットへ
つながるインタフェイスがあります。これには 210.249.139.22 のような
グローバル IP アドレスがふられています。

つまり、つうじょう、マシンには 2つのインタフェイス/IP アドレスが
あるわけです。

たいていのサーバプログラムは2つのインタフェイスを くべつしません。
しかし、くべつできるような しくみは いちおうあります。それが
    http://X68000.startshop.co.jp/~68user/net/func.html#bind
のさいごにかいてある、bind でどちらの IP あどれすをつかうかを
えらべる、ということです。

で、LocalAddr => 'localhost' は、この bind のひきすうに IP アドレス
(localhost にたいおうする 127.0.0.1) を あたえたのと おなじいみです。

これは LocalAddr をしていするときと しないときで、それぞれ
netstat -an をじっこうすると わかりやすいでしょう。
    tcp 0 0 127.0.0.1.5000 *.* LISTEN (LocalAddr してい)
    tcp 0 0 *.5000 *.* LISTEN (LocalAddr していない)
と、LocalAddr をつけると、127.0.0.1:5000 しか みていないのが
わかります。だからローカルホストからしか せつぞくできなかったわけです。


> 今まではke◯t氏の有名な掲示板や、ゆいチャ◯トの
> ソース等を参考にPerlの勉強をしていましたが、
ゆいチャットはしりませんが、kent とか rescue などと くらべられるのは
しんがいです :-)

まぁ、こっちもそんなにレベルが たかいわけではないので (こんかいの
ようなミスもあるし)、これいじょうは えらいひとからの つっこみが
こわいので いいません。

ちなみに perl って、しょしんしゃでも なんとか うごかせるから
でしょうか、うそだらけのページがおおいですね。ぼくがぜんめんてきに
しんらいしているサイトは
    http://www.context.co.jp/perlnews/
    http://www.din.or.jp/~ohzaki/perl.htm
の2つだけです。

> あと、標準モジュールの使い方の学習で効果的な
> リソースって何でしょうか?
perl モジュールガイドとかいうほんが しゅっぱんされていません
でしたっけ? しょうさいは わかりませんが。

ただ、もくてきのモジュールがわかっているならば、perldoc を
ながしよみして、けっこうなんとかなるかとおもいます。


よみにくいぶんしょうで しつれいしました。LocalAddr の
ぶぶんは、じかいこうしんじに さくじょいたします。


@yuji さん
カーネルの TCP/IP まわりのこうぞうたいのことですよね?
ぼくもしりたいです。だれかおしえて。

No. 1217 # yuji 2000/10/04 (水) 04:35:42
そうなんですよ。なかなかネットワークの構造体について
わかりやすい説明って詳しいないんですよね。
特にFreeBSDの場合は・・・
誰か知っていたら教えてください。

No. 1218 # 68user 2000/10/05 (木) 02:50:06
残念ながら、僕は知らないです。僕の持っている UNIX カーネル
関連の書籍にも、TCP/IP は載ってませんでした。

BSD Magazine No.4 に、IP の話が少し載ってますが、
構造体の説明はありません。

というわけで、解説書いて(笑)>yuji さん

No. 1219 # yuji 2000/10/05 (木) 06:27:27
そうですね。つくってみますか!
っていってもなかなか・・・
理解した分だけ作っていくのは
いいかもしれません。あとあと
役に立ちますし。
ええ、BSD Magazine No.4 に書いてありましたね。
どのような流れでデータが動いているのかは
理解するのに役に立ったと思います。

No. 1220 # UNIX見習い 2000/10/05 (木) 08:08:04
LocalAddr => 'localhost'を削除したら、外部からのアクセスに反応することを
こちらでも確認できました。
#しかし普段からLinux使ってるのにnetstatしなかった私って…ごめんなさい(汗)

それから、Perldocというものが自分のマシンに入っていることも実は知りませんでした。
昨日からネット上で検索かけまくって、やっとPerldocの存在を知りました。
さっそくperldoc -m IO::Socketして読んでみます。

68userさん、早急な解答ありがとうございました。

No. 1221 # aki 2000/10/05 (木) 10:58:31
はじめてここに書きこみさせていたただきます
よろしくお願いします。

今メーリングリストを開設しようと思っています
サーバーはLinuxで
aliasesファイルに転送先のメンバーリストファイルを指定したのですが
開かず、悩んでいます


    ----- The following addresses had permanent fatal errors -----
<aki@my-member.com>
:include: /home/sites/www.my-recruit.com/web/recruit/bin/Mailing-list/mylist-member-list
      (expanded from: <aki@my-member.com> )

    ----- Transcript of session follows -----
550 :include: /home/sites/www.my-recruit.com/web/recruit/bin/Mailing-list/mylist-member-list... Cannot open /home/sites/www.my-recruit.com/web/recruit/bin/Mailing-list/mylist-member-list: Group writable directory
554 <aki@my-member.com> ... aliasing/forwarding loop broken

--------------------------------------------------------------------------------

のようなメッセージが帰ってきます。

ファイルのパーミッションは644です

すでに1週間と一日・・・私くじけそうです・・・
もしわからる方いらっしゃいましたらお願いします。

No. 1222 # 68user 2000/10/05 (木) 11:44:03
> Group writable directory
グループが書き込めるディレクトリ、だから危険なので
実行するのはや〜めた、と言ってます。

No. 1223 # aki 2000/10/05 (木) 13:17:52
68userさんありがとうございます
パーミッションをいろいろ試したのですが・・・開きません
ファイルやディレクトリのパーミッションを
もしよろしければ、どうすればファイルを開いてくれるのか教えてください
よろしくお願いします・・・

No. 1224 # aki 2000/10/05 (木) 13:34:08
すみません、私のミスでした・・・
ディレクトリのひとつのパーミッションがおかしかっただけです
う〜んこんなこと気づかないなんて・・・
ありがとうございました〜

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