MENU

Code for IBM i その全貌:Part 6 DeepL API を使った翻訳プログラムの作成と実行

それでは最後に、API入門で取り上げたDeepL APIを利用するプログラムをVSCodeで作成および実行してみよう。
 

事前準備

今回は、プログラムを5250エミュレータ上ではなくPASE環境で実行して結果を表示させる。PASE環境にsshで接続し、結果を同一画面に表示させるためには、C/C++ランタイムライブラリー内のprintf関数(標準出力 stdoutに出力)を使用する必要がある。
 
まず最初にsshで接続する際に使用されるシェルをbash に変更しておこう。bashシェルを利用することにより、WindowsのDOSプロンプトと同じようにカーソルキーでのカーソル移動や削除キーなどが利用できるようになる。
 
デフォルトのシェルを bash に変更するには、bashがどこにあるかが必要になる。PASE環境でファイルのフルパスを確認するwhichコマンドがあるので、これを使ってbashのフルパスを確認しよう。
 
PASEターミナルに接続(ステータス・バーのTerminalsをクリックし、PASE を選択)し、which コマンドを実行する(図表67)。
 
図表67 Whichコマンドの実行
図表67 Whichコマンドの実行
 
続いて、IBM i notebooksを使って、接続するユーザーのデフォルトのシェルを which で確認したフルパスを指定して変更する。使用するのは QSYS2.SET_PASE _SHELL_INFO プロシージャで、SQLのCALLステートメントを使って変更する(図表68)。
 
図表68 SQLのCALLステートメントで変更
図表68 SQLのCALLステートメントで変更
 
変更されたかどうかを確認するには、ユーザー・プロファイルに関する情報を含む USER_INFO ビュー(https://www.ibm.com/docs/ja/i/7.3?topic=services-user-info-view)を SQL で検索する。 列 PASE_SHELL_PATH に指定した bash のフルパスが設定されていればセットが完了している(図表69)。
 
図表69 変更の確認
図表69 変更の確認
 
bashがPASE環境のシェルとして設定されていることを確認したら、ターミナル画面右上のゴミ箱アイコンをクリックして画面を閉じ、IBM iへの接続を切断し再度接続する(図表70)。
 
図表70 IBM iへの接続を切断し、再度接続
図表70 IBM iへの接続を切断し、再度接続
 
その後タスクバーのTerminalsをクリックし、PASEを選択してターミナルを表示する。以下のように表示されれば OK だ(4.4 はバージョンなので環境によっては異なる、図表71)。
 
図表71 PASEを選択してターミナルを表示
図表71 PASEを選択してターミナルを表示

コーディング

それでは、プログラムをコーディングしていこう。ローカルのソース・コードの保守 を参考に初期設定(コードを保存するフォルダの作成、Deploy 先の設定、フォルダ内に .vscode/actions.json を作成)は済ませておく。
 
VSCodeで作成したフォルダを開き、ファイル deeplapi.sqlrpgle を作成する。サンプルコードを入力する際、全てではないがコードアシスト機能が利用できるので、候補が出てきた場合に入力したいものが表示されたらそれを選択してみよう。
 
たとえばデータ構造を入力したくてdclと入力すると、候補が以下のように表示される(図表72)。
 
図表72 dclと入力すると候補が表示される
図表72 dclと入力すると候補が表示される
 
ここでdcl-dsを選択すると、以下のようにコードが挿入される(図表73)。
 
図表73 dcl-dsを選択するとコードが挿入される
図表73 dcl-dsを選択するとコードが挿入される
 
カーソルがnameの所にセットされるので、入力したいデータ構造名をそのまま入力すればよい。
 
候補が表示されたが、自分の入力したいものがない場合はスペースキーを押して候補を消去して入力を続けよう。候補が出た状態でエンターキーを押すと、一番上の候補を選択したことになるので注意したい。
 
i Magazine 2023 Winter 特集1で紹介したDeepL APIを呼び出すプログラムの全コードを以下に示す。
・・・・・・・・
**free
//
// DeepL翻訳APIの利用
// https://api-free.deepl.com/v2/translate
//
ctl-opt copyright(‘(C) 2018-2023 tat.co.jp All Rights Reserved.’);
ctl-opt text(‘DeepL翻訳APIの利用’);
 
ctl-opt dftactgrp(*no);
ctl-opt main(main);
 
dcl-pr printf Int(10) extproc(‘printf’);
input Pointer value options(*string);
end-pr;
 
dcl-proc main;
 
   Dcl-ds Request Qualified;
       URL Char(128);
       Head Char(1024);
       Body Char(1024);
   end-ds;
 
   // HTTPPOSTCLOBVERBOSE用パラメータ変数
   dcl-s replyStmf char(10000);
   dcl-s replyHdr char(10000);
 
   dcl-s detectedSourceLanguage char(2);
   dcl-s translaedText char(10000);
   dcl-s Auth_key varchar(40);
   dcl-s SendMessage char(1000);
   dcl-c LF const(x’25’);
   dcl-ds httpHeader qualified;
   responseCode char(3);
   responseMessage varchar(100);
   dcl-ds header dim(40);
      name varchar(100);
      value varchar(100);
   end-ds;
end-ds;
 
SendMessage = ‘トンネルを抜けると、そこは雪国だった。’;
 
Auth_key = ‘b16abxxc-ffff-8bcc-111c-00ad6f222d57:fx’;
 
Request.URL = ‘https://api-free.deepl.com/v2/translate’;
 
Request.Body =
     ‘auth_key=’ + %trim(Auth_key)
   + ‘&text=”‘ + %trim(SendMessage) +'”‘
   + ‘&target_lang=EN’;
 
Request.Head =
   '<httpHeader>’
   + ‘<header name=”Content-Type” value=”application/x-www-form-urlencoded” />’
   + ‘<header name=”Content-Length” value=”‘ + %char(%len(%trim(Request.body))) + ‘” />’
   + ‘</httpHeader>’;
 
exec sql select responsemsg,
      RESPONSEHTTPHEADER into :replyStmf, :replyHdr
from table( SYSTOOLS.HTTPPOSTCLOBVERBOSE(
      trim(:Request.URL),
      trim(:Request.Head),
      trim(:Request.Body)
) ) as x;
 
// DeepLから戻されたjsonファイルの内容を変数にセット
exec sql select * into :detectedSourceLanguage,:translaedText
   from JSON_TABLE(
      trim(:replystmf),
      ’$’
      columns(
          nested ‘$.translations[*]’ columns(
          ”detected_source_language” varchar(2),
          ”text” varchar(10000)
      )
   )
) x;
 
//応答ヘッダーXMLを分解してデータ構造httpHeaderにセット
xml-into httpHeader %xml(%trim(replyHdr):’ccsid=ucs2 +
      allowmissing=yes +
      doc=string +
      case=any +
      path=httpHeader’);
 
   printf(%trim(translaedText) + LF);
 
end-proc;
・・・・・・・・

 

サンプル・コーディングでは、変数 SendMessage にセットされた日本語を DeepL API に渡し、英訳した結果を受け取って printf で stdout に出力する。変換元の日本語は、「トンネルを抜けると、そこは雪国だった。」をセットした。

すべてのコードが入力できたら、Ctrl + s で保存する。

コンパイル

コードの入力が終了したら、コンパイルしてみよう。オブジェクトを作成するライブラリーは現行ライブラリーが省略値なので、USER LIBRARY LIST で IMAG2023 を設定しておく(図表74)。

図表74 USER LIBRARY LISTでIMAG2023を設定
図表74 USER LIBRARY LISTでIMAG2023を設定

Ctrl + Eで上部に候補のコマンドが表示されるので、アクション Create SQLRPGLE Program を選択する。続いてソースコードを Deploy する先の IFS ディレクトリと、プッシュするファイルの選択するよう上部に表示されるが、今回は新規作成した deeplapi.sqlrpgle のみをプッシュするので、Changes 1 change detected since last upload を選択する(図表75)。

図表75 Change 1 change detected since last uploadを選択する
図表75 Change 1 change detected since last uploadを選択する

すると、画面右下に Deploy が完了したメッセージが表示され、続いてアクション Create SQLRPGLE Program(CRTSQLRPGI コマンド)の実行結果が表示される(図表76)。

図表76 Create SQL RPGLE Programの実行結果が表示される
図表76 Create SQL RPGLE Programの実行結果が表示される

アクションの実行結果の詳細は、カーソルをメッセージに合わせると表示される通知を展開記号をクリックして確認できる(図表77、図表78)。

図表77 実行結果の詳細は、「通知を展開」で確認
図表77 実行結果の詳細は、「通知を展開」で確認
図表78 実行結果の詳細の確認
図表78 実行結果の詳細の確認

コンパイルに失敗した場合は、ステータスバーの Output をクリックしてコンパイル・リストを表示し、エラー箇所を確認してソースコードを修正、コンパイル・アクションを実行までをエラーが無くなるまで繰り返す。

実行

プログラムが作成できたら実行してみよう。まずはステータスバーの Terminals をクリックして、PASE を選択する(図表79)。

図表79 ステータスバーのTerminalsをクリックしてPASEを選択
図表79 ステータスバーのTerminalsをクリックしてPASEを選択

PASE 環境からプログラムを実行するには system コマンドに続けてIBM iのCALLコマンドを指定する(図表80)。

system “call imag2023/deeplapi”

図表80  PASE環境からプログラムの実行
図表80 PASE環境からプログラムの実行

DeepL API は、「トンネルを抜けると、そこは雪国だった。」を以下のように訳している。

  When we went through the tunnel, we found ourselve in a snowy country.

まとめ

Visual Studio Codeの拡張機能Code for IBM iを使えば、SEU/PDM環境の代替として使える可能性があること、RPG Ⅲを含むソースコードのバージョン管理がGitで行えることがおわかりいただけただろうか。またCLやRPGLE拡張機能を使えば、CLプログラムやRPGプログラムをコーディングする際のコード補完機能としても、かなりのレベルで使えることがイメージしていただけたと思う。

さらにIBM i Notebooksは、VSCode内の1つのファイル内で、以下の操作が可能になる(5250画面やACSでSQLスクリプトの実行を表示させる必要はない)。

・CLコマンドの実行
・SQLステートメントの実行
・Shell Scriptの実行
・ノート内にMarkdownで文書を記述

そして何より、このノートもGitで管理することにより、チーム開発における情報共有や実行コマンドの共有が可能になるのは特筆すべきことだと思う。

Code for IBM iのGitHubへの最初のコミットは、2021年2月21日。2023年1月9日現在までの総コミット数は1626コミットである(単純計算で2.36コミット/日)。コミッターは約35名。最新バージョンは1.6.8で、これまでに177 回tag付けされた。2022年12月(1カ月)のコミット回数は69回に及ぶ。GitHubのオープンなIssueは44。これだけでも日々進化しているツールということがおわかりになるだろう。

今回、本稿を執筆するための検証では、Code for IBM iで想定されている動きをしない場合もあった。たとえばローカルのコードをコンパイルする場合、コンパイルリストは表示されるものの、エラー項目のみのリストは表示されないなどだ。しかし、これだけ活発に開発が進められているツールなので、不具合もどんどん改善されていくことと思う。

他のプラットフォームの開発ツールは、プロプライエタリでもオープンソースでも自由に選択できる環境がある。それに対してIBM iでは、実質プロプライエタリしか選択肢がないことが長年の課題であった。Code for IBM iの登場はこの問題を解決する、とても大きな意義があることだと思う。Code for IBM iを世に出してくれたLiam Barry Allanさんに感謝を申し上げる。

RDiが機能面において最適な選択肢であることには変わりないが、VSCode + Code for IBM iも十分に利用できる。本稿が、皆さんの開発環境を次のステップに進めるきっかけになってくれれば幸いである。(完)

 

著者|
小川 誠氏

ティアンドトラスト株式会社
代表取締役社長 CIO  CTO

1989年、エス・イー・ラボ入社。その後、1993年にティアンドトラストに入社。システム/38 から IBM i まで、さまざまな開発プロジェクトに参加。またAS/400 、IBM i の機能拡張に伴い、他プラットフォームとの連携機能開発も手掛ける。IBM i 関連の多彩な教育コンテンツの作成や研修、セミナーなども担当。2021年6月から現職。

[i Magazine 2023 Winter掲載]