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

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

この記事を読むのに必要な時間:およそ 4 分

『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アプリケーションの実装(サーバーサイド,クライアントサイド共)などのソフトウェアレイヤーまでの幅広い経験を活かし,クライアント企業のWebアプリケーション構築支援を行っている。殊にAdobe製品(特にMacromedia)製品には精通している。

ブログcyano(シアノ)

コメント

コメントの記入