なぜ !"#$%&%'!"#$%&発展篇の発刊を記して
()*)年+月*,日%-."/$研究会、-."/$%01$21%32"4#%56#6/合同月例会%
山本 烈%76869%2$:14;
この資料はパブリックドメインとして公開しますお待たせしました()),%%%%%())>%%%%%())?%%%%%())+%%%%%())@%%%%%())A%%%%%()*)
B&%&9)9)

&9&9*

*1:%=<9(/<%=<9&9,9)

&2<%=<9企画

入門篇 発展篇

何が書いてある？
入門篇
•コンポーネントアーキテクチャ%•インストール%•インタフェース%•コンテンツコンポーネント%•永続性%•簡単なビューとブラウザページ%•ブラウザフォーム%•国際化%•サイトレイアウトのカスタマイズ%•アダプタ%•自動化されたテスト作業%•高度なビュー%•メタデータ%•コンテナ%•イベント

発展篇
•ソースとボキャブラリ%•サイト%•インデクシングと検索%•ブラウザセッション%•セキュリティ%•認証とユーザ管理%•デバッグ%•パッケージングとデプロイメント%•C-Dリファレンス%•!EFGリファレンス

誰が書いた？
-HI.I##%J"/%K$I:$21H641$/%
フィリップLフォンLヴァイテルスハウゼン!"#$%&主要開発者の１人%•ソフトウェアと同時に本もリリース%•絶妙なバージョンをベースに%•極めて深淵な記述%•豪華なレビューチーム%

疑問
*9 !"#$って、使われてるの？%(9 !"#$って、何がすごいの？%&9 -."/$と、どう関係あるの？%,9 この!"#$%&本は、まだ役に立つの？

*9%測る
69 メーリングリスト%
M9 ソースコードリポジトリメーリングリスト上の活動
*9 1J/9N"#$9"2Oの1J/%."Oを分析%(9 毎月のコミット数%&9 コミットに含まれるパッチ数%,9 コミッターの数（ユニークアカウント数）

P6I.9N"#$9"2O
&,のリスト、*AA@Q**%R%()*)Q)?、月単位%

総投稿数
P6I.9N"#$9"2O全体、*AA@Q**%S%()*)Q)?、月単位%+!!!"
978:;<8"
9=>"

*!!!"

9=?8"
9-=1-@8:A-BB1A>-@"
9-=1%:7;1@;")!!!"9-=1%:<#*C"
9-=1%:AD1A?<C;"
9-=1$:>@4A?1@"
9-=1:E12"(!!!"9-=1:>1;>;"9-=1:=4;"
9-=1:1;"'!!!"9-=1:F1."9-=1:F2"9-=1:A.;"&!!!"

9-=1:AGH"
9-=1:AD1A?<C;"
9-=1:4CC-7CA1"

%!!!"

9-=1"
9-F2:F1."
9-F2:AD1A?<C;"
9F="

$!!!"

9A-CI8"<C>1@H4A1:F1."
8;-A"

#!!!"

8@-?:F-A"
8@-?:F1."
H@1F1@<A?;27@8:9=78"
012/#!"

345/#!",-./!+"

678/!+"

012/!+"

345/!+",-./!*"

678/!*"

012/!*"

345/!*",-./!)"

678/!)"

012/!)"

345/!)",-./!("

678/!("

012/!("

345/!(",-./!'"

678/!'"

012/!'"

345/!'",-./!&"

678/!&"

012/!&"

345/!&",-./!%"

678/!%"

012/!%"

345/!%",-./!$"

678/!$"

012/!$"

345/!$",-./!#"

678/!#"

012/!#"

345/!#",-./!!"

678/!!"

012/!!"

345/!!",-./++"

678/++"

012/++"

345/++",-./+*"!"

H-7CF4J-C:4CC-7CA1"

少し整理
*9 N"#$リスト（ユーザ系）を取り除く%(9 コミット通知を取り除く%&9 自動テストの結果通知を取り除く%,9 １００投稿以下のリストを取り除く開発系議論の投稿数
P6I.9N"#$9"2O全体、*AA@Q**%S%()*)Q)?、月単位%
(>))%
N#:%
N"#$"2OSX"..$X:"2%
N"#$&S41$21%()))%

N"#$(S:26X8$2%
N"#$S[$M%
N"#$S#61%
N"#$S<$J%*>))%

N"#$S<M%
N"#$SXP\%
N"#$S6//"4/X$%*)))%

N"<MS<$J%
N<#%
NX"/]O%
I/:$2\6X$S<$J%

>))%

O1"X%
O2"8S<"X%O2"8S<$J%
V$M9*)%

U$#9)A%

C#29)A%

T"J9)@%

54/9)@%

56/9)@%

C4O9)+%

F629)+%

ZX:9)?%

F6Y9)?%

W$X9)>%

54.9)>%

V$M9)>%

U$#9),%

C#29),%

T"J9)&%

54/9)&%

56/9)&%

C4O9)(%

F629)(%

ZX:9)*%

F6Y9)*%

W$X9))%

54.9))%

V$M9))%

U$#9AA%

C#29AA%

T"J9A@%)%\"4/<6^"/%
M.4$M2$6P%

コードリポジトリ上の活動
*9 1J/9N"#$9"2Oの1J/%."Oを分析%(9 毎月のコミット数%&9 コミットに含まれるパッチ数%,9 コミッターの数（ユニークアカウント数）

1J/9N"#$9"2O
++A%プロジェクト（()*)年+月*,日現在）

54/9*)%

56/9*)%

C4O9)A%F629)A%

ZX:9)@%

F6Y9)@%

W$X9)+%

54.9)+%

V$M9)+%

U$#9)?%

C#29)?%

T"J9)>%

54/9)>%

56/9)>%

C4O9),%

F629),%

ZX:9)&%

F6Y9)&%

W$X9)(%

54.9)(%

V$M9)(%

U$#9)*%

C#29)*%

T"J9))%

54/9))%

56/9))%C4O9AA%F629AA%

ZX:9A@%

F6Y9A@%

W$X9A+%

54.9A+%

V$M9A+%

U$#9A?%

C#29A?%

コミット数

1J/9N"#$9"2O全体、*AA?Q),%S%()*)Q)?、月単位%!"##$%&

*@))%

*?))%

*,))%

*())%

*)))%

@))%
X"PPI:%

?))%

,))%

())%

)%

C#29A?%54/9*)%

56/9*)%

C4O9)A%F629)A%

ZX:9)@%

F6Y9)@%

W$X9)+%

54.9)+%

V$M9)+%

U$#9)?%

C#29)?%

T"J9)>%

54/9)>%

56/9)>%

C4O9),%

F629),%

ZX:9)&%

F6Y9)&%

W$X9)(%

54.9)(%

V$M9)(%

U$#9)*%

C#29)*%

T"J9))%

54/9))%

56/9))%C4O9AA%F629AA%

ZX:9A@%

F6Y9A@%

W$X9A+%

54.9A+%

V$M9A+%

U$#9A?%

パッチ数

1J/9N"#$9"2O全体、*AA?Q),%S%()*)Q)?、月単位%'(%!)&*()))%*))))%

@)))%

?)))%
#6:XH%

,)))%

()))%

)%

54/9*)%

56/9*)%

C4O9)A%F629)A%

ZX:9)@%

F6Y9)@%

W$X9)+%

54.9)+%

V$M9)+%

U$#9)?%

C#29)?%

T"J9)>%

54/9)>%

56/9)>%

C4O9),%

F629),%

ZX:9)&%

F6Y9)&%

W$X9)(%

54.9)(%

V$M9)(%

U$#9)*%

C#29)*%

T"J9))%

54/9))%

56/9))%C4O9AA%F629AA%

ZX:9A@%

F6Y9A@%

W$X9A+%

54.9A+%

V$M9A+%

U$#9A?%

C#29A?%

コミッター数

1J/9N"#$9"2O全体、*AA?Q),%S%()*)Q)?、月単位%!"##$*+,&

+)%

?)%

>)%

,)%

&)%
X"PPI_$2%

()%

*)%

)%

まとめ
*9 開発系のFG流量はさほど変わらない%(9 コードリポジトリへのコミット数、パッチ数、コミッター数
は継続して増加%&9 毎日約２０通の議論メール、３０件のコミット、１５０件のコードへの操作（パッチ）は、十分に活発といえる%

*9%!"#$って、使われてるの？
69 あまりニュースを見ないけど、まだあるの？%
69
M9

広告宣伝費をまったくかけていない%!"#$は開発者にとって魅力的だが、K$M利用者は興味を持たない%

M9 使っている人はいるの？%
69
M9

X9

たくさんいます%多くの人は!"#$を使っていることに気がついていません%

これから使って大丈夫？そのうち無くならない？%69
M9

もちろん大丈夫%
この１２年を経て、利用が拡大している%

!"#$コード利用の拡大!"#$%&%
O2"8%!"#$%`"".8I:%

2$#"N$9M\O%%!"#$%E"..$X^"/%
71J/9N"#$9"2O;%!"#$%(%

!"#$って、何がすごいの？

他と何が違うの？

!"#$の系譜
*AA@%%%%%*AAA%%%%%()))%%%%%())*%%%%%())(%%%%%())&%%%%%()),%%%%%())>%%%%%())?%%%%%())+%%%%%())@%%%%%())A%%%%%()*)

*9*)
a"M"b%%-2I/XI#I6

(9)

(9@(9A

(9**

(9*(
!"#$%
`"".8I:

B&%&9)9)

&9&

&9, &9,9*
a.4$a2$6P

O2"8*9) *9*
c$#"N$最初の波
*AA>%

()))%

*AA?%
a"M"開発開始%*AAA%!"#$%(リリース%*AA@%!"#$%*リリース%())>%!"#$%&コードを合併QVIJ$%()),%!"#$%&リリース%())?%
M4I.<"4:%*9)6*公開%())+%
O2"8開発開始%())?%!"#$%V"4/<6^"/設立%*AA?%
d6H""%5C-CTサービス開始%())*%
d6H""%aa%CWUGb%V.$:1光開始%())A%
M4I.<"4:に移行%

())A%
())?%
KU3D対応% M4I.<"4:に移行%())*%!"#$%&開発開始%

日本では、%

()*)%

())>%

())A%
!"#$%`"".8I:分離%())A%
O2"8%*リリース%

!"#$の革新
*AA@年 !"#$登場
•オブジェクトパブリッシング%•トラバーシング%•オブジェクトデータベース%•オールインワン%•オープンソース化%

オブジェクトパブリッシング
!"#$サーバー%

ブラウザ%
レスポンス%

パブリッシャ%リクエスト%

オブジェクト%これらのオブジェクトは、それぞれe`FGテキストや画像データ、ブラウザで実行される56J6UX2I#:コード、サーバーで実行される-Y:H"/コードなどを含む%

ブラウザからH_#リクエストが来たときに、%
ファイルリソースを探してその中身を返すのではなく、%オブジェクトと呼ばれる抽象的な情報構造体を探して、%
そのオブジェクトをコールして返されたものを返す。%

トラバーシング!"#$サーバー%

ブラウザ%
レスポンス%

パブリッシャ%リクエスト%

オブジェクト%0cGを受け取ると、%それを要素ごとに分解し、%それぞれの要素に対応するオブジェクトに次の要素に対応するオブジェクトを見つけてもらう。%

トラバース
H_#fQQN"#$9g#Q<"XQN"#$QI/:2"Q$<I:%
2"":%<"X1がI/:2"を見つける%
I/:2"が$<I:を見つける%

H"P$%

<"X1%

/$[1%

$J$/:1%

I/<$h%

O$/$26.%

I/:2"%

XH6#*%

M2"[1$%$<I:%<$.$:$%

オブジェクトデータベース
パブリッシャ%フォルダ%
リクエスト%

レスポンス%

e`FG%
フォルダ%
画像%
動画%

ファイル%
プログラム%
エラー%

オブジェクトの世界%
メモリ上%

「永続印」
があるオ
ブジェクト
を自動的
に同期%

画像%
動画%
ファイル%

オブジェクトデータベース%
ディスク上%

永続クラスを継承することで、自動的にオブジェクト
データベース上に書き込まれるようになる。%

オールインワン
H_#%
i#%
K$MWCj%BFGSc-E%!"#$%
K$Mサーバー%ユーザー%
パブリッシャー% アプリケーション%

データベース%

K$Mサーバー、パブリッシャー、データベースのすべてが一緒に配布される。%
これだけでK$Mアプリケーションが構築できる

第二の波
*AA>%

()))%

*AA?%
a"M"開発開始%*AAA%!"#$%(リリース%*AA@%!"#$%*リリース%())>%!"#$%&コードを合併QVIJ$%()),%!"#$%&リリース%())?%
M4I.<"4:%*9)6*公開%())+%
O2"8開発開始%())?%!"#$%V"4/<6^"/設立%*AA?%
d6H""%5C-CTサービス開始%())*%
d6H""%aa%CWUGb%V.$:1光開始%())A%
M4I.<"4:に移行%

())A%
())?%
KU3D対応% M4I.<"4:に移行%())*%!"#$%&開発開始%

日本では、%

()*)%

())>%

())A%
!"#$%`"".8I:分離%())A%
O2"8%*リリース%

プログラムの再利用性
一度書いたら、何度も使う%
コピペして、改造するのは再利用とは言えない。%%改造のために理解する手間、改造する手間、テストする手間がかかる%%不具合の時に元プログラムが悪いのか改造が悪いのか不明瞭になる%

元のプログラムはいっさい変更しないで再利用する%コンポーネントアーキテクチャによる実装%!"#$%(を改造して実現するのは不可能%

再利用って？
*9%新しいアプリケーションで既存プログラムを部品として再利用したい。%
そのまま使いたい%

使う側%

使われる側%(9%既存アプリケーションで機能の一部分を別のプログラムで置換えたい。%
取り替え%

使う側%

使われる側%
両方ともそのまま使いたい%再利用するのに何が問題？
•クラス名%•アトリビュート名%•メソッド名%•セキュリティ定義%

使う側%（呼ぶ側）%

使われる側%（呼ばれる側）%コードの中に名前が入っているので、名前が違うとコードも変更しなくてはならない%
コードの中にセキュリティ定義が入っているので、セキュリ
ティが違うとコードも変更しなくてはならない。%

既存プログラム再利用の問題
他人が異なる目的で作った既存プログラムを利用するには、そのプログラムを改変する必要があった。%•C-Dの呼び方が違う%•名前が違う%•機能が少し違う%•セキュリティの設定が違う%たとえば、
今ある仮想店舗の顧客管理の部分を、別の既存製品に取り換えたい場合：%•0cGの要素名が違う%•C-Dの名前が違う%

仮想店舗%
在
庫
管
理%

売
上
管
理%

顧
客
管
理%

•モジュール名が違う%
商
品
管
理%

•機能が少し違う%•パーミッション（セキュリティ設定）が違う%コンポーネントの交換可能性
仮想店舗%
在
庫
管
理%

売
上
管
理%

顧
客
管
理%

仮想店舗%
商
品
管
理%

在
庫
管
理%

売
上
管
理%

新
顧
客
管
理%

商
品
管
理%

青い部分も、黄色い部分も、いっさいコードを変更しないで交換可能か？%コンポーネント%
アーキテクチャ
E"P#"/$:%C2XHI:$X:42$%

コンポーネントアーキテクチャ
既存プログラムを「部品」として再利用するための技術体系%•サブクラス化から委任へ%•インタフェース%•コンポーネントレジストリ%•!EFG%•アダプタ%

コンポーネントアーキテクチャ
プログラムの再利用化のための考え方の体系%•サブクラス化よりも、委任を使う%•再利用の単位として、コンポーネントというものを考える。%•コンポーネントのC-D定義を書いたインタフェースを作り、コンポーネントと結びつける。%•コンポーネントをインタフェースなどの特徴情報とともにコンポーネントレジス
トリに登録する。%•コンポーネントは、コンポーネントレジストリを通してインタフェースなどの特徴情報を基にして探し出される。%•自分で書く部分と流用する既存コンポーネントの間で名前や機能が違う場合、アダプタで吸収する。%•セキュリティ定義をコンポーネントから取り除き、BFG形式の!EFGで定義する。
各パッケージの!EFGはアプリケーション側の!EFGでオーバーライドできる。%

サブクラス化から委任へ
サブクラス化%
1&

0&

委任%

2&

0&
コール%

.&

/&
継承%

コール%

-&

コール%

.&

-&

1&
/&

コーディング%アプローチを変更%

Cは、ab%Eb%Wb%=b%Vの機能を持つ%

2&

サブクラス化
X.611%Cf%%<$\%kY%

X.611%af%%<$\%1[IP%X.611%W7Cb%ab%E;f%%<$\%l46X8%

X.611%Ef%%<$\%[6.8%

継承により、これと同じ機能%

X.611%W7Cb%ab%E;%%<$\%kY%%<$\%1[IP%%<$\%[6.8%%<$\%l46X8%

委任
呼ばれる名前と呼ぶ
X.611%Cf%
X.611%W7;f%
名前は違ってもよい%%<$\%kY%%<$\%kYf%% %2$:42/%C9kY%%<$\%1[IPf%X.611%af%% %2$:42/%a91[IP%%<$\%1[IP%%<$\%[6.8f%% %2$:42/%E9[6.8%%<$\%l46X8f%
X.611%Ef%% %#2I/:%m3[6Hn%3[6Hno%%<$\%[6.8%インタフェースD/:$2\6X$%ZMg$X:%

インタフェース7C-D定義;

-&

コール%

.3&
.4&
代替%

使用中のa*コンポーネントをa(コンポーネントに取り換えたい。%
どうやって、a*とa*が交換可能かどうかを見分けるか？%インタフェース7C-D定義;
コンポーネントの種類を識別するために、
インタフェースを作り、関連付ける。%-&

Daに沿ってコール%

a*b%a(はDaを提供し、Daを満たす%.3&

インタフェースオブジェクト%

5.&
.4&
.6&

5.7&

呼ばれる側が同じインタフェースを提供し、それを満たす限り、コンポーネントとして交換可能。%

インタフェース
クラス、インスタンス、関数、モジュールなど%

インタフェース%コンポーネント%実装するか提供する%•インタフェースはコンポーネントのC-Dを記述した新しいタイプのオブジェクト%•記述方法はX.611文b%<$\文b%pを使を使うので、見かけはクラス定義に似ている%•でも、oD/:$2\6X$oを拡張するので、できるものは、インタフェースオブジェクト%•書かれたものは実行できないし、アトリビュート参照できない。%•名前は必ずoDo（大文字のアイ）で始まる%•インタフェースを実装したり、提供したりするものがコンポーネント%インタフェースのコード•コード例%
頭文字がD（アイ）%mD/:$2\6X$oを拡張%

X.611%DG"X6.$D/H$2I:6/X$7D/:$2\6X$;f%%%%%qqqG"X6.$%I/H$2I:6/X$%14##"2:9%%%%%G"X6.$S2$.6:$<%"Mg$X:1%IP#.$P$/^/O%:HI1%I/:$2\6X$%62$%6M.$%:"%618%\"2%I:1%%%%%I/H$2I:$<%1$.\9%V"2%$h6P#.$b%r$/s0U9<6:$19P"/:HT6P$1r%X6/%X6..%"/%I:1$.\%%%%%rO$:D/H$2I:$<U$.\7;r%6/<%O$:%:H$%J6.4$%\"2%r$/9<6:$19P"/:HT6P$1r9%%%%%%qqq%%%%%ss#62$/:ss%p%C_2IM4:$7q`H$%#62$/:%I/%:H$%."X6^"/%HI$262XHYq;%%%%%ss/6P$ss%p%`$h:GI/$7%%%%%%%%%^:.$%p%4q`H$%/6P$%[I:HI/%:H$%#62$/:qb%%%%%%%%%<$1X2I#^"/p4qqq`H$%#62$/:%X6/%M$%:26J$21$<%[I:H%:HI1%/6P$%:"%O$:%%%%%%%%%%%%%%%%%%%%%%%:H$%"Mg$X:9qqq;%%%%%<$\%O$:D/H$2I:$<U$.\7;f%%%%%%%%%qqqc$:42/%I:1$.\%M4:%I/%:H$%/$h:%HIOH$2%4#%G"X6.$9qqq%

インタフェース%
7C-D;の記述%

インタフェース•コンポーネントとの関係%
クラス%CaE%

X
IP#.$P$/:1%DCaE%

インタフェース%
X.611%DCaE7D/:$2\6X$;%

実装する%
インスタンス化%

提供する%

X.611%D/H$2I:6/X$7"Mg$X:;f%%%%%qqqC%1IP#.$%M61$%J$21I"/%"\%."X6.$%I/H$2I:6/X$9%%%%%`HI1%"Mg$X:%X"/:6I/1%1"P$%1H62$<%X"<$%6P"/O1:%:H$%J62I"41%%%%%rDG"X6.$D/H$2I:6/X$r%IP#.$P$/:6^"/19%%%%%qqq%

ここで実装%%%%%IP#.$P$/:17DG"X6.$D/H$2I:6/X$;%

CaEのインスタンス%%%%%t%U$$%N"#$9I*@/9I/:$2\6X$19."X6.$19DG"X6.$D/H$2I:6/X$%%%%%ss#62$/:ss%p%T"/$%%%%%t%U$$%N"#$9I*@/9I/:$2\6X$19."X6.$19DG"X6.$D/H$2I:6/X$%%%%%ss/6P$ss%p%T"/$%%%%%<$\%O$:D/H$2I:$<U$.\71$.\;f%%%%%%%%%qqqU$$%N"#$9I*@/9I/:$2\6X$19."X6.$19DG"X6.$D/H$2I:6/X$qqq%%%%%%%%%I\%1$.\9ss#62$/:ss%I1%T"/$f%%%%%%%%%%%%%26I1$%T"-62$/:=hX$#^"/7rT"%#62$/:%[61%1#$XI]$<9r;%%%%%%%%%#62$/:%p%1$.\9ss#62$/:ss9O$:D/H$2I:$<U$.\7;%%%%%%%%%I\%I1I/1:6/X$7#62$/:b%<IX:;f%%%%%%%%%%%%%2$:42/%#62$/:u1$.\9ss/6P$ssv%%%%%%%%%2$:42/%O$:6_27#62$/:b%1$.\9ss/6P$ss;%インタフェースの役割
•C-Dの記述%•コンテンツスキーマの記述%•スキーマはインタフェースの一種%•マーカインタフェース（種類を識別する標識）%•コンポーネントを、それが提供しているインタフェースで見分ける%•一つのコンポーネントは、複数のインタフェースを持てる%•C-Dが何も書かれない抽象インタフェースもある%•ドキュメントとして%•コンポーネントが何かを知るのに、これを見ればたいていは十分%たとえて言うなら
•コンポーネントを会社に見立てれば、インタフェースは契約%
契約を基に相手を判断%

会社%

取引%

インタフェースを基に%相手を判断%

コンポーネント%契約%
会社%

インタフェース%

相互作用%

コンポーネント%コンポーネントレジストリ
コンポーネントレジストリを探索%

Daをコール%

5.&

-&

5.&
5/&

.3& 8"89(8:(;;&/4& :,$(<+(=$+>&
見つけられたものをコール%

結果を返す%.3&.4&•インタフェースをキーにしてコンポーネントが登録される。%•インタフェースをコールすると、レジストリに登録されたものがコールされる。%•レジストリ登録を変えると、別のコンポーネントがコールされる。%•登録は!EFGで行われる。%•必要に応じて0cGの要素となる名前も登録される。%

で、結局のところ!"#$%(では、相手を相手が決めた名前で呼ぶ%
h%p%CaE7;%!"#$%&では、相手をインタフェースで呼ぶ%
h%p%O$:0^.I^$17DCaE;%

レジストリにこのインタフェースで登録されたコンポーネントが返される%

あるいは、コンフィグ7!EFG;で定義した名前で呼ぶ%
h%p%O$:0^.I^$17DCaEb%/6P$p4wPYCaEw;%
レジストリにこのインタフェースとコン
ポーネント名で登録されたコンポー
ネントが返される%

アダプタ
C<6#:$2%

アダプタ
インタフェースの違いを吸収するための仲介コンポーネント%
コンポーネント%

アダプタ%
CaE%
インタフェース%

Bd!%
インタフェース%コンポーネント%

アダプタがインタフェースの違いを吸収%たとえるなら、%
古いアメリカ製アンプ%
cEC%
端子%

古いドイツ製テープデッキ%
変換器%

WDT%
端子%

アダプタの使用

コンポーネント%
h%p%DCaE7hYN;%

使いたいインタフェース%

DCaE%

アダプタ%
IP#.$P$/:17DCaE;%
6<6#:17DhYN;%

hYN%
コンポーネント%
DhYN%
IP#.$P$/:17DhYN;%目的とするコンポーネント%たとえば
名前を調べるコ
ンポーネント%コンポーネント%
名前とサイズと場所を知りたい%アダプタ%
場所を調べるメソッド%
サイズを調べる
コンポーネント%

インタフェースの違いを吸収しながら、各種コン
ポーネントの機能を組み合わせて提供する%

!EFG
!"#$%E"/]O426^"/%
F6/6O$P$/:%G6/O46:$%

!EFG
•BFG形式の!"#$%E"/]O426^"/%F6/6O$P$/:%G6/O46O$%（!"#$コンフィグレーション管理言語）%•BFGなので、通常のBFGエディタや解析ツールが使える%-Y:H"/を知らなくても、コンフィグできる！%

!EFGですること•インタフェースをキーにしてコンポーネントを登録%•0cG要素に対応する名前を登録%•セキュリティ構成を定義%•メニュー構成を定義%
つまり、今まで-Y:H"/コードで書いていた再利用時に変更する部分を、!EFGで記述することによって外部化した。%

そして、-Y:H"/プログラマでなくても書ける。%

!EFGの意義
コンポーネントとコンポーネントをつなぎ合わせるプログ
ラム言語%%たとえば、どこかで別に開発され動いている-Y:H"/コン
ポーネントを自分のK$Mアプリケーションに組み合わせる。%
コンポーネントC%

コンポーネント%
レジストリ%

コンポーネントa%-Y:H"/%!EFG%-Y:H"/%

プログラマC%システム管理者%

プログラマa%!EFG
!"#$%E"/]O426^"/%F6/6O$P$/:%G6/O46O$%
コンフィグのためのBFG派生言語%!"#$によるK$Mアプリケーション開発%-Y:H"/によるコン
ポーネント開発%
プログラマ%
Qデザイナ%!EFGによるコン
フィグレーション%
コンフィグ担当者&（セキュリティ管理者）&

サイト開発%

コンテンツ作成%
ユーザ%

!EFGによるセキュリティ定義
基本的な機構はパーミッションベース%
コンポーネントを使おうとする主体%
パーミッション%合致したときだけアクセス
を許可%

この部分を!EFGで定義%使われようとする
コンポーネント%
パーミッション%プリンシパル%コンポーネント%

ブラウザ%
K$MWCjクライアント%
V`-クライアント%
BFGSc-Eクライアント%

コンテンツ%
メニュー%
ビュー%
アクション%
L%L%

-."/$と、どう関係あるの？
-."/$って!"#$%(をベースにしてるでしょ、、、

現在の波
*AA>%

()))%

*AA?%
a"M"開発開始%*AAA%!"#$%(リリース%*AA@%!"#$%*リリース%())>%!"#$%&コードを合併QVIJ$%()),%!"#$%&リリース%())?%
M4I.<"4:%*9)6*公開%())+%
O2"8開発開始%())?%!"#$%V"4/<6^"/設立%*AA?%
d6H""%5C-CTサービス開始%())*%
d6H""%aa%CWUGb%V.$:1光開始%())A%
M4I.<"4:に移行%

())A%
())?%
KU3D対応% M4I.<"4:に移行%())*%!"#$%&開発開始%

日本では、%

()*)%

())>%

())A%
!"#$%`"".8I:分離%())A%
O2"8%*リリース%

!"#$コードの統合とVIJ$•())>年 !"#$%(9@から!"#$%&とVIJ$を同梱%•!"#$アプリケーションが!"#$%&コードを使い始める%•徐々に旧式な!"#$%(コードが廃止される%()),Q&%-."/$%(9)%!"#$%(%())?Q?%-."/$%(9>%())+Q@%-."/$%&9)%!"#$%(% VIJ$% !"#$%&%!"#$%(% VIJ$% !"#$%&%oVIJ$oは !"#$%(の中で!"#$%&の技術を使えるようにする技術%

-."/$と、どう関係があるの？
•-."/$は、!"#$%&への移行戦略としてoVIJ$oを採用した。%•

その後、o!"#$%&oへの移行をあきらめ、!"#$%(と!"#$%&のコードを統合することにした。%•

新しい-."/$には、インタフェース、アダプタ、イベント、!EFGなどの!"#$%&技術が使われている。%•-."/$はコンポーネントアーキテクチャ化されつつあり、配布
方法のビルドアウト化と併せて、極めて柔軟に構成できるソ
フトウェアに変化しつつある。%•

なので、-."/$%,のコードを読んだり、アプリケーションを作る
のに、!"#$%&技術の理解が必要%

-."/$での使われ方#."/$9"2Oのコードリポジトリを見てみよう%*9 H_#fQQ<$J9#."/$9"2OQ#."/$QM2"[1$2Q#."/$9X"/:$/:24.$1Q:24/8Q#."/$Q
X"/:$/:24.$1%

見つけましたか
•
•
•
•
•

!EFG%
インタフェース%
スキーマ%
マーカーインタフェース%
アダプテーション%この!"#$%&本は、まだ役に立つの？
••••もちろん！%
今後、５~１０年は役に立ちます。%
コンポーネントアーキテクチャを、ここまでわ
かり易く学習できる文書は他にない。%
コード再利用のために!"#$に実装されたコンポーネントアーキテクチャは、実世界でうまくいき、現在その利用が拡大しています。%