DockerでメインフレームOSを動かす(HelloWorld!を表示させる)

昨日、[DockerでメインフレームOSを動かす](https://qiita.com/madilloar/items/35cb8534910302802f19)を投稿しましたが、メインフレームOSで``Hello World！``を表示するCOBOLプログラムを動かしてみます。

gitリポジトリに、COBOLプログラムとコンパイル＆リンクするJCLの``hellocob.jcl``とmvsにこのファイルをsubmitする``hercsub``perlスクリプトを追加しました。このjclをperlスクリプトでmvsのポート3050に流し込んで実行します。

```bash:ホストOSのbashプロンプト
./hercsub localhost:3505 hellocob.jcl
```

mvsのlogにちょっとわかりにくいですが、<font color="red">```+Hello World!``</font>次が出ていると思います。

```ホストOSでdocker exec -it prj_turnkey4_turnkey4_1 bash -c 'tail -f /opt/turnkey4/log/3033.log'

HHC01040I 0:000C COMM: client <unknown>, ip 172.18.0.1 connected to device 3505
HHC01206I 0:000C Card: client <unknown>, ip 172.18.0.1 disconnected from device 3505
11.17.39 JOB    2  $HASP100 COBOL    ON READER1     MADILLOAR
11.17.39 JOB    2  IEF677I WARNING MESSAGE(S) FOR JOB COBOL    ISSUED
11.17.39 JOB    2  $HASP373 COBOL    STARTED - INIT  1 - CLASS A - SYS TK4-
11.17.39 JOB    2  IEF403I COBOL - STARTED - TIME=11.17.39
11.17.39 JOB    2  +Hello World!
11.17.39 JOB    2  IEF404I COBOL - ENDED - TIME=11.17.39
11.17.39 JOB    2  $HASP395 COBOL    ENDED
11.17.39           $HASP309    INIT  1 INACTIVE ******** C=A
11.17.39 JOB    2  $HASP150 COBOL    ON PRINTER1       370 LINES
11.17.39           $HASP160 PRINTER1 INACTIVE - CLASS=A
11.17.39 JOB    2  $HASP250 COBOL    IS PURGED
11.29.52 STC   28  $HASP150 MF1      ON PRINTER1       211 LINES
11.29.52           $HASP160 PRINTER1 INACTIVE - CLASS=A
11.29.52 STC   28  IRB101I MF/1 REPORT AVAILABLE FOR PRINTING
```

## hercsub perlスクリプト

```perl:hercsub
#!/usr/bin/perl
use Socket;
use IO::Socket::UNIX;
use IO::Socket::INET;

if (@ARGV < 1) {
  print STDERR "Usage: hercsub socket_spec [job]\n";
  exit 2;
}

my $spec = shift @ARGV;
my $sock;

if ($spec =~ m{^/}) {
  $sock = IO::Socket::UNIX->new(Peer => $spec);
} else {
  $sock = IO::Socket::INET->new(PeerAddr => $spec);
}

die "Failed to connect to socket $spec: $!\n" unless defined($sock);

while (<>) {
  print $sock $_;
}
```

## Hello World! COBOLプログラムとコンパイル＆リンクJCL

```JCL:hellocob.jcl
//COBOL    JOB ,'MADILLOAR',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)
//*********************************************************************
//*        DEFINE COMPILE AND LINK AND EXECUTE PROCEDURE
//*********************************************************************
//CLEXEC   PROC
//*--------------------------------------------------------------------
//*        COMPILE
//*--------------------------------------------------------------------
//COMPILE  EXEC PGM=IKFCBL00,REGION=4096K,
//         PARM='NOSEQ,DMAP,PMAP'
//SYSPRINT DD SYSOUT=*
//SYSPUNCH DD SYSOUT=*
//SYSLIB   DD UNIT=SYSDA,SPACE=(TRK,(1,,1))
//SYSUT1   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSUT2   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSUT3   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSUT4   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSLIN   DD DISP=(MOD,PASS),UNIT=SYSDA,SPACE=(80,(500,100))
//*--------------------------------------------------------------------
//*        LINK
//*--------------------------------------------------------------------
//LINK     EXEC PGM=IEWL,REGION=2048K,
//         PARM='LIST,LET,MAP,XREF'
//SYSPRINT DD SYSOUT=*
//SYSLIN   DD DISP=(OLD,DELETE),DSNAME=*.COMPILE.SYSLIN
//         DD DDNAME=SYSIN
//SYSLMOD  DD DISP=(,PASS),DSNAME=&GODATA(RUN),
//            UNIT=SYSDA,SPACE=(1024,(50,20,1))
//SYSLIB   DD DISP=SHR,DSNAME=SYS1.COBLIB
//SYSUT1   DD UNIT=(SYSDA,SEP=(SYSLIN,SYSLMOD)),SPACE=(1024,(50,20))
//*--------------------------------------------------------------------
//*        EXECUTE
//*--------------------------------------------------------------------
//EXECUTE  EXEC PGM=*.LINK.SYSLMOD,COND=((5,LT,COMPILE),(5,LT,LINK))
//SYSPRINT DD SYSOUT=*
//         PEND
//*********************************************************************
//*        LIKE HERE DOCUMENT
//*********************************************************************
//HEREDOC  EXEC CLEXEC
//COMPILE.SYSIN DD *
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.  'HELLO-WORLD'.
000300 ENVIRONMENT DIVISION.
000400 CONFIGURATION SECTION.
000500 DATA DIVISION.
000600 WORKING-STORAGE SECTION.
000700 77  HELLO-MSG     PIC X(12) VALUE 'Hello World!'.
000800*--1----+----2----+----3----+----4----+----5----+----6----+----7--
000900 PROCEDURE DIVISION.
001000     DISPLAY HELLO-MSG UPON CONSOLE.
001100     GOBACK.
//
//
```