ジェネレーティブプログラミングの世界
データマッピングフレームワーク
Rmenu
・特徴
プログラムから、データとプロセスを完全分離
・疑問
本当にデータとプロセスが完全分離できるのか?
どんな仕組みで業務システムが動くのか?
日本オフィスクリエイション株式会社 下地忠史
2014年2月15日
Agenda
1.アプリケーションの基本
2.
Jsonの特徴を利用した項目移送
3.アプリケーションのデータフロー
4.アプリケーションの階層と役割
5.Rmenu アーキテクチャ
5.1
Webアプリケーション アーキテクチャ
5.2 帳票アプリケーション アーキテクチャ
5.3 並列分散バッチ アーキテクチャ
6.帳票作成例
6.1 帳票レイアウト作成
6.2 テンプレートPDF
6.3 作成するJson
6.4 出力PDF
アプリケーションの基本
・画面(ブラウザ)で入力したデータをDBに格納する。 ・DBから取得したデータを画面・帳票に出力する。ポイント
・最初にデータに着目し、データフローを考える。Ruby each命令による項目移送
inputRecord.each {|name,
value|
if outputRecord[name]
outputRecord[name] = value
end
}
Javascript for命令による項目移送
for (name in inputRecord) {
if (name in outputRecord) {
outputRecord[name]
= inputRecord[name];
}
}
2.
Jsonの特徴を利用した項目移送
Jsonはプログラム内に読み込まれるとハッシュオブジェクトに変換されます。
ハッシュオブジェクトを使用すると、項目名称が不明でも項目移送が可能です。
SQL実行後の結果セットもハッシュオブジェクトを使用しています。
Jsonの項目名(Key)には日本語が使用可能です。 項目名に日本語を使用することで、格段に可読性が向上します。クライアント
サーバ
・Json作成手順 1.画面・帳票からリクエストデータ・レスポンスデータ(トランザクション)を洗い出す。(全トランザクション) 2.アクセスするテーブルの視点から、リクエストデータ・レスポンスデータをグルーピング(IDを付与)する。 3.全データの項目名称をグルーピングしてデータセットJsonに定義する 4.リクエストJson・レスポンスJsonに項目名称を定義する。 5.リクエストJson・レスポンスJsonとセットでSQLJsonを定義する。(テーブル名・CRUDの種類・入出力項目名称等) データセットjson リクエストjson レスポンスjson ブラウザ (HTML5) リクエストjson レスポンスjson SQLjson DB①
②
③
④
⑤
⑥
⑦
⑦
⑧
⑨
⑩
4.アプリケーションの階層と役割
アプリケーション
プログラム
Json
(外部DSL)
Rmenu
フレームワーク
・Jsonに記述されたデータに従ったプログラミング ・ブラウザ側(JavaScript) ・ ・ ・SMVCモデル Spec(内部DSL)の定義に従ったコールバック関数を作成 ・サーバ側(Ruby)・ ・ ・MVC2モデル Before・Afterパターンに従った関数を作成 ・自動項目移送を可能にするための簡単な定義言語 項目名称を定義 SQL情報を定義 帳票の位置情報等を定義 ・自動項目移送(Hash) ・SQL発行(Sequel) ・ Ajax通信(Json) ・オブジェクト通信(dRuby) ・並列分散処理(Rinda) ・ PDF作成(Prawn)5.1
Webアプリケーション アーキテクチャ
クライアント
Webサーバ APサーバ
DBサーバ
ブラウザ (HTML) JQuery JQueryMobile BootStrap コントローラ イベント処理 モデル dataset.json validation.json request.json response.json ビュー 表示処理 ア パ ツ チ ・ パ ッ セ ン ジ ャ | R A C K コントローラ (dRuby) validation.json controller.rb モデル (dRuby) sql.json model.rb ビュー (dRuby) response.json view.rbDB
クライアント
Json
サーバ
index.html xxx.appspec.js(トラン定義・イベント定義) xxx.controller.js(イベント処理) xxx.model.js(データ処理・通信処理) xxx.view.js(表示処理) xxx_validation.json xxx_mode_request.json xxx_mode_response.json xxx_mode_sql.json xxx_controller.rb(リクエストデータチェック) xxx_model.rb(sql編集・データ処理) xxx_view.rb(レスポンスデータ編集) ※ xxx ・・・画面名称 mode ・・・機能名 App仕様 Json定義 イベント定義 リクエストjson レスポンスjson リクエストjson レスポンスjson リクエストjson SQLjson レスポンスjson リクエストjson SQLjson SQL 実行結果 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑨5.2 帳票アプリケーション アーキテクチャ
APサーバ
DBサーバ
プリントサーバ
テンプレート 作成
コントローラ (dRuby) validation.json controller.rb プリント コントローラ (dRuby)DB
モデル sql.json model.rb ビュー response.json view.rb PDFクリエイタ (Prawn) form.rb モデル (dRuby) sql.json model.rb ビュー (dRuby) response.json view.rb LibreOffice Excel PDF テンプレート 作成帳票 (PDF) リクエストJson レスポンスJson (PDFファイル名) リクエストJson SQLJson printparam (SQLJson) printparam (リクエストJson) SQLJson SQL 実行結果 SQL 実行結果 レスポンス Json SQLJson レスポンスJson テンプレートPDF PDF出力 レスポンスJson(PDFファイル名) レスポンスJson (PDFファイル名) ① ② ③ ⑨ ⑧ ④ ⑤ ⑥ ⑦ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱5.3 並列分散バッチ アーキテクチャ
APサーバ
タプルスペース
分散バッチ
DBサーバ
バッチ起動 サーバ Tuple Space (Rinda) TupleServer job_id TupleClient job_id job_no Job管理 分割Job管理 KEYVALUE管理 Tuple サーバ Tuple クライアント モデル sql.json model.rb モデル (dRuby) sql.json model.rb 業務DB 管理DB write TupleServer take TupleServer write TupleClient take TupleClient ・Tupleサーバ 1 台 ・ Tupleクライアント n 台 ・ job_no(分割番号) 1~n Job名 keyvalue リクエスト レスポンス ① ② ③ ④ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑤ ⑭ ⑮6.1 帳票レイアウト作成
LibreOffice・Excell等で
レイアウトを作成する。 (PDF出力が可能なソフト)
6.2 テンプレートPDF
LibreOfficeで作成したPDF。
テンプレートPDFに実データを オーバライドし帳票を作成する。
App サーバ
プリント サーバ
・リクエスト Json
作成する帳票のコントロールキーを取得する為の 入力データを設定する・SQL Json
入力データを使ってコントロールキーを取得する。 今回の例では、ケアマネIDが複数件取得される。
・レスポンス Json
作成されたPDFのファイル名(パス情報含む)が 設定される。最後にブラウザ側でPDFを出力する。・リクエスト Json
ケアマネIDが1件、設定される。・SQL Json
ケアマネIDを入力データとして、ケアマネの名称と、 ケアマネに所属するヘルパーの情報が取得される。・レスポンス Json
帳票レイアウトに沿って、ケアマネとヘルパー情報の 項目が定義され、SQL.jsonのデータが設定される。 個々の項目に、PDFの位置情報が記述されている。6.3 作成するJson
6.4 出力PDF
テンプレートPDFに実データを オーバライドし作成されたPDF。