[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 とは別にＭＬのアーカイブがある場合がありえます。例えば

    	電話番号簿(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();)

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

       ○	&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		ＭＬの記事番号ではなく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]