<!doctype article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<article>

<artheader>
<title>Linux で CAP を使う mini-HOWTO</title>
<author lang="ja">
<firstname>誠司</firstname>
<surname>衛藤</surname>
 <affiliation>
  <address>seto@slip.net</address>
 </affiliation>
</author>
<pubdate>１９９７年５月１２日</pubdate>

<![IGNORE[
目次
----
1. 免責
2. CAP とは？
3. ソースの取得とコンパイル
4. CAP のコンポーネント
5. CAP の起動
6. ファイル・サーバの構築
7. プリンタ・サーバの構築
8. 最後に
9. 参考文献
]]>

<abstract><para>
CAP とは、The Columbia AppleTalk Package の略称で、一言で言う
と Unix Box にマックの通信プロトコルである AppleTalk を理解さ
せるソフトウェアである。
</para></abstract>
</artheader>

<sect1 id="no-warranty">
<title>免責</title>
<para>
この文書の内容は、正しい手順の作業の上でのみ信頼できるものにな
ると思われるが、この文書の内容に起因する損害が出たとしてもその
責任は、著者にはないということを承諾しておいていただきたい。
</para>
</sect1>

<sect1 id="what">
<title>CAP とは？</title>
<para>
CAP とは、The Columbia AppleTalk Package の略称で、一言で言う
と Unix Box にマックの通信プロトコルである AppleTalk を理解さ
せるソフトウェアである。また名前からも分かるように、このソフト
ウェアは、コロンビア大学によって開発されたものである。それでこ
のパッケージを使って何ができるのかというと、まずマックのための
ファイル・サーバの構築、AppleTalk を使ったプリンタ・サーバの構
築、マック・ワークステーションとのインタラクティブな通信、Post
Script プリンタへのプリント・ジョブの送信、そして PostScript プ
リンタとのインタラクティブな通信などがある。個人的に筆者は、プ
リンタとの双方向でのやりとりができるという点で、最後の Post
Script プリンタとのインタラクティブな通信というのに非常に旨味
を感じる。
</para>
</sect1>

<sect1 id="compilation">
<title>ソースの取得とコンパイル</title>
<para>
あいにく CAP は、バイナリでの配布は行われていないため、各自ソ
ースをダウンロードし、コンパイルしなければならない。CAP のソー
スは、様々なサイトから FTP を使ってダウンロードできる。次に示
すサイトは、ほんの一例にすぎない：
</para><para>
<screen>
   ftp://munnari.OZ.AU/mac
   ftp://gatekeeper.DEC.COM/pub/net/appletalk/cap
   ftp://ftp.kuis.kyoto-u.AC.JP/net/cap
   ftp://ftp.crl.go.jp/archives/mac/kdd-mac/Network/cap60
</screen>
</para><para>
まず、上記のサイトから <filename>cap60.plNNN.tar.Z</filename> 
を取得し、解凍する:
</para><para>
<programlisting>
   # compress -d cap60.plNNN.tar.Z
   # tar xf cap60.plNNN.tar
</programlisting>
</para><para>
現在 <filename>cap60.patch198</filename> までのパッチが出ているので、
それらを使ってパッチレベルを上げる。個々のパッチについては、cap60 の
再上位のディレクトリで：
</para><para>
<programlisting>
   # patch -p &lt; cap60.patchNNN
</programlisting>
</para><para>
とするのだが、CAP には、前にも述べたように非常にたくさんのパッ
チが出ているため、次のようなスクリプトで対応する：
</para><para>
<programlisting>
   #!/bin/zsh
   setopt numeric_glob_sort
   for i in cap60.patches/cap60.patch*
   patch -p &lt; $i &gt;&gt;&amp; /tmp/patches
</programlisting>
</para><para>
さらに Linux 用パッチ <filename>linux.iptalk.patch</filename> を当てる。
これでコンパイルできる状態になったはずだ。まず
</para><para>
<programlisting>
   # ./Configure
</programlisting>
</para><para>
として独自のシステムの環境に合わせる。ここでは、プログラムがいろ
いろと聞いてくるが、デフォルトのままで大丈夫のようだ。次に以下の
コマンドで、各ディレクトリ毎の <filename>Makefile</filename> を作る：
</para><para>
<programlisting>
   # ./gen.makes
</programlisting>
</para><para>
さらに
</para><para>
<programlisting>
   # make include
</programlisting>
</para><para>
でヘッダファイルをインストールする。そして
</para><para>
<programlisting>
   # make libsmade
</programlisting>
</para><para>
とし、CAP 用ライブラリの生成に取り掛かる。それが終ったら本題の
CAP 各種プログラムのコンパイルだ。
</para><para>
<programlisting>
   # make programs
</programlisting>
一応何もなければ、すんなりとコンパイルしてくれるはずだ。最後に
</para><para>
<programlisting>
   # make install
</programlisting>
</para><para>
とし、各種プログラムをインストールする。すると <filename>/usr/local/cap
</filename>というディレクトリに make で作られたプログラム群が置かれる。ま
た IPTalk を使用する場合には、<filename>/etc/servives</filename> に NIC 
の設定に対する次のエントリを忘れずに行なっておこう：
</para><para>
<programlisting>
  at-rtmp   201/udp
  at-nbp    202/udp
  at-echo   204/udp
  at-zis    206/udp
</programlisting>
</para>
</sect1>

<sect1 id="components">
<title>CAP のコンポーネント</title>
<para>
次に筆者の CAP のディレクトリを紹介しよう。
</para><para>
<programlisting>
  /usr/local/cap
  ./          ash         atlooklws   capd        iwpr        papof*
  ../         atis        atpinger    getzones    lwpr        papstatus
  .banner     atistest    aufs        instappl    ntxjif*     rc.cap*
  afpvols     atlook      canonif*    isrv        papif*      tlw
</programlisting>
</para><para>
<note><title>注意</title><para>
* 印の付いていないファイルは、<command>make install</command> をした後に
自動的に置かれるもので、* 印の付いたファイルは後からコンパイルし、持
ってきたもの、あるいは自分で作成したものである。
</para></note>
</para><para>
以下は、各々のファイルについての説明である：
</para><para>
<screen>
  .banner   ... バナー・ファイル。
  afpvaols* ... aufs を起動する際に使うコンフィギュレーション・ファイル。
  ash       ... AppleShare サーバーへのログインや対話的な通信を可能にす
                るプログラム。 
  atis      ... AppleTalk Information Server の略で、AppleTalk での通信
                を可能にする。
  atistest  ... atis が正常に動いているかどうかを検証するプログラム。
  atlook    ... ゾーン内でのサービスを一覧表示するプログラム。
  atlooklws ... ゾーン内での LaserWriter を一覧表示するプログラム。
  atpinger  ... ゾーン内のサービスに対して ping を行ない、それらのサービ
                スの状態を調べるプログラム。
  aufs*     ... AppleTalk file protocol UNIX File Server。AppleShare サー
                バーを構築するプログラム。
  canonif*  ... 任意のプリンタに対するフィルタ。
  capd      ... CAP デーモン。各機器の物理的アドレスをインタプリットする。
  getzones  ... アクセスできるゾーンを一覧表示するプログラム。
  instappl  ... アプリケーションをインストールする際に使われるらしいのだ
                が、筆者は、使用したことがないので分からない。
  isrv      ... printcap に登録されているプリンタに対して印刷物を出力する
                際に用いるコマンド。
  iwpr      ... printcap に登録されていないプリンタに対して印刷物を出力す
                る際に用いるコマンド。
  ntxjif*   ... 任意のプリンタに対するフィルタ。
  papif*    ... LaserWriter プリンタ用入力／通信フィルタ。
  papof*    ... LaserWriter プリンタ用出力／バナー・フィルタ。
  papstatus ... プリンタの印刷状態を見るプログラムらしいのだが、筆者には、
                使用方法が分からない。
  rc.cap*   ... CAP を起動する際に用いるスクリプト。
  tlw       ... 特定の LaserWriter にアクセスし、PostScript インタプリタ
                を起動することのできるプログラム。
</screen>
</para><para>
なお前述のように 一連の <command>make</command> だけでは、<filename>
aufs、papif、papof</filename> などのプログラムやフィルタは、コンパイル、
インストールしてくれないので、後に自ら CAP60 の再上位ディレクトリ <filename>
/applications</filename> の下の <filename>aufs</filename> や <filename>
papif</filename> のディレクトリの中で、各プログラムをコンパイルして 
<filename>/usr/local/cap</filename> のディレクトリにそれらのファイルを
持って来なければならない。
</para>
</sect1>

<sect1 id="running-cap">
<title>CAP の起動</title>
<para>
CAP の起動は、手動で行なってもよいのだが、以下のようなスクリプトで起動
させると便利である。
</para><para>
<filename>/etc/rc.d/rc.local</filename> に次のようなステートメントを加える:
</para><para>
<programlisting>
  #
  # start AppleShare server
  #
  if &lsqb; -f /usr/local/cap/rc.cap &rsqb;; then
      /usr/local/cap/rc.cap
  fi
  #----End of /etc/rc.d/rc.local----
</programlisting>
</para><para>
# <filename>/usr/local/cap/rc.cap</filename> :
</para><para>
<programlisting>
  #!/bin/sh

  echo "CAP server starting."
  /usr/local/cap/capd eth0 "hogehoge zone"
  /usr/local/cap/atis
  /usr/local/cap/aufs -l /var/log/aufs.log -n `hostname` \
  		-U 10 -G guest -V /usr/local/cap/afpvols
  #----End of /usr/local/cap/rc.cap----
</programlisting>
</para><para>
CAP デーモンを起動させる <command>capd</command> コマンドは、第一引数に
ネットワーク・インターフェースのデバイス名、第二引数は、CAP を動かしたい
ゾーン名を指定する。
この場合、ネットワーク・インターフェースに対するデバイス名は、<option>
eth0</option>、ゾーン名は、<option>hogehoge zone</option> となっているが、
各自の環境に合わせて変えてい
ただきたい。なおゾーン名の中にスペースが入っている場合は、上記のように 
" （ダブル・クォーテーション）で囲んで記述する。プロンプトが返ってきた
ら、成功ということである。さらにこのコマンドを発行すると /etc のディレ
クトリに <filename>etalk.local</filename> という EtherTalk のダイナミック・
コンフィギュレーション・ファイルができる。これも成功の目安にする。
</para><para>
<filename>etalk.local</filename> ファイルの例：
</para><para>
<programlisting>
  #
  # EtherTalk dynamic configuration data
  #
  # Last update:  Tue Apr 29 18:20:44 1997
  #
  # Generated by Kernel AppleTalk
  #
  interface       "eth0"
  netRangeStart   15.160
  netRangeEnd     15.160
  thisNet         15.160
  thisNode        52
  thisZone        "hogehoge zone"
  bridgeNet       15.160
  bridgeNode      167
  bridgeIP        127.0.0.1
  nisNet          15.160
  nisNode         52
  asyncNet         0.00
  asyncZone       ""
  # ----End of etalk.local----
</programlisting>
</para><para>
なお <filename>/usr/local/cap/rc.cap</filename> ファイルの中の 
<command>aufs</command> コマンドについては、後述の <link 
linkend="file-server">「ファイル・サーバの構築」</link>
の項で説明する。次に atis が、正常に動いているかどうかを <command>atistest
</command> というコマンドを使って検証する。次のような出力があれば、正常に
動いているということだ。
</para><para>
<screen>
  # atistest
  CAP distribution 6.00 using Kernel Based EtherTalk encapsulation,
  June 1996 Copyright (c) 1986,1987,1988 by The Trustees of Columbia
  University in the City of New York

  abInit: &lsqb;ddp:  15.160, 136&rsqb;, &lsqb;GW:  15.160, 165&rsqb; starting
  debugging NBP
  Registering "atis test:testing@*"
  NBP SndNBP: sending
  NBP nbp_timeout: 4 tick timeout on -1073743660, 3 remain
  NBP SndNBP: sending
  NBP nbp_timeout: 4 tick timeout on -1073743660, 2 remain
  NBP SndNBP: sending
  NBP nbp_timeout: 4 tick timeout on -1073743660, 1 remain
  NBP SndNBP: sending
  NBP nbp_timeout: 4 tick timeout on -1073743660, 0 remain
  NBP SndNBP: sending
  NBP status done: found -1073743660
  Okay
</screen>
</para><para>
さてこれで各種 CAP プログラムを走らせるためのお膳立てができ
た訳だ。
</para>
</sect1>

<sect1 id="file-server">
<title>ファイル・サーバの構築</title>
<para>
今度は、マック用ファイル・サーバの構築である。これを行なうには、
<command>aufs</command> というコマンドを用いる。
</para><para>
<programlisting>
  # aufs -l /var/log/aufs.log -n `hostname` -U 10 -G guest \
	  -V /usr/local/cap/afpvols
</programlisting>
</para><para>
<command>aufs</command> には、20程のコマンド・オプションがあるが、普通使う
のは、上記のステートメントの中で使っているものぐらいであろう。以下に各オプ
ションについての説明を示す：
</para><para>
<screen>
  -l ... ログ・ファイル名を指定する（デフォルトは&lt;servername&gt;.log ）
  -n ... サーバ名を指定する。デフォルトは、&lt;hostname&gt; Aufs。
  -U ... 一度に行なえるセッションの数を指定する。
  -G ... ゲスト・ログインを許可する。この場合、サーバ側に
         guest アカウントが必要である。
  -V ... アクセスするボリュームを記述しておくファイル名を指定
         する。
</screen>
</para><para>
afpvols ファイルの例：
</para><para>
<programlisting>
  #
  # This is an example of Apple Filing Protocol Volume file.
  #
  # Format:
  #  path:volume name&lsqb;:password&rsqb;&lsqb;:&rsqb;
  #

  /home/guest:Guest::
  /home/seiji:Seiji:xxxxx:
  # ---- End of afpvols ---- 
</programlisting>
</para><para>
AppleShare サーバが立ち上がるとマックの「セレクタ・ダイアロ
グ」の「ファイルサーバの選択」のリスト・ボックスにサーバ名が
現れるはずである。
</para>
</sect1>

<sect1 id="print-server">
<title>プリンタ・サーバの構築</title>
<para>
さて今度は、プリンタ・サーバの構築である。これは、CAP と lpd
の組み合わせで、ゾーン内の AppleTalk で繋がっている PostScript
プリンタに自由にプリント・ジョブを送るというものである。さら
に lpd のリモート機能を使えば、CAP がインストールされていない
Unix Box からでも、CAP がインストールされている Linux Box 経由
でプリント・ジョブを PostScript プリンタに送ることができる。ま
ず最初に <command>atlooklws</command> というコマンドで特定のゾーン
の中で使用できる PostScript プリンタを一覧表示させてみよう。
以下のような出力が得られるはずだ。
</para><para>
<programlisting>
  # atlooklws "hogehoge zone"

  abInit: &lsqb;ddp:  15.160, 228&rsqb;, &lsqb;GW:  15.160, 167&rsqb; starting
  Looking for =:LaserWriter@SJ TW 8 ...
    1 - ATM Dev IIg:LaserWriter@*                &lsqb;Net: 15.161 Node: 83 Skt:191&rsqb;
  ---status: idle
  Address confirmed for socket 191
    2 - Apple LaserWriter IINTX_J:LaserWriter@*  &lsqb;Net: 15.161 Node:221 Skt:169&rsqb;
  ---status: idle
  Address confirmed for socket 169
    3 - Canon Lasershot B406GII_J:LaserWriter@*  &lsqb;Net: 15.161 Node:202 Skt:128&rsqb;
  ---status: idle
  Address confirmed for socket 128
    4 - Centaur (fonts LWII-NTX):LaserWriter@*   &lsqb;Net: 15.161 Node:153 Skt:234&rsqb;
  ---status: idle
  Address confirmed for socket 234
    5 - Cheque:LaserWriter@*                     &lsqb;Net: 15.161 Node:167 Skt:191&rsqb;
  ---status: idle
  Address confirmed for socket 191
    6 - EPSON LP-8200PS2:LaserWriter@*           &lsqb;Net: 15.161 Node:172 Skt:128&rsqb;
  ---status: idle
</programlisting>
</para><para>
今度は、特定のプリンタにアクセスして、PostScript インタプリタを
起動させてみよう。それは、<command>tlw</command> というコマンドで行なう。
</para><para>
<programlisting>
  # tlw "Canon Lasershot B406GII_J:LaserWriter@*"
  abInit: &lsqb;ddp:  15.160, 228&rsqb;, &lsqb;GW:  15.160, 167&rsqb; starting
  Starting session with Canon Lasershot B406GII_J:LaserWriter@*
  %no status
  status: idle

  Okay
  PostScript(r) Version 2013.115
  (c) Copyright 1984-1994 Adobe Systems Incorporated.
  Typefaces (c) Copyright 1981 Linotype-Hell AG and/or its subsidiaries.
  All Rights Reserved.
  PS&gt; showpage
</programlisting>
</para><para>
次にこのプリンタに何か PS ファイルを送り、プリントしてみる。
</para><para>
<programlisting>
  # lwpr -p "Canon Lasershot B406GII_J:LaserWriter@*" temp.ps
  abInit: &lsqb;ddp:  15.160, 228&rsqb;, &lsqb;GW:  15.160, 167&rsqb; starting
  Status: status: idle
  status: idle
  Sending temp.ps
</programlisting>
</para><para>
これで印刷が可能かどうか分かったら、次に lpd と連係して PostScript
プリンタに AppleTalk を介してプリント・ジョブを送り、印刷させるた
めの設定に入る。まず、<filename>/etc</filename> ディレクトリに 
<filename>cap.printers</filename> というゾーン内の PostScript プリンタ
の名前を定義するファイルを以下のようにして作る。
</para><para>
<programlisting>
  #
  # /etc/cap.printers
  #

  ntxj=Apple LaserWriter IINTX_J:LaserWriter@*
  canon=Canon Lasershot B406GII_J:LaserWriter@*
  # ---- End of /etc/cap.printers ----
</programlisting>
</para><para>
次に <filename>printcap</filename> を環境に合わせて編集する。
</para><para>
<programlisting>
  # /etc/printcap
  #
  # Please don't edit this file directly unless you know what you are doing!
  # Be warned that the control-panel printtool requires a very strict format!
  # Look at the printcap(5) man page for more info.
  #
  # This file can be edited with the printtool in the control-panel.

  ##PRINTTOOL## LOCAL PostScript 300x300 a4 1
  lp:\
          :sd=/var/spool/lpd/lp:\
          :lp=/dev/lp1:\
          :sh:\
          :mx#0:\
          :if=/var/spool/lpd/lp/filter:

  ## Remote PostScript Canon Laser Shot B-406G II
  lp|canon|Canon Lasershot B406GII_J:\
          :lp=/dev/canon:\
          :sd=/var/spool/lpd/canon:\
          :pl#72:pw#85:\
          :sf:\
          :mx#0:\
          :lf=/var/spool/lpd/canon/canon-lpd-errs:\
          :af=/var/spool/lpd/canon/canon-lpd-acct:\
          :if=/usr/local/cap/canonif:\
          :of=/usr/local/cap/papof:
  # ---- End of /etc/printcap ----
</programlisting>
</para><para>
次に特定のプリンタに対するデバイス・ポートを作る。
</para><para>
<programlisting>
  # touch /dev/canon
  # chmod 660 /dev/canon
</programlisting>
</para><para>
次は、特定のプリンタに対するスプール・ディレクトリやバナー
・ファイルを作る。
</para><para>
<programlisting>
  # mkdir /var/spool/lpd
  # mkdir /var/spool/lpd/canon
  # touch /var/spool/lpd/canon/.banner
  # chmod daemon.daemon /var/spool/lpd/canon/.banner
</programlisting>
</para><para>
続いてログ・ファイルの作成である。
</para><para>
<programlisting>
  # touch /var/spool/lpd/canon/canon-lpd-errs
  # touch /var/spool/lpd/canon/canon-lpd-acct
</programlisting>
</para><para>
最後に特定のプリンタのためのフィルター・ファイルを以下のように
して作る。
</para><para>
<programlisting>
  #!/bin/sh
  # canonif - CAP Input filter for Canon Laser Shot B-406G II

  /usr/local/cap/papif -P canon $*
  # ---- End of /usr/local/cap/canonif ----
</programlisting>
</para><para>
プリント・コマンドは、以下の通り：
</para><para>
<programlisting>
  # lpr -Pcanon hogehoge.ps
</programlisting>
</para><para>
さて次に CAP がインストールされていない Unix Box (hogehoge2)から
CAP がインストールされてある Linux Box (hogehoge1)経由でプリント
・ジョブを <filename>printcap</filename> に登録してあるプリンタに
送るための設定方法について記す。まず CAP がインストールされてある 
Linux Box の <filename>/etc</filename> ディレクトリに <filename>
hosts.lpd</filename> というファイルを以下のように作る。
</para><para>
<programlisting>
  # hosts.lpd
  hogehoge2
</programlisting>
</para><para>
さらに CAP がインストールされていない Unix Box の <filename>printcap
</filename> を lpd のリモート機能が使えるように次のように設定する。
</para><para>
<programlisting>
  # CAP がインストールされていない Unix Box の printcap
  lp|canon|:lp=:rm=hogehoge1:rp=canon:
</programlisting>
</para><para>
こうすることで、hogehoge2 から次のコマンドで hogehoge1 にプリン
ト・ジョブを送ることができる。
</para><para>
<programlisting>
  # lpr -Pcanon hogehoge.ps
</programlisting>
</para>
</sect1>

<sect1 id="conclusion">
<title>最後に</title>
<para>
これで CAP に関する全ての説明が終った。CAP をコンパイルし、導入
してみての感想は、Linux Box とマックや PostScript プリンタとの
コミュニケーションが意外に簡単にできてしまったということだ。ま
た１つのパッケージでこんなに数多くのことができてしまうというこ
とは、少し驚きでもあるが、とても素晴らしいことだと思う。また何
だか得をしたようにも思う。このパッケージを使って様々なアプリケ
ーションの開発へと発展していくのだろう。そういう意味で CAP とい
うソフトウェアは、非常に優れたソフトウェアであると言えよう。
</para>
</sect1>

<sect1 id="bibliography">
<title>参考文献</title>
<para>
<screen>
  1. CAP パッケージの README。
  2. CAP60/doc の中のドキュメント類。
  3. UNIX USER 1994 No. 10 「LaserWriter への出力のみならずも UNIX 
     上で AppleShare サーバーも実現する CAP ファミリー」
     熊野 善康著、 ソフトバンク
</screen>
</para>
</sect1>

</article>
