読者です 読者をやめる 読者になる 読者になる

FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

Field Reportsの特徴 (3) ―「LL言語向け帳票ツール」とは ―

JAVAで構築した帳票ツールをLL言語から利用する場合にはありがちなことですが,以下のような手順を踏まなければいけないようなツールにはしたくありませんでした。

  • DBから取得したデータを元にXMLファイル(もしくはCSVファイル)を作成する。
  • 帳票ツールを外部コマンドとして呼び出す。
  • 生成されたPDFファイルを読み込んで,クライアント側へ送信する。
  • エラー発生時には,エラーファイルの内容を解析してエラー処理を行う。

LL言語対応をうたうからには,言語の拡張ライブラリとして「普通に」利用できることが第一と考え,以下のようにいくつかの工夫を行いました。

ネイティブデータ構造を使って利用できる

最近のLL言語では,辞書/ハッシュ/連想配列,リスト/配列といったデータ構造がネイティブに利用できるのが普通なので,これらのデータ構造を入力パラメータとして帳票生成機能を呼び出せるようにしました。
具体的には,辞書のキー名とPDFのフィールド名を結びつけ,キー名とフィールド名が一致した辞書項目の値をフィールドにセットする設計としました。

DBから元データを取得する手段は様々ですが,辞書/リスト構造であれば最小の手間で変換できるのではないかと考えています。

JSONからもアクセスできる

LL言語ネイティブのデータ構造だけでなく,LL言語御用達のデータ交換フォーマットとなっているJSONにも対応しています。帳票生成時の入力パラメータをJSON形式の文字列でも与えることができます。

これは,以下のような効果を狙ってのことです。

  • Ajax, JSON-RPCのようなJSONをベースとしたWeb技術との相性がよくなるはず。
  • LL言語にとって,XMLより作るのが楽なはず。

同一プロセスで呼び出せる

せっかく辞書形式で入力パラメータを作成できるようにしても,裏でXMLファイルを作成して外部プロセスを呼び出していたのでは,処理効率がよくありません。
そこで,帳票生成機能をCライブラリの形で実装しました。
大抵のLL言語では,FFI(Foreign Function Interface)を装備していますので,Cライブラリを直接呼び出すことができます。

ただし,各言語での辞書/リスト構造の内部表現は異なっていますので,LL言語の内部表現からOCamlの内部表現へ変換する処理のみをCで手書きしています。
LL言語とCライブラリを仲介する部分を「言語Bridge」と呼んでいます。

また生成したPDFは,ファイルとして出力することもバイナリ文字列として返却することもできます。

ちなみにCライブラリだけでなく,コマンド形式の実行ファイルとしても提供していますので,JSONファイルを介して外部プロセスとして帳票生成機能を呼び出すことも可能です。

言語Bridgeのソースを添付

LL言語では,各バージョンで拡張モジュールの形式が異なり,再ビルドが必要な場合が多々あります。また,言語自体をビルドした際のオプション指定によっては,バイナリレベルの互換性が失われる場合もあります。
標準的なオプションでビルドした最新の2〜3のバージョンについては,言語Bridgeの実行モジュールをバイナリ提供する予定ですが,過去のバージョンや特殊なビルド・オプションには対応しきれません。

そこで,言語Bridgeに関しては,ソースでも提供することにしました。
これで,バイナリ提供対象外の環境であっても,ソースを再ビルドしていただければ,利用できるようになるはずです。

また,言語Bridgeを提供していない言語をお使いの場合でも既存の言語Bridgeのソースを参考にしていただければ,拡張モジュールを自作することも可能なはずです。