それでも、なすべき仕事はまだある。欧州議会の法律問題及び域内市場委員会(JURI)が予定ソフトウエア特許指令に対する修正提案の最終リストを票決しても has voted 、提案は欧州議会を通過しなければならない。指令が議会段階を通るのを急ぐ試みに続いて、元の日付が2003年9月1日に変更されたrescheduled to its original date。関係当事者が欧州議員にロビイ活動をする時間が少し出来たが、休日を考慮すると、考える時間は限られる there is not as much time as one might think.。
message queueをUNIX機能に基づくソケット又は別のファイsるデスクリプタと使うとき、不便なのはmessage queueがselect()システム呼出をサポートしないことだ。そこでunixプログラマはI/Oマルチプクス問題を、以下のような、簡単だが不様な方法で解決する。
while(1)
{
select on socket with timeout;
...
wait on a message queue with IPC_NOWAIT
}
確かに、上のやり方は不様だ。私は嫌いだ。別の解決策が、マルチスレッディングに適合する筈だ。だが、この記事では、変な方法、つまりmsguToFd()と言う新しいシステム呼出をお見せする。完成したバグのないkernelインプレメンテーションを差し上げようとは思わない。私の経験をお話するだけだ。この記事は、GNU/Linux kernelソースをいじるのが好きな人には面白いだろう。
サインを示す。
int msgqToFd(int msgq_id)
これは、message queueに対応するデスクリプタを返す。それをselect()と一緒に使うことが出来る。
何かエラーがあれば、−1を返す。
アプリケーションはこの呼出を次のように使うことが出来る。
...
q_fd = msgqToFd(msgq_id);
while(1)
{
FD_ZERO(&rset);
FD_SET(0, &rset);
FD_SET(q_fd, &rset);
select(q_fd + 1, &rset, NULL, NULL, NULL);
if(FD_ISSET(0, &rset))
{
...
}
if(FD_ISSET(q_fd, &rset))
{
r = msgrcv(msgq_id, &msg, sizeof(msg.buffer), 0, 0);
...
}
}
ファイル・デスクリプタは、ファイル構造体と関連している。ファイル構造体には、このファイル型にサポートされたfile_operatinsと言うオペレーションの組がある。このfile_operatins構造体の中には、pollと言うエントリがある。一般のselect()がすることは、こんppoll()ファンクションを呼び出して、その名が意味するようにファイル(又はソケットなど)の状態を獲得することだ。
一般的に select() は次のように働く
while(1)
{
for each file descriptor in the set
{
call file's poll() to get mask.
if(mask & can_read or mask & can_write or mask & exception)
{
set bit for this fd that this file is readable/writable or there is an
exception.
retval++;
}
}
if(retval != 0)
break;
schedule_timeout(__timeout);
}
select() の詳細な実行は、標準kernelソースの fs/select.c.中にある sys_select() と do_select() を見られたい。
理解しなければならない別のことは poll_wait()である。これがすることは、現在のプロセスを、file、pipe、socket、又は我々の場合message queueなどの各kernel機能が提供する待ち行列に入れることである。
現在のプロセスは、 select()を呼び出すことによりい幾つかの待ち行列上で待つことがあるのに注意されたい。
システム呼出は、message queueに対応するファイルデスクリプタを返す筈だ。このファイルデスクリプタは、message queueに関する file_operations を含むファイル構造体を指す筈だ。
それをするため sys_msgqToFd() は次をおこなう
1. msqidを使って、対応する struct msg_queue を探す
2. get_msgq_inode() を呼び出して新しいinodeを割り当てる
3. get_unused_fd() に新しいファイル・デスクリプタを割り当てる
4. get_empty_filp() に新しいファイル構造体を割り当てる
5. inode、ファイル構造体を初期化する
6. msgq_file_ops にファイルの file_operations を設定する
7.set file'swith msq->q_perm.key にファイルの private_data を設定する
8. fd_install() にfdとファイル構造体をインストールする
9. 新しい fdに戻る
この記事で提供する msg.c と付属の msg.h を見られたい。sys_i386.c もまた参照
msgq_poll() のすることは極めて簡単だ。
することは
1. message queue用のキイ file->private_data を用いて対応するmessage queueを探す
2. poll_wait() を呼び出して現在プロセスをmessage queueの待ち行列に入れる
3. 待ち行列が空であれば (msq->q_qnum == 0)、writable(これには議論があるが、今は考えない)として設定。空でなければ、readableとして設定
4. maskに戻る
message queue 上で poll() をサポートするには、既存の message queue ソースコードを修正する必要がある。
修正には次が含まれる。
1. wait queue head を struct msg_queue に加えること、これを使って select() のため現行プロセスを入れる。wait queue head はまた、message queue が作られたとき初期化されなければならない。 msg.c.の中のstruct msg_queue と newque() を見ること。
2. 新メッセージが(select()により)message queueに入ったときは何時でも、目覚めさせなければならない。msg.c.の中の sys_msgsnd() を見ること。
3. message queue が削除又は変更されたときは、(select()により)message queueで待っているプロセス全部に目覚めさせなければならない。msg.c.の中の sys_msgctl() とfreeque()を見ること。
4. 新しいinode とファイル構造体割り当てるには、関連ファイルシステム幾つかを設定しなければならない。
5. VFS用 s を正しく働かせる。この目的で、新しい初期化コードを作って新しいファイルシステムを登録し何かを設定しなければならない。 msg.cの中の msg_init() を見ること
変更は全部 MSGQ_POLL_SUPPORT を用いて "ifdef"される。だから、変更を特定するのは優しい筈だ。
ファイル構造体を割り当てるには、ファイルのf_vfsmnt と f_dentry を正しく設定する必要がある。さもないと、コンソールに OOPS メッセージが出る。この新しいファイル構造体でVFSを正しく働かせるには、今まで簡単に述べた追加設定幾つかが必要である。
file_operations に関して poll() だけをサポートpするので、ファイル構造体設定コードの詳細に入る必要はない。 必要なのは f_dentry と f_vfsmntを正しく設定することだけである。関連コードの殆どは、 pipe.c からコピイする。
新しいシステム呼出を追加するには、二つのことをしなければならない。
最初のステップは、kernelレベルに新しいシステム呼出を追加すること。これは既におこなった(sys_msgqToFd())。
GNU/Linux kernelにおいては、system V IPC 関連呼出全部が、 arch/i386/kernel/sys_i386.c.の中の sys_ipc() を通じて送られる。 sys_ipc() は、呼出番号を使って、要求された個別システム呼出を識別する。新しいシステム呼出を正しく送り出すには、sys_msgqToFd() のため新しい呼出番号(これは25)を定義し、sys_ipc() を変更してsys_msgqToFd() を呼び出すようにしなければならない。参考だけのため、標準kernelソースの中の arch/i386/kernel/entry.S と、この記事にある sys_i386.c の中の sys_ipc() を見られたい。
第二のステップは、ユーザレベル・アプリケーションのためstubファンクションを追加することだ。実際システム呼出stubファンクションは、GLIBCが作る。そして新しいシステム呼出を追加するには、GLIBC を修正して自分自身のものを構築してインストールしなければならないが、これは面倒で、そんなことをする気はない。問題を解決するため、私はGLIBC.からコピイして貼り付けた。この記事にある user/syscall_stuff.cを見ると、msgqToFd()という名のファンクションがあるが、これが msgqToFd()システム呼出のためのstubである。.
これがおこなうことは、簡単に言うと
INLINE_SYSCALL(ipc, 5, 25, key, 0, 0, NULL)を返す;
ipc : sys_ipc(). ipc のためのシステム呼出番号が __NR_ipc として拡張される。これは 117 である。
5 : このマクロにのためのアーギュメントの数。
25 : sys_msgqToFd() のための呼出番号
key : sys_msgqToFd() に対するアーギュメント
INLINE_SYSCALL がアーギュメントを正しく設定し、インタラプト0x80を呼び出してkernelモードに切り替えシステム呼出を呼び出す。
この修正が実際に働くかには確信がない。この種の修正が可能か否かを検討したかっただけだ。
これはさておき、指向する必要のある問題幾つかを述べたい。
1. 二つ以上のスレッド又はプロセスが message queue にアクセスしており、一つのプロセスが msgrcv() を持つ message queue で待っており、別のものが select()で待っていると、最初のプロセス/スレッドが新しいメッセージを受ける。 msg.cの中の pipelined_send() を見ること。
2.書込可能性テストのため、msgq_poll() は、message queueが空のときだけマスクを書込可能に設定する。実際我々は、message queueが一杯でないときだマスクを書込可能に設定するので、大差はないが、私は簡単な方を選ぶ。。
3.この筋書きを考えて見よう。
この種の場合、何を為すべきだろうか?正しい解決策は、message queueを削除したときfdを閉じることだろうが、その権利のある任意のプロセスでmessage queueを削除することができるので、これは不可能だ。これは、他のプロセスによりmessage queueがファイいるデスクリプタにマップされていても、message queueを削除するプロセスが、message queueに関連するファイルデスクリプタを持たないことがあるのを意味する。
加えて、同じ待ち行列を(同じキイで)もう一度作ったときでも マッピングは維持される。
4.効率問題。select() を呼び出して待ち行列で待っているプロセス全部が、新しいメッセージが来たとき目覚めさせられる。結局一つのプロセスだけがメッセージを受け取るので、その他のプロセスはまた眠る。
私は、この実験のため、GNU/Linux kernel 2-4-20 を x86 上で使った。
この修正の付いた新 kernel を構築するには、次をコピイし
msg.c を ipc/msg.c へ
msg.h を include/linux/msg.hへ
sys_i386.c を arch/i386/kernel/sys_i386.cへ
構築してインストールすることを推薦する
テストプログラムを走らせる前に、必ずキイファイルを作ること:
touch .msgq_key1
touch .msgq_key2
要約:役立って手頃な価格の遠隔医療システムを生み出すには、全ての羈絆から脱しなければならない:
TelMedForteの目標は、電力線及び無線ブロードバンド技術、及び既存優先施設により有効になる無線遠隔医療ソリューションの設計、統合のリーダーになることである。
地方自治体における各種遠隔医療作業全部の経済的支援は、地方自治体が利用出来るようにするUSDAの大型要請:Distance Learning and Telemedicine Loan and Grant Programに基づく。
各自治体で上述の各コンソーシアム・チームが地方医療施設を立ち上げて合同で、自治体規模の強力遠隔医療システムと遠隔学習システムを提案する。
TelMedForteはまた、遠隔医療アプリケーションとMasterASP-BSPの施設管理アプリケーションを統合して各自治体医療施設のための統合ソリューションを作成する。これは、MasterASP-BSPの重要な追加収入となるはずである。
TelMedForte,にとって、遠隔医療とは、直接面談会話が健康管理サービスの受益者にとって、不便、高価、不十分又は不能率であるときの、健康管理サービス提供者による健康管理消費者の検査、診断及び治療である。医療サービスの遠隔監視もまた含まれる。ブロードバンドの展開と採用は過去数年素晴らしい速度で進んでいる。しかし、米国だけで少なくとも3000万人の健康管理消費者市場が見込まれる。正しい技術を正しい時期にTelMedForteが提供するには、幾つかの重要要因がある。
電力線無線通信は、家庭内及びモバイル医療装置監視のためのユビキタス・ネットワークとして有用である(適切な無線モジュールの付いた Hot Key GPSを使うなど)。
代替電力線ブロードバンド技術もまた市場に現れ始めている。これらはすべて、在来の平衡ライン方法に基づいており2-40MHz周波数範囲を用いる。これらのソリューションは、ネットワーク容量とノイズ抑制の点で、TelMedForte システムに比べ、本質的に性能が限られる。.
今の処、物事を本当に簡単にしている。将来は、プリイリストを加え、歌に軽重を与え、中身をPostgreSQL データベースに入れ、詳細を追加する、などを計画している。
私は怠け者なので、皆の好きな歌の各種ウェブに基づくmpegオーガナイザを長く眺める手間は掛けない。ラジオ局の真似が出来るように、200曲を勝手な順序で引き出す何かが欲しかった。先ず、歌を切り抜いて、プレイリストに分ける簡単な Python スクリプトを書かなければならなかった。
cd /var/www/html mkdir audio
ウェブサーバをスタートするには、通常 "service httpd start"をおこなう。これが駄目なときは、自分のLinuxディストリビューションに付いて来た文書で、ウェブサービスのスタート・ストップの方法を見る。通常殆どのLinuxシステムの規定値ウェブサーバはApacheである
cd /usr/local/src lynx --source http://twtelecom.dl.sourceforge.net/sourceforge/lame/lame-3.93.1.tar.gz > lame-3.93.1.tar.gz tar -zxvf lame-3.93.1.tar.gz cd lame-3.93.1 ./configure --prefix=/usr/local/lame make install ln -s /usr/local/lame/bin/lame /usr/bin/lame
#!/usr/bin/python
# 上の行がこのファイルの第一行であることを確認すること
### GPL の下の著作権
## 必要な python モジュールをインポート
import os, re, time, random
## 変数を幾つか設定 これらの変数は自分の必要に応じて変えることが出来る
Home = "/var/www/html/audio"
Url_Base = "http://127.0.0.1/audio"
Song_Max = 200
List_Type = "mpegurl"
## PYTHON に詳しいのでなければ以下は絶対に変更しないこと.
File_Match = re.compile('[{mp3}{rm}{wav}{ogg}{mpeg}]$')
Home_Re = re.compile('^' + Home)
List_Types = {'smil':'application/smil', 'mpegurl':'audio/x-mpegurl'}
#---------------------------------------
## このファンクションがくまなく調べ、一致するファイル全部の
## t絶対パスを入手する。 繰り返しのメソッドである。
def Dir_Contents(Item=""):
Final_List = []
if Item == '': return ('')
elif os.path.isdir(Item):
List = os.listdir(Item)
for Item2 in List:
Item3 = Item + "/" + Item2
Temp_List = Dir_Contents(Item=Item3)
for Item4 in Temp_List: Final_List.append(Item4)
elif os.path.isfile(Item):
if File_Match.search(Item): return([Item])
else: return([])
return (Final_List)
#--------------------------
List = Dir_Contents(Home)
List_Copy = List
## 何回randomを呼び出すかを無作為化する
Secs = int(time.strftime('%S')) * int(time.strftime('%H')) * int(time.strftime('%M'))
for i in range(0,Secs): random.random()
## ファイルがなくなるまで、一度に一つのファイルを無作為に入手する。
New_List = []
while (len(List_Copy) > 0):
Position = random.randint(0,len(List_Copy) - 1)
New_List.append(List_Copy[Position])
del List_Copy[Position]
## リストのurls をredeする。
Urls = []
for Item in New_List:
## 項目毎に、Home directory prefix を取って url を前に加える
Url = Url_Base + Home_Re.sub('', Item)
Urls.append(Url)
## 歌の数より聴きたい数が多いときは、終わる。
## Song_Max = 200のとき、このアレーにある数が分かるときは
## ボーナスポイント。
if len(New_List) > Song_Max: New_List = New_List[0:Song_Max]
## このファイルを編集した馬鹿者が無効のリストタイプを持つときは...
if not List_Types.has_key(List_Type): List_Type = 'mpegurl'
Content_Type = List_Types[List_Type]
### ここで内容をプリントアウトする
print "Content-Type: " + Content_Type + "\n\n"
if List_Type == 'mpegurl':
for Url in Urls: print Url
elif List_Type == 'smil':
print "\n<smil>\n <body>\n"
for Item in Urls: print " <audio src='" + Url+ "'/>"
print " </body>\n</smil>\n"
else:
for Url in Urls: print Url
#------------------------------------------------------------------------
# Open Radio version 1.0
# Copyright 2003, Mark Nielsen
# All rights reserved.
# This Copyright notice was copied and modified from the Perl
# Copyright notice.
# This program is free software; you can redistribute it and/or modify
# it under the terms of either:
# a) the GNU General Public License as published by the Free
# Software Foundation; either version 1, or (at your option) any
# later version, or
# b) the "Artistic License" which comes with this Kit.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either
# the GNU General Public License or the Artistic License for more details.
# You should have received a copy of the Artistic License with this
# Kit, in the file named "Artistic". If not, I'll be glad to provide one.
# You can look at http://www.perl.com for the Artistic License.
# You should also have received a copy of the GNU General Public License
# along with this program in the file named "Copying". If not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307, USA or visit their web page on the internet at
# http://www.gnu.org/copyleft/gpl.html.
(訳注:#--------------------からここまでの英文は著作権に関する定型文)
ブラウザ、Real Player又は使っている何か別のプレーヤにこれをタイプするs"http://127.0.0.1/cgi-bin/playlist.py".
これが到達することの出来る点について考えがある。Flash、Real Player、Windows Media Player、Javascriptには苦い経験が沢山あるので、ここで育つ何かがあると思う。インターネット・ラジオ局に関しては色々な中身を聴いたが、市場に正しく接しているとは思えない。古い時代のラジオに固執している。進歩してメディア巨人に制約されない必要がある。インターネット・ラジオ局は大きい画を描いているとは思えない。今、私は自分のラジオを自分のために発展させ、それで何かをしようとしている。
Unixでは、メールはOS自体と密接に統合されているので、上手く働かないのはすり切れたタイヤで車を運転するようなものだ。時速10km以上で走らないとか、片側に体重を移すとか−女友達を乗せないうちは良いが、そんなことをした途端に問題が起こる。実際のメールシステム−ネット接続など−は、どんなUNIX系OSでも予想していることの一つだ。ここでしようとするのは、実際のメールシステムの例を最低一つ示すことだ。それを自分の設定に調節するか内挿することが出来る。重要な部分は、それをするため働く必要のある構成品を知ることだ。
全体を作り上げる構成品
メールシステムは、大まかに定義された構成品三つを含む。メールの読取、作文に使うソフトウエアMUA (Mail User Agent)、直接呼出プログラムを使うこともあるが通常はSTMPサーバであるMTA (Mail Transfer Agent)、及び回収プログラム(STMPサーバもPOP機能を含むが、単独プログラムの方が普通)だ。MUAを入用とすることが多いが、これは受付に過ぎない。残り二つの構成品が働くとどんなものでも使うことが出来る。お望みなるNetscape に貼り付いても良い。この例の残り二つについては、有名なMTA−Eximと、おそらく世界で最も普通に使われる回収ユティリティ、Eric S. Raymondの "fetchmail" を使う。
中身の獲得
"fetchmail" の設定は余り面倒でない。必要なのは、自分のホームディレクトリの中に".fetchmailrc" と言うファイルを作ることと、POP関連情報を規定することだ。例として、私のものを示す;
# 修正全部を "/var/log/mail.*" に記録したい
set syslog
# 全員に関し同じ中身を設定
defaults protocol pop3,
timeout 300,
nokeep,
fetchall,
mda "procmail -f-"
# 私の ISP からメールを入手
poll "pop.happybruin.com",
user "fuzzybear"
password "wouldnt_you_like_to_know";
# 私の別のアカウントからメールを入手
poll "pop3.bearsden.com",
user "ben-fuzzybear",
password "shhh_its_a_secret";
上は一瞥だけでよい− "fetchmail" マニュアルに良く説明してある。私は、メールを二つの別のアカウントから回収している。私のネット接続(無線モデモ)は当てにならないので、"fetchmail" を設定して、どの接続も5分(300秒)後に時間切れにした。また一旦受信したらメールを削除するよう命じ ("nokeep")、既読フラッグを無視して待ち行列の("fetchall")メール全部を入手することとし、"procmail" を使って自分のヘッダ処理をさせた("mda ...")。最後のものは、皆が必要とは市内が、SMTPが壊れていると、所謂る "Envelope-from" を含むのを忘れることがあるので、これがそれを補う。その他は、自明であると考える。
fetchmailを立ち上げるには一般的に二つの方法がある。 "init"スクリプトの一つとしてか(これは常時接続のとき役立つ)、又は自分の "/etc/ppp/ip-up.d"から(ダイアルアップ接続で普及)スタートすることが出来る。通常は、これを"fetchmail"設定のとき選択する。各ユーザもまた、ワンタイムランとしてか(コマンド行で"fetchmail"とタイプするだけ)又は設定間隔でメールボックスを呼び出すデーモンとして(私はこの方法が好きだ。10分間隔で呼び出す"fetchmail -d 600" を使う。これは".fetchmailrc"で定義することも出来る)手動でスタートすることが出来る。
"fetchmail" は、この簡単な状態が示すより遙かに融通性がある。全く複雑な間に合わせ設備を使っていない限り−それは自分で分かっている筈−、有効なメール・プロトコルを用いてあらゆる種類のメール検索が出来ると言えば十分だ。勿論、自分の好みの検索エージェントがあれば、それでも良い。
大きい画を見る
自分SMTPサーバの設定は、上より複雑にする必要はないが、考えるより遙かに多くを絶対に取り上げなければならない。考える主な事柄は、ネットのどこにあわせるか?だ。そんな規模の大きいことを考えたことない人に取っては、別のパズルだ。現実は、ネットのほとんどが、小さい部品−今自分が座っているコンピュータなど−から構築されている。ISPはネットの別のノードだ。実際、そのルータを通じて接続しているが、接続したら、ネットそのものの部分になって−その結果、自分の小さい部品が残りの部品と調和して働くのを確かめる責任を生じる。
(最近読んだセキュリティ関連RFCの一つは−正確には思い出せないが−ネットに接続するメールサーバの多分50%以上には、ある程度構成ミスがある。恐ろしい統計で、ネット・メールシステムの信頼性と融通性の証明にもなっている。我々全部が、自分の義務を果たして、改善に貢献しなければならない)
我々の多数に取って、状況は簡単だ。デスクトップ・マシン、単一のISPがあれば、自分のSMTPをする必要はない−少なくとも、ISPのSMTPサーバに我々のメールを送るにこれ以上は必要でない。この状況で、どんなMTAも沢山のことをするので、アドレス書換以外に細工することはない。設定時に聞かれたことに答えるだけだ。それで働く。しかし、システムのこの部分は、変更するとき少しばかり「厄介」だ。一つより多いISPを使っているとき、又は基本から少し違うことをしたいとき、少し構成が要るので、ほとんどの人々がメールに引きつけられるのもこの点だ。
"sendmail" のコンフィギュレーション・ファイルは、誰かが頭を キイボードに叩きつけているようだ。それを見ると、理由が分かる! -- 詠み人知らず
"sendmail.cf" は、少なからぬシステム管理者が担架ににくくり付けられて口から泡を服ながら運ばれるのに責任があった。これは醜い生物で、それから作ったコンフィギュレーションフ・ァイルも少しも可愛くない。その作用はLG58号で少し詳しく説明した(Configuring Sendmail in RedHat 6.2, or My Adventure in the Heart of the Jungle)、この点で、私は苦痛を殆ど押さえており、医者はあと1、2年この錠剤を飲むのを止めろと言う。
真剣な話、これは決心のしどころだ。君のシステムのネットワーク接続が主な状態(ISP、ホスト名、ダイアルアップから常時接続インターネットへ)を変えよとしているときは、一度や二度でなく自分のSMTPのやり方を考えなければなければならない。例として言うと、私は自分勝手な方法でする。私は生活のため旅行するので、色々なシステム・コンフィギュレーションで沢山のISP(ダイアルアップ、無線、ホテルの有線モデモなど)を使うからだ。この方法でそれをおこなうのは、一つのシステムから別のシステムに移るとき、他人のメール設定がどうかを心配することなく、一つのシステムから別のシステムに移るとき何もコンフィギュアすることないことをいみする。大変な便利だ。言い換えると。自分勝手をすることは、大したことをしないで実現出来るが、自分の必要に基づいておこなうことが重要な決心だ。環境が統計と異なる何かであるすべての場合に、もっと融通性があり、強力で骨の折れない「自分でやる」方法を見出す。
SMTP 設定オプション
左様、ここで、典型的なSMTP設定二つを定義した:
1) アドレス書換を除くすべてをdelegate する(ローカルでしなければならない)。ISPのSMTPサーバ(我々の観点から "smarthost")がルーチンすべての面倒を見る。これは、君の設定が、特に信頼性の高いレコードを持つ主ISPを通じて、変えることのない安定な設定であるとき良い方法だ(夢見ることが出来る筈だね?)。
2) 全部を自分でする。これには数多くの利点がある。信頼性のないISPサービスを迂回すること、他端にあるホストにメールが実際に配信されると即座に見ることが出来るなどだ(数年前、私のISPが私のe-メールを一週間以上保存して、その塊を通知もしないで破棄したことがあった。私がこれを始めたのはそれが理由だ)。
一般的に、MTA(メール転送エージェント)のインストール中におこなう決定だ。多くはない、Eximの場合、五つの選択を与えられる。そのうち最初の二つだけが実際にここで通用する("eximconfig"プログラムがコンフィギュレーションの間に走るか、又は任意の時期に手動で走らせることが出来る):
下のオプションのうち一つを選ばなければならない:
(1) インターネット・サイト;メールはSMTPを使って送受信される。自分の
ニーズがどのカテゴリにも上手く合わないときは
これを使ってスタートして、i config file を人手でエディットする。.
(2) smarthostを使っているインターネットサイト:インターネット・メールを
このマシン上で、SMTPにより直接又はfetchmailなどのユテリティを走らせて
受け取る。発信メールは任意選択でアドレスを書き換えて
smarthostを使って送る。これは多分ダイアルアップでしたいことだ。
...
これら二つの選択は、上の二つの質問に適合することに注意されたい。「全部を自分でする」方法は#1に合い、"smarthost" は#2である。このとき、"eximconfig" は別の質問をする。そのうち一つは
... どのユーザアカウントにシステム管理者メールが行くか? スペース又はコンマで分離した一つ以上のユーザ名を入力する。この メールを「ルート」のメールボックスに残したいときは`none' を入力する。 −注意、これは全く強く止める。またユーザ名は小文字であるのに注意!
獣の胃袋
これをおこなったら−そして二つの異なるケースでする必要のあることに到達したら−アドレス書換の設定をする必要がある。結局、システムが理解するような君のe-メールアドレスは"username@host"で、君が自分のドメインを持っていない限り、これはインターネット有効のアドレスにはならない。幸い、Eximを用いると、それは難しくない。
先ず、"/etc/exim/exim.conf" をエディットし、下記を6番セクション("REWRITE CONFIGURATION")に追加する:
*@localhost ${lookup{$1}lsearch{/etc/email-addresses}\
{$value}fail} Ffsr
# Root shouldn't be emailing anyone outside, but just in case... root: happybear@bruins.com ben: happybear@bruins.com rivka: sweetie@here.com linda: babe@westcoast.org jen: saucy@wench.net
各種の方法
「smarthost」オプションを使って進めるのであれば、これで終わりだ。「試験」の節まで飛んで構わない。私のように「自分でやる」のであれば、少し書き加えることがある。メールに行き先を知らせる責任があり、配信失敗の状態(受信ホスト又は中間ルータが壊れたとか、ネットワーク通信線の一時断線など)を扱う必要があるからだ。これらの行動の殆どは、MTAのように、良く定義されているが、私はEximから、"/etc/exim/exim.conf"の最初のセッションで、「不具合」メールを殆ど0まで少なくする方法(管理者に送る)を見付けた。下記を付け加えれば良い:
auto_thaw = 5m
これで君は偉大な管理者になった訳だが、していることは大したことではない。問題メッセージに何をするかを決める(Eximが、待ち行列に何かが詰まっていると告げたとき、 "mailq" を走らせて何かを知り、 "exim -Mvl <message_id>")を使ってログファイルを見て、"/etc/email-addresses"に新ユーザを追加すると、どんな問題にも又は他の人の迷惑メール通知にも応答する。"exim" マニュアルを見てこれに慣れること。大いに役立つ。経験のある大規模システム管理者は、私の指示に縮こまって警告を出すだろうが、単一マシン又は小規模LANでは、上で十分だ。正しく設定したら、メールシステムには驚く程トラブルがなくなり、殆どは自分で修復する。
試験
Exim には一連のビルトイン試験モードがある。そのうち一つは、極めて手頃だ。試験をするべき主な事柄は、書換規則が働くかどうかだ−これは簡単だ:
Baldur:~$ exim -brw ben
sender: happybear@bruins.com
from: happybear@bruins.com
to: ben@localhost
cc: ben@localhost
bcc: ben@localhost
reply-to: happybear@bruins.com
env-from: happybear@bruins.com
env-to: ben@localhost
上の全部が正しく働いたら、君のメールシステムは少なくとも正しくコンフィギュアされている。自分で何かメールを送ってヘッダを見られたい。 "From:" と "Reply-to:" が(定義されていれば)君のネット有効アドレスに一致しており、平分のユーザ名だけではない筈だ。例を示す(実際のアドレス/IPは、記事の残りの部分と同じく、挫折したスパムボットに変えてある。偽のアドレス、スパマスライムを食う):
Mutt composition メニューで:
From: "Benjamin A. Okopnik" <ben@localhost>
To: Benjamin Okopnik <happybear@bruins.com>
Cc:
Bcc:
Subject: Rewrite test
Reply-To:
Fcc: =Sentmail
Mix: <no chain defined>
PGP: Clear
mail -s "Rewrite test" happybear@bruins.com
どちらの方法でも、これを送ると、それが戻ったとき
Date: Tue, 30 Apr 2002 03:47:19 -0400 From: "Benjamin A. Okopnik" <happybear@bruins.com> To: Benjamin Okopnik <happybear@bruins.com> Subject: Rewrite test WARNING: Deep Magic in progress. Ben Okopnik -=-=-=-=-=-
実際のヘッダを見ると、(Muttでは "h" キイを押す) いかが現れている:
From ben Tue Apr 30 03:48:15 2002
Return-Path: <happybear@bruins.com>
Received: from Baldur (pzw-199-999-99-999.sunbridge.com [199.999.99.999]))
by bruins.com (9.10.3/9.10.3) with ESMTP id g3U7lR45008674
for <happybear@bruins.com> Tue, 30 Apr 2002 00:47:32 -0700 (PDT)
Received: from ben by Baldur with local (Exim 3.35 #1 (Debian))
id 172SM7-0004nd-00
for <happybear@bruins.com> Tue, 30 Apr 2002 03:47:23 -0400
Date: Tue, 30 Apr 2002 03:47:19 -0400
From: "Benjamin A. Okopnik" <happybear@bruins.com>
To: Benjamin Okopnik <happybear@bruins.com>
Subject: Rewrite test
Message-ID: <20020430074718.GA18398@Baldur>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.3.28i
Status: U
X-UIDL: 27862
WARNING: Deep Magic in progress.
Ben Okopnik
-=-=-=-=-=-
まとめ
ここまで随いて来たのであれば・・・おめでとう。君は、Netizen−ネットを少しばかりスムーズに走らせるのに沢山の時間と労力を費やした男の一人−に参加するより沢山学んだ。君達のような人とは喜んでIPスペースを共有する。
Linuxを楽しみ給え!
著者紹介:
Ben は、Linux Gazette の補助編集員でAnswer Gang.のメンバーでもある。
Ben は1962年モスコーで生まれた。6才で電気に興味を持ち--フォークをコンセントに突っ込んで火を出してそれを証明した--それ以来、技術の道に溺れた。大人になって、プリント基板に部品をハンダ付けし、4kメモリに合うようにプログラムしなければならなかったときから、コンピュータの仕事をしている。その結果の悪夢から治してくれる心理学者がいれば、金に糸目は付けない。
その後の Ben の経験には、十数個の言語のソフトウエア、ネットワーク及び台風接近中のデータベース・メンテナンス、帆走雑誌から技術雑誌に至る範囲の出版物への執筆が含まれる。7年間の大西洋/カリブ海 帆走を最近終えて、バルチモアで休養しており、ここで、サン。マイクロシステムの技術インストラクタをしている。
Ben は Linux で 1997年以来働いており、全額自己負担で、太平洋北西の核戦争危機に関心を持っている。