<!doctype linuxdoc system>
<article>
<title>DOS でパソコン通信していた人に捧げる Linux でパソコン通信する方法
</title>
<author>ぺー (NBB02702@niftyserve.or.jp)</author>
<date>1993年3月9日</date>

<![IGNORE[
                    ====================================
                    DOS でパソコン通信していた人に捧げる
                        Linux でパソコン通信する方法
                                      
                                 1993/03/09
                    ぺー (NBB02702@niftyserve.or.jp) 著
                    ====================================


    目次
    ====

    はじめに
    １章 Linux でのパソコン通信

    ２章 まず環境を整える
      2.1  文字コード
      2.2  kon の設定
      2.3  kterm の設定
      2.4  ホストが EUC コードで入出力する場合

    ３章 xc
      3.1  xc のコンパイルに必要なファイル
      3.2  xc のコンパイルと設定法
      3.3  xc の設定法
      3.4  いよいよ通信 (xc 編)

    ４章 kermit
      4.1  kermit の設定法
      4.2  いよいよ通信 (kermit 編)

    ５章 minicom 
      5.1  minicom のコンパイルに必要なファイル
      5.2  minicom のコンパイルと設定法
      5.3  いよいよ通信 (minicom 編)

    ６章 STK (super待機くん)
      6.1  STK の導入
      6.2  いよいよ通信 (STK 編)
      6.3  注意
      6.4  新春パッチ

    ７章 マクロを作ってみる
      7.1  マクロの簡易デバッグ法
      7.2  kermit でマクロ
      7.2.1  kermit でマクロを書く際の問題点
      7.3  xc でマクロ
      7.4  minicom でマクロ

    ８章 いわゆるオンライン入力
      8.1  uum 系
      8.2  kinput2

    ９ 付録 (stk)
    １０ その他


                                −・−


    はじめに
    ========
]]>

<abstract>
    この文書は、少しは UNIX やプログラミングの知識があり、かつ Linux を
    使い始めたばかりの人をおもな対象にします。UNIX をよく知っている人には
    不要な事柄も書いてありますが、気にしないで下さい。:-)

    make コマンドが何をするものか想像がつかない人は、初心者向けの
    UNIX 解説本やプログラミング関連の本等で少し知識を仕入れましょう。
</abstract>

<p>
<bf>注意: この文書はかなり以前に書かれたものなので、
いまどきの Linux 環境にはあてはまらない箇所があります。
(JF Project)</bf>
</p>

<sect>Linux でのパソコン通信
<p>

    Linux でのパソコン通信は DOS でのパソコン通信とほとんど同じです。
    通信ソフトを起動して対話的にホストへアクセスすることも可能ですし、
    マクロを書けば、いわゆるオートパイロットも可能です。また、cron 機能を
    使えば、希望の時間に通信ソフトを起動してオートパイロットで必要な所を
    巡回する、といった芸当も可能で、とても便利です。DOS でのパソコン通信と
    違うのは通信用のソフトウェア程度です。

    日本語が使える通信ソフトには、大抵の UNIX 互換環境に備わっている
    kermit や、B-Plus プロトコルや xmodem プロトコルが内蔵され機能も
    豊富な xc があります。また、もともと MINIX 向けに開発された minicom も
    Linux に移植されています。minicom はメニュー形式でいろいろな設定が
    可能です。いずれもマクロ言語を備えています。さらに、変り種としては、
    mule や nemacs の中からの通信を可能にするSTK (super待機くん) という
    ソフトウェアもあります。これは Emacs LISP で書かれています。
 
    kermit は、バイナリがあればすぐにでも BBS 等にアクセスできます。
    minicom や xc は、日本語対応パッチを使用してコンパイルし直す必要が
    あります。

    この文書では、以上のソフトウェアの基本を扱います。より詳しい
    情報が欲しい人は、各ソフトウェアのマニュアルを読んでください。
    また、この文書のディレクトリ構成などは SLS 版の Linux を元にしています。


</sect>


<sect>まず環境を整える
<p>

    日本語でパソコン通信を開始するにはいくつか前提条件があります。

<itemize>
<item>kon や kterm のように漢字を表示できるソフトウェアが稼働していること
<item>mule や nemacs のように日本語を編集できるソフトウェアが使えること
</itemize>

    この条件を満たしていない人は、まずこのような環境を整える必要があります。


<sect1>文字コード
<p>

    BBS にアクセスする時に問題になるのが、ホストが扱う文字コードと
    自分の PC で扱う文字コードの相違です。Linux を含む UNIX システムでは、
    シフト JIS だけでなく JIS コードや EUC コードも一般的に使われます。
    むしろ JIS や EUC の方が一般的とも言えます。

    このため、Linux で稼働する日本語表示用のソフトウェアも、標準では文字が
    JIS や EUC コードであると解釈するように設定されているかもしれません。
    この状態で、シフト JIS コードが標準の BBS に接続すると、シフト JIS
    コードの文字はそれが漢字や仮名などの 2 バイト文字であるとは解釈されず、
    Linux 上では「化けて」読めません。BBS ホストが使用する文字コードと
    自分の PC の日本語表示用ソフトウェアが解釈できる文字コードを
    通信ソフト内で設定できれば、通信ソフトが入力と出力の際に内部で
    自動的に文字コードを変換するので、うまく対処できます。しかし、
    通信ソフトが複数の文字コードに対応していなければ、2 バイト文字の
    表示を扱う kon や kterm 側の設定で日本語の文字を正しく表示できるように
    対処しなければなりません。

</sect1>

<sect1>kon の設定
<p>

    ここで特に扱うのは <tt>/usr/local/lib/kon.cfg</tt> ファイルの中の文字
    コードの設定項目です。このファイルの終り近くに

<tscreen><verb>
SjisKanji:
</verb></tscreen>

    という行がありますので、この次の行が「Off」に設定されていれば「On」に
    変更します。こうすると、コンソールでシフト JIS コードを扱うことが
    可能になります。これが Off の状態では JIS コードと EUC コードだけが
    正しく表示され、シフト JIS コードは「化け」ます。

    この変更は、BBS のホストが入出力する文字コードがあくまでも
    シフト JIS であるということを前提にします。しかし、後にも
    述べるように、ホストが EUC コードなどで文字を入出力する時には
    この変更は不要です。

    その他の設定については kon のマニュアルを参照してください。

</sect1>

<sect1>kterm の設定
<p>

    X11 上で動作する kterm で文字コードを指定するには、起動時に
    「<tt>-km</tt> <文字コード>」というオプションを使います。例えば kterm 内で
    シフト JIS コードを使って入出力する時には次のように指定します。

<tscreen><verb>
kterm -km sjis ....その他のオプション....
</verb></tscreen>

    詳しいことは kterm のマニュアルを参照してください。重要なのは、
    kterm が扱う文字コードと BBS のホストが扱う文字コードを
    一致させることです。

</sect1>

<sect1>ホストが EUC コードで入出力する場合
<p>

    NIFTY-Serve では、ログイン時、通常は「SVC」と入力する所を
    「SVC/EUC」と入力することにより、ホストが EUC コードで文字を
    入出力します。こうしてログインする時には、kon や kterm が扱う
    文字コードは EUC でなければなりません。

    kon では上で述べた設定を「OFF」にし、kterm ではオプションで
    「<tt>-km sjis</tt>」と指定する部分を「<tt>-km euc</tt>」に変更します。
    これで、いずれのソフトウェアも EUC コードを正しく表示できます。
    繰り返しますが、重要なのは、kon や kterm が扱う文字コードと BBS のホスト
    が扱う文字コードを一致させることです。どの文字コードが優れている
    という事ではありません。

</sect1>

</sect>

<sect>xc
<p>

    さて、ようやく通信ソフトの設定です。この章では xc に関する情報を
    扱います。xc はマクロ言語を備えています。また、B-Plus プロトコルにも
    対応していますから、NIFTY-Serve にアクセスする人には便利な
    ソフトウェアでしょう。


<sect1>xc のコンパイルに必要なファイル
<p>

    xc を Linux で動かす際に必要なものを次に示します。すべて
    NIFTY-Serve UNIX フォーラム (FUNIX) の 1 番ライブラリ・
    「Free software UNIX source」にあります。

<tscreen><verb>
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

番号  データ名
235   xc32-news.tar.Z
221   xc32ptahc.tar.Z  Xc3.2用SJIS対応パッチ
220   xc32.tar.Z  Unix用通信ソフト
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
</verb></tscreen>

</sect1>

<sect1>xc のコンパイル
<p>

    ☆ まず、各アーカイブからコンパイルに必要なファイルを取り出します。
       必要なファイルを次に示します。

<tscreen><verb>
   アーカイブ名   必要なファイル
---------------   ------------------------------
     xc32.tar.Z - 入っているファイル全部
xc32ptahc.tar.Z - patch.all  README.j  convtbl.h
xc32-news.tar.Z - ../patch.news  ./README.j.NEWS
</verb></tscreen>

       それぞれのアーカイブのファイルは一ヵ所 (全部同じディレクトリ) で
       解凍して下さい。

<tscreen><verb>
解凍例
------
tar xfvz xc32.tar.Z
tar xfvz xc32ptahc.tar.Z patch.all README.j convtbl.h
tar xfvz xc32-news.tar.Z ../patch.news ./README.j.NEWS ; \
mv ../patch.news .
</verb></tscreen>

    ☆ 解凍が済んだらパッチを当てます。次のコマンドを実行します。

<tscreen><verb>
patch -p < patch.all ; patch -p1 < patch.news
</verb></tscreen>

    ☆ このままでは Linux 向けには設定されないので、コンパイルできません。
       少し修正が必要ですので、この文書に付属の patch.linux を使って
       次のコマンドを実行します。

<tscreen><verb>
patch -p1 < patch.linux
</verb></tscreen>

       このパッチファイルを使うと、だいたい次のような変更が施されます。

<itemize>
<item>デバッグ用のオプションをコメントにする
<item>Linux 用に LINUX マクロを定義 (フロー制御のために使用)
<item>B-Plus 転送時にシリアルポートのフロー制御 (RTS/CTS) を使用<newline>
         これにより B-Plus プロトコルのアップロードが正しく動作する
<item>各種ファイルの置き場所を変更する
<item>NIFTY-Serve でホストが出力する ^@ (00h) はログに記録させない
<item>マクロの中で 2 バイト文字を正しく認識させる
</itemize>

       ※すでに Linux で xc を使っている人も、一からコンパイルを
         やり直してください。つまり、前回のパッチに対する新たなパッチは
         存在しません。


    ☆ コンパイルとインストールは、スーパーユーザーになって
       以下のコマンドを実行します。

<tscreen><verb>
make ; make install ; make man
</verb></tscreen>

       これで、プログラムのコンパイルとインストールが完了です。

       次に、設定ファイルをホームディレクトリにコピーします。
       必要なのは「<tt>.xc</tt>」ファイルだけです。コピーが済んだら、
       ファイルの所有者とグループを正しく設定しておきましょう。

</sect1>

<sect1>xc の設定法
<p>

    <tt>~/.xc</tt> を適切に変更・設定します。

<tscreen><verb>
−例−
set bps 9600
set cis "on"
set sjis "off"
set auto "on"
</verb></tscreen>

    最初はシリアル回線の速度指定です。モデムの繋がった RS-232C の速度が
    例えば 9600 BPS なら、「<tt>set bps 9600</tt>」です。

    NIFTY-Serve に接続する場合は、B-Plus プロトコルが使えますから、
    「<tt>set cis "on"</tt>」と設定しておきましょう。それ以外の BBS なら
    「<tt>set cis "off"</tt>」です。

    CompuServe に接続すると、B-Plus 転送を開始する印に使われる
    ^E がログイン直後にホストから出力され、意図しないところで
    xc が B-Plus 転送モードに入ってしまいます。ですから、
    「<tt>set cis "off"</tt>」と設定しておき、実際に B-Plus の転送が
    始まる時には xc のプロンプトに戻って、手動で B-Plus 転送を
    開始すると良いでしょう。

    次に、BBS のホストが Shift-JIS コードで入出力を行なう場合は、
    set sjis "off" と設定します。これが「on」になっていると、もともと
    SJIS コードの文字をさらに SJIS コード変換ルーチンに通すことになり、
    表示が乱れます。

    また、通信のログを取っておきたい場合は、「<tt>set auto "on"</tt>」
    と設定します。ログは特に指定しなければ「<tt>./capture.log</tt>」へ
    出力されます。

    これで通信の準備が整いました。

</sect1>

<sect1>いよいよ通信 (xc 編)
<p>

    シェルのプロンプトで「<tt>xc -l /dev/cua1</tt>」等とタイプすれば
    起動します。「<tt>-l /dev/cua1</tt>」はモデムが繋がったデバイスを指します。
    xc のプロンプトは「<tt>&lt;XC&gt;</tt>」ですから、ここで「<tt>t</tt>」と
    タイプします。
    (Enter キーも忘れずに。) これでターミナルモードになり、
    モデムの AT コマンドなどを使って通信を開始できます。ここから後、
    ログインして会議室などを巡回し、ログアウトするまでの手順は、
    DOS の通信ソフトとほぼ同じです。

    ターミナルモードからプロンプトに戻るには、「<tt>Ctrl-A X</tt>」と
    タイプします。終了は「<tt>q</tt>」です。

    B-Plus プロトコルでのダウンロードやアップロードを指定すると、
    転送が始まった時に xc の B-Plus ルーチンが自動的に起動されます。
    この時、画面にはあまり情報が表示されず、ソフトウェアがハングしたのかと
    思うかもしれません。しかし、ダウンロード中のファイルが入るべき
    ディレクトリを、ダウンロード時に別のシェルから監視すると
    わかるように、転送ルーチンは正しく動作しています。安心して
    終了を待ってください。

</sect1>

</sect>


<sect>kermit
<p>

    この章では kermit に関する情報を扱います。kermit は再コンパイルは
    不要で、SLS 等に入っている標準的なもので日本語が通ります。


<sect1>kermit の設定法
<p>

    kermit の設定ファイルは「<tt>~/.kermrc</tt>」です。日本語を表示させる
    ためには、このファイルに最低限つぎの設定が必要です。

<tscreen><verb>
set line /dev/cua1
set speed 9600
set parity none
set modem hayes
set terminal bytesize 8
set command bytesize 8
set escape 127
</verb></tscreen>

<itemize>
<item>「<tt>set line</tt>」はモデムが繋がっているデバイスを指定します。
      COM2 にモデムが繋がっていれば <tt>/dev/cua1</tt> です。

<item>「<tt>set speed</tt>」はシリアル回線 (RS-232C) の速度を指定します。
      モデムの速度ではありません。

<item>「<tt>set modem</tt>」はモデムコマンドの体系を指定します。AT コマンドが
       使えるなら <tt>hayes</tt> です。

<item>「<tt>set terminal bytesize</tt>」と「<tt>set command bytesize</tt>」
       に <tt>8</tt> を設定すると、8 ビットのデータはマスクされず、日本語が
       正しく扱えます。

<item>「<tt>set escape 127</tt>」を設定しなければ、2 バイト文字が「化ける」
       ことがあります。
</itemize>

</sect1>

<sect1>いよいよ通信 (kermit 編)
<p>

    シェルのプロンプトで「<tt>kermit</tt>」とタイプすれば起動します。
    起動すると、「<tt>C-Kermit&gt;</tt>」という kermit のプロンプトが表示
    されます。
    ここで「<tt>c</tt>」とタイプすると、ターミナルモードに入ります。
    ここからは、DOS の通信ソフトと同様に AT コマンド等が使えます。

    通信が終ったら「<tt>Ctrl-\ h</tt>」 (「<tt>set escape 127</tt>」を設定
    してあれば「<tt>DEL h</tt>」) でプロンプトに戻り、「<tt>q</tt>」で kermit 
    を終了します。
    ターミナルモードから直接 kermit を終了するには「<tt>Ctrl-\(DEL) q</tt>」
    コマンドを使います。

    通信のログを残すには、kermit のプロンプトで次のようにタイプします。
    このコマンドは、通信を始める前、またはログの保存を開始する直前に
    実行します。

<tscreen><verb>
C-Kermit> log session kermit.log
</verb></tscreen>

    最後の引数はログのファイル名です。好きな名称が使えます。
    また、ファイル名の後の引数に「 <tt>append</tt>」を指定すると、
    既存のファイルに追記します。

</sect1>

</sect>


<sect>minicom 
<p>

    この章では minicom に関する情報を扱います。minicom では各種設定を
    メニュー形式で行なえます。また、NIFTY-Serve・FUNIX で公開されている
    Linux 用パッチには、マクロ言語の例として日経 mix や NIFTY-Serve 用の
    オートパイロット・スクリプトが含まれています。

    minicom には B-Plus プロトコルは内蔵されていません。ですから、公式には
    minicom では B-Plus は使えないことになっています。しかし、他の
    通信ソフト (tipbp など) に入っている B-Plus プロトコルのルーチンを
    取り出して minicom に統合することは可能ですから、腕に覚えのある人は
    挑戦してみてください。


<sect1>minicom のコンパイルに必要なファイル
<p>

    minicom を Linux で動かす際に必要なものを次に示します。
    いずれも NIFTY-Serve UNIX フォーラム (FUNIX) の Linux 用
    ライブラリ (LIB 13) にあります。SLS に入っている minicom の
    バイナリは日本語には対応していません。

<tscreen><verb>
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

番号  データ名
 55   mc15b.tgz 通信ソフト minicom 1.5b
 61   mc15bj.tgz minicom1.5b用パッチセット
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

</verb></tscreen>

    55 番のものは minicom 本体で、61 番のものが Linux で使うためのパッチです。

</sect1>

<sect1>minicom のコンパイルと設定法
<p>

    minicom の実行形式を作成する方法は、上にも挙げた Linux 用の
    パッチに入っている「<tt>install.doc</tt>」にとても詳しく記されています。
    また、設定方法もこのファイルに書かれています。

    はじめて minicom を実行する時には、ルートの権限で

<tscreen><verb>
minicom -s
</verb></tscreen>

    を実行しましょう。これにより各種の設定ができます。

</sect1>

<sect1>いよいよ通信 (minicom 編)
<p>

    シェルのプロンプトで「<tt>minicom</tt>」とタイプすると起動します。minicom 
    は他のソフトウェアと違って、起動するとターミナルモードになりますので、
    即 AT コマンドなどを使用できます。

    ログを記録するにはターミナルモードで「<tt>Ctrl-A L</tt>」を使います。この
    コマンドを実行すると、どのファイルに保存するかを指定する窓が開きます。
    適切な名前を指定しましょう。取り消しには ESC キーを使います。
    また、起動時に <tt>-l</tt> オプションを使うと、スクリプトファイルで指定した
    拡張子を使って、ログイン時に <tt>nif1208.log</tt> のようなログファイルを
    自動的に作成します。この場合も「<tt>Ctrl-A L</tt>」は有効です。

    「<tt>Ctrl-A Z</tt>」でヘルプメニューが表示されます。

    各種メニューでカーソルを動かすには、次のようなキーを使います。

<tscreen><verb>
       上 : k
左 : h        右 : l
       下 : j
</verb></tscreen>

    <tt>/etc/termcap</tt> が適切に設定されていればカーソルキーも使えます。
    <tt>install.doc</tt> を参照してください。

    終了するには「<tt>Ctrl-A X</tt>」を使います。本当に終了するかどうかを
    聞かれますから、Yes にカーソルを合わせて Enter キーを押します。

    上記の「<tt>install.doc</tt>」はとてもよく書けていますから、minicom を
    使いたい人はぜひ読んでみましょう。cron の使い方まで記されています。

</sect1>

</sect>


<sect>STK (super待機くん)
<p>

    STK は、基本的には NIFTY-Serve の RT や CB を支援するための
    ソフトウェアで、 Emacs LISP で記述されています。つまり、通信が
    mule や nemacs のバッファ (窓) の中で実行されるのです。しかし、
    このソフトウェアはチャット専用ではなく、普通の通信ソフトと同様に
    様々な BBS へのアクセスが可能です。しかも、通信の内容はすべて
    エディタのバッファに自動的に蓄積されます。

    このソフトウェアは NIFTY-Serve のチャット専用のモードを
    備えていますから、NIFTY-Serve の RT や CB の愛好者には
    うってつけでしょう。課金が増えてもしりません。:-) 

    ちなみに、NIFTY-Serve・C 言語フォーラム (FC) では、週末の深夜などに
    Linux 愛好者がこの STK を使っておしゃべりしています。

    STK は、製作された方々のご好意により、この文書に付けることが
    できました。


<sect1>STK の導入
<p>

    stk では、実際の通信には kermit を使用します。ですから、まず
    この文書の kermit の章で解説したように、kermit で通信が
    できるよう環境を整えてください。

    次に <tt>stk.tar</tt> を展開します。(展開例 : <tt>tar xfv stk.tar</tt>)
    展開されたファイルの中にある <tt>stk.el</tt> が、Emacs LISP で書かれた
    stk のプログラムです。

    この <tt>stk.el</tt> は、各自の環境に合わせて設定を変更します。
    まず、<tt>stk.el</tt> の初めの方にある「<tt>(defvar **** ****)</tt>」の
    部分を適切に変更します。Emacs LISP を知らない人でも、それぞれの
    項目に何を記述するかは見れば解るでしょう。:-) 不明な点があれば
    <tt>stk.doc</tt> の「注解1.A．STKの調整」を参照してください。

    変更が終ったら、mule か nemacs の中で「<tt>M-x byte-compile-file</tt>」
    コマンドを使って、<tt>stk.el</tt> をコンパイルします。このコマンドを
    実行すると、nemacs や mule がファイル名を入力するように
    促しますから、ここで <tt>stk.el</tt> の絶対パスを入力します。コンパイルが
    終ったら、<tt>stk.el</tt> と同じディレクトリに <tt>stk.elc</tt> という
    ファイルが生成されますから、mule/nemacs の LISP ファイルを置くディレクトリ
    (<tt>/usr/local/mule/lisp</tt> など) に <tt>stk.elc</tt> を、ルートの権限で
    コピーします。パーミッションの設定も忘れずに。

    最後に

<tscreen><verb>
(load-library "stk")
</verb></tscreen>

    の一行を <tt>~/.emacs</tt> に追加してインストールは完了です。

    mule や nemacs で作業していた人は、stk を使う前に一度
    エディタを終了しましょう。

</sect1>

<sect1>いよいよ通信 (STK 編)
<p>

    mule や nemacs の中から「<tt>M-x kermit</tt>」とタイプすると、
    kermit (と stk) が起動されます。ここで「<tt>M-x connect-to-nifty</tt>」と
    タイプすると、自動的に NIFTY-Serve にログインできます。
    NIFTY-Serve 以外に接続する場合は、通常の kermit と同様の
    手順でログインしましょう。この部分は単なる kermit なのです。

    stk が本領を発揮する、NIFTY-serve の RT や CB に入ったら、
    「M-x chat」とタイプします。mule (nemacs) のバッファが三つの
    窓に分かれますね。これが chat モードです。下側の窓が入力用です。
    このモードにはコマンドがいくつか用意されています。

    頻繁に使うのは「<tt>Control-C H</tt>」です。このコマンドを発行すると
    ミニバッファに「だれ:」と表示されます。ここで <tt>*handle*</tt> という
    バッファから適切な名前を選び、その名前の左にあるアルファベットを
    選んでタイプします。(Enter キーも忘れずに。) こうすると、入力用の
    窓の発言の最後に「＞ぺーちゃん」のような文字が付加されます。

    「<tt>M-x chat-quit</tt>」でチャットモードを終了します。
    その他のコマンドの使い方は <tt>stk.doc</tt> を参照してください。

    通信が終了したら、ログを一度ファイルに保存してもいいですし、
    そのまま通信用のバッファを編集するのも良いでしょう。

</sect1>

<sect1>注意
<p>

    <tt>stk.el</tt> を byte-compile-file すると、「<tt>M-x connect-to-nifty
    </tt>」が失敗する場合があるようです。もし自動ログインに失敗することがあれば
    <tt>/usr/local/mule/lisp/stk.elc</tt> を削除し、<tt>stk.el</tt> を同
    ディレクトリに入れてみましょう。

</sect1>

<sect1>新春パッチ
<p>

    この文書に付属の <tt>stk.patch</tt> の使い方は、<tt>stk.patch</tt> に
    書かれています。
    お楽しみあれ！

</sect1>

</sect>



<sect>マクロを作ってみる
<p>

    さて、通信ソフトがうまく動き出したら、マクロを書いてみるのも
    おもしろいでしょう。

    ここでは、kermit, xc, minicom のマクロの初歩を扱います。
    さらに詳しいことはそれぞれの解説文書などを参照してください。

    ここで紹介するマクロの例では例外の処理は行ないません。著者は
    以下のマクロが動作することを確認していますが、場合によっては
    不具合があるでしょう。


<sect1>マクロの簡易デバッグ法
<p>

    マクロを作っているとき問題になるのは、いちいちホストに繋がないと
    マクロの虫とりができない点です。

    そこで、ホストに繋がずにある程度のデバッグをすることを考えます。
    どうするかというと、自分でホストとターミナルの二役を演じるのです。
    「馬鹿なことを」と思うかも知れませんが、これは効果的です。
    毎回ホストに電話して接続する時間が省けますから、デバッグの
    効率が上がります。しかもこうすれば無駄な電話代も不要になります。

    では実際に挑戦してみましょう。まず X11 なら xterm などの
    ターミナルを二つ起動します。一つめが <tt>ttyp0</tt>、二つめが <tt>
    ttyp1</tt> とします。
    ここで、通信ソフトは <tt>ttyp0</tt> で起動し、<tt>ttyp1</tt> がホストの役を
    務めます。コンソールなら <tt>tty1</tt> と <tt>tty2</tt> がそれぞれ 
    <tt>ttyp0</tt> と <tt>ttyp1</tt> に相当します。

    まず、ちょっと荒っぽいですが、<tt>/dev/ttyp1</tt> に対して次のコマンドを
    実行します。(コンソールなら <tt>/dev/tty2</tt> です。)

<tscreen><verb>
chmod og+r /dev/ttyp1
</verb></tscreen>

    この後、ttyp1 (ホスト側) で次のコマンドを実行します。

<tscreen><verb>
cat
</verb></tscreen>

    これだけです。簡単ですね。次に、<tt>ttyp0</tt> に移ります。ここでは、
    通信ソフトのモデムのデバイスを指定する部分で、<tt>/dev/cua1</tt> などの
    代わりに <tt>/dev/ttyp1</tt> (仮ホスト側) を指定します。その後、
    <tt>ttyp0</tt> 側のシェルで通信ソフトを起動します。
    例えば xc なら次のように起動します。

<tscreen><verb>
xc -l ttyp1
</verb></tscreen>

    kermit の場合は、<tt>.kermrc</tt> の中の「<tt>set line</tt>」の行を

<tscreen><verb>
set line /dev/ttyp1
</verb></tscreen>

    と設定し、このあと kermit を起動します。通信ソフトが無事
    起動できたら、その時点ですでに二つのターミナルが結ばれています。
    通信ソフトをターミナルモードにして、<tt>ttyp0</tt> 側で適当に文字を
    打ち込んでみましょう。どうですか。打ち込んだ文字が
    <tt>ttyp1</tt> (ホスト側) に表示されますね。ホスト側から文字を入力すると、
    反対に <tt>ttyp0</tt> に文字が出ます。これで「超簡易 BBS ホスト」の
    完成です。:-)

    さて、<tt>ttyp0</tt> で起動した通信ソフトでマクロを実行してみます。また、
    <tt>ttyp1</tt> からは実際にホストが出力する文字を打ち込んでやります。
    この <tt>ttyp1</tt> からの入力に対して、マクロが期待どおり反応すれば
    大成功です。うまく反応しなければ、一度 <tt>ttyp0</tt> の通信ソフトを
    終了し、エディタでマクロを書き直し、再度 <tt>ttyp0</tt> で通信ソフトを
    起動します。あとはこの手順を繰り返します。

    マクロが完成したら、まず <tt>ttyp0</tt> の通信ソフトを終了し、次に 
    <tt>ttyp1</tt> の「<tt>cat</tt>」を終了させます。「<tt>cat</tt>」が
    うまく終了しなければ、強引に
    <tt>kill</tt> してあげましょう。

    最後に次のコマンドを実行して作業が終了です。

<tscreen><verb>
chmod og-r /dev/ttyp1
</verb></tscreen>

    これでかなりの部分まで虫とりができるでしょう。
    実際にホストにアクセスしてマクロがうまく動かなければ、
    また同じように虫をとれば良いのです。

</sect1>

<sect1>kermit でマクロ
<p>

    <tt>~/.kermrc</tt> には各種設定を書きました。このファイルにはマクロも
    記述できます。では命令を見ていきましょう。

<descrip>

<tag>set &lt;項目など&gt;....</tag>
       各種の設定を行ないます。kermit のプロンプトで「<tt>set ?</tt>」と
       タイプすれば何を設定できるかが表示されます。

<tag>dial <電話番号></tag>
       電話をかけます。

<tag>input &lt;数字&gt; &lt;文字列&gt;</tag>
       &lt;数字&gt; 秒の間 &lt;文字列&gt; が送られてこないかを監視します。
       &lt;文字列&gt; が届いたら &lt;数字&gt; 秒が経過していなくても次の命令に
       進みます。&lt;数字&gt; 秒たっても &lt;文字列&gt; が送られてこなければ、
       次に進みます。

<tag>outut &lt;文字列&gt;</tag>
       &lt;文字列&gt; をホストに送ります。文字列の中にある <tt>\13</tt> は
       改行文字をあらわします。

<tag>connect</tag>
       オンラインモードに移行します。

<tag>define &lt;マクロ名&gt; マクロの本体 ....</tag>
       マクロを定義します。

       マクロ内で複数の命令を繋げるにはコンマ (<tt>,</tt>) を使います。

<tscreen><verb>
input 10 *,    output C NIF\13
</verb></tscreen>

       マクロが複数の行にまたがる時には、行末にマイナス (<tt>-</tt>) を付加
       します。

<tscreen><verb>
input 10 *,               output C NIF\13,-
,-
input 10 Connection-ID,   output SVC\13
</verb></tscreen>

        マクロの中では空白行にも「<tt>,-</tt>」が必要です。

<tag>:標識</tag>
      <tt>goto</tt> 命令の飛び先である標識は、最初にコロン (<tt>:</tt>) 
      を付けて目印にします。

<tscreen><verb>
:come_here
</verb></tscreen>

<tag>if &lt;条件&gt; &lt;命令&gt;</tag>
       &lt;条件&gt; が真ならば &lt;命令&gt; を実行します。

<tag>log session &lt;ファイル&gt;</tag>
       通信の記録を &lt;ファイル&gt; に保存します。

<tag>quit, exit</tag>
       ともに kermit を終了します。

</descrip>

    kermit の命令 (予約語) は大文字か小文字かは区別されません。
    読みやすいと思うように大文字と小文字を使い分ければ良いでしょう。
    当然ですが、送受信する文字列では大文字と小文字は区別されます。

    これだけの記述法を覚えれば大抵のことができます。

    では、NIFTY-Serve のログインマクロを見てみましょう。
    このマクロは ROAD-2 用です。<tt>~/.kermrc</tt> にこれを追加し、
    kermit のプロンプトで「<tt>nifty</tt>」とタイプすれば、このマクロが
    動きます。

<tscreen><verb>
define nifty set input timeout-action proceed ,-
    set input echo on ,-
    set input case observe ,-
    set input silence 0 ,-
    ,-
    dial ここに電話番号を書きます,-
    :begin,-
      output @P\13,-
      input 2 NAME?,-
      if failure goto begin,-
    ,-
    input 10 *,              output C NIF\13,-
    input 10 Connection-ID,  output SVC\13,-
    input 10 User-ID,        output ここには ID を書きます\13,-
    input 10 Password,       output ここはパスワードです\13,-
    ,-
    log session ~/kermit.log append,-
    connect
</verb></tscreen>

    それそれの命令の使い方や意味は kermit のプロンプトで
    「<tt>help input</tt>」のように入力すると表示されます。また、
    プロンプトで「<tt>?</tt>」を入力すると、その時点で入力できる命令などが
    ぜんぶ表示されます。

    kermit の命令は、他にもここに書ききれないくらいの量がありますから、
    必要に応じて kermit のオンラインマニュアルや kermit のヘルプ機能を
    使って調べましょう。

    <tt>crontab</tt> に項目を加えれぱ kermit で自動運転することも可能です。
    <tt>cron</tt> 機能の詳しい使い方は UNIX のシステム管理などの本を
    参考にしてください。

    kermit で自動運転を実現するマクロは、NIFTY-Serve・FUNIX の
    Linux 用 13 番ライブラリにあります。
    54 番の「kermitでNIFTY autoaccess」がそれです。


<sect2>kermit でマクロを書く際の問題点
<p>

    起動すると「<tt>C-Kermit 5A(188), 23 Nov 92, POSIX</tt>」と表示される
    kermit や、これより古い kermit では、2 バイト文字は input 命令などでは
    判定できません。つまり

<tscreen><verb>
input 10 Connection-ID
</verb></tscreen>

    は正常に処理されますが、漢字などを使って

<tscreen><verb>
input 10 未読分
</verb></tscreen>

    のようには記述できないのです。このように書いたとしても、
    kermit はその文字列がホストから送られてきたか判断できません。

    kermit のソースファイルを持っている人は、パッチを当てて
    コンパイルしなおせば、この問題が解決します。書き換えるのは
    <tt>ckuus4.c</tt> の以下の部分です。

<tscreen><verb>
int
doinput(timo,s) int timo; char *s; {
  int x, y, i, icn;
  char *xp, *xq = (char *)0;
  CHAR c;
  ^^^^
</verb></tscreen>

    の下線部 "<tt>CHAR</tt>" を単に "<tt>char</tt>" に変更します。
    <tt>reinput</tt> コマンドを
    実現している関数・<tt>doreinput()</tt> （同じく <tt>ckuus4.c</tt> にあり）
    も同様に変更します。これで、input コマンドの文字列中で
    シフト JIS 漢字コードを使用することができるそうです。

    また、この問題は「<tt>C-Kermit 5A(189), 30 June 93, POSIX</tt>」では
    解決されているそうです。

    この節の情報は川俣吉広さんに提供していただきました。感謝します。

    この文書の筆者は kermit のソースファイルを持っていませんので、
    このパッチの動作は確認していません。

</sect2>

</sect1>

<sect1>xc でマクロ
<p>

    xc のスクリプト (マクロ) 言語は Bourne シェルのスクリプト言語に
    似せて作られています。しかし、まったく同じではありません。

    kermit とは違い、xc では一つのファイルに一つのマクロだけを
    記述できます。つまり、サブルーチンは別々のファイルに
    書かなければなりません。

    改行文字とセミコロン (<tt>;</tt>) は、ともにコマンド間の区切りに
    使います。

    「<tt>#</tt>」よりうしろの部分は注釈になり、xc には無視されます。

    以下はスクリプトで使える命令の一部です。


<descrip>
<tag>dial &lt;電話番号&gt;</tag>
       電話をかけます。

<tag>redial</tag>
       dial 命令で接続に失敗した時に、同じ番号にもう一度電話を
       かけ直します。

<tag>waitfor &lt;文字列&gt; &lt;数字&gt;</tag>
       特定の文字列がホストから送られてくるのを待つために使います。
       &lt;数字&gt; 秒の間 &lt;文字列&gt; を待ちます。&lt;文字列&gt; が
       送られてきた時点、または &lt;数字&gt; 秒たった時点で次の命令に進みます。

<tag>transmit &dquot;&lt;文字列&gt;&dquot;</tag>
       文字列をモデムに送ります。改行文字も送る時には <tt>^M</tt> を使います。
       
<tag>pause &lt;数字&gt;</tag>
       &lt;数字&gt; 秒のあいだ何もしません。

<tag>if &lt;条件&gt; ; then &lt;命令&gt;</tag>
       &lt;条件&gt; が真ならば &lt;命令&gt; を実行します。

<tag>capture &dquot;on|off&dquot;</tag>
       <tt>on</tt> で通信の内容をログに保存し、<tt>off</tt> で保存をやめます。

</descrip>

    では NIFTY-Serve 用のマクロ例です。これも ROAD-2 用です。

    このマクロは、ログイン後、新しくメールが届いていれば全部
    ダウンロードします。そのあと、ダウンロードしたメールを
    ホストで削除し、ログアウトして回線を切ります。メールを
    ダウンロードしている時にだけ、その内容をログに保存します。
    メールが届いていなければそのままログアウトして回線を切ります。

    マクロの命令については、xc のマニュアルにさらに詳しいことが
    書かれていますから参照してください。

<tscreen><verb>
# xc macro for NIFTY-Serve FENICS-ROAD 2

dial "ここにホストに接続するための電話番号を書きます"
while ! waitfor "CONNECT" 50
        do
                redial
        done

pause 1
transmit "@P^M"
while ! waitfor "HOST NAME?" 3
        do
                transmit "@P^M"
        done

waitfor "*" 5
transmit "C NIF^M"

waitfor "Enter Connection-ID  --->" 20
transmit "SVC^M"

waitfor "Enter User-ID  --->" 20
transmit "ここに ID を書きます^M"

waitfor "Enter Password --->" 20
transmit "ここにパスワードを書きます^M"

waitfor "LOG OUT"
if waitfor "未読分" 10; then
        waitfor "E. " 30
        transmit "MAIL^M"
        waitfor "電子メール" 10
        pause 1
        transmit "DOWN NEW PROT:NON^M"
        pause 1
        transmit "1^M"
        waitfor "ロード開始−" 300      # メールの表示を開始
        capture "on"
        waitfor "ロード終了−" 600      # メールの表示が終了
        capture "off"
        transmit "1^M"                  # ホストでメールを削除
endif

waitfor "^M＞" 10

transmit "off^M"
waitfor "*" 30
transmit "off^M"
quit

# end of NIFTY macro
</verb></tscreen>

    文字列の最初や最後にある「<tt>^M</tt>」は改行文字をあらわします。

    このマクロを実行するには、例えば <tt>nifty.xc</tt> というファイル名で
    保存して、xc のプロンプトで

<tscreen><verb>
s nifty.xc
</verb></tscreen>

    とタイプします。

    コマンドラインから次のようにタイプすると、xc はコマンドモードに
    ならずに直接指定したマクロを実行し、マクロが終了したら xc も
    終了します。

<tscreen><verb>
xc -l デバイス名 -s スクリプトファイル名
</verb></tscreen>

    このような項目を <tt>crontab</tt> に加えれば、指定した時間に自動的に
    マクロを走らせ、BBS にアクセスすることが可能になります。
    (<tt>crontab</tt> をつかうには <tt>crond</tt> を動かしておかなければ
    なりません。)
    <tt>cron</tt> 機能の詳しい使い方は UNIX のシステム管理などの本を
    参考にしてください。

    xc でオートパイロットを実現するマクロ集は、NIFTY-Serve・FUNIX の
    1 番ライブラリ・「Free software UNIX source」にあります。
    353 番・「xcscript.tar.gz xc用 オートパイロット」がそれです。

</sect1>

<sect1>minicom でマクロ
<p>

    minicom のスクリプト言語は比較的命令数が少ないので、コツがつかめれば
    あとは楽にマクロを書けるでしょう。

    サブルーチンは、kermit と同様、ひとつのファイルの中にいくつも
    書くことができます。

    では命令などを見てみましょう。

<descrip>

<tag>set &lt;変数&gt; &lt;値&gt;</tag>
       <変数> (アルファベットの a 〜 z が一文字だけ) に <値> を
       設定します。

<tag>expect { }</tag>
       文字列を待つために使う命令です。この命令では一度に複数の文字列を
       待つことが可能です。

<tscreen><verb>
expect {
        "紅茶"                goto cafe
        "ウイスキー"          goto bar
        "オレンジジュース"    goto VendingMachine
        timeout 10            goto end
}
</verb></tscreen>

       <tt>{</tt> と <tt>}</tt> の間には各行に

<tscreen><verb>
&lt;文字列&gt; &lt;その文字列が来た時に実行する命令&gt;
</verb></tscreen>

       と書きます。命令の部分がなければ、<tt>expect</tt> を終了して <tt>}</tt> 
       の次の行に制御を移します。また <tt>{</tt> と <tt>}</tt> の中にある

<tscreen><verb>
timeout <数字> <命令> 
</verb></tscreen>

       「&lt;数字&gt; 秒だけ列挙された文字列を待ち、その後 &lt;命令&gt; を
       実行する」
       という意味です。&lt;命令&gt; 部分に <tt>break</tt> と書くと 
       <tt>expect</tt> を終了して
       <tt>}</tt> の次の行に制御を移します。&lt;命令&gt; 部分を省略すると
       マクロを
       終了してしまいますので注意してください。

       <tt>expect</tt> の中で <tt>timeout</tt> 命令を使わなければ 60 秒間だけ
       文字列を待ち、
       <tt>expect</tt> を終了します。

<tag>send &dquot;&lt;文字列&gt;&dquot;</tag>
       &lt;文字列&gt; をモデムに送ります。ホストへの送信やモデムへの
       命令に使えます。文字列の最後には minicom が自動的に改行文字を
       付け加えてモデムに出力しますから、xc や kermit のように
       明示する必要はありません。

<tag>sleep &lt;数字&gt;</tag>
       &lt;数字&gt; 秒の間、なにもしません。

<tag>timeout &lt;数字&gt;</tag>
       expect 命令の外で使うと、&lt;数字&gt; 秒たったらマクロの実行を
       強制的に終了します。

<tag>標識:</tag>
       <tt>goto</tt> や <tt>gosub</tt> 命令で飛んでくる所を示します。最後に
       コロン (<tt>:</tt>) を書きます。
       
<tag>goto &lt;標識&gt;</tag>
       &lt;標識&gt; に飛びます。

<tag>gosub &lt;標識&gt;</tag>
       サブルーチン・&lt;標識&gt; に飛び、サブルーチン内に 
       <tt>return</tt> 命令かあれば
       この次の行に戻ります。

<tag>return</tag>
       サブルーチンを終了し、サブルーチンを呼び出した行の次の行に戻ります。

<tag>exit</tag>
       マクロを終了します。

<tag>if &lt;条件&gt; &lt;命令&gt;</tag>
       &lt;条件&gt; が真ならば &lt;命令&gt; を実行します。

</descrip>

    マクロを実行するには、「<tt>Ctrl-A G</tt>」で開く窓の <tt>C</tt> の項目に
    マクロのファイル名を指定して、リターンキーを押します。

    実際にマクロの例を見れば、それぞれの命令をどう使うかがわかると
    思います。では、NIFTY-Serve・FENICS-ROAD2 用のマクロです。

<tscreen><verb>
# NIFTY-Serve 用超簡易スクリプト

# 画面に受信した文字を表示
verbose on

send    "ここに電話番号を書きます"
timeout 3600
set m 0
sleep 1
expect {
        "CONNECT"
}
sleep 1

loop:
        send    "@P"
        expect {
                "HOST NAME"
                timeout 2       goto loop
        }

        expect {
                "*"
        }
        send    "C NIF"
        expect {
                "Connection-ID  --->"
        }
        send    "SVC"

        expect {
                "User-ID  --->"
        }
        send    "ここに ID を書きます"

        expect {
                "Password --->"
        }
        send    "ここはパスワードです"

        #
        # −−メールが１通届いています（未読分１通）−−
        # があれば新しいメールが届いている
        #
        expect {
                "未読分"        set m 1
                "続き"
                "E. 終了"
                timeout 20
        }

        if m = 1 gosub mail
        send "off"

        expect {
                "HOST NAME"
        }
        expect {
                "*"
        }
        send    "off"
        sleep   2
        exit

#
# 電子メールをダウンロードするサブルーチン
#
mail:
        send    "mail"
        expect {
                "電子メール"
        }
        send    "down new prot:non"
        sleep   1

        # ダウンロード開始の許可
        send    "1"

        expect {
                "−ダウンロード終了−"
        }

        # ホスト上のメールを削除
        send    "1"

        sleep   1
        return
</verb></tscreen>

    このマクロが実行することは、xc のマクロ例と同じです。ログイン後、
    新しくメールが届いていれば全部ダウンロードします。そのあと、
    ダウンロードしたメールをホストで削除し、ログアウトして回線を切ります。
    メールが届いていなければそのままログアウトして回線を切ります。

    この例では使っていない命令も少しあります。興味がある人は
    minicom に付属の <tt>Manual.scr</tt> ファイルを参照してください。

    minicom の自動運転マクロは、5 章でも書いたように、
    NIFTY-Serve・FUNIX の Linux 用ライブラリ(13 番) にある
    「mc15bj.tgz minicom1.5b用パッチセット」の中に含まれています。

</sect1>

</sect>


<sect>いわゆるオンライン入力
<p>

    ここでは、ホストに接続して直接電子メールを書いたり会議室などに
    発言を書く方法を扱います。

    仮名漢字変換サーバーが動いていないと日本語は入力できませんから、
    まずシステム上で Wnn (jserver) や canna (cannaserver) が
    動作する状態にしてください。


<sect1>uum 系
<p>

    kon 上や X11+kterm 上では Wnn 用の uum や canna 用の canuum を使って
    日本語が入力できます。これらのプログラムは通信ソフトを起動する前に
    動いていなければなりません。

    起動法は、kon や kterm が扱う文字コードが SJIS なら

<tscreen><verb>
uum -sS
</verb></tscreen>

    です。canuum も同じオプションを使います。文字コードが EUC なら

<tscreen><verb>
uum -uU
</verb></tscreen>

    です。これで日本語が入力できるようになります。uum (canuum) を
    日本語入力モードにするには「Ctrl-o」キーを使います。
    もういちど「Ctrl-o」キーを使うと通常の英数字入力モードに
    戻ります。

    以上で、通信ソフト内でも日本語が入力できるようになります。

</sect1>

<sect1>kinput2
<p>

    kinput2 は X11 用の日本語入力フロントエンド プログラムです。
    仮名漢字変換サーバーには Wnn, canna, sj3 が使えます。

    kterm で kinput2 を使うには、まず <tt>/usr/lib/X11/app-defaults/KTerm</tt> 
    に次の設定を加えます。

<tscreen><verb>
*VT100*translations: #override  Ctrl<Key>space: \
begin-conversion(_JAPANESE_CONVERSION)
</verb></tscreen>

    次に kterm を起動します。そして最後に、kinput2 を起動します。
    (この順番は前後しても問題ありません。) 使用する仮名漢字変換
    サーバーの種類により「<tt>-wnn</tt>」「<tt>-canna</tt>」「<tt>-sj3</tt>」
    のオプションのうちの
    ひとつを使います。uum などと違い、kinput2 ではターミナルの
    漢字モードが何になっていても使えます。

<tscreen><verb>
起動例

kinput2 -canna &
</verb></tscreen>

    kinput2 の起動には少し時間がかかります。うまく起動されたら、
    「Ctrl-スペース」キーで kinput2 の日本語入力モードが有効になります。
    このキーは上記の設定 (「Ctrl&lt;Key&gt;space」の部分) で任意のものに
    変更できます。日本語入力モードを終了するには「シフト＋スペース」キーを
    使います。

    以上で、通信ソフト内でも日本語が入力できるようになります。

</sect1>

</sect>


<sect>付録 (stk)
<p>

    STK の製作者のご好意により、この文書に STK のプログラムなど一式を
    付けることができました。stk を製作された皆様に感謝します。

    この文書に付属の <tt>stk.tar</tt> に対して次のようなコマンドを実行します。

<tscreen><verb>
解凍例
------
tar xfv stk.tar
</verb></tscreen>

    これで、カレントディレクトリに <tt>stk</tt> ディレクトリが作られ、
    その中に <tt>stk.el</tt> や解説など一式が入ります。この続きは、上に書いた
    STK の説明を読んでください。

[編注：添付ファイル <tt>stk.tar</tt>, <tt>stk.patch</tt>, <tt>patch.linux</tt> 
は、<url url="ftp://ftp.linet.gr.jp/pub/JF/html/BBS-access.tar.gz"> に同梱されて
います。]

</sect>


<sect>その他
<p>

    この文書の作成にあたり、つぎの方々が協力してくれました。感謝します。
    (抜けている人がいればごめんなさいね。)

<tscreen><verb>
川俣吉広さん  GHA02475 (NIFTY-Serve)
仙石浩明さん  &lt;sengoku@sdl.hitachi.co.jp&gt;
がお さん     MHD01611 (NIFTY-Serve)
こやまさん    &lt;koyama@tmit.ac.jp&gt;
January さん  GCC03454 (NIFTY-Serve)
</verb></tscreen>

    著者は NIFTY-Serve しか使っていませんので、その他の BBS や
    ネットワークではプログラムをどこから入手できるのかわかりません。
    ご存知の方はご一報ください。

    Linux で動作する日本語対応の通信ソフトが他にもあれば、著者まで
    情報をお寄せください。また、この文書の改善案や間違いの指摘なども
    お待ちしています。電子メールの宛先は次の通りです。

<tscreen><verb>
NBB02702@niftyserve.or.jp
</verb></tscreen>

    ぺーちゃん

</sect>

</article>
