オープンソースでの	  COBOLの基幹システム開発	

オープンCOBOLワーキンググループ	  	  峰松 浩樹	

自己紹介	••

氏名：峰松 浩樹	  所属	  – OSSコンソーシアム	  	  h(p://www.osscons.jp/	  OpenCOBOLワーキンググループ	  •所属	  – 有限会社ランカードコム	  – 本社：長崎県長崎市扇町	  – 東京：四ッ谷事務所	  •業種：	  – 長崎県庁他 自治体向け業務	  – 民間企業向けWebアプケーション構築等	  	  Twi(er:	  @minemaz	  	  Mail:	  mine@lancard.com	  		  	  12/05/25		  	  2	概略	• 自己紹介	  • COBOLについて	  • オープンソースのCOBOL	  • OpenCOBOLについて	  • 事例紹介	  – ORCA	  – 海外	  – 長崎県	  • 国内での活動状況	  	  12/05/25	

3	

COBOLについて	
• 事務処理用に開発されたプログラミング言語	  • 最初のリリースは	  1959年（昭和34年）	  • 非理系の事務員でも使用可能	  • 自然言語である英語に近い記述	  • 特に金額計算など事務処理（商用計算）の用途に	  広く使われている。	  
• 演算精度が高い	  12/05/25	

4	COBOLプログラム例（１）	
000100*	 HELLO.COB	 OpenCOBOL	 FAQ	 example	 
000200	 IDENTIFICATION	 DIVISION.	 
000300	 PROGRAM-ID.	 hello.	 
000400	 PROCEDURE	 DIVISION.	 
000500	 	 	 	 	 DISPLAY	 "Hello	 World!".	 
000600	 	 	 	 	 STOP	 RUN.	 	 

12/05/25	

5	COBOLプログラム例（２）		 
IDENTIFICATION	 DIVISION.	 
PROGRAM-ID.	 hello.	 
PROCEDURE	 DIVISION.	 	 DISPLAY	 "Hello	 World!".	 	 STOP	 RUN.	 	 

12/05/25	

6	演算精度が高い	• 十進数固定小数点にて値を保持	  • 31桁（OpenCOBOL）の有効桁	  （メーカー実装によってはさらに精度が高い）	  • 例：	  数値丸め round(0.49999999999)	  の値が	  正しく	  0	  になります	  
（1になってしまう実装があります）	  12/05/25	

7	

オープンソース COBOLコンパイラ	
• COBOLからバイナリへの変換	  – TinyCOBOL	  • 非常に基本的な機能のみの実装。非業務向け	  – OpenCOBOL	  • ORCAプロジェクト用に開発された日本発の	  COBOLコンパイラ	  • COBOLからJavaクラスファイルへの変換	  – P3/COBOL	  • 実績少ない	  – NECA	  • メンテナンス停止中	  12/05/25	

8	

OpenCOBOLについて	
• COBOLからC言語への変換とコンパイル	  • 元開発者は日本人（西田 圭介 氏）	  • 現開発者はRoger	  While氏	  • 現バージョンは OpenCOBOL	  1.0	  • OpenCOBOL	  1.1では画面制御機能の拡充と	  デバッグ機能の強化等	  12/05/25	

9	

OpenCOBOLについて	
• 取り扱い可能なデータ形式	  – 固定長レコード	  – Berkeley	  DB （ISAM形式）	  – PostgreSQL（OSSコンソーシアムにて拡張中）	  – 組み込みSQL （EXEC	  SQL等）（拡張）	  	  • 主にバッチ処理にて効果を発揮する	  12/05/25	

10	

OpenCOBOLについて	
• OSS	  コンソーシアム	  オープンCOBOLソリューション部会	  参加企業により	  日本語対応進行中	  12/05/25	

11	

OpenCOBOL事例	
• 国内	  – 日本医師会総合政策研究機構 JMARI ORCA	  – 長崎県 汎用機ダウンサイジング	  – 関西方面	  JA	  	  オフコンからLinuxへの移行	  • 海外	  – フランス財務省
MicroFocus	  →	  OpenCOBOL	  – ロイヤル・アホールド（英国：世界3位の小売業者）
IBM	  COBOL	  →	  OpenCOBOL	  – FlyBuys	  (オーストラリア：カード、買物ポイント付与）
Fujitsu	  COBOL	  →	  OpenCOBOL	  12/05/25	

12	日本医師会総合政策研究機構		  12/05/25	

13	

長崎県：今までの経緯		  • 2008年：長崎県様よりOpenCOBOLを	  使った移植可能性について調査依頼	  • 2009年：Webアプリとして既存のCOBOL	  
ソースを流用できないか調査依頼	  • 2010年：JCL等バッチ処理について本格的な	  移植ツールの実装	  • 2011年：バッチ編集、管理画面の実装。	  
既存データの移行等	  • 2012年：実機と並行運用	  12/05/25	

14	

実装環境	• 既存環境：	  – 国産メーカ汎用機	  – 専用ページプリンタ	  – 専用端末エミュレータ	  	  • 移行先：	  – Linuxサーバ数台（業務種類毎に1台ずつ）	  – 印刷出力はPDFファイルにて生成	  – Webブラウザで（JCL、COBOLプログラムの	  編集など）端末操作	
12/05/25	

15	

作業対象	• 職員総合、財務会計、予算編成の3システム	  • COBOLプログラム	  – 合計で約500万行、約1万5千本	  	  • JCL（ジョブコントロール言語）	  – 合計で約100万行、約6500本	  	  • 帳票レイアウト	  – 職員総合システムで約400本	  – 他システムは未知数（同数程度、計1200本？）	  12/05/25	

16	

移行イメージ	

汎用機リソース		  移植	  ツール	

Linuxサーバ	

JCL	  (ジョブ操作)	

JCL2perl	Perl(など）	

COBOL	

acos2oc	

OpenCOBOL	

帳票	

formconv	  ocprinter	

PDF出力	

データファイル	

convacosbin	  TXT2ISAM	  ISAMファイル	

12/05/25	

17	

汎用機からの移行	
移行前環境。大型汎用機と専用端末（エミュレーション使用）での接続	  大型機	

ベンダ独自プロトコルで接続（B4670）	

専用端末	

12/05/25	

18	

汎用機からの移行(入力端末移行)	
専用端末以外の端末からもデータエントリを可能とし将来の置き換えに備える	  大型機	ゲートウェイ	  サーバ	

ベンダ独自	  プロトコル	
専用端末	

12/05/25	

MySQL	  サーバ	

TCP/IP	Web	  アプリ	19	

汎用機からの移行(並行運用)	
汎用機とlinuxの並行運用。データの突き合わせを行いながら	  動作相違箇所のチェック、運用上のノウハウの蓄積を行う	  大型機	ゲートウェイ	  サーバ	MySQL	  サーバ	
TCP/IP	

ベンダ独自	  プロトコル	

2012年5月	  OpenCOBOL	  Linux	  専用端末	

12/05/25	

Web	  アプリ	20	

汎用機からの移行(移行完了)	
汎用機撤去後の環境	  OpenCOBOL/Linuxにて処理を行い、データエントリもWebアプリから実施する	  OpenCOBOL	  Linux	  MySQL	  サーバ	Web	  アプリ	TCP/IP	
2013年9月予定	  12/05/25	

21	

長崎県での状況	
• プロジェクトはredmineで管理	  	  • プロジェクトのソース、バイナリはsubversionで配布	  	  • 長崎県職員と複数の業者メンバーが参加	  （職員7人、4社	  18人程度）	  • CentOS5+perl+OpenCOBOL+mysqlで	  各社内でコンパイル、実行、帳票デザインが可能に	  • OSSで全体的な開発コストが低下	  12/05/25	

22	

既存COBOLソースの変換と問題点	
• データ型、演算精度の違い	  •COMP-­‐1 浮動小数点、丸め誤差	  	  • 文字の取り扱い	  •全角文字列、SPACEの解釈	  	  • 文字罫線	  •外字領域にマップされた文字罫線	  	  • 外字	  •12/05/25	

地名、人名、特殊記号	  23	

既存COBOLソースの変換と問題点	
• 自動変換と移植工数	  • 業務ロジックを変えるわけではないので、	  ほとんど機械的に置き換えが出来る	  →	  自動変換を検討		  • 自動変換でカバーしていない無いパターン	  は都度パターン追加	  →	  移植ノウハウの自動化	  12/05/25	

24	php+OpenCOBOL+Perl+MySQL	• PHP側記述例	  if(!extension_loaded('opencobol'))	 {	 	 	 	 	 dl('opencobol.so'	 .	 PHP_SHLIB_SUFFIX);	 
}	 $err	 	 	 	 =	 opencobol_init();	 
$handle	 =	 opencobol_load("/tmp/TEST0001.so");	 
$err	 	 	 	 =	 opencobol_call(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 $handle,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 "TEST0001",	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 array(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 "WK-KETA"	 =>	 "9876543",	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 "WK-A"	 =>	 "ABCDEFGHIJKLMNOPQRSTUVWXYZ”));	 	 

12/05/25	  25	  php+OpenCOBOL+Perl+MySQL	• OpenCOBOL側記述例	  	 	 *	 	 	 	 OPEN	 	 	 	 	 	 	 INPUT	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 IN4-F.	 	 	 	 	 	 	 CALL	 "cob_perl_require"	 USING	 "COB_PERL.pm”	 	 	 	 	 	 	 CALL	 "cob_perl_call"	 USING	 "mydb_open"	 	 	 	 	 	 	 	 	 	 	 	 "IN4-F"	 "AIACF050".	 	 	 	 	 	 	 CALL	 "cob_perl_results"	 USING	 	 	 	 	 	 	 	 	 	 	 	 	 COBPERL-STATUS	 LN010-FSTAT1.	 	 
〜略〜	 	 	 	 	 	 	 	 CALL	 "cob_perl_close".	 

12/05/25	  26	  php+OpenCOBOL+Perl+MySQL	• Perl側記述例	  sub	 mydb_open	 {	 	 	 	 	 my	 ($fh,	 $dbname)	 =	 shift;	 	 	 	 	 eval	 {	 	 	 	 	 	 	 	 	 require	 $dbname.".pm";	 	 	 	 	 };	 	 	 	 	 my	 $db;	 	 	 	 	 eval	 "\$db	 =	 new	 $dbname();";	 	 	 	 	 $COBPERL_DB::dbnames{$fh}	 =	 $db;	 	 	 	 	 $db->{'dbname'}	 =	 $dbname;	 	 	 	 	 $db->{'status'}	 =	 "00";	 	 	 	 	 $db->{'fstatus'}	 =	 "00";	 	 	 	 	 $db->Open;	 	 	 	 	 ($db->{'fstatus'},	 $db->{'status'});	 
}	 
12/05/25	  27	  php+OpenCOBOL+Perl+MySQL	
PHP	• ユーザインタフェイス	

OpenCOBOL	 • 業務ロジック	

Perl+MySQL	 • データアクセス	

12/05/25	  28	  オープンソースCOBOLの利点	
• 他オープンソースとの親和性	  – Ruby、Perl、PHP、Java	  他との相互接続	  • オープンソースのDBとの接続	  – MySQL、PostgreSQL、sqliteなど	  • OpenCOBOLの拡張	  – 文法的拡張	  – 仕様的な拡張	  • OSSで全体的な開発コストが低下	  12/05/25	

29