z/OSのユーザー・インターフェースについて考える ～teraterm利用のすゝめ～

# はじめに

## 問題
画面を上下にスクロールさせる方法といえば？	
	
- [ ] 人差し指で画面に触れ、上下にスワイプする
- [ ] マウスのホイールをグリグリ回す
- [ ] F7キー / F8キーを押す
	
1画面に表示される情報量を変更する方法といえば？	
	
- [ ] 人差し指と親指を画面に触れ、両指を近づけたり離したりする(ピンチイン/ピンチアウト)
- [ ] ウィンドウの角をドラッグしてウィンドウの範囲を変える
- [ ] エミュレーターの構成の"画面サイズ"にて、縦x横サイズを24x80, 32x80, 43x80, 27x132, 62x160 のいずれかから選択する
	
Unixのファイルシステムを扱う時に使用するインターフェース/接続方法といえば？	
	
- [ ] teratermからssh/telnetで接続
- [ ] PCOMからOMVSで接続
- [ ] PCOMからish or ISPF 3.17パネルで接続

---
メインフレームのユーザー・インターフェースと言えば、PCOM(Personal Communication)に代表される3270端末エミュレーター、そう、あの黒い背景に緑の文字の画面です。この特殊極まりないユーザーインターフェースが未だに幅を利かせているのが、若者のメインフレーム離れに繋がる大きな要因だと思うのですが、なかなかこの牙城がくずれません。
実の所、z/OSのユーザー・インターフェースは色々改善されています。職場の関係上、周りにはPCOM大好きな人が多いのですが、「慣れればこっちの方が早いんだよ」という妙なこだわりのもと、新しいインターフェースを全く受け入れようとしない人が多くてどうも理解に苦しみます。PCOMは無くせないのはしょうがないのですが、より便利なツールがあるのであれば適材適所でそれを使った方がいいに決まってます。よりよいインターフェースがあるのに使わないのはある意味柔軟性の欠如じゃなかろうかと。
まぁ人それぞれ使いやすいもの使えばいいんですが、少なくともUSS上のファイル扱うのにいいかげんOMVS使うのはやめましょうよと、というお話です。

# PCOM以外のツールの整理
こんなのがあります。
## Rational Developer for System z (RDz) 
eclipseベースのz/OS向けアプリケーション統合開発環境です。COBOL, PL/I, Assemblerなどz/OSで稼働するアプリケーションをeclipseでJavaのように開発できます。
z/OS上のリソース(PDS, メンバーなど)がWindowsのフォルダー構造のように扱えたりします。
有償ということもあり、かなりリッチな機能が提供されています。
PDSメンバーの編集、JOBのサブミット、JOBLOG確認などもできます。(あくまで開発環境なのでSYSLOGの確認やSDSFコマンド投入はできない、たぶん)

## z/OS Explorer
無償で使えるeclipseベースのツール。RDzからアプリ開発支援機能を省いて、PDSやUSSリソースの操作、JES操作部分に特化させたようなもの。
以前はFTPプロトコルベースで接続していたが、最新のバージョン(z/OS Explorer AQUA)では、RDzのホスト側モジュールと同じものを導入しておけば、もう少し機能がリッチになる。

## z/OSMF
ブラウザからz/OSの管理がいろいろできるらしい。使ったこと無いので実際どこまで使えるのかまだよく分かりません。	是非使いたいが、手元にすぐ使える環境がないので...
z/OS側にLiberty(WASの簡易版みたいなやつ、つまりWebアプリサーバー)が必要らしい。	z/OS V2.1でオプションフィーチャーとして提供されるが、z/OS V2.2ではベースに含まれて提供されるっぽい。	
参考: [知らなきゃ損！ z/OSMF新機能](https://www.youtube.com/watch?v=H4udzGckI1g)

3270エミュレーター機能が全て使える訳ではないようだが、ISPFの操作は大抵のことはできるらしい。そして、なんとこいつはRESTのAPIを提供しているらしい！(RESTでデータセット確認したりJOBLOG見たりできるらしいぞ！)

## teraterm
言わずと知れたUnix系の操作でよく使われるフリーのエミュレーターです。
telnet or ssh経由でUSS(Unix System Service)に接続できます。当然telnetサーバー or sshサーバーを構成する必要があります。今時、Unixを名乗るならsshとかデフォルトで使えるようにしておいて欲しい...。構成されてなかったら基盤チームにブーブー文句を言いましょう。
(ちなみにOpenSSHはz/OS V2.1まではPorted Toolというオプションフィーチャーで提供されていたが、V2.2からはやっとベースに含まれて提供されるらしい！)

# teratermでの便利機能
ということで、teratermでz/OSのUSSに接続した場合の便利機能をいくつか挙げてみます。

## Unixコマンド
普通にUnixのコマンドが使えます。lsとかcdとかviとか。
ヒストリ機能も使えます。
(ディレクトリ/フォルダ名のタブ補完は使える環境と使えない環境があって何に依存するのか不明。誰か教えて。)
シェル・スクリプトも使えます。(基本kshだったはず。 bashも入れれば使えます。)
Ctrl+cが効きます。
複数画面が使えます。
Unix知識が流用できるのが最大のポイント。まぁUnix System Serviceなんだから当たり前。
※Unixの世界では当たり前のことがOMVSではことごとく不都合があります。(これを不都合だと思わないアナタ！、本人は幸せかもしれませんが傍から見ると不幸です。)

## TSOコマンド
USSからTSOコマンドを投入するためのコマンドがあります。その名も「tsocmd」。tsocmdに続けて投入したいTSOコマンドを入力します。
例えば、

```xxx:実行例
[CICS004@host01:/u/cics004] tsocmd listuser
listuser
USER=CICS004  NAME=CICS004               OWNER=IBMUSER   CREATED=02.129
 DEFAULT-GROUP=ESA      PASSDATE=16.232 PASS-INTERVAL= 30 PHRASEDATE=N/A
 ATTRIBUTES=SPECIAL OPERATIONS
 REVOKE DATE=NONE   RESUME DATE=NONE
 LAST-ACCESS=16.232/22:54:44
 CLASS AUTHORIZATIONS=NONE
 NO-INSTALLATION-DATA
 NO-MODEL-NAME
 LOGON ALLOWED   (DAYS)          (TIME)
 ---------------------------------------------
 ANYDAY                          ANYTIME
  GROUP=ESA       AUTH=USE      CONNECT-OWNER=IBMUSER   CONNECT-DATE=02.129
    CONNECTS=10,769  UACC=NONE     LAST-CONNECT=16.232/22:54:44
    CONNECT ATTRIBUTES=NONE
    REVOKE DATE=NONE   RESUME DATE=NONE
SECURITY-LEVEL=NONE SPECIFIED
CATEGORY-AUTHORIZATION
 NONE SPECIFIED
SECURITY-LABEL=NONE SPECIFIED
```

```tsocmd listuser > userinfo.txt ```というようにすればファイルに結果をリダイレクトできますし、コマンドなのでシェル・スクリプトからTSOコマンドを投入するといったこともできますね。

## SDSFコマンド
TSOコマンドのようにSDSFコマンドを投入できるコマンドは提供されていませんが、REXX用のインターフェースが用意されているので、簡単なREXX作ればできます。
REXXを使うとJESの操作なんかもできるので、すごく利用の幅が広がります。(REXXからJESの操作は近いうちに別の記事をアップする予定)

```rex:sdsf.rex
/* REXX */

PARSE ARG VAR1

mycmd.0=1
mycmd.1=VAR1

rc=isfcalls('ON')

Address SDSF ISFSLASH "(mycmd.) (WAIT)"

Say "RC: " RC
Say "ISFMSG:  " ISFMSG

if ISFMSG2.0 > 0 then
  do
    do ix=1 to ISFMSG2.0
      SAY "ISFMSG2."ix ":" ISFMSG2.ix
    end
  end

if ISFULOG.0 >0 then
  do
    do ix=1 to ISFULOG.0
      SAY ISFULOG.ix
    end
  end

rc=isfcalls('OFF')
```

このrexxファイルを適当な所に配置して、パスを通します。そんでaliasとか切っておくと使いやすい。
例えば、CICS004というユーザーの場合、ホームの.profileに以下のような設定をしておきます。(ログイン時にこのプロファイルが読まれる)

```xxx:.profile
set -o vi
PS1="["$LOGNAME@`hostname`:'$PWD'"] "
export PATH=$PATH:/u/cics004/Shell:/u/cics004/REXX
alias sdsf=sdsf.rex
```

/u/cics004/REXX以下に、sdsf.rexを配置する想定です。パスをきって、aliasを指定しています。これで、sdsfと打つとこのREXXが起動する訳です。

```xxx:実行例
[CICS004@host01:/u/cics004] sdsf d a,l
RC:  0
ISFMSG:   COMMAND ISSUED
ISFMSG2.1 : ISF776I Processing started for action 1 of 1.
ISFMSG2.2 : ISF769I System command issued, command text: d a,l.
ISFMSG2.3 : ISF766I Request completed, status: COMMAND ISSUED.
ZOS1      2016232  23:17:50.35             ISF031I CONSOLE CICS004 ACTIVATED
ZOS1      2016232  23:17:50.35            -d a,l
ZOS1      2016232  23:17:50.35             IEE114I 23.17.50 2016.232 ACTIVITY 868
                                            JOBS     M/S    TS USERS    SYSAS    INITS   ACTIVE/MAX VTAM     OAS
                                           00006    00041    00002      00036    00015    00002/00030       00027
                                            LLA      LLA      LLA      NSW  S  VLF      VLF      VLF      NSW  S
                                            DLF      DLF      DLF      NSW  S  EPWFFST  FFST     EPWFFST  NSW  S
                                            CSFSTART CSFSTART CSFSTART NSW  S  SYSLOGD  SYSLOGD  CONFPDS  OWT  SO
                                            VTAM     VTAM     VTAM     NSW  S  SDSF     SDSF     SDSF     NSW  S
                                            CPCMDX   CMD      GO       OWT  S  RRS      RRS      RRS      NSW  S
                                            TCPIP    TCPIP    TCPIP    NSW  SO JMON     JMON     JMON     OWT  SO
                                            RSED     RSED     RSED     IN   SO OAM      OAM      IEFPROC  NSW  S
                                            JES2     JES2     IEFPROC  NSW  S  RACF     RACF     RACF     NSW  S
                                            TSO      TSO      STEP1    OWT  S  TN3270   TN3270   TN3270   NSW  SO
                                            FTPD1    STEP1    FTPD     OWT  AO INETD2   STEP1    INETD    OWT  AO
                                            RSED9    STEP1    STCRSE   IN   AO RSED1    STEP1    STCRSE   OWT  AO
                                            RSED2    STEP1    STCRSE   IN   AO DBL1MSTR DBL1MSTR IEFPROC  NSW  S
                                            DBL1IRLM DBL1IRLM          NSW  S  DBL1DBM1 DBL1DBM1 IEFPROC  NSW  S
                                            DBL1DIST DBL1DIST IEFPROC  NSW  SO RMF      RMF      IEFPROC  NSW  S
                                            M80AMSTR M80AMSTR PROCSTEP NSW  S  M80ACHIN M80ACHIN PROCSTEP NSW  SO
                                            M7AAMSTR M7AAMSTR PROCSTEP NSW  S  CT53H5T1 CT53H5T1 CICS     NSW  SO
                                            DBT1MSTR DBT1MSTR IEFPROC  NSW  S  DBT1IRLM DBT1IRLM          NSW  S
                                            DBT1DBM1 DBT1DBM1 IEFPROC  NSW  S  DBT1DIST DBT1DIST IEFPROC  NSW  SO
                                            M80QMSTR M80QMSTR PROCSTEP NSW  S  M80QCHIN M80QCHIN PROCSTEP NSW  SO
                                            CT31V1A1 CT31V1A1 CICS     NSW  SO CT52O1A2 CT52O1A2 CICS     NSW  SO
                                            CT52O0CM CT52O0CM CICS     NSW  SO BBGZANG2 BBGZANG2 STEP1    NSW  SO
                                            CT53H3A1 CT53H3A1 CICS     NSW  SO GTFNG    B34F     IEFPROC  NSW  S
                                            M80EMSTR M80EMSTR PROCSTEP NSW  S  M80ECHIN M80ECHIN PROCSTEP NSW  SO
                                            CICS004  STEP1    CICS004  IN   AO
                                           IMS008  OWT      CICS004 OWT

```

素敵です。
PCOMだと出力結果が他のSYSLOGとまざって流れてしまったり、1行に収まらない長ったらしいコマンドを打つ時には"+"を打って別ウィンドウを開いたりと面倒ですが、これだとそんなことは気にする必要はありませんね。

# おわりに
eclipseとかブラウザとか、z/OSもいろいろがんばって新しいユーザーインターフェースを出してきています。でも、それだと「慣れればPCOMの方が早いんだよ」という常套句の前になかなか浸透しない恐れがあると思っています。GUIは、初めてでも使いやすかったりグラフとか可視化するには便利ですが、自動化とか繰り返しとかログ取得とか日常的な操作には不向きな点も多いです。その辺りの操作については、やっぱりCUIでの使い勝手を追求するってのが正解だと思っています。
z/OS の場合、teraterm(SSH) + REXX + シェル・スクリプトというので色々便利なことができる、ということに最近気づいたので、今後、その辺記事にしていこうと思います。(z/OS MFのREST APIがかなり気になってますが、まだすぐに使える環境が無いのでそこは後々...)

#参考
[z/OS Tips：USS上のファイルをPDSのメンバーへコピーする](http://qiita.com/soumei/items/15893483b81e0b6e91b7)