このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

NetEvents

発言者:よしもと
( Date Monday, February 17, 1997 08:14:16 )


Chuckさんが、また面白そうなものを作りましね。

以下のページをご覧あれ!!

→  Scripting News

田中求之 さんからのコメント
( Monday, February 17, 1997 16:07:25 )

さっそく BIAP のページから落としてきました。これをつかえば
TCP/IP のスクリプティングが可能になりますね。

TCP/IP osax が不安定なだけに、こっちに切り替えた方が安全かな?

今から、いくつかのスクリプトを動かしてみます。TCP/IP osax 用に書いていた
ものなら、すぐに書き換えられるのがいいな。


→  NetEvents Info

田中求之 さんからのコメント
( Monday, February 17, 1997 17:34:52 )

メール送信用のスクリプトを NetEvents 用に書き換えてみましたが、ばっちり
動きました。

アプリケーションを呼び出しますので、その点だけは気を付ける必要があるのですが、
それ以外は TCP/IP osax の場合と、基本的な部分はまったく一緒のスクリプトに
なります。

参考までに、メール送信用のスクリプトを登録しておきます

→  SendMail By NetEvents サンプルスクリプト

田中求之 さんからのコメント
( Monday, February 17, 1997 19:56:26 )

HTTP プロトコルの通信(ようはページのソースを抜き出す程度ですが)をやって
みましたが、快調でした。

できれば、openStream に timeout の指定ができれば嬉しかったとは思いますが、
私が試した範囲では、安定して使えるようです。


大分県 安東 さんからのコメント
( Thursday, February 20, 1997 17:01:11 )

私も早速試してみました。

うーん、スバラシイ...

NetEventを完全にバックグラウンドに出来ると見ためが良くなります
ね。(^^;

このへんの機能というかインターフェースが標準でAppleScript環境?!
にも付くといいなあ?!

田中求之 さんからのコメント
( Friday, February 21, 1997 19:54:25 )

NetEvents を使った Finger クライアントのサンプルスクリプトです。
finger の処理自体はハンドラーとして独立させてあります。

property crlf : (ASCII character 13) & (ASCII character 10)

display dialog "enter user@host" default answer ""
set tgUser to text returned of the result

set oldDel to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"@"}
set xUser to text item 1 of tgUser
set xHost to text item 2 of tgUser
set AppleScript's text item delimiters to oldDel

finger(xUser, xHost)
---

on finger(xUser, xHost)
  tell application "NetEvents 1.0b4"
    
    set tgAddr to NameToAddr xHost
    set sss to OpenStream tgAddr port 79
    
    try
      WriteStream sss data (xUser & crlf)
      
      repeat until (StatusStream sss) = "DATA"
      end repeat
      
      set d to {}
      repeat while (StatusStream sss) = "DATA"
        set end of d to (ReadStream sss amount 20480)
      end repeat
      
      CloseStream sss
      
    on error
      AbortStream sss
      error "Connection Error"
    end try
  end tell
  
  set oldDel to AppleScript's text item delimiters
  set AppleScript's text item delimiters to {""}
  set d to d as string
  set AppleScript's text item delimiters to oldDel
  
  
  return xReturner d
  
end finger

最後の最後に Tanaka's osax を使ってますが、改行コードを CRLF から CR
に変換するだけですので、osax をわざわざ使わなくてもスクリプトで処理できる
できます。

田中求之 さんからのコメント
( Sunday, March 09, 1997 01:04:52 )

NetEventsに付属している HTTP Server のスクリプトをちゃんと動くように書き
換えて遊んでいますが、なかなか面白いです。 Web サーバーの基本というのは、
ほんまにシンプルやなぁ、というのを実感できます。

付属のサンプルは、単に挨拶を返すだけなので、これに手を加えて、ちゃんとページ
を送り出すものに作り替えてみるつもりです。


考えてみれば、自分で適当な port を決めて、サーバーとクライアントを自分で
作ったら、自分専用のプロトコルでネットワーキングが行えるなぁ。楽しいかも
しれない (^_^)

田中求之 さんからのコメント
( Tuesday, April 08, 1997 21:19:58 )

NetEvents を使った新しいサンプルを登録しておきました。

http downloder といって、ファイルに並べて書いておいた URL のデータ
(HTTP プロトコルでダウンロードするものに限る)を次々にダウンロードする
というものです。ようは、ダウンロードのバッチ処理用のものです。

NetEvents 1.0b6 と Tanaka's osax が必要です。

セーブしたアプリケーションに多めにメモリーを割り当てておけば、安定してダウン
ロードを行います。もちろん、アプレットがバックグランドになっていても大丈夫です。
今日の午後は、これをバックで走らせながら、表で色々な作業をやってましたが、
1度もエラーを出したり、落ちたりしていません。また、こうして Netscape で
ホームページを見ていたり、あるいはメールを読み書きしていても、問題はない
ようです( PM8100/100 + MacOS 7.6J)

さらに、複数のアプリケーションを作って、それらを同時に走らせることも可能です。



→  http_downloder (for NetEvents)

田中求之 さんからのコメント
( Wednesday, April 09, 1997 02:32:50 )

自宅に戻って Quadra 840AV + MacOS 7.6J (OT1.1.2) 上で動かしてみましたが、
こちらでも非常に安定して動作します。さすがは Chuck さんの作った NetEvents!

というわけで (?)、バーチャルホスト対応&転送レート(かなりアバウト)の記録を
組み込んだ改良版を作って登録しておきました。



→  http downloader 2

田中求之 さんからのコメント
( Wednesday, April 09, 1997 17:00:39 )

NetEvents を動かすときには、NetEvents をバックグランドに持っていって、かつ
ウィンドウを隠してしまうほうが早くなるようです。

ステータスがウィンドウに描かれるようになってますが、これの作画処理が入ると
その分遅くなってしまうようです。

しかし、NetEvents は面白い(っていうか、HTTP のプロトコルって単純だから
色々と作るのも楽でいいですねぇ)。

田中求之 さんからのコメント
( Thursday, April 10, 1997 19:05:19 )

エラー処理、およびファイル名の重複チェックを組み込み、若干の高速化を
はかった改良版を登録しておきます。

データをセーブするフォルダーは global 変数で管理するようにし、起動の度に
選ぶように変えました。


こいつの HTTP セッションの部分をちょいと書き換えた上で、Web サーバーの
スクリプトと合体させると、ブラウザーによるファイルのアップロードを受け付ける
サーバーができあがります。

田中求之 さんからのコメント
( Thursday, April 10, 1997 19:07:08 )

あ、改良版の URL の記入を忘れてた(^_^;;

(登録ファイル名の綴りがおかしいままだけど、見逃してね)


→  HTTP Downloader 3 (for NetEvents)

田中求之 さんからのコメント
( Thursday, April 10, 1997 20:33:41 )

>データをセーブするフォルダーは global 変数で管理するようにし、起動の度に
>選ぶように変えました。

複数を同時に走らせるときには、global ではなく property で管理するように
スクリプトを変更してくださいね。


田中求之 さんからのコメント
( Friday, April 18, 1997 23:58:56 )

NetEvents 1.0b7 がリリースされています(ホームページの記載は 1.0b6 の
ままですが)。

今回から、バックグランド専用版も登場


→  NetEvents Info

kozka さんからのコメント
( Tuesday, April 22, 1997 18:52:55 )

ダイアルアップでプロバイダへ接続した後に自分のIPアドレスを得るには
どうしたら良いのでしょうか?「NetEvents 1.0b7 」のmyAddressというコマン
ドでは意味不明の値がかえってきます。「192.168.1.1」のような文字列をとり
だしたいのですが、、

自分のMacへのリンクをHTMLファイルに書き込んでFetchでアップしたいのです。

田中求之 さんからのコメント
( Tuesday, April 22, 1997 19:07:09 )

下記のように、myAddress で得たアドレスデータを AddrToName で変換してやれば
普通の IP アドレス(文字表記された IP アドレス)を得ることができます。

tell application "NetEvents 1.0b7"
  set myAddr to MyIPAddress
  set myIP to AddrToName myAddr
end tell

あるいは1行にまとめて

tell application "NetEvents 1.0b7"
  set myIP to AddrToName (MyIPAddress)
end tell

kozka さんからのコメント
( Tuesday, April 22, 1997 23:16:34 )

「AddrToName」を使えばよかったのですね。「AddrToName」をてっきりドメイ
ン名に変換するコマンドかと思い込んでいました。ありがとうございました。


田中求之 さんからのコメント
( Wednesday, April 23, 1997 00:22:43 )

すみません、間違ってました。

ホスト名が割り当てられていない場合、上記のスクリプトはエラーになるようです。
(つまり文字表記された IP アドレスは返さない)

NameToAddr の逆だからうまくいくと思ったのですが、テストしたマシンには
すべてホスト名がついていたため気が付きませんでした。

ですから、ホスト名がついていないマシンで、自分の IP アドレスを得るには、
MyIPAddress が返す4バイトの整数を、自分で IP アドレス表記に変換する
ルーティンを組むか、NetEvents をあきらめて、正直に TCP/IP コンパネ
で確認するしかないようですね。

kozka さんからのコメント
( Wednesday, April 23, 1997 13:24:38 )

そうでしたか。まずはマニュアルで入力するようにしてそのうち可能な方法
が見つかればその方法を使うことにしてみます。

重松修 さんからのコメント
( Thursday, May 15, 1997 21:07:19 )

何時もお世話になっております。

先生のサンプルスクリプト(HTTP DOWNLOADER)を試しているのですが、
私だけか分かりませんが、動きません。

・NetEvents 1.0b7を使用
・PowerMacintosh 6100 および Centris 650でチェック

状態は、
(1) 32Kより大きいといって大きなファイルはダウンロードでエラーになる。
(2) 小さなファイル(HTMLなど)はダウンロードできない。
  このときログのためのレート計算で0による除算でエラーになることがある。
(3) 田中先生のサンプルのダウンロードファイルはうまくいく。
  が、該当ファイルを自分のサーバー(テストしたマシンとは別、QPQで運用)
  からダウンロードしようとするとやはり失敗します。

どのような理由が考えられますでしょうか?メモリは十分に割当てています。
(ドロップレット、NetEvents共)

HTTP DOWNLOADERの利用の目的は、FileMakerにゲストが登録したホームページ
を回ってリンクが切れていないことを確認するということです。ですので、
基本的にきちんと最後のファイル名まで書いてあるとは限りません。

  正1: http://www.mydomain.com/index.html
  誤1: http://www.mydomain.com

  正2: http://www.mydomain.com/abc/index.html
  誤2: http://www.mydomain.com/abc

最後の「/」がついてない場合もありますし、ファイル名まで書いてある事は
稀なのですが、Marionetの場合は、まずヘッダのみ取得すると、たとえば、
誤1では単にエラーになりますが、誤2の場合は正しいURLを教えてくれます。

よろしくお願いいたします。

田中求之 さんからのコメント
( Friday, May 16, 1997 12:37:05 )

1:サーバーが QPQ の場合にうまく行かないのは、私も確認しています。これは
QPQがヘッダーとデータの間の改行コードに CR を使っている(みたい?)のが
原因のようですが、詳しくは調べてません。

2:32K以上のデータがエラーになる件については、…なぜだろ? 私は、この
スクリプトを使って数Mの大きなファイルのダウンロードなどにも使っていますが
全くエラー無しなんですが。

3:あくまでも、きちんと URL が確定しているファイルをダウンロードするスク
リプトであって、サイトなどを巡回するためのものには作っていません。しかし、
HTTP プロトコルでファイルを取ってくる基本的な機能は組み込んでありますので、
あとは、各自でこれを利用して改造してもらえばよいと思います。


重松修 さんからのコメント
( Friday, May 16, 1997 14:43:05 )

QPQでないサーバ(Apache)で試したところ、32K以上のファイル(JPEG)
も小さなテキストもうまくいきました。(QPQと全く同じ内容です)

どうやら、全て原因はQPQにあったようです。大変お騒がせいたしました。
m(__)m

ところで、ヘッダとデータの間が<CR>とありますが、通常は<CR><LF>
という空改行が入るところに<LF>のない<CR>だけ、っていう事ですか?
(@_@)?

田中求之 さんからのコメント
( Friday, May 16, 1997 15:28:04 )

>ところで、ヘッダとデータの間が<CR>とありますが、通常は<CR><LF>
>という空改行が入るところに<LF>のない<CR>だけ、っていう事ですか?

CR ではなくて LF でした。

HTTP では、ヘッダーとデータの間には空行が入ることになっており、通常は
CRLF で改行が入る(つまり、ヘッダーの最後には CRLF + CRLF というパ
ターンが来る)ものなのですが、QPQ の場合は、空行ようの改行に LF を
使っています。

この点に関しては QPQ の ML でも問題として指摘されていたことがありますが、
修正されるという返事は出ていなかったように思います(作者が忙しいみたいで
作者からのコメントが、このところほとんどありません)。

HTTP_downloader は、ヘッダー部分とデータ部分との切れ目の認識に
CRLF を用いていますので、この部分が QPQ の場合には働きません。


実際にページのソースをそのままダウンしてもらえばわかります。

田中求之 さんからのコメント
( Friday, May 16, 1997 15:47:00 )

>実際にページのソースをそのままダウンしてもらえばわかります。

指定した URL のページのソース(or データ)をヘッダーも含めて丸ごとファイルに
落とすスクリプトを、念のため登録しておきました。


→  getPageSource(NE).hqx

重松修 さんからのコメント
( Saturday, May 17, 1997 14:35:08 )

わざわざスクリプトまでご登録しただき、ありがとうございます。m(__)m

QPQの場合、それを仕様といえば仕様でしょうが、ほとんどバグですね。
とりあえず、CRLFCRLFで区別している部分を一度xRerunerで変換して
CRCRにすれば、良さそうですね。

頂いたテストスクリプトともども、動作を検証して、報告いたします。

田中求之 さんからのコメント
( Saturday, May 17, 1997 17:37:54 )

>とりあえず、CRLFCRLFで区別している部分を一度xRerunerで変換して
>CRCRにすれば、良さそうですね。

ヘッダーの検出にはこれでOkですが、データ部分は変換しないように気をつ
けてください。


重松修 さんからのコメント
( Sunday, May 18, 1997 19:13:04 )

色々試して見ました。

その結果、QPQ以外にも変なのがいることが判明しました。(^_^;;

<CR><LF>を2回送ってくるもの
Server: Apache/1.2b2<CR><LF>
Server: Apache/1.2b8<CR><LF>
Server: Apache/1.1.3<CR><LF>
Server: Apache/1.1.1<CR><LF>
Server: Netscape-Commerce/1.12<CR><LF>
Server: Netscape-Communications/1.1<CR><LF>
Server: Microsoft-IIS/3.0<CR><LF>
Server: WebSTAR/2.0 ID/33602<CR><LF>
Server: TeleFinder/5.5b25<CR><LF>
Server: CERN/3.0<CR><LF>

そうでないものたち
HTTP/1.0 200 OK<CR><LF>
Date: Sunday, 18-May-97 09:50:29 GMT<CR><LF>
Server: QuidProQuo/1.0<CR><LF>
MIME-version: 1.0<CR><LF>
Content-type: text/html<CR><LF>
Last-modified: Saturday, 17-May-97 18:04:29 GMT<CR><LF>
Content-length: 100<LF>
<LF>

HTTP/1.0 200 Document follows<LF>
Date: Sun, 18 May 1997 09:57:48 GMT<LF>
Server: NCSA/1.4.2<LF>
Content-type: text/html<LF>
<LF>

重松修 さんからのコメント
( Sunday, May 18, 1997 19:22:40 )

QPQですが、例えば、「http://host.mydomain/usagi/」とすべきところを
「http://host.mydomain/usagi」とした場合、

HTTP/1.0 302 Moved<CR><LF>
Date: Sunday, 18-May-97 10:20:19 GMT<CR><LF>
Server: QuidProQuo/1.0<CR><LF>
Location: /usagi/<CR><LF>
<CR><LF>

と今度は、<CR><LF><CR><LF>を返してきます。
以上、追加で気付いたことを報告します。

田中求之 さんからのコメント
( Monday, May 19, 1997 00:48:29 )

NCSA のサーバーが LF を使っているのか… でしたら、けっこう多くのサーバーが
ヘッダーの後に LF しかつけていない可能性はありますね(最近は Apache に移った
ところが多いのだろうけど)。

多少速度は犠牲になりますが、ヘッダー認識部分をきちんと作りなおしたほうが安全
ですね。 xReturner を通したうえで CRCR の文字列を区切りとして使うという
のが確実かな? ただ、xReturner を通してしまうと、データ部分の LF をカット
してしまうので、このへんにちょっと細工が必要ですね。

ま、こういうのを考えるのがスクリプトを書く楽しみなんですが (^_^;;