gracetory’s blog

東池袋にある合同会社グレストリのエンジニアブログです

COBOLでWEBアプリケーション開発のはじめの一歩

f:id:grnishi:20170913102639j:plain

はじめに

合同会社グレストリで経理担当をしているgrnishiです。好きな青色はターコイズブルーです。

今回エンジニアブログを執筆するにあたり、経理担当らしい題材を探してみましたがなかなか見つからないので、COBOLでWEBアプリケーションを作ってみたいと思います。

COBOLは皆さんご存知の通り事務員でも扱えるような設計になっており、また金融関係では広く利用されていました。(現在は知りません)

経理といえばお金。お金といえば銀行。銀行といえばCOBOL。

Googleで探してみるとGnuCOBOL(以前はOpenCOBOL)というオープンソースのCOBOLコンパイラを使って構築している人がいました。

qiita.com http://itdoc.hitachi.co.jp/manuals/3020/30203D90G0/J2C20015.HTMitdoc.hitachi.co.jp

何度目の車輪の再発明になるかわかりませんが、ちょっと遊んでみたいと思います。

環境構築

今回はCentOS6.7にCOBOL環境を構築します。

%> cat /etc/redhat-release
CentOS release 6.7 (Final)

GnuCOBOLのインストールの前に、先に必要なものをインストール。

yum install gmp-devel help2man

まずGnuCOBOLのソースコードを取得します
こちらからダウンロードできます。
今回は2.2を。更新日は2017年7月20日である事に驚きを隠せません。

wget https://sourceforge.net/projects/open-cobol/files/gnu-cobol/2.2/gnucobol-2.2-rc.tar.gz/download -O gnucobol-2.2-rc.tar.gz

展開からの一連のコマンド。
berkeleyDB求められるけど必要無いかなと思い–without-dbを。

tar zxvf gnucobol-2.2-rc.tar.gz
./configure --without-db
make
make test
make check
make install

/etc/ld.so.confに下記を記述

include ld.so.conf.d/*.conf

ldconfigを実行しておく

sudo ldconfig

cobcコマンドの確認

%> cobc --version
cobc (GnuCOBOL) 2.2-rc.0
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Keisuke Nishida, Roger While, Ron Norman, Simon Sobisch, Edward Hart
Built     Jul 28 2017 20:45:44
Packaged  Jul 20 2017 20:13:05 UTC
C version "4.4.7 20120313 (Red Hat 4.4.7-17)"

とりあえず環境構築はできました。

当然のHelloWorld

まずはhelloworldをやってみます。
wikipediaからサンプルソースを。 ファイル名はhelloworld.cobとします。

cat helloworld.cob

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLO.
000300 PROCEDURE DIVISION.
000400     DISPLAY 'HELLO, WORLD!'.
000500     STOP RUN.

コンパイルします。
cobc(コボシー?コブシー?)でコンパイルです。gccとかjavacと同じですね。
-x は実行ファイルを作成するそうです。

%> cobc -x helloworld.cob
%> ./helloworld
HELLO, WORLD!

はい。出来ました。

一応FizzBuzzも

helloworldだけだとアレなんで、wikipediaにFizzBuzzがあったのでこれも試してみる。

cat fizzbuzz.cob

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. FIZZBUZZ.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 I                                PIC 9(3).
000600 01 HENSHU-IKI                       PIC X(4).
000700 01 HENSHU-NUM REDEFINES HENSHU-IKI  PIC BZZ9.
000800 01 DUMMY-IKI                        PIC X(1).
000900 PROCEDURE DIVISION.
001000     PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
001100       EVALUATE FUNCTION MOD(I 3) = ZERO
001200           ALSO FUNCTION MOD(I 5) = ZERO
001300       WHEN TRUE  ALSO TRUE
001400         DISPLAY 'FIZZBUZZ'
001500       WHEN TRUE  ALSO FALSE
001600         DISPLAY 'FIZZ'
001700       WHEN FALSE ALSO TRUE
001800         DISPLAY 'BUZZ'
001900       WHEN OTHER
002000         MOVE I TO HENSHU-NUM
002100         UNSTRING
002200           HENSHU-IKI DELIMITED BY ALL SPACE
002300           INTO DUMMY-IKI HENSHU-IKI
002400         END-UNSTRING
002500         DISPLAY HENSHU-IKI
002600       END-EVALUATE
002700     END-PERFORM.
002800     STOP RUN.

例のごとくコンパイル&実行

%> cobc -x fizzbuzz.cob
%> ./fizzbuzz
1
2
FIZZ
4
BUZZ
FIZZ
7
8
FIZZ
BUZZ
11
FIZZ
13
14
FIZZBUZZ
16
17
FIZZ
以下略

動きました。ここまで来るのに2時間ぐらい経ってます。

CGIとして動かす

まずはhttpd.confに下記を追加

<Directory /path/to/document_root/cobol-app/>
     AddHandler cgi-script .cgi
     Options +ExecCGI
</Directory>

とりあえずわかりやすくcobol-appというディレクトリにしておきましたが、何でもいいです。 一般的にはcgi-binですかね。perlから離れて12年なので今は昔です。

で、HTML用のCOBOLソース

000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. HELLO_HTML.
000020 ENVIRONMENT DIVISION.
000030 DATA DIVISION.
000040 WORKING-STORAGE SECTION.
000050 01 CR PIC X.
000060 PROCEDURE DIVISION.
000070 MAIN.
000080 MOVE FUNCTION CHAR(14) TO CR.
000090 DISPLAY 'Content-type: text/html'.
000100 DISPLAY CR.
000110 DISPLAY '<!DOCTYPE html>'.
000120 DISPLAY '<html lang="ja">'.
000130 DISPLAY '<head>'.
000140 DISPLAY '<meta charset="UTF-8">'.
000140 DISPLAY '<title>タイトル</title>'.
000150 DISPLAY '</head>'.
000160 DISPLAY '<body>'.
000170 DISPLAY 'Hello HTML!'.
000180 DISPLAY '</body>'.
000190 DISPLAY '</html>'.
000200 STOP RUN.

COBOLの作法とか知りませんがとりあえず。ヘッダーの改行出力の部分で相当はまりました。

DISPLAY ''.

とかやると怒られるんですが、それは私がCOBOLをわかっていないからでしょうか?

さいごに

これが私のCOBOL引退作になるでしょう。