Comments
Description
Transcript
ColdFusion Webアプリケーションフレームワーク入門
COLDFUSION WEBアプリケーションフレームワーク入門 -COLDBOXの使い方- JCFUG 2015/01/23 © 2015 Ortus Solutions, Corp & Luis Majano スピーカーについて JCFUGマネージャー 1998年のCF日本進出から一貫して、受託開発・コン サルティング・トレーニング講師等で活動 Macromedia COLDFUSION MX 認定デベロッパー試験 公式ガイド 監修・翻訳担当 ソフトバンククリエイティブ刊 ISBN 4-7973-2665-4 2004年3月刊 ColdFusion 8 プロフェッショナルガイド 編著・監修担当 毎日コミュニケーションズ刊 ISBN 978-4839925802 2008年4月刊 ColdFusion セキュリティ設定代行 サービス CFの受託案件やコンサルなどお仕事も募集中! 株式会社エスアイヤ 河野 俊之 ([email protected]) 木戸間 周平([email protected]) JCFUGのご紹介 JCFUG - Japan ColdFusion User Group – http://jcfug.com/ Adobe Japan 公式コミュニティーの中で、 もっとも歴史がある オンラインを中心とした活動で、 現在のアクティブメンバーは700名以上 老若男女、ColdFusionの経験を問わず メンバー募集中! 概要 • フレームワークについて – フレームワークとは – 主なWeb用フレームワーク/ライブラリの種別 – フレームワークでどう変わるか • 使った場合と使わない場合との違い • MVC2モデル – ColdFusion用フレームワークの紹介 • ColdBoxの概要 – 特徴 – 仕組み • 主な構成要素 • 基本の流れ • エンティティの扱い/データアクセス • バリデーション • まとめ フレームワークとは • アプリケーションフレームワーク (Application Framework) とは、プログラミングに おいて、特定のオペレーティングシステムのためのアプリケーションの標準構造 を実装するのに使われるクラスやライブラリの集まりである。単にフレームワーク とも呼ぶ • 多くの再利用可能なコードをフレームワークにまとめることによって、開発者の手間を 省き、新たなアプリケーションのために標準的なコードを改めて書かなくて済むように する (Wikipediaより) • デスクトップアプリケーション用 – MFC, Cocoa, GNOME, KDE, .net Framework, Java FX など • Webアプリケーション用 – Struts2, SAStruts, JSF, ASP.net, Ruby on Rails, CakePHP, Django など – JavaScript用フレームワークもある • HTML/CSSのフレームワークといったものもある – 定義済みCSS等のセット、レスポンシブ対応。Bootstrap など 主なWeb用フレームワーク/ライブラリの種別 • Webアプリケーションフレームワーク – Webアプリの流れや構成 – Ajax/REST対応 • テンプレートエンジン – HTMLレンダリング 軽量フレームワーク (多分こんな感じ) • バリデーションライブラリ – 入力値の検証 • ORM – データの永続化/DB処理 • DIコンテナ – クラス/インスタンスの管理、疎結合 • AOP – 関心の分離、疎結合 • 単体テスト – テストコードによる自動テスト フルスタックフレームワーク フレームワークでどう変わるか • アプリケーションの構造を整理する手助けになる – フレームワークのコンセプトに沿った整理が促進される – ある程度方針が決まっているため、土台の作りについて悩まなくてよい • 基本構造を毎回作らなくてよくなる – – – – 初期化 データアクセス インスタンスの管理/関数のロード ファイルの置き場所、関数の置き場所などの確保 • 決まったディレクトリ構造、決まった置き場所 – – – – – – セッション管理 バリデーション処理 エラー処理 ロギング セキュリティ その他 • カバーする範囲はFWによって異なる フレームワークでどう変わるか • 例:FWを使わない場合にありがちな構造 – 一つのcfmが画面と一対一に対応 – ロジック、データアクセス、プレゼンテーション全てが 一枚のファイルに書かれている HTTP Request 処理 SQL バリデーション 表示 HTTP Response cfm DB フレームワークでどう変わるか • これはこれで分かりやすいが・・・ – 処理が分離していないため、似たような別の処理を書く時 に、コピーせざるを得ない • 処理を外部に追い出すとしても追い出す先に悩むことになる 処理 SQL バリデーション 処理 SQL バリデーション コピペ 表示 表示 cfm cfm フレームワークでどう変わるか • コピーすると、その場は良いのだが・・・ – 修正が入ると、その都度全部直さなくてはならない – 修正=リリース後の改修のみならず開発中の変更、 試行錯誤も含む 修正 修正漏れ 処理 SQL バリデーション 処理 SQL バリデーション 処理 SQL バリデーション 処理 SQL バリデーション 表示 表示 表示 表示 cfm cfm cfm cfm フレームワークでどう変わるか • 現在の主流:MVCモデル(MVC2) • 役割ごとに分ける – Model(cfc):そのアプリケーションで本来したいこと全般とそのデータ 表現(ドメインモデル)を書く – View(cfm):表示に伴う処理を書く(webの場合主にHTML出力) – Controller(cfc):処理の起点。入力に応じてModelを起動し、 Viewを呼び出す DB Controller HTTP Request Model View HTTP Response フレームワークでどう変わるか • 変更に強い、再利用し易い – 再利用=そのシステムの中で使いまわせる • これは設計の問題であって、FWを使わなくても同じことは可能。逆に 使用してもそうならないように作ることも可能ではあり、FWはあくまで 方向づけの一つに過ぎない Controller REST View JSON ModelA DB Controller HTML View HTML ModelB フレームワークでどう変わるか • 一方でフレームワークを使うと・・・ – 覚えるコストがかかる • 同じFWを使い続けることによって回収する – 実行速度が多少落ちるケースもある • FWが裏で色々やっていることがあるので・・・ – MVCで分けるとは言ってもどこに何を書くべきかなどの設計に は、経験、慣れが必要 • 設計の話なので割愛するが、MVCのあるべき姿については一時期一部 で盛り上がっていた模様。この辺りが面白いのでは・・・ – MugeSoの日記:PHPerのMVCの一体どこが間違っていたのか http://d.hatena.ne.jp/MugeSo/20121224/1356345261 – F’s Garage:MVCにおけるcontrollerクラスの役割は時代と共に変わって行く http://f-shin.net/fsgarage/638 ColdFusion用フレームワーク • • • • Struts (2001~ OO/XML) Fusebox 5.5 (1997~ 非OO → 後にOO) Ruby on Rails (2004~ OO/non XML) CF界最古のフレームワーク。更新停止 CakePHP (2005~ OO/non XML) http://www.fusebox.org/ Mach II 1.8 (2003~ OO/XML) CFで最初のオブジェクト指向(Object-Oriented)フレームワーク。更新停止 http://mach-ii.com/ Model-Glue: 3.2 RC 2 (? OO/non XML) イベントベースのOOフレームワーク。更新停止 http://www.model-glue.com/ ColdBox 3.8.1 (2006~ OO/non XML) ORMサポートなどが色々ついたフルスタックのフレームワーク。2014/10に4.0.0 RCリリース http://www.coldbox.org/ • CFWheels 1.3.2 (2009~ OO/non XML) RoRにインスパイアされたフレームワーク。本家同様ActiveRecordパターンのORMを持つ 2014/11更新。 http://cfwheels.org/ • FW/1 - 2.5 (2010~ OO/non XML) 設定より規約(convention over configuration)に則った軽量フレームワーク。2014/08に3.0 Beta1リ リース。DI 1というDIコンテナもある http://fw1.riaforge.org/ ColdBoxとは • オープンソース • 2006年から開発されている • MVC, DI, AOP, ORM, ユニットテストなど幅広いレイヤをサポート • Adobe, GE, Kennedy Space Center, NASA JPL, US Airforceなどで使用されている • ドキュメントが豊富(英語) – 本も出ている • 中の人+有志による様々な拡張機能 – http://www.coldbox.org/forgebox • カンファレンスもやっているらしい – http://www.intothebox.org/ かなり力が入っているFWといえるのではないか? → 更新が止まるとやはりあまりよろしくないので重要 ColdBoxの特徴 • イベントドリブン/フロントコントローラー – ファイルベースではなく、自分でつけたイベント名で処理を動かしていく • 設定より規約 – 開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせないというソフトウェア 設計パラダイム – XMLに設定を書かずにディレクトリ/ファイル名などの一定のルール付けで解決する • 4つの内部フレームワークを持つ(単体利用も可能) – – – – • • • • • • WireBox:DI(依存性注入)とAOP(アスペクト指向プログラミング)のフレームワーク LogBox:Log4J風のログライブラリ CacheBox:キャッシュエンジン MockBox:テスト用モック、スタブ作成のフレームワーク CFORM(Hibernate)を統合 Ajaxサポート RESTful/SOAPサポート Adobe Flex/Airの統合とモニタリング xUnit/BDDのサポート 様々なDSL(キャッシュ、 DI/AOP、 ロギング、モック作成などで使える独自記法) ColdBoxの特徴 ColdBoxの仕組み • 以下について簡単に解説 – 主な構成要素 – 基本の流れ – エンティティの扱い/データアクセス – バリデーション ColdBoxの仕組み-主な構成要素 • イベントハンドラ(controller) – ユーザーからのリクエスト(イベント)を受け取るエンドポイント – ColdBoxオブジェクト • モデル(model) – アプリで行いたい処理を実行する – ColdBoxオブジェクトである必要はなく勝手に作ってよい – エンティティも含む • レイアウト/ビュー(view) – レイアウト:ヘッダ、フッタなどの共通部分のcfmテンプレート 内部にビューをインクルードして使う – ビュー:各画面を描画するcfmテンプレート ColdBoxの仕組み-その他の構成要素 • モジュール – 独立した画面等も含むことができる拡張機能 • カート、ブログ、 ユーザー管理、セキュリティなど • プラグイン – 画面を伴わない拡張機能 • バリデーション、ORM拡張、多言語化、各種ユーティリティなど • 4.0で廃止。モジュールに統合される模様 • インターセプター(Intercepting Filterパターン) – リクエスト/レスポンスの前後やその他に用意された各種のインターセ プションポイントでフィルター的に処理を実行する機能 • Application.cfm/cfcやOnRequestEnd.cfmで 全体処理を実行するようなイメージ ColdBoxの仕組み-主な構成要素 • ファイル/ディレクトリ構成 /www/ApplicationDir /config /handlers フレームワークの設定関係 ハンドラ置き場 Article.cfc Main.cfc /layouts レイアウト置き場 Main.cfm /models モデル置き場 /article Article.cfc ArticleService.cfc /utilities /modules /views ColdBoxの拡張機能 ビューファイル置き場 /article list.cfm Detail.cfm Application.cfc Index.cfm ColdBox本体呼び出し箇所 cfm起動のためのダミーファイル (アクセスは基本的に全てここで受ける) ColdBoxの仕組み-基本の流れ ColdBoxの仕組み-基本の流れ • イベントドリブン – http://hoge/bbs/index.cfm?event=article.list – http://hoge/bbs[/index.cfm]/article/list/ • ハンドラ – /bbs/handlers/Article.cfc <cffunction name="list" returntype="void"> <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> ColdBoxの仕組み-基本の流れ • イベントドリブン – http://hoge/bbs/index.cfm?event=article.list – http://hoge/bbs[/index.cfm]/article/list/ mod_rewriteなどで省略可能 • ハンドラ – /bbs/handlers/Article.cfc <cffunction name="list" returntype="void"> <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> ColdBoxの仕組み-基本の流れ • イベントドリブン – http://hoge/bbs/index.cfm?event=article.list – http://hoge/bbs[/index.cfm]/article/list/ イベント名 • ハンドラ – /bbs/handlers/Article.cfc <cffunction name="list" returntype="void"> <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> ColdBoxの仕組み-基本の流れ • イベントドリブン – http://hoge/bbs/index.cfm?event=article.list – http://hoge/bbs[/index.cfm]/article/list/ • ハンドラ Cfc名を名前で紐付け – /bbs/handlers/Article.cfc <cffunction name="list" returntype="void"> <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> ColdBoxの仕組み-基本の流れ • イベントドリブン – http://hoge/bbs/index.cfm?event=article.list – http://hoge/bbs[/index.cfm]/article/list/ • ハンドラ メソッド名を名前で紐付け – /bbs/handlers/Article.cfc <cffunction name="list" returntype="void"> <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> ColdBoxの仕組み-基本の流れ • イベントドリブン – http://hoge/bbs/index.cfm?event=article.list – http://hoge/bbs[/index.cfm]/article/list/ • ハンドラ – /bbs/handlers/Article.cfc Request Collection →URL/Formパラメータが入る Private Request Collection <cffunction name="list" returntype="void"> →データ受け渡しに使える <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> ColdBoxの仕組み-基本の流れ • ハンドラ – /bbs/handlers/Article.cfc <cffunction name="list" returntype="void"> <cfargument name="event"> <cfargument name="rc"> <cfargument name="prc"> Modelからデータ取得 <cfset prc.qArticle = articleService.listTreeQuery(rc.row)> <cfset event.setView("article/list")> </cffunction> • ビュー – /bbs/views/article/list.cfm Viewファイルの呼び出し ColdBoxの仕組み-基本の流れ • ビュー – /bbs/views/article/list.cfm ・・・ <cfloop query=“prc.qArticle”> <div class=“row”> <p>タイトル:#prc.qArticle.Title#</p> <p> #prc.qArticle.Body# </p> </ div > </cfloop> ・・・ prcの値を使用 (rcも使える) ColdBoxの仕組み-基本の流れ • 詳しくは以下を参照 – ColdBox Overview • http://wiki.coldbox.org/wiki/ColdBox.cfm • どうもDBを使わない、ごく簡単なサンプルがない? – とりあえずColdBoxバンドル版に含まれる /ApplicationTemplates/Simple を見てみるのがいいかも – DBを用意するのがやや面倒だが、 /samples/applications/SimpleBlog/simple_blog_5 には一通りの処理が入っている – 4.0用にはhelloworldというサンプルが作られている模様 • https://github.com/ColdBox/coldboxsamples/tree/master/applications/helloworld ColdBoxの仕組み-エンティティの扱い • Queryオブジェクトをそのまま使うこともできる が、基本的にはcfcにデータや振る舞いを実装 することを想定 • そうしたcfcと物理DBを繋ぐためのツールが用 意されている(CFORM/Hibernateのラッパー) – ColdBox 3.x系だとORMService Plug-in – ColdBox 4.x系だとcborm module • ここでは、そうしたDBと繋ぐ機能について解説 ColdBoxの仕組み-エンティティの扱い • 大まかに言って3パターンある • http://wiki.coldbox.org/wiki/Models.cfm – Solo Style • ColdBoxのサポート機能をあまり使わないパターン(割愛) • Query → モデルへの代入など便利機能あり – ActiveEntity Style • cfcをテーブルの1レコードに直接マッピングし、自分自身に 操作メソッドを持たせる • いわゆるActiveRecordパタ-ン – Virtual Service Layer Style • エンティティを操作するサービス層を提供 • いわゆるトランザクションスクリプト的にするのか、ドメインモデル 的にするのかはまた別の話で、とりあえずそういう機能があるとい う点だけ・・・ ColdBoxの仕組み-エンティティの扱い • 例えば、掲示板アプリのデータ構造を考える – 投稿記事 • • • • • ID 件名 投稿者名 内容 投稿時刻 ColdBoxの仕組み-エンティティの扱い • 例えば、掲示板アプリのデータ構造を考える – 投稿記事 • • • • • ID 件名 投稿者名 内容 投稿時刻 <!--- Article.cfc ---> <cfcomponent> <cfproperty name=“articleID”> <cfproperty name=“title”> <cfproperty name=“author”> <cfproperty name=“content”> <cfproperty name=“regDate”> ・・・ それぞれcfcのプロパティ として割り当てる </cfcomponent> ColdBoxの仕組み-エンティティの扱い • 例えば、掲示板アプリのデータ構造を考える <!--- Article.cfc ---> <cfcomponent> <cfproperty name=“articleID”> <cfproperty name=“title”> <cfproperty name=“author”> <cfproperty name=“content”> <cfproperty name=“regDate”> Articleテーブル 列名 型 articleID Integer title Varchar Author Varchar Content Text regDate Date ・・・ </cfcomponent> 格納先のテーブルを用意 DB ColdBoxの仕組み-エンティティの扱い • ActiveEntity Styleの場合 DBのarticleテーブルにマッピング (4.0だとexends指定が異なる) <!--- Article.cfc ---> <cfcomponent persistent=“true” table=“article” extends=“coldbox.system.orm.hibernate.ActiveEntity”> <cfproperty name=“articleID” fieldtype=“id” generator=“native”> <cfproperty name=“title” ormtype=“string”> <cfproperty name=“author” ormtype=“string”> <cfproperty name=“content” ormtype=“string”> <cfproperty name=“regDate” ormtype=“date”> ・・・ </cfcomponent> ColdBoxの仕組み-エンティティの扱い • ActiveEntityクラスにより自動的にメソッドが補完 – 一件取得 • prc.article = entityNew("Article").get( rc.id ); – リスト取得 • prc.articles = entityNew("Article").list( sortOrder=“regDate",asQuery=false); – 削除 • entityNew("Article").deleteByID( rc.id ); – 保存(新規/更新は自動振り分け) • event.paramValue("id",0); • article = populateModel( entityNew("Article").get( rc.id ) ); • article.save(); CFCで静的メソッドが使えないため、常にインスタンスを作成 しないといけない点がやや苦しい・・・ ColdBoxの仕組み-エンティティの扱い • 保存(新規/更新は自動振り分け) – event.paramValue("id",0); • rc.idの初期化。<cfparam>と同じ動作 – article = populateModel( entityNew(“Article”).get( rc.id ) ); • populateModel({cfcインスタンス}) – rcからパラメータをとって、渡されたインスタンスの同名プロパ ティに自動的に代入 • entityNew(“Article”).get( rc.id ) – rc.idと同じArticleIDのレコードがあったら、ロードしてインスタンス を作成、無かったら空のインスタンスを作成 – article.save(); • インスタンスがロードされたものだったらUPDATE、新規だっ たらINSERTを行う ColdBoxの仕組み-エンティティの扱い • Virtual Service Layer Styleの場合 <!--- Article.cfc ---> <cfcomponent persistent=“true” table=“article”> DBのarticleテーブルにマッピング Extendsはしない POJO的な単なる普通のcfc <cfproperty name=“articleID” fieldtype=“id” generator=“native”> <cfproperty name=“title” ormtype=“string”> <cfproperty name=“author” ormtype=“string”> <cfproperty name=“content” ormtype=“string”> <cfproperty name=“regDate” ormtype=“date”> ・・・ </cfcomponent> ColdBoxの仕組み-エンティティの扱い • 基本機能だけの場合、サービスクラスは作らなくてよい。 • ArticleエンティティとVirtualEntityServiceがバインドされた 状態のインスタンスを、 DIコンテナから取得できる • <cfproperty name=“articleService" inject="entityService:Article“> – WireBoxのDSLとして「inject」という属性が拡張されている – Articleエンティティ用に初期化されたentityServiceのインスタンスが 自動作成 – entityServiceに定義済みのメソッドを使い、ハンドラ/モデル内でエン ティティを取り出せるようになる • 別途サービス用クラスを作成し、VirtualEntityServiceを継承して、 独自拡張することも可能 ColdBoxの仕組み-エンティティの扱い • 取得したarticleServiceを使って操作が可能となる – 一件取得 • prc.article = articleService.get( rc.id ); – リスト取得 • prc.articles = articleService.list( sortOrder=“regDate",asQuery=false); – 削除 • articleService.deleteByID( rc.id ); – 保存(新規/更新は自動振り分け) • event.paramValue("id",0); • article = populateModel( articleService.get( rc.id ) ); • articleService.save(article); ColdBoxの仕組み-エンティティの扱い • 詳細は以下を参照 – Model Integration Guide • http://wiki.coldbox.org/wiki/Models.cfm – リレーション構造を含むサンプル • /samples/applications/SimpleBlog/simple_blog_5 – DBと直接関連していないモデルクラスもDIコンテ ナ経由で取り出せる • http://wiki.coldbox.org/wiki/WireBox.cfm ColdBoxの仕組み-エンティティの扱い • 課題 – ColdBoxというよりも一般的な課題だが、複雑なリレーショ ンを含む場合、ORMへのマッピング定義が難しい • ORMを使うことによる新たな問題 • ORMを使わなくても、手動でRDB⇔オブジェクト化はできるがそれ はそれで面倒 – 多量のデータ、複雑なリレーションはSQLを直接書いた方 が扱い易い • ORM経由でのクエリオブジェクト取得や、ORMとネイティブクエリ の併用も可能だが、Queryオブジェクトとして取得すると、利用す る際のインターフェースが異なるため、使う側で工夫が必要 • 速度面でもSQLの方がチューニングし易いため、一覧系はSQL、詳 細画面はORM経由で省力化など、ある程度の割り切りが現実 的? ColdBoxの仕組み-バリデーション • ColdBoxのバリデーションエンジンは基本的には、モ デル(エンティティ)に対して、制約として記述する • ハンドラ内などで、独自のバリデーション設定を作る こともできる • その場合、モデルあるいは構造体(rc/prcなど含む)に対 してチェックを行える • バリデーションのルールは、基本的なものが予め定 義済みだが、独自のルールも作成可能 • 独自ルールはUDFで定義できるので、DBを見るなど実装 依存の処理も追加可能 ColdBoxの仕組み-バリデーション • バリデーション制約の例 <!--- Article.cfc ---> <cfcomponent persistent=“true” table=“article”> <cfproperty name=“articleID” fieldtype=“id” generator=“native”> <cfproperty name=“title” ormtype=“string”> <cfproperty name=“author” ormtype=“string”> <cfproperty name=“content” ormtype=“string”> <cfproperty name=“regDate” ormtype=“date”> <!--- validation --> <cfset this.constraints = { title= {required=true}, author = {required=true}, content = {required=true, size=1000} }> </cfcomponent> ColdBoxの仕組み-バリデーション • チェックを実行 cfcに書いたバリデーション ルールが実行される <!--- Handler.cfc ---> <cffunction name=“save”> <cfset event.paramValue("id",0)> <cfset var article = populateModel( articleService.get( rc.id ) )> <cfset var vResults = validateModel(article)> <cfif !vResults.hasErrors() > <cfset articleService.save(article )> <cfset getPlugin("MessageBox").info(“Article Saved!")> <cfset setNextEvent("articles")> <cfelse> <cfset getPlugin("MessageBox").error(messageArray=vResults.getAllErrors())> <cfreturn editor(event,rc,prc)> </cfif> </cffunction> ColdBoxの仕組み-バリデーション • 組み込みのルール(一部) – required:必須チェック – type:型チェック – max, min:最大最小 – size:文字や配列のサイズ(長さ)チェック – regex:正規表現パターンを書けるチェック – inList:リストに含まれるかどうか – udf:チェック結果を返す任意のUDFを実行 – method:オブジェクト内の任意のメソッドを実行 (udfとどう違うのか?) ColdBoxの仕組み-バリデーション • 詳細は以下を参照 – ColdBox Object & Form Validation Engine • http://wiki.coldbox.org/wiki/Validation.cfm – サンプル • /samples/applications/Validation まとめ&CFフレームワーク利用の課題 • フレームワークを使うことでその思想に則った開発がし易くなる – ただし、学習コストがそれなりにかかる – 設計思想が肌に合わない場合、別のものに乗り換える勇気 • 2015/01時点でアクティブなCF用のWebアプリケーションフレームワークはおよそ3 種類 – いずれも日本語のドキュメントはない – 英語でも解説書などがほぼないため、ある程度フレームワークの中身を追わないと何をして いるのかよく分からないことが多い • • ColdBoxは様々なレイヤをサポートしており、いわゆるモダンな開発への近道とな りうる ColdBoxに限らず、DI/AOP絡みの言語拡張でありがちだが、どこに何が書けるの かよくわからない。設定にエラーが出ているが何が原因なのかよくわからない – これもフレームワーク本体のソースを見るのが早そう • 今からColdBoxを触るのであれば、4.0の方がよいかも – ドキュメントはまだ書き換わっていないが、一部の変更点以外は大体同じ • 変更点:http://wiki.coldbox.org/wiki/Compatibility:4.0.0.cfm – サンプルも動いたり動かなかったりするが、GitHubを見ていると、ちょうどいま書き換えてい る途中のようなので、しばらくしたら直っていたりするかも – また、一部設定を変えれば動いたりもする ありがとうございました • ColdBox – http://www.coldbox.org/ • ColdBox Bundle版に色々なサンプルが付属している (一部要DB) – https://github.com/coldbox • 4.0 RC用のサンプルはGithubから。現在調整中? – http://runnable.com/ColdBox • サイト上で動かせるサンプル • JCFUG – http://jcfug.com/ • CFに関する質問、回答、その他受付中!