FMLを使用したOracle Tuxedo ATMIアプリケーションのプログラミング

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

フィールドの定義と使用

ここでは、以下の内容について説明します。

 


FMLおよびVIEWSを使用するための準備

FMLフィールド化バッファを操作したり、VIEWS関数を使用して構造体とフィールド化バッファ間でフィールドを移動するには、次の準備作業が必要です。

この章では、これらの内容と、関連する処理について説明します。

 


FMLおよびVIEWSのフィールドの定義

ここでは、以下の内容について説明します。

 


フィールド名とフィールド識別子を定義する

フィールド識別子(fieldid)は、typedefによりFLDID (FML32の場合はFLDID32)として定義されます。フィールド識別子は、フィールド型とフィールド番号で構成されます。フィールド番号は、フィールドを識別するための一意の番号です。

フィールド番号は、次の範囲内の番号でなければなりません。

フィールド番号0および対応するフィールド識別子0は、不正なフィールド識別子(BADFLDID)を示すために予約されています。フィールド機能を備えた別のソフトウェアを使用してFMLを操作する場合は、フィールド番号に関する別の制約が適用されることがあります。

Oracle Tuxedoシステムは、フィールド番号に関する以下の規則に従っています。

FMLのフィールド番号
FML32のフィールド番号
予約済
使用可能
予約済
使用可能
1-100
101-8191
1-10,000,
30,000,001-33,554,431
10,001-30,000,000

Oracle Tuxedoシステムでは予約されている番号の使用を強制的に制限していませんが、アプリケーションでは予約番号を使用しないようにしてください。

フィールド識別子とフィールド名のマッピング情報は、フィールド表ファイルまたはフィールド・ヘッダー・ファイルに取り込まれます。フィールド表ファイルを使用する場合は、この後で説明するマッピング関数を使用してCプログラム内のフィールド名の参照を変換する必要があります。フィールド・ヘッダー・ファイルを使用すると、プログラムのコンパイル時にCプリプロセッサ(UNIXリファレンス・マニュアルのcpp(1)を参照)によってフィールド名からフィールド識別子へのマッピングが行われます。

フィールド表にアクセスするための関数およびプログラムでは、FLDTBLDIR環境変数およびFIELDTBLS環境変数を使用して、使用するソース・ディレクトリとフィールド表ファイルを指定します。(FLDTBLDIR32およびFIELDTBLS32は、 FML32と同じ目的で使用されます)環境変数の設定方法については、「FMLおよびVIEWSの環境設定」を参照してください。

複数のフィールド表を使用すると、複数のフィールド・グループに対して別々のディレクトリやファイルを設定できます。ただし、フィールド名およびフィールド番号は、すべてのフィールド表を通して一意でなければなりません。フィールド表がCヘッダー・ファイルに変換されて同じフィールド番号が複数回発生すると、予測できない結果が発生する可能性があるためです。

 


フィールド表ファイルを作成する

フィールド表ファイルは、viなどの標準的なテキスト・エディタを使用して作成します。このファイルの形式は、次のとおりです。

エントリは、空白文字またはタブで区切ってください。

フィールド表の例

次のリストは、基数が500から700にシフトするフィールド表の例です。基数が500のグループの場合、最初のフィールド番号は501です。基数が700のグループの場合、最初のフィールド番号は701です。

リスト4-1 フィールド表ファイル
# following are fields for EMPLOYEE service
# employee ID fields are based at 500
*base 500
#name rel-number type flags comment
#---- ---------- ---- ------ -------
EMPNAME 1 string - emp name
EMPID 2 long - emp id
EMPJOB 3 char - job type
SRVCDAY 4 carray - service date
*base 700
# all address fields are now relative to 700
EMPADDR 1 string - street address
EMPCITY 2 string - city
EMPSTATE 3 string - state
EMPZIP 4 long - zip code

 


フィールド名からフィールド識別子にマッピングする

実行時のマッピングは、Fldid()関数およびFname()関数を使用して行います。これらの関数は、FLDTBLDIR環境変数およびFIELDTBLS環境変数で指定されたフィールド表ファイルのセットを参照します。FML32が使用されている場合、Fldid32()関数とFname32()関数は、FLDTBLDIR32環境変数およびFIELDTBLS32環境変数を参照します。

Fldidは、引数(フィールド名)をfieldidにマッピングします。次のコードを参照してください。

char *name;
extern FLDID Fldid();
FLDID id;
...
id = Fldid(name);

Fnameは、その引数(fieldid)をフィールド名にマッピングすることにより、逆の処理を行います(次のコードを参照):

extern char *Fname();
name = Fname(id);
. . .

フィールド識別子からフィールド名へのマッピングは、ほとんど使用されません。フィールド識別子がわかっており、その識別子から対応する名前を確認するケースはほとんどないためです。フィールド識別子からフィールド名へのマッピングを行う例は、バッファの出力ルーチンです。バッファの出力ルーチンでは、フィールド化バッファの内容を、理解できる形式で表示する必要があります。

関連項目

 


フィールド表をロードする

Fldid()を最初に呼び出すと、フィールド表ファイルがロードされ、必要な検索が実行されます。フィールド表ファイルは、その後もロードされたまま残ります。Fldid()は、成功時にその引数に対応するフィールド識別子を返し、失敗時にはFBADNAMEに設定したFerrorと共に、BADFLDIDを返します(FML32を使用している場合は、Ferror32がかわりに設定されます)。

Fldid()でロードしたフィールド表が占有するデータ領域を回復するには、Fnmid_unload()関数を呼び出してファイルをすべてアンロードする必要があります。

Fname()関数は、Fldid()と同じように動作しますが、処理の内容は、フィールド識別子からフィールド名へのマッピングです。ロード対象のフィールド表は同じ環境変数を使用して指定しますが、マッピング表の別のセットが生成されます。Fname()が成功すると、fldid引数に指定された名前を含む文字列へのポインタが返されます。失敗するとNULLが返されます。

注意: ポインタは、表がロードされている限り有効です。

Fldid()の障害は、フィールド表が見つからないかまたはオープンできない(FFTOPEN)、フィールド表の構文が間違っている(FFTSYNTAX)、フィールド表内にノーヒット条件が存在する(FBADFLD)、などが原因で発生します。Fname()で作成したマッピング表が占有する表領域は、Fidnm_unload()関数を呼び出して回復できます。

実行時のマッピングを使用するマッピング関数およびその他のFML関数には、FIELDTBLS環境変数およびFLDTBLDIR環境変数を正しく設定しておく必要があります。これらの環境変数が設定されていない場合は、デフォルト値が使用されます。これらの環境変数のデフォルト値については、「FMLおよびVIEWSの環境設定」を参照してください。

関連項目

 


フィールド表からヘッダー・ファイルに変換する

すでに説明したとおり、mkfldhdr (またはmkfldhdr32)コマンドを実行すると、フィールド表がCコンパイラ処理に対応したヘッダー・ファイルに変換されます。生成されたヘッダー・ファイルの各行の形式は、次のとおりです。

#define fname fieldid

fnameにはフィールド名を指定し、fieldidにはフィールド識別子を指定します。フィールド識別子は、エンコードされたフィールド型とフィールド番号で構成されます。フィールド番号は絶対数、つまりbaserel-numberを足した数です。生成されたファイルは、Cプログラムに組み込むことができます。

「フィールドをC構造体およびCOBOLレコードにマッピングする」で説明するとおり、実行時のマッピング関数を使用する場合、ヘッダー・ファイルを使用する必要はありません。

コンパイル時にファイル名を識別子にマッピングすると、処理を高速化でき、データ領域が少なくて済むという利点があります。逆に、サービス・ルーチンのコンパイル後にフィールド名と識別子のマッピングが変更されると、サービス・ルーチンに伝播されないという欠点があります。このような場合、サービス・ルーチンはコンパイル済のマッピングを使用します。

mkfldhdrコマンドを実行すると、FIELDTBLS環境変数で指定された各フィールド表が、対応するヘッダー・ファイルに変換されます。ヘッダー・ファイル名は、フィールド表名に.hという接尾辞を付けて指定します。生成されたヘッダー・ファイルは、デフォルトでカレント・ディレクトリに保存されます。別のディレクトリに保存したい場合は、mkfldhdrコマンドで-dオプションを使用して、保存先ディレクトリを指定します。詳細は、『Oracle Tuxedoコマンド・リファレンス』「mkfldhdr、mkfldhdr32(1)」を参照してください。

フィールド表からヘッダー・ファイルへの変換例

例1および2は、環境変数を設定してmkfldhdr(1)コマンドを実行する方法を示しています。ここでは、3つのフィールド表ファイル(${FLDTBLDIR}/maskftbl${FLDTBLDIR}/DBftbl${FLDTBLDIR}/miscftbl)が処理され、3つのインクルード・ファイル(maskftbl.hDBftbl.hmiscftbl.h)がカレント・ディレクトリに生成されます。詳細は、『Oracle Tuxedoコマンド・リファレンス』「mkfldhdr、mkfldhdr32(1)」を参照してください。

例1

FLDTBLDIR=/project/fldtbls
FIELDTBLS=maskftbl,DBftbl,miscftbl
export FLDTBLDIR FIELDTBLS
mkfldhdr

例2

FLDTBLDIR32=/project/fldtbls
FIELDTBLS32=maskftbl,DBftbl,miscftbl
export FLDTBLDIR32 FIELDTBLS32
mkfldhdr32

例3

例3は例1と同じですが、出力ファイル(maskftbl.hDBftbl.hmiscftbl.h)が${FLDTBLDIR}で指定されたディレクトリに保存される点だけが異なります。

FLDTBLDIR=/project/fldtbls
FIELDTBLS=maskftbl,DBftbl,miscftbl
export FLDTBLDIR FIELDTBLS
mkfldhdr -d${FLDTBLDIR}
mkfldhdr -d${FLDTBLDIR}

環境変数をオーバーライドしてmkfldhdrを実行する

mkfldhdrのコマンドラインでフィールド表の名前を指定し、環境変数をオーバーライドする(または環境変数を設定しない)ことができます。

ただし、この方法は実行時マッピングの関数に対しては適用できません。実行時マッピングの関数が使用されている場合、FLDTBLDIRがカレント・ディレクトリと見なされ、FIELDTBLSはユーザーがコマンドラインで指定したパラメータの一覧と見なされます。たとえば、次のコマンド:

mkfldhdr myfields

は、フィールド表ファイルmyfieldsをフィールド・ヘッダー・ファイルmyfields.hに変換し、そのヘッダー・ファイルをカレント・ディレクトリに格納します。

詳細は、『Oracle Tuxedoコマンド・リファレンス』「mkfldhdr、mkfldhdr32(1)」を参照してください。

 


フィールドをC構造体およびCOBOLレコードにマッピングする

ここでは、以下の内容について説明します。

 


VIEWS機能とは

FML VIEWSは、フィールド化バッファとC構造体、またはフィールド化バッファとCOBOLレコードの間でデータを交換するためのメカニズムです。この機能は、時間のかかるデータ操作を、C関数を使用してC構造体で行うために用意されています。この方が、FML関数を使用してフィールド化バッファでデータを操作するより効率的です。また、VIEWSを使用して、COBOLプログラムでFMLフィールド化レコードを扱うCプログラムとメッセージを送受信する方法としても使用できます。

この項では、VIEWSを使用してフィールド化バッファとC構造体をマッピングする方法を説明します。

VIEWSの構造

次の図は、VIEWSの構成要素とそれらの相互関係を示しています。

図4-1 VIEWS機能の構成要素

VIEWS機能の構成要素

 


VIEWファイルを作成する

ソースVIEWファイルは、viなどの任意のテキスト・エディタで作成する標準テキスト・ファイルです。このファイルには、1つまたは複数のソースVIEW記述(フィールドから構造体への実際のマッピング情報)が格納されています。

VIEWコンパイラの最も重要な役割は、オブジェクトVIEWファイルを生成することです。このファイルには、コンパイル済のオブジェクトVIEW記述が含まれています。オブジェクトVIEWファイルは逆に、VIEW逆アセンブラ(viewdisまたはviewdis32)での入力として使用できます。VIEW逆アセンブラを使用すると、オブジェクトVIEW記述をソース形式に戻し、内容を検証したり、編集することができます。詳細は、『Oracle Tuxedoコマンド・リファレンス』「viewdis、viewdis32(1)」を参照してください。

ソースVIEW記述を作成および編集し、viewdisの出力を編集することができます。コンパイル済のVIEW記述(バイナリ形式)を直接読み取ることはできません。

VIEWファイルには、VIEW記述のほかに#または$で始まるコメント行を格納できます。#で始まる空白行は、VIEWコンパイラによって無視されますが、$で始まる行は、VIEWコンパイラが生成するヘッダー・ファイルに渡すことができます。この規則によって、Cのコメントなどのwhatの文字列をVIEWコンパイラが生成するCヘッダー・ファイルに渡すことができます。

注意: この規則は、COBOLには適用されません。したがって、$で始まる行はCOBOL COPYファイルには渡されません。

 


VIEW記述を作成する

ソースVIEWファイル内の各ソースVIEW記述は、次の3つの部分で構成されています。

VIEW記述の最初の行は、「VIEW」というキーワードで始まり、続いてVIEW記述の名前が指定されます。メンバー記述(マッピング・エントリ)は、C構造体またはCOBOLレコードのメンバーに関する情報を含む行です。キーワードENDで始まる行は、VIEW記述の最後の行です。

次のリストは、一般的なソースVIEW記述の内容です。

リスト4-2 VIEW記述のソース
VIEW vname
# type cname fbname count flag size null
# ---- ----- ------ ----- ---- ---- ----
--------------member descriptions-------------------
.
.
.
END

前記のリストでは:

VIEW記述でのフラグ・オプションを指定する

以下は、VIEW記述内のメンバー記述のflag要素として指定できるオプションです。

C

このオプションは、メンバー記述で記述された構造体メンバーに加えて、連想カウント・メンバー(ACM: Associated Count Member)と呼ばれる構造体メンバーの生成をリクエストします。

フィールド化バッファから構造体へのデータ転送時には、構造体内の各ACMは対応する構造体メンバーに転送されたオカレンスの数に設定されます。

F

このオプションは、構造体からフィールド化バッファへの一方向のマッピングを指定します。このオプションによるメンバーのマッピングは、構造体からフィールド化バッファへのデータ転送時のみ有効です。このオプションは、-nコマンドライン・オプションを指定した場合は無視されます。

L

このオプションは、carray型またはstring型のメンバー記述に対してのみ使用され、これらのフィールドが可変長の場合に転送されるバイト数を示します。carrayフィールドまたはstringフィールドを常に固定長データ項目として使用する場合、このオプションを指定する利点はありません。

Lオプションは、carray型またはstring型の構造体メンバーに対応する連想長メンバー(ALM: Associated Length Member)を生成します。フィールド化バッファから構造体へのデータ転送時には、ALMは、対応する転送フィールドの長さに設定されます。フィールド化バッファ内のフィールドの長さがマッピングされた構造体メンバーに割り当てられた領域を超える場合は、割り当てられたバイト数のみが転送されます。対応するALMは、フィールド化バッファ項目のサイズに設定されます。したがって、ALMが構造体メンバーの配列サイズより大きい場合、フィールド化バッファ情報は転送時に切り捨てられます。

構造体メンバーからフィールド化バッファのフィールドにデータを転送する場合、そのフィールドがcarray型であれば、ALMを使用してフィールド化バッファに転送するバイト数を指定します。string型のフィールドの場合、ALMは転送時に無視されますが、転送後、転送されたバイト数に設定されます。carrayフィールドには長さ0も指定できます。ALMが0の場合は、関連する構造体メンバーの値がNULL値でない限り、フィールド化バッファに長さ0のフィールドが転送されます。

ALMの型は、FMLではunsigned short型、FML32ではunsigned long型としてCヘッダー・ファイルで定義され、L_cnameという名前が生成されます。cnameは、ALMが宣言された構造体の名前です。

ALMが宣言されたメンバーのオカレンス数が1の場合(またはデフォルトが1の場合)、ALMは次のように宣言されます。

unsigned short L_cname;

一方、オカレンス数が1より大きい場合(N)、ALMは次のように宣言されます。

unsigned short L_cname[N];

これはALM配列と呼ばれます。このような場合は、ALM配列内の各要素は構造体メンバー(またはフィールド)の対応するオカレンスを参照します。COBOL COPYファイルでは、FMLはPIC 9(4) USAGE COMP-5型、FML32はPIC 9(9) USAGE COMP-5型として宣言され、L-cnameという名前が生成されます。メンバーが複数回発生する場合は、COBOLのOCCURS句を使用して複数のオカレンスを定義します。

注意: 生成されたALM名と接頭辞L_で始まる名前の構造体メンバーが競合する場合があります。VIEWコンパイラは、このような競合を致命的なエラーとして報告します。たとえば、構造体メンバーのL_partsという名前は、メンバーpartsに対して生成されるALM名と競合します。

N

ゼロ方向マッピングを指定します。C構造体にフィールド化バッファはマッピングされません。このオプションは、C構造体またはCOBOLレコードに充填文字を割り当てるときに使用することができます。このオプションは、-nコマンドライン・オプションが指定された場合は無視されます。

P

このオプションは、string型およびcarray型の構造体メンバーのNULL値としてVIEWが解釈する内容を指定します。このオプションを指定しない場合、構造体メンバーの値がユーザー指定のnull値と等しいと(後続のnull文字は考慮しない)、構造体メンバーがnullになります。

一方、このオプションを指定した場合は、ユーザー指定のnull値と構造体メンバーの値が等しく、さらに最後の文字が完全な長さまで及んでいると(後続のnull文字は考慮しない)、構造体メンバーがnullになります。

C構造体またはCOBOLレコードからフィールド化バッファへデータを転送する場合、値がNULLのメンバーは転送先のバッファに送信されません。たとえば、構造体のメンバーTESTcarray[25]型で、ユーザー定義のNULL値「abcde」が指定されているとします。Pオプションを設定しない場合、最初の5文字が順にabcdeであれば、TESTはNULLと見なされます。Pオプションを指定した場合、最初の4文字が順にabcdで、かつcarrayの残りの文字がすべて「e」であれば(eが21個)、TESTはNULLと見なされます。

このオプションは、-nコマンドライン・オプションを指定した場合は無視されます。

S

このオプションは、フィールド化バッファから構造体への一方向のマッピングを指定します。このオプションを指定したメンバーのマッピングは、フィールド化バッファから構造体へのデータ転送時のみ有効です。このオプションは、-nコマンドライン・オプションを指定した場合は無視されます。

VIEWSでNULL値を使用する

VIEWSのNULL値は、C構造体またはCOBOLレコードのメンバーが空であることを示すために使用されます。NULL値はデフォルト値として提供されていますが、独自に定義することもできます。

デフォルトのNULL値は、数値型の場合はすべて0 (dec_tの場合は0.0)、char型の場合は “\0"、string型とcarray型の場合は “ “ です。

null値を指定するためにエスケープ規則定数を使用することもできます。VIEWコンパイラで認識されるエスケープ定数は、\ddd (dは8進数)、\0\n\t\v\b\r\f\\\'、および\"です。

string型、carray型、およびchar型のNULL値は、二重引用符または一重引用符で囲みます。VIEWコンパイラは、ユーザー定義のnull値の内部のエスケープされていない引用符は受け付けません。

要素は、値がその要素のNULL値と同じであればNULLになりますが、以下の例外があります。

VIEW記述のnullフィールドにキーワード “NONE"を指定することもできます。これは、そのメンバーに対するnull値がないことを意味します。

string型および文字配列(carray)型のメンバーのデフォルトの最大サイズは、2660文字です。

注意: string型のメンバーは通常「\0」で終了するため、ユーザー定義のNULL値の最後の文字として「\0」を指定する必要はありません。

 


VIEWファイルをコンパイルする

FMLではviewc、FML32ではviewc32がVIEWコンパイラ・プログラムです。これらのプログラムは、ソースVIEWファイルを取り込み、オブジェクトVIEWファイルを生成します。生成されたオブジェクトVIEWファイルは実行時に解釈され、データの実際のマッピングに影響を与えます。実行時には、viewcに対してCコンパイラを使用する必要があります。コマンドラインは、次のようになります。

viewc [-n] [-d viewdir] [-C] viewfile [viewfile . . . ]

このコマンドラインのviewfileは、ソースVIEW記述を含むソースVIEWファイルの名前です。コマンドラインには、1つまたは複数のviewfileを指定できます。

-Cオプションを指定すると、viewfileで定義した各VIEWに対してCOBOL COPYファイルが1つ作成されます。これらのコピー・ファイルはカレント・ディレクトリに作成されます。

-nオプションを使用すると、FMLバッファにマップしないC構造体またはCOBOLレコードのVIEW記述ファイルをコンパイルできます。

デフォルトでは、viewfileのすべてのVIEWがコンパイルされ、複数のファイルが作成されます。つまり、VIEWファイルごとにオブジェクトVIEWファイル(接尾辞「V」)とヘッダー・ファイル(接尾辞「h」)が作成されます。VIEWSの構成要素については、「VIEWS機能の構成要素」を参照してください。

オブジェクトVIEWファイルの名前はviewfile.Vとなります。それは、カレント・ディレクトリに作成されます。-dオプションを指定して別のディレクトリを指定することもできます。ヘッダー・ファイルは、カレント・ディレクトリ内に作成されます。

注意: Windowsのように、大文字と小文字を区別しないオペレーティング・システムの場合、オブジェクトVIEWファイルには.vvという接尾辞が付きます。

詳細は、『Oracle Tuxedoコマンド・リファレンス』「viewc、viewc32(1)」を参照してください。

 


viewcを使ってコンパイルしたヘッダー・ファイルを使用する

VIEWコンパイラ(viewc)を使用して作成したヘッダー・ファイルを任意のCアプリケーション・プログラム内で使用すると、VIEWで記述したC構造体を宣言できます。たとえば、次のようなVIEW記述:

VIEW test
#TYPE CNAME FBNAME COUNT FLAG SIZE NULL
int empid EMPID 1 - - -1
float salary EMPPAY 1 - - 0
long phone EMPPHONE 4 - - 0
string name EMPNAME 1 - 32 "NO NAME"
END

は、次のようなCヘッダー・ファイルを作成します:

struct test {
long empid; /* null=-1 */
float salary; /* null=0.000000 */
long phone[4]; /* null=0 */
char name[32]; /* null="NO NAME" */
};

詳細は、『Oracle Tuxedoコマンド・リファレンス』「viewc、viewc32(1)」を参照してください。

 


VIEWコンパイラを使って作成したCOBOL COPYファイルを使用する

-Cオプションを使用してVIEWコンパイラで作成したCOBOL COPYファイルを任意のCOBOLアプリケーション・プログラムで使用すると、VIEWで記述したCOBOLレコードを宣言できます。たとえば、前の項に示したVIEW記述のCOBOL COPYファイルは、TEST.cblファイルでは次のようになります。

*       VIEWFILE: "test.v"
* VIEWNAME: "test"
05 EMPID PIC S9(9) USAGE IS COMP-5.
05 SALARY USAGE IS COMP-1.
05 PHONE OCCURS 4 TIMES PIC S9(9) USAGE IS COMP-5.
05 NAME PIC X(32).

COPYファイルの名前は、VIEWコンパイラによって自動的に大文字に変換されます。COPYファイルは、次のようにCOBOLプログラムに組み込まれます。

01 MYREC COPY TEST.

COPYファイルの出力の詳細は、『COBOLを使用したOracle Tuxedo ATMIアプリケーションのプログラミング』を参照してください。

 


コンパイル後にVIEWファイルの情報を表示する

VIEW逆アセンブラであるviewdisは、VIEWコンパイラで生成されたオブジェクトVIEWファイルを逆アセンブルし、ソースVIEWファイルの形式でVIEW情報を表示します。また、対応する構造体メンバーのオフセットも表示します。

この形式の情報を参照できると、オブジェクトVIEW記述が正確かどうかを検証するのに役立ちます。

VIEW逆アセンブラを実行するには、次のコマンドを入力します。

viewdis objviewfile . . .

デフォルトでは、カレント・ディレクトリ内のobjviewfileが逆アセンブルされます。このファイルをカレント・ディレクトリで検索できないと、エラー・メッセージが表示されます。コマンドラインには、1つまたは複数のオブジェクトVIEWファイルを指定できます。

viewdisの出力は、元のソース表示の記述に似ているように見えます。編集可能で、viewcに再入力できます。viewdisの出力に表示される行の順序は、元のソースVIEW記述の順序と異なる場合がありますが、順序が違ってもオブジェクトVIEWファイルの正確性とは関係ありません。

詳細は、『Oracle Tuxedoコマンド・リファレンス』「viewdis、viewdis32(1)」を参照してください。


  先頭に戻る       前  次