Web開発のための基礎知識

CGIのディバッグ

EnterpriseServer のRPGエンジンの利用による利点はまだあります。
しかもそれは開発者にとって非常に重要な 「ディバッグ」 というステージです。
おおよそソフトウェアの開発工程においては開発そのものよりもディバッグに時間を要します。

● IBM の紹介するディバッグ手法

IBMマニュアル等で解説されているディバッグの手法は、CGIを実際にブラウザから動作させて
HTTPサーバーのプロセスの中でディバッグするというものです。
しかしHTTPサーバーは複数のプロセス(JOB)を保有しているために、どのプロセスで実行されるかは
HTTPサーバーのみ知るということになります。

そこでIBMでは

CHGHTTPA NBRSVR(2 2)[実行]キー

によってHTTPサーバーのプロセスをひとつだけしか稼動しないように設定しておいてから、
STRTCPSVR *HTTP によってHTTPサーバーを起動させて、実行されるJOB の情報を
WRKACTJOB によって調べておきます。

STRSRVJOB JOB(010804/QTMHHTTP/QTHTTP00385) STRDBG PGM(MYLIB/MGCGI) UPDPROD(*YES)

によってサービス・ジョブの開始によって ADDBKP などを設定してディバッグするというものです。
つまり、これはバッチ・ジョブのディバッグ手法と同じです。

しかし、これは HTTPサーバーのプロセスをひとつだけに絞るために複数の開発者が同時に
ディバッグすることはできません。 誰か一人ががディバッグ中であれば、残る他の開発者がディバッグするには
その人がディバッグを終えるまで待たなければなりません。 これは現実的であるとは言えないでしょう。

もし、開発機( System i )と本番機( System i )が同じ一台であり、既にHTTPサーバーによる本稼動を
開始していたのであれば、HTTPサーバーのプロセスをひとつに絞ることは不可能です。
となると追加開発のディバッグは至難の技となってしまいます。
またサービス・ジョブを稼動させてという面倒な作業は時間の限られている開発者にとって煩わしいものです。

● RPGエンジンによるディバッグ手法

EnterpriseServer によって提供される「RPGエンジン」をバインドしたCGIであればディバッグも
通常の RPG開発と変わることはありません。
EnterpriseServer には 「STRCGIDBG」というコマンドが提供されています。

                               CGI ディバッグ開始  (STRCGIDBG)                        
                                                                                      
        選択項目を入力して,実行キーを押してください。                                
   
     CGIプログラム  . . . . . . .     CGI004       名前                         
       ライブラリー  . . . . . . . .     CGIBIN       名前 , *LIBL, *CURLIB        
     メソッド  . . . . . . . . . . .   GET           GET, POST                     
     モジュール・ソース表示  . . . .   *PGMDEP       *PGMDEP, *NO, *YES            
     標準入力または QUERY_STRING . .   '@TEMPLATE=/AS400-NET.USR/PROJECT/CGI004/DB2
   _DSPDSPLY.HTM&SHCODE=NV-CF1'

のようにCGIに渡すパラメータを 「標準入力または QUERY_STRING」に記述 しておいて実行するだけで、
CGIの出力結果としてのHTMLが、次のように PCOMMエミュレーター画面に表示されます。

** STRCGIDBG *********************************************               
*                                                        *               
*          CGI : CGIBIN/CGI004                                           
*                                                        *               
**********************************************************               
CONTENT-TYPE: TEXT/HTML                                                  
                                                                         
<html>                                                       
<head>                                                       
<meta http-equiv="Content-Language" content="ja">            
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
                                                                  
<title>  商品マスターファイル  </title>               
</head>                                                     
<body>                                                      
<center><h1>  商品マスターファイル  </h1></center>
<hr>      
<pre>                                                        
<table cellpadding="1" cellspacing="0" border="0" bordercolor="#000000">
<REPORT>                                                     
<tr>                                                         
        <td> 商品  コード </td>                     
        <td> : </td>                         
        <td><FLD NAME=SHCODE>NV-CF1    </FLD></td>
        </tr>                                                
<tr>                                                         
        <td> 商品名  </td>                         
        <td> : </td>                                  
        <td><FLD NAME=SHNAME> Cカセット編集ビデオ     </FLD></td>
        </tr>                                                
<tr>                                                         
        <td> 単価  </td>                               
        <td> : </td>                                  
        <td><FLD NAME=SHTANK>0085000</FLD></td>
        </tr>                                                 
<tr>                                                          
        <td> 品種  コード </td>                           
        <td> : </td>                                   
        <td><FLD NAME=SHSCOD>0002</FLD></td>
        </tr> 
</REPORT> 
</table>  
</pre>    
<a href="/AS400-NET.USR/PROJECT/CGI004/DB2_DSPDSPHED.HTM">  検索条件の入力
  戻る  </a>                                            
</body>                                           
</html>
【 解説】

エミュレータにHTMLの結果が表示されますので、HTTPサーバーを使わずに結果を知ることができます。
もちろん停止点を定義して変数の中身を知ることもできます。
複数の開発者が個々にしかも同時にディバッグできるのは、もちろんのことですし、これまでの適用業務の
開発とそんなに変わるものではなく違和感なく効率の良いディバッグを行うことができます。
HTTPサーバーも止める必要はありません。
上記では表示されていませんが、RPGエンジンによって 適切でない場合への警告メッセージも
表示されます。

このような自然の形でのディバッグができることは開発の上でとても重要なことです。