1   PerlでJCL、                                  基幹バッチをダウンサイジング    Perlを使った基幹システムのマイグレーションの現場からYAPC::Asia 2011 Tokyo / mine...
2                                                     自己紹介                        名前:               峰松 浩樹                ...
3YAPC::Asia 2011 Tokyo / mine@lancard.com   11/10/15
4                                                  概略                        ダウンサイジングにPerlを使った理由                        ...
5                                                 実装環境                        既存環境:                               国内メーカ汎...
6                                                          作業対象                        職員総合、財務会計、予算編成の3システム              ...
7                                                対応                        COBOLプログラムを大規模に書き換える                        ツ...
8                                           Perlを使った理由(JCL)                        機能:ほとんどは固定長テキストのデータ処理                 ...
9                                                  JCL移植例(JCL)               JOR OUTID=SPR OUTDEV=PR/M050/JSTD CLASS=A    ...
10                                                 JCL移植例(Perl)               #!/usr/bin/perl               use strict;   ...
11                              Perlを使った理由(COBOL)                        移植:                               書換パターンが確定すれば処...
12                                                                          移植作業                               COBOLソースの変...
13                                                       modules                        Parse::EYapp                     ...
14                                           Parse::EYapp                        Perlのyacc互換パーサParse::Yapp の拡張実装         ...
15                                                           Parse::EYapp                        JCL内のSORTパラメータ解析(パラメータ例:...
16                                                                  Parse::EYapp                        JCL内のSORTパラメータ解析(...
17                                                               Parse::EYapp                        Parse::EYapp 用 eypファ...
18                                                             印刷                        汎用機プリンタのエミュレーション                ...
19                    php+OpenCOBOL+Perl+MySQL                        COBOLは固定長のバイト列を扱う                        Perlで固定長の...
20                    php+OpenCOBOL+Perl+MySQL                        PHP側記述例               if(!extension_loaded(opencobo...
21                    php+OpenCOBOL+Perl+MySQL                        OpenCOBOL側記述例                *   OPEN      INPUT   ...
22                    php+OpenCOBOL+Perl+MySQL                        Perl側記述例               sub mydb_open {             ...
23                                                          今後                        公開許可をとる                        Ope...
24                        ご清聴ありがとうございましたYAPC::Asia 2011 Tokyo / mine@lancard.com   11/10/15
Upcoming SlideShare
Loading in …5
×

PerlでJCL,基幹バッチをダウンサイジング

2,851 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,851
On SlideShare
0
From Embeds
0
Number of Embeds
271
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

PerlでJCL,基幹バッチをダウンサイジング

  1. 1. 1 PerlでJCL、  基幹バッチをダウンサイジング Perlを使った基幹システムのマイグレーションの現場からYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  2. 2. 2 自己紹介  名前: 峰松 浩樹  : 長崎県在住  所属: 有限会社ランカードコム  email: mine@lancard.com  twitter: minemaz  趣味: 猫いじりYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  3. 3. 3YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  4. 4. 4 概略  ダウンサイジングにPerlを使った理由  Perlで構文解析 Parse::EYapp  ダウンサイジング実際にやってみた  今後YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  5. 5. 5 実装環境  既存環境:  国内メーカ汎用機  専用ページプリンタ  専用端末エミュレータ  移行先:  Linuxサーバ数台(業務種類毎に1台ずつ)  印刷出力はPDFファイルにて生成  Webブラウザで(JCL、COBOLプログラムの 編集など)端末操作YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  6. 6. 6 作業対象  職員総合、財務会計、予算編成の3システム  COBOLプログラム  合計で約500万行、約1万5千本  JCL(ジョブコントロール言語)  合計で約100万行、約6500本  帳票レイアウト  1システムで約400本  計1200本前後?YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  7. 7. 7 対応  COBOLプログラムを大規模に書き換える  ツールで自動書換  コンパイラ側を改造する  既存プリンタのエミュレーションでPDF出力  MySQLなどの操作用にCOBOLを拡張  JCLは習得と導入が簡単な他言語へ変換するYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  8. 8. 8 Perlを使った理由(JCL)  機能:ほとんどは固定長テキストのデータ処理  フィルタ処理  並べ替え  編集  構文:JCL的なDSLを構成しやすそうだった  GOTO  ヒアドキュメント  括弧無しでsub呼び出し  機械的に置き換え可能?YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  9. 9. 9 JCL移植例(JCL) JOR OUTID=SPR OUTDEV=PR/M050/JSTD CLASS=A ; COMM 月次パラメタSTORE; INPUT ACCEPT1,TYPE=DATA,LIST=YES; AIDF0270 1 4210918 例月(1)+△+支給日 AIDF0271 4210822 4210918 償還完了者リスト抽出期間(自~至) ******** *前回支給日の翌日~今回支給日 ENDINPUT; CREATESEQ INFILE=(ACCEPT1 FILESTAT=SYSIN ) OUTFILE=(AID.F089K RECSIZE=80 BLOCKSZ=11440 RECFORM=FB BPB=4); COMM 引去金ファイル作成; AIDM2510:STEP AIDM2510 FILE=AIA.IL1 DUMP=DATA; ASSIGN AIDF0010 AID.F101 SHARE=ALL HOLDMODE=NO;YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  10. 10. 10 JCL移植例(Perl) #!/usr/bin/perl use strict; use warnings; use JCL; JOR "OUTID=SPR OUTDEV=PR/M050/JSTD CLASS=A "; COMM "月次パラメタSTORE"; INPUT "ACCEPT1,TYPE=DATA,LIST=YES",<<_EOT; AIDF0270 1 4210918 例月(1)+△+支給日 AIDF0271 4210822 4210918 償還完了者リスト抽出期間(自~至) ******** *前回支給日の翌日~今回支給日 _EOT ENDINPUT; CREATESEQ "INFILE=(ACCEPT1 FILESTAT=SYSIN )", "OUTFILE=(AID.F089K RECSIZE=80 BLOCKSZ=11440 RECFORM=FB BPB=4)"; COMM "引去金ファイル作成"; AIDM2510: STEP "AIDM2510 FILE=AIA.IL1 DUMP=DATA"; ASSIGN "AIDF0010 AID.F101 SHARE=ALL HOLDMODE=NO";YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  11. 11. 11 Perlを使った理由(COBOL)  移植:  書換パターンが確定すれば処理をコード化  COBOLプログラマの負担を軽く  機能:  cob_perl.so (OpenCOBOLから perl 呼び出し)  DBI、DBDでのMySQL操作  MySQL-COBOL間の細かいデータ編集  文字コード変換YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  12. 12. 12 移植作業  COBOLソースの変換とコンパイル $ acos2oc.pl COBFILE.txt  JCLの変換 $ JCL2perl.pl JCLFILE.txt > JCLFILE.jcl  帳票レイアウトファイルの変換 $ cp FORMFILE.txt form/FORMFILE.fromYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  13. 13. 13 modules  Parse::EYapp  Perlのyacc互換パーサParse::Yapp の拡張実装  CIsam  vbISAM操作用  PDF::Haru  libharuを使用した高速なPDF生成YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  14. 14. 14 Parse::EYapp  Perlのyacc互換パーサParse::Yapp の拡張実装  EBNF-like な構文で構文木の自動生成  パーサ本体をクラスとして生成  サンプルも多く非常に使いやすいYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  15. 15. 15 Parse::EYapp  JCL内のSORTパラメータ解析(パラメータ例:1) FUNCTION: RECORD: KEY=(1 26) INCLUDE=(1 5 EQ "42101") AND (13 6 EQ "080205") INCLUDE=(1 5 EQ "42101") AND (13 6 EQ "080206") INCLUDE=(1 5 EQ "42101") AND (13 6 EQ "080207") INCLUDE=(1 5 EQ "42101") AND (13 6 EQ "080208") ENDSORT:YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  16. 16. 16 Parse::EYapp  JCL内のSORTパラメータ解析(パラメータ例:2) RECORD ARRANGE=(1 3)(",")(4 2)(",")(6 5)(",") (11 2)(",")(13 2)(",")(15 2)(",")(17 2)(",") (19 2)(",")(21 6)(",")(27 2) ENDPARAMYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  17. 17. 17 Parse::EYapp  Parse::EYapp 用 eypファイル記述例(部分) def : OMIT = omits { __PACKAGE__->addOmitChain(@{$_[3]}); } | INCLUDE = includes { if (ifExistsIncludesChain(@{$_[3]})) { __PACKAGE__->addIncludeChain(@{$_[3]}); } } | KEY = keys { __PACKAGE__->setKeyChain(@{$_[3]}); } | SUM = sums { __PACKAGE__->setSumChain(@{$_[3]}); } | ARRANGE = arranges { __PACKAGE__->setArrangeChain(@{$_[3]}); } | MODREC = modrecs { __PACKAGE__->addModrecChain(@{$_[3]}); } ; keys : keys sp key { [@{$_[1]},$_[3][0]] } | key { [@{$_[1]}] } ;YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  18. 18. 18 印刷  汎用機プリンタのエミュレーション  書式定義をそのまま使用して罫線生成  PDF出力  PDF::Haru (libharu へのPerlインタフェイス)  PDF::API2 (PDFの連結でのみ使用)  当初は PDFJを使用していたが、速度的な問題で 書き換えYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  19. 19. 19 php+OpenCOBOL+Perl+MySQL  COBOLは固定長のバイト列を扱う  Perlで固定長のバイト列作ってやればいい?  タブンネ  MySQLとのやり取りをperlに任せればOK?  タブンネYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  20. 20. 20 php+OpenCOBOL+Perl+MySQL  PHP側記述例 if(!extension_loaded(opencobol)) { dl(opencobol. . PHP_SHLIB_SUFFIX); } $err = opencobol_init(); $handle = opencobol_load("/tmp/TEST0001.so"); $err = opencobol_call( $handle, "TEST0001", array( "WK-KETA" => "9876543", "WK-A" => "ABCDEFGHIJKLMNOPQRSTUVWXYZ”));YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  21. 21. 21 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".YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  22. 22. 22 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}); }YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  23. 23. 23 今後  公開許可をとる  OpenCOBOLのSCREEN SECTIONの実装を拡張  日本語化等 Cmenu、Curses併用  組込SQL(EXEC SQL 〜 END-SQL)を実装する  (perlで変換して、perl経由で呼び出す)  これを機会に長崎でもperlユーザが集まって、 Nagasaki.pm (仮称)が出来たらいいな等YAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15
  24. 24. 24  ご清聴ありがとうございましたYAPC::Asia 2011 Tokyo / mine@lancard.com 11/10/15

×