オープンソースのツールにはIBM iでも使用可能で便利なものが沢山あります。その中からジェシー・ゴルジンスキー氏がお勧めする、選りすぐりのツールTop 10をご紹介した記事です。IBM iでRPGとオープンソースをミックスして利用されている方は、日常のシステム管理作業の効率化のために是非参考にしてください。(編集部)
2022/1/24 ジェシー・ゴルジンスキー
JSONクエリ・ユーティリティを始めとしてLFTPやサービスコマンダー等々に至るまでRPMの山にあるオープンソースの10の秘宝にジェシー・ゴルジンスキーが光を当てます。
多分ご存知のように、IBMはRPMパッケージ・マネージャ(RPM)形式で何百と言うオープンソースのパッケージを提供しています。私が親しみを込めて「RPMの山」と呼ぶこのソフトウェアの収蔵品は、IBM iの中心的なコンポーネントになりました。例えば、Node.jsやPythonといったプログラミング言語は、今や標準言語です。しかし、幾つかのオープンソースはあまりよく知られていません。
今日は、素晴らしい山の中に眠る幾つかの秘宝をカウントダウン方式で取り上げるつもりです。ほとんどのオープンソースと同様に、これらのツールはSSHセッションのbash環境で実行した場合に最もよく動作する筈です。この分野に詳しくない場合にはIBM iオープンソース文書を調べてください(また、bashを使用し、環境プロパティを適切に設定することもお勧めします)。
ご紹介する秘宝の幾つかがあなたの役に立つことを願います。それらの秘宝を容易に見つけられるように、RPMパッケージの名前を含めていることに注目してください。
10. JSONクエリ・ユーティリティ(パッケージ名:‘jq’)
JSON(JavaScript Object Notation)は、テキストベースのデータ表現の事実上の標準になっています。JSONは、あらゆるプラットフォーム上のほぼすべてのプログラミング言語で生成または処理することができます。それは、ディスクにデータを保管したり、ビジネス対ビジネス(B2B)のデータを転送したり、多くのWeb/REST APIのために使用されています。要するに、それはあらゆる所にあります。
Db2 for iは、組み込みJSONサポートと共に提供されていますが、データベース以外の文脈でJSONを扱う方がもっと容易なことがあります。結局のところ、RPMの山にはJSONデータを検査、ソート、選別そして別の形に変換するコマンド行ツールがあります。このツールは“jq”(“JSON Query”の短縮形)と呼ばれています。
図1では、”curl”コマンドと一緒にパブリックAPIを呼び出しています。この特定のサービスは、リポジトリのコミット履歴に関する数多くの情報を返します。しかし、私は最新のコミットメッセージとコミットした人にしか関心がありません。“jq”コマンドを使って最初のエントリーを抽出し、不要なデータを除去し、それを望む形式に変換しています。
▲図1. JSONの照会、フィルター掛け及び形式変換のために”jq”を使う
以下にLu2iano Mammino氏のTwitterから私が学んだことを載せておきます:2つのJSONデータ(図2を参照)を比較する前に、“jq”を使ってJSONをソートする。とても素晴らしいです!
▲図2. JSON比較用の便利なヒント
興味が湧きましたか?もっと詳しい情報については気軽に「jqプロジェクトサイト」を調べてください。
9. 16進ダンプ・ユーティリティ(パッケージ名:‘util-linux’)
ファイルの中身について、疑問を抱いたことはありませんか?例えば次のような疑問です:
- データはEBCDICそれともASCII?
- タブ文字が使われているのか、空白文字が使われているのか?
- そこにあるのは余白なのか、それとも(MicrosoftのWordの「スマート引用符」の様に)誤変換されたUnicode文字なのか?
- 使っているエディターはこのUTF8のファイルをバイト順マーク(BOM)と一緒に保管したのか?
そうした疑問を抱いたことがきっとあると思います。否応なく、どこかの時点でファイルの実際のバイト列を見る必要があります。確かにDSPFには16進表記でバイト列を表示するオプションがありますが、5250は非推奨になっています(夢を見させて!)。SSHで単に“hexdump”コマンドを実行する方がずっと容易です。このツールはその振る舞いをカスタマイズするための種々のオプションと共に提供されていますが、最も一般的に使われているのは多分”-C”です。これは左画面に16進のバイト文字を、そして右画面にそれに対応するASCII文字を表示します(図3参照)。
▲図3. 16進と文字表記を左右に並べて表示する16進ダンプ・ツール
8. LogRotate(パッケージ名:‘logrotate’)
ログファイルはどこにでもあり、それは良いことです!何だかんだ言っても、アプリケーションの動作を検査したり問題を診断したりする必要がある場合、ログは往々にして最初に立ち止まる場所になります。しかし、ログは手に負えなくなる可能性があります。時としてログは何メガバイト(またはギガバイト)ものディスク容量を消費する可能性があります。どうやってそれらを抑えられますか?
“logrotate”ツールを使うことで、ログファイルを自動的に循環させ、圧縮し、削除さえもできます。HTTP Server for iはログ循環を使ってこれを行っていますが、全ての製品がそのような機能を持っている訳ではありません。ですから、特化したツールを持っていると役に立ちます。
このツールは、アーカイブログの名前の形式をカスタマイズでき、保存するログの数やアーカイブログを圧縮すべきかどうかを指定できて、とても柔軟な設定が可能です。これは連続実行するサービスではないことに注意してください。連続実行するのではなく、それを定期的に(またはジョブスケジューラ―を介して)実行しなければなりません。詳細についてはプロジェクトのウェブサイトをご覧ください。IBMチャンピオンのAndy Youensもこの便利なユーティリティに関して優れた記事を書いています。
7. 行終端文字変換ツール(パッケージ名:‘dos2unix’)
技術における馬鹿げた事の中でも私を最もイライラさせるのは、行終端文字の違いです。Windowsは、ファイル中の新しい行を示すのに2つの文字列(キャリッジ・リータンとライン・フィード、即ち“CRLF”)を使用します。IBM i上のPASEを含む他のほとんどのプラットフォームは1文字(ライン・フィード、即ち”LF”)を使用します。これが多くの問題を引き起こす可能性があります! 例えば、Windowsベースのエディターを使っているとすると、注意していないとファイルはWindows形式で保管される可能性があります。それはいつも上手く動作するとは限りません。例えば、シェルスクリプトがエラーを起こし、「誤ったインタープリター」または「ファイルが見つかりません」といったメッセージを出すかも知れません。簡単な”dos2unix”コマンドは、すぐにこの問題を解決できます!逆方向の”unix2dos”コマンドもあります。
▲図4. 行終端文字をUNIX形式に変更する
6.LFTP(パッケージ名:‘lftp’)
PASE環境用にコマンド行FTPクライアントが欲しいと思ったことはありませんか?私はあります!多くの人は、人気のある”ftp”コマンドに馴染みがありますが、RPMの山には”lftp”というもっと良いものがあります。
“lftp”コマンドは、ここで一覧表をお見せできない程多くの機能を持っていますが、私の好きな幾つかの機能は次の通りです。
- タブキーによるリモートファイル名の補完
- バックグラウンドで転送を実行するBashに類似した機能
- ftp、sftp(ssh)及びHTTPを含む複数プロトコルのサポート
- 転送率の調整
- “mirror”ディレクティブを使ってリモートサイトの完全ミラーを作成するためのダウンロード機能
詳細についてはlftpのウェブサイトをご覧ください。
5. Bash組み込み関数(パッケージ名:‘bash’)
尊きbashシェルはオープンソースに取り組んでいるほとんどの人にとって頼みの綱です。Bash及びその他のシェルは古典的なCLコマンドと根本的に違います。これらのシェルは、現行ジョブではなく常に子プロセスでコマンドを実行します。単一ジョブという枠組みに慣れている人達にとって、これは混乱の元になり得ます。例えば、図5の一連のコマンドは馬鹿げて見えるかも知れません。
▲図5. PASEの“system”ユーティリティによるライブラリーリスト変更の試行
“addlible”コマンドは、ライブラリーリストにライブラリーを追加したことを告げていますが、”dsplibl”コマンドはそれを反映しません。何故でしょう? 何故なら、bashは“addlible”コマンドが実際に実行される子ジョブを作るからです! ですから、元々のジョブのライブラリーリストは変更されず、元の状態を保っています。
この種の難問の解決に役立てるために、IBMは3つの組み込みbashコマンドを作成しました。
- 現行ジョブでCLコマンドを実行する“cl”コマンド
- 現行ジョブのライブラリーリストを変更または表示する“liblist”コマンド
- 現行ジョブのジョブIDを表示する“getjobid”コマンド
ですから、図6に示すように、新しい組み込みコマンドを活用することで、bashで実行中に現行ジョブのライブラリーリストを変更することができます。
▲図6. 組み込み関数”liblist”でライブラリーリストを変更する
同様に、現行ジョブで(ADDLIBLE、CHGJOBなどの)CLコマンドを実行するために、組み込み”cl”コマンドを使うことができます。詳細については、この話題に関するKevin Adlerのブログをご覧ください。
4. ターミナルMUltipleXer(パッケージ名:‘tmux’)
“tmux”ツールはSSHセッション上で強力な力を発揮します。一例として、セッションを切ることなくSSH接続を閉じることができるので、後で再接続し作業を継続することができます。また、ターミナルを複数のウィンドウに分割(図7を参照)することもできます。SSHで長時間作業を行っているならば、これはとても強力なツールです。
▲図7.複数ウィンドウをもつターミナルMUltiPleXer
上記のスクリーンショットは、ブログ「Kevinのだらだらお喋り」からのものです。
3. Telnet 5250クライアント(パッケージ名:‘tn5250’)
“tn5250”ツールのお陰で、SSHセッション内から5250を立ち上げることができます。ACSのような別個のエミュレーターを立ち上げられない、または立ち上げたくない場合、これが役に立つかも知れません。何故5250が必要なのでしょう? 私には分かりません。しかし、そうであるなら、私達はあなたの肩代わりをしています(図8参照)。
▲図8.SSHターミナル内の5250エミュレーション
2. NCursesディスク使用率(パッケージ名:‘ncdu’)
何がディスク容量を消費しているのか訝しく思ったことはありませんか? NCDUツールは、ディスク使用状況を視覚化する対話型で強力なインターフェースを提供します。このツールに任意のディレクトリーを指定するだけで、何がディスク容量を消費しているのか分かります! 他のツールと同様に、個々のディレクトリーにドリルダウンすることもできます(図9参照)。
▲図9.IFSディスク使用率の分析
そして、このツールを/qsys.libに対して使用することもできます(図10)。
▲図10.QSYS.LIB内のディスク使用率分析
1.サービスコマンダー(パッケージ名:‘service-commander’)
IBM i上では様々なタイプのワークロードが実行されていますが、それらを管理するために異なるテクニックを使用しなければなりません。ある種の事にはSTRTCPSVRが機能します。Node.jsアプリケーション用には、シェルで“node”コマンドを実行します。更にオープンソースのワークロードは、ファイルシステムのあらゆる場所に配置される可能性があります。そして、何が実行されているかをどのように知るのでしょうか? NETSTATコマンドですか、WRKACTJOBコマンドですか、それともSQLですか? これらのジョブすべてを管理するのは心を挫くような大仕事かもしれません。
これら異なる種類のジョブすべてを管理する単一のツールがあったなら素晴らしくありませんか?私がサービスコマンダー・ツールを作成した理由はそこにあります。1つのツールで次のような事ができます。
- あらゆるタイプのサービスを開始、終了する
- どのサービスが実行されているかを調べる
- 実行中のサービスのパフォーマンス測定基準を収集する
- 現在どのポートがオープンになっているかを調べる
- どのジョブでサービスが実行されているか、またはあるポートでどのジョブが効いているかを調べる
視覚情報は図11をご覧ください。サービスコマンダーは、シェルから起動できますが、STRTCPSVRコマンドと統合もされています。ですから、あなたがIBM iホストサーバー、Jenkins、TomCat、Pythonプログラム、Apache Camelまたはそれらすべてに興味があるかどうかに関係なく、1つのコマンドでジョブを開始、終了、またはモニターできます。
デモビデオ及びハンズオン演習と同様に、更なる情報はここで見つけられます。
▲図11.幾つかのサービスの状況のチェック
他のユーティリティは?
まあそんな具合に、オープンソース中の10の「秘宝」をご紹介しました。今日の記事の中の何かを活用できたなら素晴らしいことです! 私が紹介し忘れたもっと良い何かをご存知であれば、TwitterのTechChannelまたはIBM iオープンソース・パッケージにリストされているソーシャル・プラットフォームであなたの好きな秘宝を共有してください。あなたの好きなオープンソースの秘宝のことを聞くのを楽しみにしています。