AS/400展望台

IFSのホットな5つのヒント−続編



Mel Beckman著

先月はiSeriesのIFSの複雑さに対処するための10のヒントのうち、最初の5つを紹介しました。(IFSのホットな5つのヒント)http://www.e-bellnet.com/special/vision/vision_0401.html
今月は残りの5つを紹介します。この残りの5つはIFSユーザーの多くが共通して直面する、プログラミング上や運用上の課題に対処するためのものです。それではご紹介しましょう。今月も順番は特に重要ではありません。

ヒント1:IFS階層構造をPCのドライブにマッピングする

IFSのそもそもの目的は、他のオペレーティング・システムとの統合を促進することですので、外部のシステムからIFSにアクセスする方法を知りたいと思うのが自然です。そしておそらく、IFSを使用する最も一般的なオペレーティング・システムはさまざまなWindowsオペレーティング・システムでしょう。

Windowsユーザーである皆さんは、ドライブのマッピングという概念はご存知でしょう。クライアントのWindowsマシン上でのドライブ装置を示す文字が、実際にはリモートのサーバーのファイル・システムを参照しているというものです。これを利用した方法もIFSにアクセスする簡単な方法ではありますが、そのやり方は必ずしも直感的なものではありません。そこでWindowsからすばやく簡単にIFSにアクセスするためのカンニング・ペーパーを用意しました。以下の説明ではiSeries Accessがあることを前提としていますが、iSeriesユーザーであればすでにお持ちのことと思います。

まず歴史の勉強です。iSeries AccessのExpress以前のバージョンではリモートのドライブをマッピングさせるのは簡単でした(パフォーマンスは若干、良くありませんでしたが)。[近くのコンピュータ]でiSeriesのマシンを探して右クリックし、ポップアップ・メニューから[ネットワークドライブの割り当て]を選択します。iSeriesボックスへのログオン・プロセスを経た後、ルート・ディレクトリから始まるIFS全体を参照するためのドライブの文字を選択します(または[マイコンピュータ]を右クリックして[ネットワークドライブの割り当て]ダイアログを開始することもできます)。必要に応じてIFSのサブディレクトリだけをマッピングさせてOS/400ディスクの一部だけにアクセスを制限することもできます。

しかしiSeries Access ExpressやOS/400 V5R1では、[近くのコンピュータ]、つまり今では[マイネットワークプレース]と呼ばれるメニューでiSeriesのシステムが表示されません(NetServerを使用している場合、iSeriesは[マイネットワークプレース]に表示されることに注意してください)。iSeriesマシンにアクセスするにはまずそのドライブを「共有」させなければなりません。このやり方は一目瞭然というわけではありませんが、一度手順を覚えてしまえば自然なものになります。

  1. iSeries Navigatorを起動します。利用可能なiSeriesシステムが一覧表示されます。
  2. 共有したいiSeriesボックスのアイテムを開き、そこからファイル・システムの項目を開きます。
  3. ファイル共有という項目を選択し、マッピングさせたいIFSの部分(たとえばルート・ファイル・システム)の共有がすでにアクティブになっているかどうかを確認します。共有がアクティブになっていなければ共有を作成する必要があります。
  4. 共有を作成するには、ファイル・システムから統合ファイル・システムを選択し、右側のペインでマッピングさせたいファイル・システムを右クリックします (たとえばIFS全体をマッピングするときは「ルート」を選択します)。
  5. ポップアップ・メニューが表示されますので、[共有]−[新規共有]を選択します。続いて表示されるダイアログで共有名とログイン値を入力します。ドライブのマッピングの際にこの共有名を使用しますので覚えておいてください。
目的とするiSeriesのファイル・システムの共有を設定したら、Windowsのエクスプローラーから[マイコンピュータ]を右クリックし、ポップアップ・メニューから[ネットワークドライブの割り当て]を起動します。マッピングさせたいドライブの文字を選択し、フォルダのドロップダウン・メニューを選択して上記で作成したiSeriesのホスト名と共有名を探します。ホスト名と共有名は結合されていますので、ホスト名「WEB001」の共有「IFSROOT」は「WEB001IFSROOT」と表示されます。

また、iSeries Navigatorからドライブをマッピングさせることもできます。ファイル・システムからファイル共有を選択し、右側のペインから共有を右クリックしてポップアップ・メニューから[ネットワークドライブの割り当て]を選択します。次に接続ユーザー名のプロンプトに対してAS/400のユーザー名を入力し、パスワードのプロンプトに対してAS/400のパスワードを入力してOKボタンをクリックし、ドライブをマッピングします。

ヒント2:行方不明のリンク

IFSではディレクトリのエントリのことを「リンク」と呼びます。これはUnixのコミュニティから不運にも引き継がれた名前です。というのも、iSeriesネイティブのプログラマにとっては多くの混乱を招く原因となっているからです。ネイティブのOS/400のファイル・システム(QSYS.LIB)では、すべてのオブジェクトに対してそのオブジェクトが存在するライブラリにディレクトリ・エントリが1つだけあります。IFSの他のファイル・システムではそうではなく、オブジェクトは特定のディレクトリに実際に「属して」いるわけではありません。ディレクトリはオブジェクトを指しているリンクの集合に過ぎません。

ファイル・システムによってこのような違いがある理由はOS/400の機能ベースのオブジェクト・アーキテクチャにあります。このアーキテクチャでは、オブジェクトが持つ権限を委譲・採用したり密接に制御したりすることができます。この権限はそれぞれのオブジェクトに結び付けられており、許可なくして変えることはできません。 しかしIFSでは、権限はオブジェクト自体にではなくオブジェクトへのリンクの中にあり、ディレクトリ内に含まれています。リンクで指し示されたものは実際にはバイトのコンテナに過ぎません。属性情報も伝えないため、オブジェクトとは呼べずファイルと呼ぶべきものです。OS/400のネイティブのファイル・システムと他のIFSのファイル・システムとの違いを理解することは、IFSがサポートしている2種類のリンクを理解するために不可欠です。

1つ目のリンクはハード・リンクです。ハード・リンクはディスク上におけるファイルの絶対的な物理的位置を指し示す、普通のディレクトリです。ハード・リンクに関して唯一独特なのは、ハード・リンクが同じファイル・システム内に含まれる限り、どのファイルも1つ以上のハード・リンクを持ちうることです。OS/400のAdd Link(ADDLNK)コマンドを使用してファイルへリンクを追加することができます。

マルチ・リンクの結果として面白いことが起きます。ファイルに対するハード・リンクが1つを除いてすべて削除されないとそのファイルを削除できないということです。ファイルをあるディレクトリから別のディレクトリに移動させてもファイル自体は移動せずそのファイルへのリンクが移動するだけです。

ファイルのコピーを1つだけ格納して、複数のプログラムからそれぞれの内部でコードされたパスによってそのファイルにアクセスしたいときは、マルチ・ハード・リンクを使うと便利です。たとえば、/myproject/master/filesディレクトリと/bobsproject/master/filesディレクトリに、mydataという名前のインクルード・ファイルがあるとします。それぞれのmaster/filesディレクトリにリンクがあるので、それぞれ別のプロジェクトで実行されるプログラムが同じファイルにアクセスできます。お分かりの通り、これはOS/400のライブラリ・リストつきアーカイブと同じ動作です(しかもライブラリ・リストの概念の方が良いアプローチであると私は思います)。

2種類目のリンクはシンボリック・リンクです。シンボリック・リンクは他のファイル・システム中にあるファイルを指し示すことができます。シンボリック・リンクは実際には小さなファイルで、その中に絶対ディレクトリ・パス(/で始まる)または部分ディレクトリ・パス(ディレクトリ名で始まる)を含んでいます。たとえば、

/myproject/src/main/init.c

のようにファイルを直接的に指しているシンボリック・リンクがあります。また現在のディレクトリを基準にして

src/main/init.c

のようにファイルを間接的に指すこともできます。また、実際のファイルを実際に参照することなく

src/main

というシンボリック・リンクでディレクトリを指し示すこともできます。シンボリック・リンク名は任意につけることができます(たとえばbob.lnk、fred.lnk、mary.lnkなど)。パス中にシンボリック・リンク名があるのをIFSが見つけたときは、リンク・ファイルのコンテンツをパス中の名前と置き換えます。したがって、bob.lnkにsrc/mainが含まれている場合、コード中のパスは

/bobsproject/bob.lnk/init.c

となり、これが

/bobsproject/src/main/init.c

と展開されます。ちょっと分かりづらいかも知れませんが、このような動作の結果、/で始まるシンボリック・リンクは、そのポイント以前のパスにあるすべてを否定することになります。したがって、bob.lnkに/myproject/src/mainが含まれている場合、上記の例は

/bobsproject//myproject/src/main/init.c

のように展開され、その意味は実際には

/myproject/src/main/init.c

となります。この簡単なチュートリアルにより、リンクが機能しなくなったり行方不明になってしまったりしたときに起こる問題を理解しやすくなるでしょう。

ヒント3:FTPと名前フォーマット

IFSのパスがOS/400の物理ファイルを指し示している場合、そのファイルは中身がファイルのメンバーであるようなフォルダに見えます。FTPを使用して物理ファイルのメンバーを転送する際、ファイルのメンバーへのパス全体を一挙に指定するのではなく、物理ファイルを表している「フォルダ」へまず移動するのが一番良いでしょう。

しかしこのやり方は決して直感的なものではありません。IFSのネーミングでは参照しようとしているオブジェクトのタイプを示す各名前に、固有の拡張子を付けなければなりません。物理ファイルのメンバーの場合、この拡張子は.mbrになります。またデフォルトではOS/400のFTPサーバーはIFSの名前付け方法(namefmt1)ではなくOS/400の名前付け方法(namefmt0)を使用します。

物理ファイルのメンバーをFTPする手順を示します(コマンドラインのFTPクライアントを使用してOS/400のFTPサーバーにログインした後からの手順です)。この手順はOS/400 V5R1以降だけで有効であるという点に注意してください。それ以前のバージョンのOS/400では、1つのメンバーのソース・ファイルしか転送できません。

まず、quote siteサブコマンドを使用してNAMEFMTをIFSに設定します。

quote site namefmt 1

次に、転送したいメンバーを含む物理ファイルに移動します。

cd /qsys.lib/mylib.lib/myfile.file

これで選択したメンバーを取り出すことができますが、この手順にはいくつかのやり方があります。

get mymember.mbr

のように単にgetを使用しても良いですが、この場合ローカル・システム上の現在のライブラリ中に.mbrという拡張子がついてメンバーが格納されます。また、.mbrという拡張子を付けたくない場合は、次のように宛先ファイル名を指定することもできます。

get mymember.mbr myname.txt

宛先名は、ローカル・マシンのオペレーティング・システムで使用できるものであればどんな名前でも構いません。OS/400サーバーにファイルをアップロードさせる場合は、putコマンドを使用します。この際、宛先名に.mbr拡張子を付ける必要があります。

put myname.txt mymember.mbr

ローカル・システム上に.mbrの拡張子がついたファイルがすでに存在する場合でも、宛先名を指定することをお勧めします。OS/400のFTPサーバーへのPUTの際に拡張子を取り除くFTPクライアントもあるからです。

複数のメンバーをgetしたりputしたりすることもできますが、この場合は宛先ファイル名を指定することができませんのでgetまたはputした結果は使用しているFTPクライアントによって異なります。複数のメンバーをgetまたはputするには、次のようにpromptサブコマンドを使用して、対話型入力モードをオフにしておかなければなりません。

prompt

このコマンドは実際には対話型入力モードを設定するのではなく、対話型入力モードのオンオフを切り替えるためのものであることに注意してください。このサブコマンドを発行すると、まず入力モードがオンなのかオフなのかを示すメッセージが表示されます。複数のファイルを送信したり受信したりするには、mputコマンドとmgetコマンドを使用します。次の例のように、複数のファイル名を1つ1つ羅列させることもできます。

mget file1.mbr file2.mbr file3.mbr

または次のようにアスタリスク(*)のワイルドカード指定子を使うこともできます。

mget file*.mbr

上記のファイル転送のシナリオいずれにおいても、通常のFTP文字セット変換サービスを使用することができます。ただし、FTPは外部で規定されたファイル・フォーマットを理解しないため、バイナリ・フィールドやパック型数値フィールドを変換することはできない点を忘れないでください。これらのフィールドの変換は、形式ファイル・エキスポート・ユーティリティを使用したり数値フィールドをゾーン表現に変換したりするなどして自分で行わなければなりません。

複数メンバーをコピーする簡単な方法の1つとして、ソース・ファイル中のすべてのソース・メンバーをgetまたはputする方法があります。この特別なケースの場合、ソース・コードが転送され、転送されるデータがASCIIフォーマットに自動変換されるとOS/400は認識します。

ヒント4:IFSオブジェクトの存在を調べる

IFSオブジェクトやIFSディレクトリを使用する前に、それらの存在を検証する必要がある場合があります。これにはIFSのopendir() APIやopenfile() APIを使ってプログラムで行うことができますが、HLLプログラミングを使用しないもっと簡単なCLを使用する方法もあります。

図1に示すCHKIFSOBJというCLプログラムはこのテクニックを紹介したもので、実際にCLライブラリに追加することができるスタンドアロン型のユーティリティです。このプログラムは、指定されたオブジェクトが存在する場合は「1」、存在しない場合は「0」の論理値を返します。CHKIFSOBJのCLコマンド定義を図2に示します。

このプログラムは、ターゲット・ファイル名やターゲット・ディレクトリ名を引数として使ってDSPLNKコマンドを実行することで動作し、ターゲットが存在しない場合にDSPLNKが送信するメッセージCPFA0A9を監視します。DSPLNKは対話モードまたはバッチモードのいずれかにおいてのみ動作し、バッチモード(OUTPUT (*PRINT)では常に印刷出力を生成します。したがってDSPLNKの副作用は、CHKIFSOBJが自動的に保留して削除する印刷ファイルが冗長になることでです。

大量のIFSオブジェクトの存在を調べる必要がある場合は、opendir()とopenfile()を起動するHLLを記述してください。しかしごく少数のオブジェクトを調べるだけの場合は上記のユーティリティを使用するのが良いでしょう。

ヒント5:IFSをWebで表示させる

Webブラウザでftp://というURLフォーマットを使用してiSeriesのFTPサーバーにユーザーがアクセスすると、その表示結果がよく混乱を招きます。これはFTPサーバーのデフォルトの名前付けフォーマットがOS/400の名前付け方法(namefmt0)であるのに対し、WebブラウザのユーザーはPCでの名前付け方法(namefmt1)に慣れているためです。対話型のコマンドラインFTPクライアントを使用する場合は、「quote site namefmt 1」コマンドを使用して名前フォーマットを変更するのが容易なやり方です。しかしWebブラウザではこれができません。

この問題の解決方法はOS/400のFTPサーバーのデフォルトの名前付けの方法を namefmt1に変えてしまうことです。これには次のように、Change FTP Attribute (CHFTPA)コマンドをQSECOFRとしてあるいは*IOSYSCFG権限を持ったユーザーとして実行することにより行います。

CHGFTPA NAMEFMT(*PATH) LISTFMT(*UNIX)

このコマンドを実行した後は、TCP/IPを停止して再起動しなければなりません。コマンドラインのユーザーを含むすべてのFTPユーザーは、デフォルトでPC流の一覧表示を使うことになる点に注意してください。

IFSのマイスター

これでIFSのパワーを活用する私のトップ10のヒントはおしまいです。すぐに使えそうなものもあるでしょう。そしてやがてはすべてを使っていただけることと思います。

Mel Beckmanは当ホームページの業務提携先、米Penton Media, Inc.のシニア・テクニカル・エディタです。



↑このページのトップへ
TOPPAGE

BELLDATA, Inc. Copyright reserved.