[PREVIOUS CHAPTER] [NEXT CHAPTER]
5 ファイルをまとめて操作する関数群 (mgetとまとめおくりで使う)

5.1	mget options (help file より)

mgetは『そのコマンドごとに』『まとめおくりはユーザーごとに』送り方が指
定できます。以下 help ファイルより抜粋

mget range 	[モード]	[時間間隔]
			ファイルをまとめて送り返す
			スプールの記事や、
			(もしあれば)アーカイブにあるファイル
   引数:
	range		範囲を指定
			1-10,12,15-100 1,2,10
			first first:10 last:30 100-last(mh的 Syntax)
	モード		gz tgz ish rfc934 b rfc1153 d unpack uf(default=tgz)
	時間間隔	送り返すメールが複数の時の間隔(default=300)	

   モード:
		オプションなしは tar+gzip で spool.tar.gz
	tgz	同上
	uf	PLAINTEXT(UNIX FROM)
	gz	GZIP(UNIX FROM)
	b	RFC934 format 	PLAINTEXT(mh-burst)
	rfc934	
	ish	lha + ish 
	lhaish
	i
	li
	lu	lha + uuencode
	lhauu
	unpack	PLAINTEXT(UNIX FROM)
	uu	UUENCODE
	d	RFC1153 format 	PLAINTEXT
	rfc1153	RFC1153 format 	PLAINTEXT

以下ではこれらの

	複数のファイルを一辺に取り扱う方法
	そのフォーマットについての少し細かい点

に関して記述します。

5.2	mget3 のデフォールトの変更

○ 複数のファイルを一つにする時のまとめ方のデフォールト
$MGET_MODE_DEFAULT can change the default file format "mget" command
sends back. The default format is "tgz" on UNIX, 'mp' on Windows NT4.

libsendfile.pl では

    local($mode) = $MGET_MODE_DEFAULT || 'tgz'; # default

のようになっています。オプションで明示的な指定がない場合は

	tar して gzip をかけたフォーマット(binary)
	そして uuencode して送られます。

で送り返されます。このデフォールトは $MGET_MODE_DEFAULT で変更できます。
定義して意味のある変数は 上述のmgetのオプションと同じと思って構いませ
ん。正確には(libfop.pl中で定義されている) %_fp というハッシュテーブル
のKEY(2番目の引数のフィールド)です。

	uf
	rfc934
	rfc1153
	mp
	gz
	tgz
	lhaish
	lhauu
	uu

○ アーカイブ(var/archive や library コマンドや…)のencodingのデフォールト

spool とは別にMLのアーカイブがある場合がありえます。例えば

	電話番号簿(TEXT)
	100個ずつにまとめたスプールの記事(BINARY)

このアーカイブを取り寄せる時のデフォールトは

	テキスト	$MGET_TEXT_MODE_DEFAULT
			(デフォールトは 'mp' MIME/Multipart)

	バイナリ	$MGET_BIN_MODE_DEFAULT
			(デフォールトは 'uu' uuencode された状態); 

	$mode = -T $opt ? 
	    ($MGET_TEXT_MODE_DEFAULT || 'mp'): 
	($MGET_BIN_MODE_DEFAULT || 'uu'); 

○	Subject の設定 

	$MGET_SUBJECT_TEMPLATE

という変数をテンプレートとして用いています。これを元にいくつかの入れ替
えをおこなって subject を生成しています。
これは

   result for mget _DOC_MODE_ _PART_ _ML_FN_

のように定義されている場合

	   _DOC_MODE_   <=>    [last:10 tar + gzip]
	   _PART_       <=>    (1/4)
	   _ML_FN_      <=>    $ML_FN (here is "(Elena Lolobrigita ML)") 

という置換えが行なわれ、最終的に

   Subject: result for mget [last:3 tar + gzip] (1/1) (Elena Lolobrigita ML)

という形で mget の result が送り返されます。よってこの変数を適当に削る
なりすれば subject をカスタマイズできます。

これにより $NOT_SHOW_DOCMODE (CFVersion 2) と $DEFAULT_MGET_SUBJECT は 
obsolete になりました。

5.3	mget3 インターフェイス:パターンマッチ戦略

この時点で flock もはずれて、最後の最後あとは、&Notify だけが残ってい
る

	MH風展開を実行
		e.g. 1,last:30 -> 1,70-100

	if V2 フォーマットでTRY
		e.g.
		spool/PLAIN-ARTICLE
		archive/100.tar.gz 
		等を探索
		return

	elsif ではそのパターンはアーカイブ?
		ほとんど Exact にアーカイブ内を探索
		return

	elsif V1 format 探索 (廃止)
		なら、実行
		return

	else
		NO MATCH or V1 FORMAT ERROR

5.4	プログラムのパス
6.47.4

ファイル操作ではいくつか下請けのプログラムを呼ぶことがあります。これら
は makefml が自動的に検出し、設定するはずです。でも一応確認はして下さ
い。自分でチェックしながら config.ph に書くのは管理者として望ましい態
度です。site_init.ph もしくは sitedef.ph 等で一回ちゃんと記述してあと
はほっておくというのもよい手です。

現在ファイル操作関係で自動的に検出し設定されるのは次のコマンドです。 

	変数名				設定例

	$TAR                           = "/usr/bin/tar cf -";
	$UUENCODE                      = "/usr/bin/uuencode";
	$COMPRESS                      = "/usr/bin/gzip -c";
	$ZCAT                          = "/usr/bin/zcat";
	$LHA                           = "/usr/local/bin/lha";
	$ISH                           = "/usr/local/bin/ish";

5.5	mget3 の送り返しプロセス

いくつかのファイルをまとめて送り返すプロセスの最終ステージは、次のよう
に行なわれます。

   ○  	mget3 interface はロックがかかっている状態のうちに 
	$TMP_DIR に送り返すべきファイルを作っておきます。
	送り返しプロセスはロックを外した後で行なわれる。

なお $TMP_DIR に作られる中間ファイルは次のようなファイル名になっている。

	m:"モード名":"プロセスID"return.数字(分割されるため)

送り返すものが複数になった時のために”分割の数字”は必要であるのは自明
だが、一意にファイルを定めるためにはプロセスIDとモード名までがセットに
なる必要がある。というのは一つのメールで「複数のモードの mget コマンド
を使う」ことができるからである。

   ○	ロックをはずす (&Unlock();)

というのは、送り返すプロセスが長い場合ML自体およびその後に来たもっと
手間のかからないプロセスさえもロックして止まてしまうのはいけないからで
ある。

   ○	&RunStartHooks; から mget3_SendingEntry を呼び出す。

mget3_SendingEntry は %mget_list に従い下位インターフェイスを呼び出す。
ロックははずれているので、複数の送り返しプロセスがどう時に走っても構わ
ない。

ファイルが分割されている場合、送り返しは $MGET_SEND_BACK_SLEEPTIME (が
未定義なら $SLEEPTIME) 時間ごとに行なわれる。mget コマンドで明示的に指
定される場合以外はデフォールトの $MGET_SEND_BACK_SLEEPTIME
($SLEEPTIME) が優先される。$SLEEPTIME は $MGET_SEND_BACK_SLEEPTIME の
古い名前である

注意:なお通常の条件下では今送り返そうとしている中間ファイルが 上書きさ
れることはありえない。異常な場合は有り得るだろうが…(そんな状態のOS下
でプロセスはマトモに動かないだろう)

5.6	コマンドで単なるシンタックスエラーの警告をする

明示的に $USE_WARNING をセット
e.g. in config.ph

	$USE_WARNING = 1;

するとコマンドメールでのシンタックスエラーの警告をする。デフォールトは
しない。

e.g. 
# helps 			←コマンドのエラーは警告
#うじゃ				←シンタックスエラー警告なし
#しぐにちゃ〜	uja@uja.ac.jp	←シンタックスエラー警告なし

5.7	mget の送り返し時のファイルサイズ

	$MAIL_LENGTH_LIMIT (default is 1000 lines)

は複数のファイルに分割する時の一通あたりの大きさです。行数で指定します。
Internetならともかく、パソコン通信の人へも配送する時は気を使いますよね
(最近ではそうでもないのか?よくしらない)。

目安としては1000行でだいたい50kくらいになるので1000が選ばれています。

5.8	mget で指定できるファイルの最大数

mget で指定できるファイル数の最大値。デフォールトは1000で mget * など
として1000通以上のファイルを指定するとエラーになる。

	$MGET_SEND_BACK_FILES_LIMIT

5.9	Mget Format: Unix From 形式

4.4BSD UNIX の sendmail は /usr/libexec/mail.local を使い各ユーザ(e.g. 
fukachan) 宛のメールを /var/mail/fukachan に保存しています。
この形式が UNIX FROM 形式です。$HOME/mbox も同様ですね。

	From fukachan Mon Jan 26 09:11:46 1998
	Received: by hikari.fml.org (8.8.8/3.4W6+Hikari-2.1) 
		with ESMTP id JAA02846 for <uja@fml.org>; 
		Mon, 26 Jan 1998 09:11:46 +0900 (JST)
	From: fukachan@sapporo.iij.ad.jp
	Subject: uja

	なんとなくです。なんとなく

MH の inc はこの形式のファイルを処理することを前提にしています。

5.10	Mget Format: MIME/MultipartのBNF表現(RFC1521より)

   boundary := 0*69<bchars> bcharsnospace

   bchars := bcharsnospace / " "

   bcharsnospace :=    DIGIT / ALPHA / "'" / "(" / ")" / "+" /"_"
                 / "," / "-" / "." / "/" / ":" / "=" / "?"

   Overall, the body of a multipart entity may be specified  as
   follows:

   multipart-body := preamble 1*encapsulation
                  close-delimiter epilogue

   encapsulation := delimiter body-part CRLF

   delimiter := "--" boundary CRLF ; taken from Content-Type field.
                                   ; There must be no space
                                   ; between "--" and boundary.

   close-delimiter := "--" boundary "--" CRLF ; Again, no space
   by "--",

   preamble := discard-text   ;  to  be  ignored upon receipt.

   epilogue := discard-text   ;  to  be  ignored upon receipt.

   discard-text := *(*text CRLF)

   body-part := <"message" as defined in RFC 822,
             with all header fields optional, and with the
             specified delimiter not occurring anywhere in
             the message body, either on a line by itself
             or as a substring anywhere.  Note that the
             semantics of a part differ from the semantics
             of a message, as described in the text.>

5.11	Mget Format: MIME/Multipartの見本

Date: Thu, 18 May 95 22:33:00 JST
From: Elena@phys.titech.ac.jp (Elena Lologrigita)
Subject: P R E S E N T
To: fukachan@phys.titech.ac.jp
MIME-Version: 1.0
Content-type: multipart/mixed;
	boundary="--Thu_18_May_95_22:32:56--"

----Thu_18_May_95_22:32:56--
Content-Type: message/rfc822

Date: Thu, 18 May 95 21:45:17 JST
From: fukachan@phys.titech.ac.jp
Subject: あほうどり
To: Elena@phys.titech.ac.jp (Elena Lolobrigita ML)
Message-ID: <19950518.01905.Elena.Lolobrigita@Baycity.asia>

「なんとなく いいかんじだな〜 そのほうがおもしろいし 」
につきますね、この番組
「明日に」でも「明日へ」でも「明日」でもない「あしたキックオフ」なんで
すよ(う〜ん、なんとなくわかるが(笑))

(ふ):やっぱり、#3、#7、#12、#23、#27、#32 ですね(^^)

----Thu_18_May_95_22:32:56--
Content-Type: message/rfc822

Date: Thu, 18 May 95 22:00:29 JST
From: Elena@phys.titech.ac.jp
Subject: あしたキックオフ
To: Elena@phys.titech.ac.jp (Elena Lolobrigita ML)
Message-ID: <19950518.01906.Elena.Lolobrigita@Baycity.asia>

はまるとあの変な雰囲気から抜けられなくなります(笑)やっぱり 
アミノテツロー の謎のマニアックな味?とでもいうのがこの番組が
一番全壊^H開してますね。
もちろん 脚本・シリーズ構成:山本優 あっての「フリーキック」ですなぁ

----Thu_18_May_95_22:32:56----

5.12	Mget Format: RFC934

rfc934 "Proposed Standard for Message Encapsulation"

MH の burstで複数の展開に展開できます。

Example:
------- Forwarded Message

From: Anna
Subject: Mama told me

やっぱり「あほうどり」ですね。シリーズの核心です。
脚本:山本優	絵コンテ:アミノテツロー	演出:鈴木敏明

------- Forwarded Message

From: Elena
Subject: Albatros

イングリッドは隼の妹という根も葉もあるような話が…(笑)

------- Forwarded Message

5.13	Mget Format: RFC1153 digest 

comp.sys.ibm.pc.digest とかでみるでしょ?あれです。RFC は aboutすぎて
読んでもよくわかりません;_;

Example:

Date: Sat, 20 May 95 01:33:50 JST
From: Elena@phys.titech.ac.jp
Subject: Freekick
To: fukachan@phys.titech.ac.jp

GODAI BBS DIGEST	Sat, 20 May 95	Volume 95: Issue 120

Today's Topics:
	エレナさんの特技は? 

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

Date: Sat, 20 May 95 00:00:31 JST
From: "Ken'ichi Fukamachi" <fukachan>
Subject: 	エレナさんの特技は? 
X-Mail-Count: 01932

エレナさんの特技は水撒きだってば(^^) 水撒き

--fukachan 
「とんでもだめだよ、おにいちゃん。アルバトロスは風にのるんだ」

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

End of GODAI BBS Digest V95 Issue #120
********************************

5.14	Mget Format: 1153 のカスタマイズ

$RFC1153_ISSUE		MLの記事番号ではなく1153形式で送り出す時の番号

$RFC1153_SEQUENCE_FILE	その番号を保存するファイル

		このルーチンが呼ばれるたびにカウンタは進みますが、
		前述のように各ユーザごとに1153で送る場合を考えると
		送り方はそれぞれ違うのだから
		番号はちゃんとつながってはくれません。
		これを解決する方法はありません

$RFC1153_LISTNAME 	まとめ送りする1153 digest につけるタイトル

$RFC1153_VOL		Volume 例えば96年度のまとめ送りなら Volume 96の
			ようなレベルの番号

$RFC1153_CUSTOM_HOOK	&Rfc1153Custom($mode, *conf) の中で
			行なわれるフック

&Rfc1153Custom($mode, *conf) internal:

    ########## CUSTOMIZE BELOW ##########
    $issue     = $RFC1153_ISSUE    || 1;
    $listname  = $RFC1153_LISTNAME || "UJA";
    $vol       = $RFC1153_VOL      || $year;
    $IssueSeq  = $RFC1153_SEQUENCE_FILE  || 
	"$FP_VARLOG_DIR/IssueSeq"; # file to remember count;

    &GetTime;
    &eval($RFC1153_CUSTOM_HOOK, 'RFC1153 custom:');
    $issue = &Rfc1153GetSeq($IssueSeq);

5.15	Mget Format: lzh + ish option

FYI: 一部のOS(Sun OS 4.x ?)で 2.2 でうまく動かない時に 
$INSECURE_SYSTEM = 1; を設定すると動くことがあります。
9.15

	mget 200-210 ish

の用に指定するとlzh して ish(s7 mode)したものを送り返します。

	$LHA = "/usr/share/bin/lha";
	$ISH = "/home/axion/fukachan/bin/ish";

等をどこかで(config.ph or sitedef.ph)で設定して下さい。makefml が自動
探索て設定されているはずですが確認はして下さい。

5.16	SJIS にファイルを変換して送る (lzh + ish と lhz + uuencode option)

config.ph で $USE_SJIS_IN_ISH = 1; をセットすると lha を使うタイプでは 
SJIS に変換します。変数名は ish だけのように見えますが歴史的なものです。
lha を使うならいづれの場合にも適用されます。

^M ^Z もつけます。すべて、外部コマンドを使わずに自力でやります。


[PREVIOUS CHAPTER] [NEXT CHAPTER]