[PREVIOUS CHAPTER] [NEXT CHAPTER]
5 library コマンド

5.1	library コマンド

library コマンドはMLの中に配送されないsubのMLを含んでいるような状
態です。次のようなコマンドがあります(help ファイルも見てね)
"library" commands are a sub-mailing list. This command has its own
summary file and archive directories. "put" file is stored in
$LIBRARY_ARCHIVE_DIR ($SPOOL_DIR for ML) and summary file is
$LIBRARY_DIR/summary. The system is closed under $LIBRARY_DIR.
This system uses the same routines as the usual ML. Hence the file
name is number. Also FML does not permit the freedom of file names to
put for security.

	library put	このコマンド以降の部分を記事として保存
	library get 	ファイル名(数字)
	library summary	
	library index	libraryとして蓄えられた記事の
			サマリ・ファイルを送り返します。
	library unlink [番号] 指定番号の記事をライブラリーから削除する
	library delete [番号] 同上
	library rm     [番号] 同上
	library put	put a file (after this line)
	library get 	file to get (number)
	library summary	
	library index	summary file (index file) in library 
	library unlink [number]	remove "number" file in library
	library delete [number]
	library rm [number]

等があります。 削除にあたっては From: のアドレスがそのファイルをかつて
突っ込んだ人と同じである必要があります。

ファイル名が数字なのは一つにはML本体と全く同じように実装しているから
です。そして security 上ファイル名をユーザが自由に選ぶことはさせません。
やるなら submit した後で管理者が後で名前の変更 rename(2) をするべきで
す。

$DIR の代わりに対応するものとして次のものがが定義されています。

	$LIBRARY_DIR		library コマンドの HOME ($DIRに相当)
	$LIBRARY_ARCHIVE_DIR	library コマンドの SPOOL($SPOOL_DIRに相当)

library コマンドの特定のコマンドを使えないようにするには 
@DenyLibraryProcedure に定義します。シンタックスと理屈は 
@DenyProcudure と同様です。
4.1
4.1

例: 'library put' を使えないようにする。

	@DenyLibraryProcedure = ('put');

5.2	メンバーリストファイルの拡張について (libmember_name.pl)

1998/01/09 AUTHOR: 福井 誠之 <fukui@sonic.nm.fujitsu.co.jp>

libmember_name.pl は members にメンバー各個人の名前を付加するモジュー
ルです。

この機能を有効にするには、config.ph にて、

      $USE_MEMBER_NAME = 1;

の一行を記述するだけで OK です。既に運用中の ML でも OK です。
makefml config のメニューでもできます。


[機能説明]

  これまでの fml では、メンバー一覧を 'members' コマンドで取り寄せると
メンバー全員のアドレスが返送されてきますが、アドレスだけでは誰が誰なのか
わかりにくい場合がありました。
  このモジュール libmember_name.pl は、その問題を解決するために、各メンバー
の名前 (基本的には、mail の From: ヘッダに書かれている名前(gecos)) を管理
する機能を付加します。
  このモジュールを有効にすることにより、機能が追加・変更される項目を以下
に記述します。


● 自動登録モード

    自動登録時 ('confirm','subscribe' コマンドによる登録も含む) に、
  mail の From: 行に書かれているアドレスが $MEMBER_LIST に追加されますが、
  その際に From: 行に書かれている名前 (gecos) も保存するようになります。

● 'members', 'member' コマンド

    'members', 'member' コマンドによるメンバー一覧の取り寄せで、メン
  バーのアドレスに対応する名前が登録されている場合には、その名前が付加さ
  れて返送されます。

  返送されるメンバー一覧の例 :

	#.FML HEADER
	# NEW FORMAT FOR FURTHER EXTENSION
	# e.g. fukachan@phys r=relayserver m=3u s=skip 
	# r= relayserver
	# m= matomeokuri parameter is time and option
	# s= skip. can post from this address but not delivered here.
	# the same obsolete format is compatible with new format and as follows:
	# e.g. fukachan@phys relayserver matome 3u
	#.endFML HEADER
	yoshio@aaa.co.jp (早乙女 好雄)
	yumi@bbb.ac.jp (Yumi SAOTOME)
	##BYE yuina@ccc.or.jp (Yuina HIMOO)
	・
	・
	・

● 'name' コマンド (新規)

  コマンド文法 : name [新しい名前]

    コマンドを送ってきた者の登録されている名前を [新しい名前] に変更します。
  古い名前が登録されていない場合は、新規に登録されます。
  また、[新しい名前] を省略すると、現在登録されている名前を削除します。

● 'admin name' コマンド (新規)

  コマンド文法 : admin name アドレス [新しい名前]

    リモート管理機能を使用している場合に有効になる、管理者用の名前変更コマ
  ンドです。アドレスを指定することにより、各メンバーの名前を変更することが
  できます。([新しい名前] の取り扱いについては、'name' コマンドと同様)

    この 'name' と 'admin name' コマンドを使用することにより、自動登録
  でない ML や、既に運用されている ML でも、名前の新規登録や変更ができるよ
  うになります。さらに、自動登録時には無条件に gecos が登録されるのとは違
  い、コマンドのオペランドにより自由な名前を登録することができますので、
  例えば、
      - 内輪の ML で、メンバーのニックネームを登録
      - 職場の ML で、名前だけでなく所属も付加して登録
  等の応用ができます。

[技術的補足]

● 名前の管理方法

    表面上は、members ファイル中に書かれている各行のメンバーのアドレスに
  名前が付加されるように見えますが、実際には members-name という別ファイル
  にて、'アドレス 名前' というエントリを記述して、アドレスと名前の対応付け
  をしています。('members' コマンドは members ファイルを返送するのではな
  く、members と members-name をマージしてテンポラリファイルを作成し、それ
  を返送しています)

    また、名前は日本語(2バイト文字) も OK で、途中に空白文字を含んでいても
  かまいません(改行までが名前と認識されるため)。管理ファイルには、強制的に
  JISコードに変換してから書き込まれます。さらに、From: や Subject: ヘッダ
  から名前を得たときには、 $USE_MIME = 1 なら MIME デコードの処理が行われ
  ます。

● 名前管理ファイル members-name のファイル名変更方法

  'members-name' という名前を変更したい場合には、config.ph にて

    $MEMBER_NAME_FILE = "$DIR/〜";

  と記述して変更してください。(〜 : 変更したいファイル名)

● メンバーの名前を得るための関数

  HOOK 処理等で、メンバーの名前を得たいときには、事前に

	&use('member_name');

  をした上で、

	&CheckMemberNameFile(アドレスの文字列)

  を呼び出してください。アドレスに対応する名前が返ってきます。
  名前が登録されていない場合には、'' が返ってきます。

  名前は members-name ファイルに書かれている文字コードがそのままで返って
  きます。基本的に JIS コードのはずですが、members-name を直接編集して
  JISコード以外の文字コードで記述した場合はその限りではありません。

● libmember_name.pl が OVERWRITE しているコマンド・処理

    上記のような方法で、アドレスと名前の対応付けを管理していますので、先の
  機能説明で記述したコマンドに加えて、さらに他のコマンドも libmember_name.pl
  内で追加処理が行われます。
    libmember_name.pl 内で追加処理が実行されるコマンド・処理の一覧を以下に
  記述します。

	- 自動登録処理 ('confirm','subscribe' コマンド含む)
	- 'members','member' コマンド
	- 'bye','unsubscribe' コマンド
	- 'chaddr','change-address','change' コマンド
	- 'admin bye','admin unsubscribe' コマンド
	- 'admin chaddr','admin change-address','admin change' コマンド
	- 'name' コマンド (新規)
	- 'admin name' コマンド (新規)

● 'name', 'admin name' コマンドの &SecureP() 処理のバイパスについて

  fml では、コマンドを処理する際にコマンドラインに不当な文字がないかどうかを
  &SecureP() という関数内でチェックして、不当な文字が含まれていればコマンド
  の実行を却下するようになっています。

  'name','admin name' コマンドで、オペランドに日本語(2バイト文字) を指定
  すると、そのままではこの 2バイト文字が「不当な文字」と認識されてコマンドが
  実行できません。そこで、'name','admin name' コマンドで &SecureP() 処理
  をバイパスするために、libmember_name.pl では %SECURE_REGEXP を定義していま
  す。

  %SECURE_REGEXP を定義して &SecureP() をバイパスしたときの副作用について、
  fukachan に質問してみたところ、

  "Ken'ichi Fukamachi" <fukachan@sapporo.iij.ad.jp> さん wrote:
  |うーん、どうだろ。SecureP とかは汎用なので、あまり緩くできないとおもっ
  |ています。でも特定のコマンドのフレーズを通してもそれが単なる string 操
  |作でしかないのであれば特に変なことはおこらないはずですけどね。だから大
  |丈夫だろうとおもってます。

  とのことです。


5.3	Traffic を調べる (libtraffic.pl)

AUTHOR: yuao@infonia.or.jp (Yuao Tanigawa)

[libtraffic.pl の説明]

  メイルの投稿量の統計をとるコマンドです。

  使い方は、

% libtraffic.pl [-n <best?>] [-m <mails>] [-d] [where is summary?]

で、オプションを指定しないで、

% libtraffic.pl

とすると、デフォルトで、カレントディレクトリのsummaryを読んで、

1. 月毎のメイル投稿量
2. メイル投稿量毎の日数
3. 時間帯別の投稿量
4. 1日25通以上投稿があった日
5. 投稿者ベストテン
6. 1日当たりの平均投稿量と最大投稿量

を出力します。

  オプションで、-d を指定すると、さらに、

0. 日毎の投稿量

も得られます。デフォルトでは表示しません。

  オプション -n は、5.の投稿量の多い人のベスト何人まで表示するかを
数字で指定します。デフォルトでは、-n 10 と同じです。

  オプション -m は、4.の何通以上あった日を表示するかを数字で指定し
ます。デフォルトでは、-m 25 と同じです。

5.4	traffic で 複数のアドレスを持つ人物を同一視してカウントする 技

	Author: Yuao Tanigawa <yuao@infonia.or.jp>
	fml-support: 00736
	fml-support: 02578
> $TRF_NAME_HOOK = q#
>     $name =~ s/umura@solan\.chu/umura@nn.solan./oi;
> #;
> 
>  と設定しています。これは
> 
>    umura@solan.chu -> umura@nn.solan.
> 
>  という書き換えを行うことになります。

  こんな感じで、$name にsummaryに書いてあるアドレスが入っている
ので、config.ph の中で $TRF_NAME_HOOK にいちいちアドレスを置き
換えるコードを書いて下さい。あとは、

if ( $name eq 'yuao@drei.mech.' || $name eq 'XN9Y-TNGW@j.asa' ) {
	$name = 'tanigawa@tribo.';
}

など、ほんとに、好きなように書いて下さい。同一人物データベースと
かつくって自動的にやってくれるようなインテリジェントな作りには
なっていないので、ごめんなさい。(_o_)
# ということで、メンバ全員、対応させようとすると、本当にシンドイ
# です。^_^;


[PREVIOUS CHAPTER] [NEXT CHAPTER]