|
すいません、、。 −−−−−−−−−−−−−−− 「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つの例を通して、コールバック関数の使い方を説明します。 −−−−−−−−−−−−−−−−−−−− うーん、用例にしても呼び出しのレベルがいたずらに増えてるだけで、いまいち便利になった実感が。 |
|
こんにちは。 @ふくしさん ぼくの少ない経験でしか言えませんが、 今までぼくは「コールバック関数」(もしくはハンドラ)の名称は、 「何らかのアクションを要求した際に呼び出される関数」 に対して使ってきました。 #ボタン押下のイベントに対して呼び出されるモノであったり #シグナルイベントに対して呼び出されるモノであったり ふくしさんが例に出されている、それぞれの本では、 >「実用Perlプログラミング」(オライリー) の説明がほぼ的確だと思います。 >「Perl 5 パワフルテクニック大全集」(インプレス) や >「Perl 5 マスターブック」(翔泳社) の説明は、これらの部分だけを見ると コールバック関数と呼ぶのはおかしいような気はしますね。 どちらかと言うと、コールバック関数として使う際に便利に呼び出せるように 準備をしているところに見えます。 あくまでもそれぞれ、コード参照とサブルーチンの説明なのではないでしょうか。 |
|
全くもって同感です<hsj さん > 「何らかのアクションを要求した際に呼び出される関数」 あと、このアクションは「非同期に発生する」というのも 重要な要素なのかな? (違うかも) |
|
なるほどー(知恵熱) ひとつわからないのが、Tkやシグナルハンドラのように、 そのアクションをキャッチする機構がシステムによって用意されているもの (BASICのON命令みたいなもんですね) だけをコールバックと呼ぶんでしょうか? それとも、呼び出し元も自前のPerlコードで書いた例がなにかあるでしょうか? あと非同期ってどういう意味なんでしょう。 あとなんでコールバック(電話を掛けなおすこと)っていうんでしょね。 すいませんずうずうしくお伺いして、、。 |
|
ん〜、こういうのは自分の中で納得できるかどうかなので、 うまく説明するのは僕には難しいなぁ。 > あと非同期ってどういう意味なんでしょう。 プログラム側から「いつそのアクションが起きるか」を 知ることができないということです。たとえば、マウスの クリックがいつ発生するだとか、シグナルがいつ飛んで くるかを、プログラムの側から予想することはできません。 > Tkやシグナルハンドラのように、そのアクションをキャッチする機構が > システムによって用意されているものだけをコールバックと呼ぶんで > しょうか? そうだと思います。というより、システム (OS) の手助けを 借りなければ、非同期なアクションに応答することはできません。 signal は非同期でやってきますので、シグナルハンドラという 機構が OS にあります。 ボタンの押下は、結局は X Window System のイベントとして socket 経由でデータが送られてきます。これは select で データが送られてきているかどうかを調べます (たぶん)。 結局どちらも OS の手助けを借りている (=システムコール を使う) わけです。 |
|
にゃるほどー、わかりました。 非同期というのがユーザープログラムでわからない、 システムがキャッチする、 それを処理するのがコールバック、というのであれば納得できます。 あとはシグナルハンドラやTkのプログラムを勉強するなかで 勉強しようと思います。 どうもありがとうございます!>68userさん、hsjさん |
|
FreeBSDでネットワークプログラミング(カーネル)を しているのですが、たくさんの構造体が でてきてすこし混乱しています。 わかりそうでわからないので 構造体を日本語で具体的に説明しているHP、本などを 知っている方がいらっしゃいましたら どうか教えてください。HPの方がありがたいです。 乱文ですが、よろしくお願いします。 |
|
はじめまして、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を使った場合、なぜ外部からのアクセスが出来ないのか 原因が分からずに悩んでいます。 あと、標準モジュールの使い方の学習で効果的なリソースって何でしょうか? 私の手持ちの書籍では、標準モジュールの利用に関して載っていないので 何かオススメの書籍、もしくはネット上のリソースで参考になるところがあれば 紹介していただきたいと思います。なるべく日本語のリソースで(←贅沢かな?) 長々と書いちゃってすみませんが、ご指導の程、よろしくお願いいたします。 |
|
こんどは 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 まわりのこうぞうたいのことですよね? ぼくもしりたいです。だれかおしえて。 |
|
そうなんですよ。なかなかネットワークの構造体について わかりやすい説明って詳しいないんですよね。 特にFreeBSDの場合は・・・ 誰か知っていたら教えてください。 |
|
残念ながら、僕は知らないです。僕の持っている UNIX カーネル 関連の書籍にも、TCP/IP は載ってませんでした。 BSD Magazine No.4 に、IP の話が少し載ってますが、 構造体の説明はありません。 というわけで、解説書いて(笑)>yuji さん |
|
そうですね。つくってみますか! っていってもなかなか・・・ 理解した分だけ作っていくのは いいかもしれません。あとあと 役に立ちますし。 ええ、BSD Magazine No.4 に書いてありましたね。 どのような流れでデータが動いているのかは 理解するのに役に立ったと思います。 |
|
LocalAddr => 'localhost'を削除したら、外部からのアクセスに反応することを こちらでも確認できました。 #しかし普段からLinux使ってるのにnetstatしなかった私って…ごめんなさい(汗) それから、Perldocというものが自分のマシンに入っていることも実は知りませんでした。 昨日からネット上で検索かけまくって、やっとPerldocの存在を知りました。 さっそくperldoc -m IO::Socketして読んでみます。 68userさん、早急な解答ありがとうございました。 |
|
はじめてここに書きこみさせていたただきます よろしくお願いします。 今メーリングリストを開設しようと思っています サーバーは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週間と一日・・・私くじけそうです・・・ もしわからる方いらっしゃいましたらお願いします。 |
|
> Group writable directory グループが書き込めるディレクトリ、だから危険なので 実行するのはや〜めた、と言ってます。 |
|
68userさんありがとうございます パーミッションをいろいろ試したのですが・・・開きません ファイルやディレクトリのパーミッションを もしよろしければ、どうすればファイルを開いてくれるのか教えてください よろしくお願いします・・・ |
|
すみません、私のミスでした・・・ ディレクトリのひとつのパーミッションがおかしかっただけです う〜んこんなこと気づかないなんて・・・ ありがとうございました〜 |