ジェネレーティブプログラミングの世界 データマッピングフレームワーク 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から取得したデータを画面 帳票に出力する ポイント 最初にデータに着目し データフローを考える
2.Json の特徴を利用した項目移送 Json はプログラム内に読み込まれるとハッシュオブジェクトに変換されます ハッシュオブジェクトを使用すると 項目名称が不明でも項目移送が可能です SQL 実行後の結果セットもハッシュオブジェクトを使用しています 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]; } } Json の項目名 (Key) には日本語が使用可能です 項目名に日本語を使用することで 格段に可読性が向上します
クライアントサーバ リクエスト json 3 リクエスト json ブラウザ (HTML5) 1 2 データセット json 4 SQLjson 5 DB 10 9 7 7 6 レスポンス json 8 レスポンス json Json 作成手順 1. 画面 帳票からリクエストデータ レスポンスデータ ( トランザクション ) を洗い出す ( 全トランザクション ) 2. アクセスするテーブルの視点から リクエストデータ レスポンスデータをグルーピング (ID を付与 ) する 3. 全データの項目名称をグルーピングしてデータセット Json に定義する 4. リクエスト Json レスポンス Json に項目名称を定義する 5. リクエスト Json レスポンス Json とセットで SQLJson を定義する ( テーブル名 CRUD の種類 入出力項目名称等 )
4. アプリケーションの階層と役割 アプリケーションプログラム Json に記述されたデータに従ったプログラミング ブラウザ側 (JavaScript) SMVC モデル Spec( 内部 DSL) の定義に従ったコールバック関数を作成 サーバ側 (Ruby) MVC2 モデル Before After パターンに従った関数を作成 Json ( 外部 DSL) 自動項目移送を可能にするための簡単な定義言語項目名称を定義 SQL 情報を定義帳票の位置情報等を定義 Rmenu フレームワーク 自動項目移送(Hash) SQL 発行 (Sequel) Ajax 通信 (Json) オブジェクト通信 並列分散処理(Rinda) PDF 作成 (Prawn)
5.1 Web アプリケーションアーキテクチャ クライアント Web サーバ AP サーバ DB サーバ App 仕様 Json 定義イベント定義 ブラウザ (HTML) JQuery JQueryMobile BootStrap モデル dataset.json validation.json request.json response.json コントローラ イベント処理 ビュー 1 リクエスト json レスポンス json 10 アパツチ パッセンジャ R A C K 2 リクエストjson レスポンスjson 9 9 3 コントローラ validation.json controller.rb 8 リクエスト json SQLjson 6 7 SQLjson リクエスト json モデル sql.json model.rb ビュー SQL 実行結果 5 DB 4 表示処理 レスポンス json response.json view.rb クライアント 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 機能名
5.2 帳票アプリケーションアーキテクチャ AP サーバ DB サーバプリントサーバ 1 18 2 リクエスト Json レスポンス Json (PDF ファイル名 ) リクエスト Json コントローラ モデル sql.json model.rb validation.json controller.rb SQLJson ビュー response.json view.rb 5 3 SQL 実行結果 4 printparam (SQLJson) DB レスポンス Json(PDF ファイル名 ) 6 17 テンプレート作成 LibreOffice Excel PDF テンプレート 9 8 実行結果 SQL printparam ( リクエスト Json) レスポンス Json (PDF ファイル名 ) テンプレート PDF 14 7 16 プリントコントローラ PDF クリエイタ (Prawn) form.rb 10 SQLJson SQLJson レスポンス Json レスポンス Json 13 11 12 PDF 出力 15 モデル sql.json model.rb ビュー response.json view.rb 作成帳票 (PDF)
5.3 並列分散バッチアーキテクチャ AP サーバタプルスペース分散バッチ DB サーバ バッチ起動サーバ write 4 TupleServer 3 Tuple Space (Rinda) take 7 TupleServer Tuple サーバ 8 管理 DB Job 管理分割 Job 管理 KEYVALUE 管理 2 5 Job 名 keyvalue write 9 TupleClient 11 リクエスト 1 6 レスポンス モデル sql.json model.rb TupleServer job_id take 10 TupleClient Tuple クライアント 15 TupleClient job_id job_no 12 14 Tuple サーバ 1 台 Tuple クライアント n 台 job_no( 分割番号 ) 1~n モデル sql.json model.rb 13 業務 DB
6.1 帳票レイアウト作成 LibreOffice Excell 等でレイアウトを作成する (PDF 出力が可能なソフト )
6.2 テンプレート PDF LibreOffice で作成した PDF テンプレート PDF に実データをオーバライドし帳票を作成する
6.3 作成する Json App サーバプリントサーバ リクエスト Json 作成する帳票のコントロールキーを取得する為の入力データを設定する SQL Json 入力データを使ってコントロールキーを取得する 今回の例では ケアマネ ID が複数件取得される レスポンス Json 作成された PDF のファイル名 ( パス情報含む ) が設定される 最後にブラウザ側で PDF を出力する リクエスト Json ケアマネ ID が 1 件 設定される SQL Json ケアマネ ID を入力データとして ケアマネの名称と ケアマネに所属するヘルパーの情報が取得される レスポンス Json 帳票レイアウトに沿って ケアマネとヘルパー情報の項目が定義され SQL.json のデータが設定される 個々の項目に PDF の位置情報が記述されている
6.4 出力 PDF テンプレート PDF に実データをオーバライドし作成された PDF
ご清聴を感謝します