メインフレームを見てみよう~後編~
ちなみにJCLという独自言語は、本当に独自性の高い言語で、OSが違えば書き方がまるで違いますので、狙うメインフレームのお勉強をしっかりしないとなりません。PC系だとスクリプトとか、バッチファイルが近いイメージですね。
そして、次に問題となるのが、このJCLで記述したジョブをどうやって実行するか。
ジョブの実行に当たっては大まかに二つの方法があります。一つはJCLソースをどこかに保存してそのまま実行するというもの。もう一つはJCLをコンパイルして実行する方法……これはもうそのまんまで、JCLのコンパイラを通して実行ファイルを作って、と言う流れになります。
で、どちらになるのかは、これまたメインフレームの種類によって違います。コンパイル必須というOSもあれば、コンパイル不要だったり、コンパイルしてもしなくても両方行けるというパターンだったりと様々。
ついでに言うなら、両方どちらでも、というOSでも、パラメータ設定によりどちらかに固定されていることがあります。
要するに、「わからない」と言うことですね。頑張って確認して下さい。
さらに言うなら、コンパイルしてもしなくてもジョブのソースはどこかに保存しなければならないのですが、これがまた面倒です。
メインフレームでは、ジョブに限らず、プログラムのソースも、コンパイルした後の実行プログラムもすべて「ライブラリ」という特別な管理をするファイルの中に格納しなければなりません。そして――もうここまで来ればだいたい予想がつくと思いますが――これらのライブラリは自由に名前をつけられますので、はてどんな名前やら、です。
一応、JCLのソース、またはJCLのコンパイル後の実行モジュールの格納先に関しては「特にパラメータを変更していない場合XXXXになる」という記述があったりしますが、このパラメータというのが、だいたいの場合導入時にOS内部に設定してしまうので、確認する術が無い。XXXXがあればラッキー、と言う程度のなかなか分の悪い賭けをしなければなりません。
ちなみにライブラリ自体は隠されているわけではないので、ディスク内のファイル一覧を取得すれば見つかります。
ディスク内のファイル一覧取得のためにはライブラリがわからないとならないという、タマゴが先かニワトリが先かという話、再びです。
また、もう一つの注意点として、このライブラリと言うのがメインフレームOSの標準機能である、資源管理の管理下にあると言うこと。資源管理というのはこうしたライブラリやらディスク装置やらのアクセス状態をかなり厳重に管理している機能で「○月×日、端末番号XXXが操作してライブラリYYYにZZZというソースを追加した」なんてのが記録されてしまいます。
そして、この記録機能は切ることが出来ず、記録を取り出す機能はあれども消す機能が無いという……頑張ってバレないようにしないとね!
さて、どうにかこうにかディスク内のファイル一覧を取得できたとしましょう。どのディスクにある何というファイルからデータを取り出せばいいのかわかったので……次はどうする?
ここで問題になるのはメインフレームの「ファイル」という概念です。一般的にデータを格納するためのファイルは「順編成ファイル」「索引編成ファイル」「データベースファイル」のどれかになります。ぶっちゃけて言うと、「○編成ファイル」というのは基本的に1件のデータが固定の長さになっているファイルで、何バイト目から何バイトが得意先の名前で、その次の何バイトが住所で……という感じでデータが格納されています。もちろん、どこに何のデータが入っているかは、プログラムなりシステムなりの仕様書を見ないとわかりません。
そして「データベースファイル」ですが、これもこれで、何らかの方法を採らないと中を見ることは出来ません。何らかの方法?わかりやすく言えばプログラムです。
とりあえず得意先のデータは索引編成ファイルかデータベースのどちらかに入っているはずなのですが、とりあえずプログラムで全件読み出して、カンマ区切りのCSVファイルとして出力してみましょうか。
で、プログラムを書くわけですが……先程のジョブと同様、プログラムもどこかのライブラリにソースを保存しなければならないわけで、これもまた一つ苦労をしておく必要があります。
んで、どこに保存するかがわかったとして……
プログラムか……COBOL、PL/I、RPG辺りが有名どころですか。
メーカー独自の言語があったりもしますが、少なくともBASICだとかPythonだとかは使えません。かろうじてC言語が使える事もありますが、言語のコンパイラはオプション製品なので、期待しない方がいいでしょう。
それぞれの言語ごとの書き方は省略するとして、少なくとも言えるのは、システムの仕様書を片っ端から読みあさって、得意先データがどんな情報を持っているかを確認しながらでないとプログラムはかけないと言うこと、かな?
後は、データベースだった場合でも「俺はSQLくらい書けるぜ」という人を地の底へたたき落とす、リレーショナルじゃないデータベースの存在とか。
コンピュータ黎明期の頃に作られたデータベースの中には階層型とかネットワーク型なんて言う、SQLとかそう言うのがないデータベースが普通に使われていたりするのです。そして、そう言うデータアクセスのプログラムは、メーカー独自の書き方が必要だったりします。
また勉強することが増えました。
既に、他のプログラムをコピペして書き直した方が良さそうな次元になってきました。
さて、どうにかプログラムを書いてコンパイルも出来た、としましょう。ちなみに全くの初心者が色々手取り足取りで教わりながらやったとしてもここまで来るのに早くてもひと月くらいかかると見てください。端末の独特な操作性だけでなく、テキストエディタも実に独特な動き方をしますから。マウスでスクロールなんてしませんし、カーソルキーで一番下まで行くと、上からカーソルが出てくることもあります。ドラ○エか。コピペも独特の操作をするし、文字列検索、置換なんて呪文みたいなコマンドを使いますからね。頑張って操作に慣れて下さい。
ちなみにプログラムのコンパイルもジョブにより実行するので、コンパイル用のJCLを記述しなければなりませんし、コンパイル後の実行モジュールはどこかのライブラリに入れなければなりません。
そう、上がったハードルが全然下がってくる気配がないのです。
どうにかこうにかデータを吸い上げてCSV形式に加工してファイル出力したとしましょう。もちろん出力するためのファイルはディスクに割り当てをしなければなりませんし、固定長のCSVという、一般的なオフィスアプリケーションが出力するようなCSVファイルではありませんが、それでもオフィスアプリケーションに放り込めばちゃんと表示してくれるのでそこは心配しなくても大丈夫。
さて、出力したファイルをどうやって外に持ち出すか?ですが、これは比較的簡単で……FTPで送り出すことが出来たりします。「なら最初からFTPで送り出せよ」と言われるかも知れませんが、だいたいの場合FTPで送り出せるのが順編成ファイルのみとなっているので、索引編成ファイルやデータベースファイルは送り出せないんですね。あとは、あまり深く説明はしませんが、パック化十進数という形で数値を格納する場合があり、ファイルをそのまま取り出すとあとから読みづらかったりするので、プログラムで変換する処理を入れてみました。
と言うことでメインフレーム側のFTPクライアントを起動して……ええ、JCLにFTPでファイル送信するよ、と記述して実行するんですが、これでようやく外へ送り出せ……ない。
メインフレームもだいたいの場合TCP/IP通信できたりするのですが、基本的にDNSを参照したり、自由にアクセスできたり、というのはありません。接続先はかなり固定されているので、社内にある(だろう)FTPサーバを探し出し、アカウント情報を取り出してどうにか、ですねえ。
さて、ここまで読んで察しの良い方はこう思うでしょう。
「いや、ライブラリの中とか文字列検索して使えそうなのを探せよ」
文字列検索をする便利な何かは……OS標準にない。あるいはあっても……JCLを書かないと使えない。
さて、一体どれほどの手間をかけたかわかりませんが、どうにかデータを取り出し、手元のPCへ転送、持ち込んだUSBメモリへ格納したらおさらばしましょう。
ミッションコンプリートです。
となればよかったんですけどね。
持ち帰ったCSVファイルを開いて愕然とするでしょう。
カンマがどこにも無い、と。
メインフレームで主に使われている文字コードはEBCDICというコードで、いわゆるJISとかASCIIといったコードとは全く別物。Unicode?知らない子ですね。
具体的に言うと A はJISコードでは41(16進数表記)となりますが、EBCDICコードでは C1(これも16進数表記)だったりします。ついでに言うなら、メインフレームのメーカー感の互換性は……一部あるけど一部無し。んで、Bが42とC2……順調に進んでIが49とC9なんですが、Jになると4AとD1になります。順調に心を折りにきてます。
そして、これをどうにかしたあとに待っているのが、日本語。いわゆる全角文字という奴ですが、これがまあ……何というか、うん。作者は3つほど知っていて使ったこともあるのですが、それぞれ独自の体系だったり、何となくJIS漢字コードに準拠していたりと様々です。Unicode?何度も聞かないで下さいね?
ちなみに作者は頑張って文字コードを自動変換するプログラムを作ったりしていますが、もちろんとあるメーカー製専用となっているので、他のメーカーのメインフレームには使えません。ついでに言うと同じメーカーのメインフレームでもバージョンが違うと色々違ったりするので……まあ、頑張れ。
と言うことで、メインフレームがどういう物なのか、何となくわかったかな、というお話でした。