はじめに
合同会社グレストリで経理担当をしている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引退作になるでしょう。