ColdFusion-開発効率を求められる今だから知りたい高性能Webアプリケーションサーバー

第1回ColdFusionとは何か。どう動いているのか

『10分で作るRailsアプリ』が人気を集めるなど、昨今のWebアプリケーション開発では開発効率の高さが求められるようになりました。そのような中で抜群の開発効率を誇るColdFusionですが、名前だけは知られていても、実際どのようなものかを知っているWeb開発者は残念ながら少ないのが実情です。

この連載では、なかなかフォーカスされることの少ないColdFusionに注目し、そのポテンシャルを探ることを目的としています。

今回は、ColdFusionを概観します。

ColdFusionとは

ColdFusionとはアドビシステムズ株式会社が販売するWebアプリケーションサーバーです。同じようなカテゴリーに属する製品としてはマイクロソフトのASP.NETや、サンマイクロシステムズの策定する仕様であるJava Platform, Enterprise Edition(略称Java EE。古くはJ2EEと呼ばれていました)に準拠したWebSphereJBossなどがあります。

ColdFusionはWebアプリケーションサーバーとして長い歴史を持っており、1995年に米Allaireから発売されて以来、その開発効率・生産性の高さから一貫してWeb開発者より支持を集めています。2001年の米MacromediaによるAllaire買収を経て、最新版 ColdFusion 8日本語版はアドビシステムズ株式会社から2007年9月21日に発売されました(英語版以外でローカライズされているのは日本語版のみとなっており、日本市場への力の入れ具合が伺えます⁠⁠。

Webアプリケーションサーバーという名前の通り、主にデータベースと連携した動的サイトの構築に使われますが、ColdFusion自体はJava EEプラットフォーム上で動作するため、ColdFusionからJavaで構築したビジネスロジック(Javaのクラスファイル)を呼び出すなど、他の言語との"のり"の役割も果たすことができます。ColdFusion8以前よりサポートしているJava EEの商用実装であるWebSphereなどに加え、ColdFusion 8からはフリーのJava EE実装であるJBoss上で動作させることも公式にサポートされるようになったため、JBossの上位層としての活躍させることも可能ですサポートするプラットフォーム一覧はこちら(PDF)⁠。

また、ColdFusion 8では.NETのアセンブリを呼び出すことも可能になったので、.NETを採用している企業が.NETでビジネスロジックを構築し、そのフロントエンドとしてColdFusionを採用するというシナリオも考えられます。つまり、JavaかColdFusionか、あるいは.NETかColdFusion かという二者択一的なものではなく、様々な言語プラットフォームと共存できるのがColdFusionのポイントであるといえます。

さらに、Adobeプロダクトの一員となったことにより、フロントエンド側にFlash Player、Adobe AIR、ブラウザ、Adobe Readerなどを持ってくることができるようになったため、各種バックエンド(データベース、Java、.NET、Webサービス、 LiveCycle、Flash Media Serverなど)と前述のフロントエンドを繋ぐハブとしての役割も担うようになりました。

その他、ColdFusion 8が備えている機能には以下のようなものがあります。

  • Webサービス(SOAP)の提供、または外部Webサービスの呼び出し
  • Flash RemotingによるFlashとの高い親和性
  • LiveCycle Data Services ES(旧Flex Data ServicesによるFlexとの高い親和性
  • HTMLからPDFへの変換
  • PDFファイルの操作(2つのPDFのマージ、目次作成、暗号化、PDFのオーダーメイドなど)
  • 画像処理(サムネイル作成、画像描画など)
  • グラフの描画
  • SMSJabberGoogle TalkなどのXMPP)JMS(Java Message Service)などの非同期イベントの処理
  • LDAPとの連携によるアカウント管理
  • Microsoft Exchangeとの連携(バッチ処理でカレンダーに予定を入れるなど)
  • ラインデバッギング(ページにブレイクポイントを設定し、その時点での各種変数を参照可能)
  • GUIによるサーバー監視(処理に時間のかかっているページや、遅いクエリー、頻繁に実行されているクエリー、メモリー消費量などをグラフやチャートなどで視覚的に監視可能)

これはColdFusion 8が備えている機能の一例に過ぎませんが、これらのリッチな機能はColdFusionにビルドインで組み込まれているため、ColdFusionを買ったその日からこれらの機能を簡単に使用することができます(たとえば、PerlやPHPで画像やグラフを描画しようと思ったら、GDなど外部ライブラリを別途導入する手間がかかります⁠⁠。

ColdFusion概要 - データベースとの連携

ColdFusionは元々データベースと連携した動的Webサイトを構築するためのアプリケーションサーバーとして開発されました。そのため、他言語に比べ動的サイト構築には一日の長があります。

例えば、ColdFusionではCFML(ColdFusion Markup Language)というHTMLのようなタグベースの言語を用いて、クエリーを発行したり、クエリーの中身を表示するロジックを組みます。例えば、 PHPでADODBなどの外部ライブラリを用いずに、ネイティブな関数のみでMySQL上のTable1のカラムstrから、⁠What's new」で始まる行を取得してくる例と、ColdFusionで同じ事をする例を比べてみましょう。

PHPでクエリーを実行し、結果を表示する例
<?php
$handle = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$handle) {
    die('接続できませんでした: ' . mysql_error());
}
$param = mysql_escape_string("What's new%");
$sql = sprintf("SELECT str FROM Table1 WHERE str LIKE '%s'", $param);
$result = mysql_query($sql);
if (!$result) {
    echo "クエリ ($sql) を正しく実行できませんでした: " . mysql_error();
    exit;
}
while ($row = mysql_fetch_assoc($result)) {
    echo '<p>' . htmlspecialchars($row["str"]) . '</p>';
}
mysql_close($handle);
?>
ColdFusionでクエリーを実行し、結果を表示する例
<!---
cfqueryタグで囲った中身には実行したいSQLを記述します。
cfqueryタグのクエリー結果はname属性で渡した変数に代入されます。
cfqueryparamタグはmysql_escape_string()のように、SQLインジェクションを防ぐために、SQLの特別な文字列をエスケープしてくれるタグです。
また、プリペアドステートメントのプレースホルダーの役割も果たします。
なお、このHTMLのコメントのような部分はCFMLのコメントに該当し、ColdFusionが吐き出すHTMLには出力されません。
--->
<cfquery datasource="ds" name="qry"> 
SELECT str FROM Table1 WHERE str LIKE <cfqueryparam CFSQLType="CF_SQL_VARCHAR" value="What's new%">
</cfquery> 
<!---
下のcfloopタグがPHPのwhile文の部分にあたり、ここで全ての該当行をループし表示します。
変数を出力するにはcfoutputタグの中で、出力したい変数をシャープマーク(#)で囲います。
シャープマークで囲った中身はプログラムとしてColdFusionに解釈されます。
この場合HTMLEditFormat()関数に引数qry.strを渡した結果を出力するという意味です。
HTMLEditFormat()はHTMLのタグの開き括弧などをエスケープするXSS対策のための関数です(PHPのhtmlspecialchars()に相当)。
--->
<cfloop query="qry">
    <p><cfoutput>#HTMLEditFormat(qry.str)#</cfoutput></p>
</cfloop>

ご覧頂いて分かるとおり、PHPではデータベースへの接続・切断や各種エラーハンドリングも自分で記述する必要があります。それに対し ColdFusionではデータベースへの接続・切断やクエリー実行、及びその際の考え得るエラーハンドリングなどがcfqueryという1つのタグの中にカプセル化されています。そのため、cfqueryタグの中に実行したいSQLを記述するのみで、目的の行をデータベースから取得してくることができます。クエリー部分の行数を比較しても、PHPがmysql_connect()からwhile直前までの11行のところ、ColdFusionはcfqueryタグの3行と、シンプルさが際だっています。

また、クエリーの結果を出力する部分を比べた際に、PHPではHTMLタグとPHP言語自体が入り乱れていて可読性とメンテナンス容易性を損なっています。それを補うため、通常のPHP開発ではSmartyなどのテンプレートエンジンを使うことになり、テンプレートエンジンを覚えるという学習コストが別途発生します。

それに対しColdFusionではCFMLがタグベースと言うこともあり、クエリー結果を出力している部分(cfloopタグで囲われた部分)に CFMLタグ(プログラミング言語)とHTMLタグ(プレゼンテーション言語)を違和感なく織り交ぜて記述することができます。このHTMLとの親和性の高さこそがHTMLベースのWebアプリケーションを構築する際にColdFusionを選ぶベネフィットの一つとなっています。ロジック制作で覚えた CFMLをプレゼンテーションレイヤーでも使用することができるため、ColdFusionにはテンプレートエンジンと言うものが必要ありません。別途テンプレートエンジンを覚えるコストがかからないことは、HTMLベースのWeb開発をしていく上で大きなメリットであると言えます。

他言語とのコスト対決

さて、ここで気になるのは、学習コストやソフトウェア購入費用など、Webサイト構築でトータルにかかるコストがColdFusionと他の言語でどの程度違ってくるか、と言う点でしょう。

同じ機能を持ったサイトを構築してみて学習コスト、工数など比較できるとベストなのですが、そのようなデータはおそらくどこにも存在していないでしょう。しかし、予測を立てることはできます。

例えば、あなたが今から動的Webサイト構築に初めて関わる人で、プログラミング言語も多少の心得はあるが、本格的なものはこれから覚える人だと仮定しましょう。

PerlやJavaを選んだ場合、それを自分の道具のように使いこなせるアドバンスドレベルまで達するには、教えるコスト・覚えるコストが相当かかることは、CGIやJSPを作ったことがある人なら経験的に感じることができるでしょう。アドバンスドレベルとは行かないまでも、⁠これを作りたい!』と思ったことが実現できるレベルまで達するまでも相当時間がかかるのではないでしょうか。

これは何故でしょう。おそらく考えるに、PerlやJavaは言語設計の段階から動的サイトを構築するためだけに設計されているわけではないと言う点が大きいと思います。

例えばPerlなどは、1)テキスト(HTML)処理が容易にできる、2)データベースと連携できる、3)ApacheなどWebサーバーと連携できる、などと言う点で、たまたま動的Webサイト構築にも使える言語であった、と考えることもできます。

対してColdFusionではどうでしょうか。上で見てきたように、煩雑なデータベース操作のカプセル化(cfqueryタグ)やHTMLとの親和性の高さなど、HTMLベースの動的サイトを構築するための高い機能性を見過ごすことはできません。SQLと十数種のCFMLタグ・関数さえ覚えてしまえば、初歩的な動的サイトの構築ができてしまいます。また、それら基本的なデータベース操作に加え、メールを送信する、グラフを描く、画像を操作する、など昨今のWebサイトでは当たり前の機能もCFMLタグや関数にカプセル化された状態で提供されています。つまり、ColdFusionを買ったその日からリッチな動的サイトを構築する機能を持ったタグベースの簡便な言語を手に入れることができると言うことです。

もちろん、盲目的に「動的サイトを構築するならPerlやJavaよりColdFusionを使った方がよい」と言うつもりはありません。なぜなら一度Perlを不自由なく使いこなせる程度に覚えてしまえば、CPANという膨大なライブラリーを活用することもできますし、POE(Perl Object Environment)でサーバーを構築するなど、今回ターゲットとしている『動的サイトを構築する』と言う目的以外のことにも覚えた知識を転用することができるからです。

問題になるのは、そのPerlの自由さを享受するためのオーバーヘッドを受け入れ、Perlという言語自身を覚えることから始めるという回り道をする余裕があるのか、あるいは動的サイトを構築することを主眼として設計されたColdFusionを用いて、動的サイト構築一直線で進む余裕しかないのか、と言う点です。

プログラミング言語もこれからで、私は動的サイトを構築するだけでよい、と言うなら、覚えることも少なく一直線に進むことができるColdFusionは十分考慮に値するソリューションであると言えるでしょう。

ColdFusionの動作原理

ColdFusion自体はJava EEプラットフォーム上で動作する製品になります。そういった点でApacheの組み込みモジュールとして動作するPHPなどとは異なっています図1⁠。

図1 PHPの動作模式図
図1 PHPの動作模式図

つまり、PHPのようにApacheのプロセス内でプログラムが実行されるわけではなく、別のプロセスがCFMLテンプレート(CFMLが書かれたプログラムファイル。拡張子は通常.cfm)を実行し、その結果をApacheに渡す形になります図2⁠。

図2 ColdFusionの動作模式図
図2 ColdFusionの動作模式図

スタンドアローン形態でインストールした場合は、JRunというAdobeの提供するJava実行環境上でColdFusionが動作する形になります(そのほか、ColdFusionはWebSphereや JBoss上で動作させることもできます⁠⁠。Apacheから接続する場合、JRun上で動いているColdFusionに、mod_jrunというモジュール経由で接続し、CFMLテンプレートの処理をColdFusionプロセスに依頼します(IISの場合はISAPIフィルタ(jrun.dll)経由となります⁠⁠。ColdFusionはCFMLテンプレートをJavaのバイトコードにコンパイルし、キャッシュします。そのため、2回目以降のリクエストにはコンパイルされたJavaバイトコードが実行されるため、Javaレベルの実行スピードを得ることができます(ご存じの通りJavaは HotSpotなどの各種高速化技術のおかげでバイトコードの実行速度はほぼネイティブレベルです⁠⁠。

日本のColdFusionコミュニティー

Webアプリケーションの開発を行っていく上で、相談できる相手や参考になるリソースが存在することは非常に重要です。

日本にはJCFUG(Japan ColdFusion User Group)が存在し、ColdFusion-Style.jpというサイトで活動を行っています。ColdFusion開発で行き詰まったらフォーラムで相談してみると、なにかヒントや解決方法が得られるかもしれません。著者もkatzというハンドル名で活動しています。

また、JCFUGでは定期的にColdFusion勉強会を開いているので、その勉強会に参加して、ColdFusionユーザーと意見を交わすなど、face to faceな関係を築けるのも大きなメリットです。

おすすめ記事

記事・ニュース一覧