More Related Content Similar to 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox Similar to 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox (20) More from Tomoharu ASAMI (17) 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox2. 浅海のプロフィール
• 1985年年-2001年年:富⼠士通
• UNIX OSをビジネス向けに改造する仕事
• ファイル管理理、分散ファイルシステム、Webサーバなど
• 信頼性、運⽤用管理理、COBOL向けの改造
• 1993年年頃からオブジェクト・モデリングの調査を始める
• 1995年年からJavaの利利⽤用を始める
• 1998年年からJava&XMLのフリーソフトを開発・公開(個⼈人活動)
• SmartDoc(XML⽂文書処理理系)、Relaxer(プログラム⾃自動⽣生成)
• 2001年年-現在:浅海智晴事務所代表
• モデリング、XML、Javaのコンサルティング、教育活動
• 2002、2003年年度度:IPA未踏に採⽤用
• Relaxer (DSLによるプログラムの⾃自動⽣生成)
• 2005年年度度-2007年年度度:稚内北北星学園⼤大学東京サテライト校教授
• 2007年年度度-現在:⽇日本Javaユーザグループ副会⻑⾧長
• 2009年年2⽉月-現在:edge2.cc主宰
• 2009年年5⽉月-現在:匠Labフェロー
3. 開発プログラム
• SmartDoc (1998年年)[Java]
• XML⽂文書処理理系
• 専⽤用XML⽂文書からHTML、LaTeX、プレインテキストを⽣生成
• Relaxer (2000年年)[Java]
• XMLスキーマ⾔言語RELAXをDSLとして⽤用いたスキーマ・コンパイラ
• RELAXからJavaプログラム、W3C XML Schemaなどを⽣生成
• SmartCase (2004年年、試作)[Java]
• 専⽤用XML⽂文書でユースケース・モデルを記述
• 仕様書を⽣生成
• JavaDSL (2007年年、試作)[Java]
• JavaをDSLのメタ⾔言語としてオブジェクト・モデルを記述
• Javaプログラムと仕様書を⽣生成
• SimpleModler (2008年年〜~)[Scala]
• ScalaをDSLのメタ⾔言語としてオブジェクト・モデルを記述
• Javaプログラムと仕様書を⽣生成
• SmartDox (2012年年〜~)[Scala]
• Emacs org-modeベースの⽂文書処理理システム
13. PIM/PSM/実装
CIM : Computer Independent Model
DSL PIM : Platform Independent Model
CIM
PIM PSM : Platform Specific Model
DSL: Domain Specific Language
DSL
PSM
非機能要求 実装 プラットフォーム
(Java、 XML、 …)
14. クラウド時代のソフトウェア
開発
業務
業務
アーキテクチャ
方式 開発
クラウドに飲み込まれてしまう!
製造 コンポーネント開発
プラットフォームの共用
コンポーネント・サービスの再利用
オフショア開発
プログラム自動生成
システム保守・運用 システム保守・運用
ハードウェア保守・運用 ハードウェア保守・運用
15. DSL駆動開発&コンポーネン
ト
分析 設計 実装
DSL 自動生成 コンポーネント
OO分析
OO設計 OO実装 コンポーネント
DSL 自動生成 コンポーネント
DSL 自動生成 コンポーネント
OO分析
OO設計 OO実装 コンポーネント
16. DSL駆動開発とは
• テキストDSLを⽤用いたモデル駆動開発
• UMLをプログラミング⾔言語的に⽤用いることは間違いだっ
た!?
• テキストDSLでモデルを記述
• 作成効率率率はテキストが圧倒的に効率率率的
• 必要に応じてUMLの図を⽣生成
• モデルの視認性はUMLが上 モデルをテキストで記述する
• テキストDSLの実現⽅方法 モデルをデータとして
• 内部DSL:ホスト⾔言語上に構築 操作して成果物を⽣生成する
• 外部DSL:スクラッチで⾔言語を作成
18. SimpleModelingモデル変換
業務モデル ドメイン・モデル 要求モデル システム・モデル 設計モデル 実装
静的構造 エンティティ ドメイン層 ドメイン層
抽出
具体化 格納
現実世界
データベース
ドメイン・モデル
抽出
コントロール アプリケーション層 アプリケーション層
ボキャブラリ 詳細化 実現
動的モデル
具体化
文脈
ユースケース
具体化
利用事例 バウンダリ プレゼンテーション層 プレゼンテーション層
操作
やりたいこと
エンド・ユーザ
アプリケーション・モデル
19. SimpleModeling全体像
ドメイン・モデル 要求モデル システム・モデル 設計モデル
用語
事実 契約
自然言語 規則 契約 ユースケース
宣言モデル 拡張 静的モデル 利用 動的モデル
変換
コラボレーション コラボレーション
動的モデル 動的モデル アプリケ
ーション・
同期
機能モデル 変換 具体化 モデル
サービス契約 静的モデル 静的モデル
データフロー図 クラス図 クラス図
オブジェクト・
OCL
同期
操作
操作
モデル
OCL OCL
クラス図 クラス図 クラス図
静的モデル 変換 静的モデル 具体化 静的モデル
ドメイン・
モデル
動的モデル
張
拡
化
体
具
ルール・モデル 宣言モデル 変換 宣言モデル
ビジネス・ルール ビジネス・ルール
20. UMLの⻑⾧長所と短所
• ⻑⾧長所
• 唯⼀一の標準オブジェクト・モデル記法である。
• メタ・モデルが厳密に定義されている。
• グラフィカル⾔言語であり、概要情報の伝達にすぐれてい
る。
• 短所
• オブジェクト・モデル以外の記述には必ずしも適してい
ない。
• オブジェクト・モデルも完全に記述できるわけではない。
• 作成効率率率が必ずしも⾼高くない。
• モデル・リポジトリの操作性がよくない。
• ⼤大規模開発に必ずしも適していない。
• ⾃自然⾔言語情報の取り扱いが不不⼗十分。
21. Modegramming (モデグラミング)
• Modeling + Programming
• モデリングとプログラミングの融合
• テキストDSL+モデルコンパイラによるモデル駆動
開発
• DSL (Domain Specific Language)
• Scala DSL
• Mindmap DSL (MindmapModeling)
• Excel DSL, XML DSL, JRuby DSLなど必要に応じて
• メタ・モデル(モデル体系)
• SimpleModeling
• モデルコンパイラ
• SimpleModeler
22. SimpleModeling技術
• SimpleModeling
• 企業アプリケーション向けモデリング⼿手法
• 業務モデリング、ドメイン・モデリング、要求モデリング、
システム・モデリング
• MindmapModeling
• SimpleModelingのモデル抽出⼿手法
• ドメイン・モデリング(+業務モデリング)
• SimpleModeler
• SimpleModeling⽤用モデル・コンパイラ
24. MindmapModeling
• MindmapModelingはマインドマップを使ってモデルを
作成する⼿手法。
• 稚内北北星学園⼤大学東京サテライト校で実務者をターゲット
としたモデリング教育向けに開発
• 問題空間側のモデルをマインドマップで記述することが
できる。
• 業務モデル : 業務ユースケース
• ドメイン・モデル : 静的構造モデル
• MindmapModelingと⼀一般的なマインドマップの違い。
• MindmapModelingモデルは、マインドマップの上に独⾃自構造
を拡張しており、オブジェクト・モデルに落落とし込む⼿手順が確
⽴立立している。
25. なぜMindmapModelingなのか
• ⾃自然⾔言語(⽇日本語)による⽂文章情報からいかにオブジェクト・モ
デルを作成するのか?
• ⾃自然⾔言語(⽇日本語)→UMLを直接作成するのは難しい。
• ⾃自然⾔言語(⽇日本語)ベースの中間的な構造モデルがあるとよい。
• この⽬目的にはマインドマップが最適。
• 単なるマインドマップでは不不⼗十分
• オブジェクト・モデルへの変換を前提にしたマインドマップベー
スのフォーマットが有効。
• このためには⽬目的にかなったメタ・モデルをバックグラウンドに
したマインドマップのフォーマットでなければならない。
• このフォーマットがMindmapModeling。
• オブジェクト・モデルをメタファで理理解できる。
• オブジェクト・モデリングの”コツ”を習得
26. MindmapModelingのコツ
• ⼊入⼒力力となる⾃自然⾔言語の⽂文章(雑誌記事など)は、仕様化の
ための⽅方針やモデルの⾻骨格、詳細情報が不不⼗十分なので、
その現実を受け⼊入れて適宜モデルを補う。
• 構想⼒力力、提案⼒力力もモデリング技術のうち
• MindmapModelingのモデルは、プログラムで実装可能
であることが重要。実装がイメージできないモデルは、
間違いと考えてよい。
• 仕様の⾻骨格は「物語」で構築する。「物語」を明確にす
ることで、モデルの取捨選択、モデル化⽅方針の選択、不不
⾜足部分の補完を⾏行行うことができる。
27. MindmapModelingについて
• このスライドが参考になると思います。
• MindmapModelingチュートリアル
• http://www.slideshare.net/asami224/
mindmapmodeling
• 毎⽉月勉強会やってます。
• 横浜モデリング勉強会
• http://www.facebook.com/groups/223587707726703/
• ワークショップの進め⽅方
• http://www.facebook.com/groups/223587707726703/
doc/370544933030979/
31. SmartDox DSL
• SmartDox
• https://github.com/asami/smartdoxprocessor
• SmartDoc後継
• Emacs org-modeベースの⽂文書処理理システム
• SmartDox DSL
• 固いモデル:プログラムに落落ちるモデル
• ドメイン・モデルなど
• 柔らかいモデル:プログラムに落落ちないモデル
• 要求仕様など
• SmartDoc DSLで記述した⽂文書
• 固いモデルと柔らかいモデルが混在
• ⽂文書の中からマーキングルールを使って⾃自動抽出
35. SimpleModelerの動作
Web仕様書
project クラス図
html
ステート
CSV import マシーン図
java
SimpleModelリポジトリ
(Maven project) Javaプログラム
convert
grails
Scala DSL
Grailsプログラム
import
gae
Mindmap
(Xmind)
Google App Engine/Python
プログラム
gaej
verify testset
import
Google App Engine/Java
gaeo プログラム
Excel
検証結果 テストセット Google App Engine Oil
プログラム
企画中
36. SimpleModelerが⽣生成する
コード
Web Controller/
Action/Template HTML Form
JSP
index.jsp EntityRepositoryService
Servlet
Dojoウィジェット
index.jsp
index.jsp DEACustomerController
index.jsp
<<document>>
DDCustomer
GwtCustomer DSYorozuEntity
GWT RepositoryService
GWT-RPC JDO
index.html Servlet
<<entity>>
GwtYorozuEntity DEACustomer
GWTCustomer RepositoryServiceImpl
Editor
JDO
Atom
AtomPub
AtomPub Servlet
AtomYorozuDomain
Atomクライアント
RepositoryServiceServlet
DataStore
HTML Form
REST JSON
Servlet
Webブラウザ RESTYorozuDomain
(JavaScript) RepositoryServiceServlet
38. 諸元
• SimpleModeler 0.1.5
• Grails 1.0.4
• Google App Engine/Python 1.1.9
• Eoogle App Engine/Java 1.2.0
• Google Web Toolkit 1.6.4
• Eclipse 3.4 Java EE Developers + Google App Engine
Plugin
39. デモ⼿手順
Groovy/Spring/Hibernate
Grails
Python/Django/Dojo Toolkit
CSV
③ Google App Engine
Python
SimpleModel
リポジトリ ④ Java/JDO/
① Scala
Google App Engine Servlet/JSP/Dojo Toolkit
DSL ⑤ Java
マインドマップ ② Google App Engine Java/JDO/Google Web Toolkit
Java
Google Web Toolkit
⑥ クラス図/ステートマシーン図/
状態遷移表
Web仕様書
40. CSVとクラス図
demo.csv
#actor,parts,attrs
customer,,phone
#resource
goods,,note
#event
buy,customer;goods
44. SimpleModelerデモ
③Scala DSL→Grails
$ grails create-app grailsdemo
$ simplemodeler –grails com.demo –
output:grailsdemo
$ cd grailsdemo
$ grails generate-all com.demo.DeeBuy
$ grails generate-all com.demo.DeaCustomer
$ grails generate-all com.demo.DerGoods
$ grails run-app
46. SimpleModelerデモ
④Scala DSL→Google App Engine/Python
$ simplemodeler –gae com.demo –
gae.project:simplemodelerdemo –output:gae
$ dev_appserver.py gae
$ cd gae
$ cd appcfg.py update simplemodelerdemo
48. SimpleModelerデモ
⑤Scala DSL→Google App Engine/Java
[Eclipse]gaejプロジェクト作成
$ simplemodeler –gaej com.demo –
gaej.project:simplemodelerdemo –gaej.gwt –
output:../gaej
[Eclipse]リフレッシュ
[Eclipse]Gaejプロジェクト起動
[Eclipse]Googleアップロード
51. SimpleModelerデモ
⑥CSV→マインドマップ→Scala DSL→Web仕様書
$ simplemodeler –convert yorozu.csv
$ simplemodeler –project yorozu
$ cd yorozu
$ simplemodeler –import ../yorozu.csv
$ mvn compile
$ simplemodeler –html com.yorozu –output:target/
html.d
52. SimpleModelerデモ
CSVで記述できること
yorozu.csv
#actor,base,parts,attrs,powers,states,roles
顧客,,,住所
個⼈人顧客,顧客,,,性別(男性;⼥女女性)
法⼈人顧客,顧客
従業員,,,,,,店員
#role
店員
#resource
商品,,製品+,,,商品状態(⼊入荷待;在庫中;配送中;販売完)
製品
#event
顧客取引,,顧客;店員
顧客購⼊入,顧客取引,商品+
54. SimpleModelerデモ
Scala DSL
package com.yorozu
import org.simplemodeling.dsl._
import org.simplemodeling.dsl.datatype._
import org.simplemodeling.dsl.domain._
import org.simplemodeling.dsl.domain.values._
case class DER製品 extends DomainResource {
term = "製品"
caption = "製品"
brief = <t></t>
description = <text></text>
id("製品Id", DVI製品Id())
attribute("製品Name", DVN製品Name())
}
case class DVI製品Id extends DomainValueId {
term = "製品Id"
caption = "製品Id"
brief = <t></t>
description = <text></text>
attribute("value", XString)
}
case class DVN製品Name extends DomainValueName {
term = "製品Name"
caption = "製品Name"
brief = <t></t>
description = <text></text>
attribute("value", XString)
}
57. SimpleModelerデモ
Scala DSL→ステートマシーン図
package com.yorozu
case class DMS⼊入荷待 extends DomainState {
import org.simplemodeling.dsl._ term = "⼊入荷待"
import org.simplemodeling.dsl.datatype._ caption = "⼊入荷待"
import org.simplemodeling.dsl.domain._ brief = <t></t>
import org.simplemodeling.dsl.domain.values._ description = <text></text>
case class DER商品 extends DomainResource { transition(DEE商品⼊入荷(), DMS在庫中())
term = "商品" }
caption = "商品"
brief = <t></t> case class DMS在庫中 extends DomainState {
description = <text></text> term = "在庫中"
caption = "在庫中"
id("商品Id", DVI商品Id()) brief = <t></t>
attribute("商品Name", DVN商品Name()) description = <text></text>
association("製品", DER製品(), OneMore)
statemachine(DM商品状態()) transition(DEE顧客購⼊入(), DMS配送中())
} transition(DEE顧客購⼊入(), DMS販売完())
}
・・・中略略・・・
case class DM商品状態 extends DomainStateMachine { case class DMS配送中 extends DomainState {
term = "商品状態" term = "配送中"
caption = "商品状態" caption = "配送中"
brief = <t></t> brief = <t></t>
description = <text></text> description = <text></text>
state(DMS⼊入荷待()) transition(DEE商品配送(), DMS販売完())
state(DMS在庫中()) }
state(DMS配送中())
state(DMS販売完()) case class DMS販売完 extends DomainState {
} term = "販売完"
caption = "販売完"
brief = <t></t>
description = <text></text>
}
60. まとめ
• ユビキタス⾔言語の設計と運⽤用が⾮非常に重要
• ツールのアシストは必須
• マインドマップによるユビキタス⾔言語記述はブレインス
トーミングと教育向け
• Scala DSLでのユビキタス⾔言語は「柔らかいモデル」の
記述に不不満
• SmartDox DSLで「柔らかいモデル」と「固いモデル」
を統合