初級
非常に優れた性能を持つColdFusion 7が発表されてから2年以上たち、その間には様々な変化がありました。
こうした新しい動きは、ColdFusion 8の新たな機能を考える上で大変重要なことでした。
幸せなことに、2007年前半、当社のプレリリースユーザグループツアーの一部としてColdFusion 8を何千人もの開発者に披露することができました。プレゼンテーションやデモを準備しながら、ColdFusion 8には語りたいことがなんと多くあるのだろう、と驚きました。ColdFusion MX7は既に充分な競争力のある製品でしたが、ColdFusion 8へのバージョンアップは、これまでのアップデートとは異なり、まさに「飛躍的」なものでした。プレリリースユーザグループツアーの期間中、デモの内容やプレゼンテーションを慎重に選び、毎週アップデートしていました。ここでも、ColdFusion 8を構成する機能とテクノロジのハイライトについて、皆さんにご紹介したいと思います。
ここでは、私にとってのColdFusion 8が重要である理由のトップ8を紹介します。
私たちがCFML(ColdFusion Markup Language)を愛してやまないのは、それがクリーンであり簡単で生産性も高く、そして何よりもコーディングしていて楽しいということです。しかし、これは改善の余地がないということではありません。ColdFusion 8では、CFMLをさらに簡単に、また直感的に使うための多くの改善点が導入されています。
例を示しましょう。これまでのColdFusionの式では、++や-=のような演算子はサポートされていませんでしたが、ColdFusion 8のCFMLでは++、--、%、+=、-=、*=、/=、%=、&&、||、!がサポートされています。また、CFSCRIPTタグブロックでは、ColdFusion 8では==、!、=、<、<=、>、>=も式の演算子としてサポートされています。
別の例を挙げましょう。配列を作成し、値を入力するとします。以下に示すのはこれまでのColdFusion構文です。
<CFSET myArray=ArrayNew(1)>
<CFSET ArrayAppend(myArray, "Adam")>
<CFSET ArrayAppend(myArray, "Ben")>
<CFSET ArrayAppend(myArray, "Tim")>
同じ内容がColdFusion 8では次のようになります。
<CFSET myArray=["Adam", "Ben", "Tim"]>
次に、これまでの初期化構造体を作成する方法を示します。
<CFSET myStruct=StructNew()>
<CFSET myStruct.product="ColdFusion">
<CFSET myStruct.version=8>
同じ内容がColdFusion 8では次のようになります。
<CFSET myStruct={product="ColdFusion", version=8}>
もちろん、古い構文も使用できますが、JavaScriptやActionScriptなど複数の言語を使って作業する開発者にとっては、ColdFusion 8によりコードがさらにクリーンになり、より一層の一貫性を持たせることができます。
もう1つ例を挙げます。これはCFMLで強化された機能の中でも、私が気に入っているものの1つです。CFMLタグを使用していて、オプションの属性を使用する必要がある場合があるとします(CFQUERYタグのCACHEDWITHIN属性か、CFMAILタグのSERVER属性など)。タグに属性を条件付きで付加する方法はないので、それぞれ異なる属性を持つタグの複数のセットを使用することになります。しかし、ColdFusion 8では次のように処理できます。
<CFSET args=StructNew()>
<CFSET args.name="myQuery">
<CFSET args.datasource="myDSN">
<CFIF needCaching>
<CFSET args.cachedwithin=CreateTimeSpan(0,1,0,0)>
</CFIF>
<CFQUERY ATTRIBUTECOLLECTION="#args#">
...
</CFQUERY>
この例では、CFQUERYタグにはATTRIBUTECOLLECTIONという属性があります。この構造には通常CFQUERYタグに渡される属性のNAME=VALUEペアが含まれ、これらの属性の代わりに使用されます。この場合の利点は何でしょうか。初心者にとっては、コードがクリーンで単純であることです。しかし、もっと重要なことは、ここに示すように、メンバを構造に条件付きで追加でき、条件付き属性を1度だけ処理する方法の問題が解決することです。
これらはごくわずかの例ですが、おわかりになるように、CFMLはこれまでよりもはるかに強力になりました。もちろん、これらの強化機能はすべて必要に応じて使うものであり、以前の方法でコードを記述し続けることができます。
かつてCold Fusion 2でC/C++でのユーザ独自のタグの記述をサポートしたときから、統合は常にColdFusionの歩みにおける重要な部分です。何年もの間、私たちはCOM、CORBA、Java、JMS、XMPP、SOAP、AMFなどのサポートを追加してきました。いろいろな意味でColdFusionはミドルウェアであり、様々なバックエンドをバインドしてそれらを活用するアプリケーションを記述できるようにする接着剤のようなものです。このような流れから、ColdFusion 8にも重要な新しい統合オプションが追加されています。
ユーザの組織で.NET開発を行っているのであれば、ColdFusion 8が完全な.NETクライアントであることを知れば興味を持っていただけるでしょう。これは、ローカルであってもリモートであっても、また、Windows以外のサーバからであっても、CFMLコードによって.NET CLR内で実行されているクラスまたはアセンブリを呼び出せることを意味しています。コードスニペットを以下に示します。
<!--- Get System.IO.DriveInfo class --->
<cfobject type=".NET"
name="sidiClass"
class="System.IO.DriveInfo">
<!--- Get drives --->
<cfset drives=sidiClass.GetDrives()>
このコードでは.NET System.IO.DriveInfoクラスのインスタンスを取得し、GetDrives()メソッドを呼び出して、ColdFusionサーバ上のハードドライブのリストを取得します。おわかりのように、これは非常に簡単な例ですが、大切なことは、ColdFusion 8では.NETコードの呼び出しが非常に簡単になったということです。ColdFusion 8は、CFML、Java、および.NETコードを同じページ内から呼び出せる唯一のプラットフォームであり、1つの結果セット内に結果を結合することもできます。これは実に強力な機能です。
もう1つの例は、Microsoft Exchangeの統合です。ユーザの組織でExchangeを使用している場合、ColdFusionは他のExchangeクライアントのようにExchangeサーバに接続でき、CFMLタグの呼び出しの事項としてタスクの追加やグループミーティングの設定などが行われます。以下のスニペットによって、ユーザであるBenのすべてのカレンダーのエントリが取得されます。
<CFEXCHANGECONNECTION SERVER="192.168.10.10"
USERNAME="ben"
PASSWORD="p@$$w0rd"
CONNECTION="con1">
<CFEXCHANGECALENDAR ACTION="get"
CONNECTION="con1"
NAME="calQuery">
カレンダーのエントリの作成、データのフィルタリング、サブフォルダへのアクセスなども同様に簡単です。
ColdFusionはColdFusion MX 7で初めてPDF統合を導入し、CFDOCUMENTタグとCFREPORTタグを使用してPDFドキュメントを作成できるようになりました。ColdFusion 8では、2つの新しいフォームのPDF統合が追加されました。
新しいCFPDFタグを使用して、PDFファイルのマージ、ページの追加または削除、パスワードによるファイル保護、PDFのフラット化、ページのサムネールの作成などができます。この例では、レポートフォルダのすべてのPDFファイルと2つの追加のPDFファイルをnew.pdfという名前の新しいPDFファイルにマージします。
<cfpdf action="merge"
destination="new.pdf"
overwrite="yes">
<cfpdfparam source="reports">
<cfpdfparam source="sales/jan.pdf">
<cfpdfparam source="sales/feb.pdf">
</cfpdf>
新しいCFPDFFORMタグを使用するとPDFフォームの作業が簡単になります。次の例では、既存のPDFフォームに値を入力します。
<cfpdfform action="populate" source="my.pdf">
<cfpdfsubform name="form1">
<cfpdfformparam name="employeeName"
value="Ben Forta">
<cfpdfformparam name="date"
value="#now()#">
<cfpdfformparam name="department"
value="ColdFusion Team">
</cfpdfsubform>
</cfpdfform>
CFPDFFORMタグを使用すると、ここに示すようにフォームフィールドに入力できるだけでなく、電子的に送信したフォームから値を抽出することもできます。
ここで紹介したのは注目機能の一部に過ぎません。ColdFusionの開発者が高度なPDF統合を使用できるようにする様々な属性やオプションは数多くあります。そのすべてはいくつかの簡単なタグで表されます。
ColdFusion 4およびColdFusion 5には、インタラクティブなデバッガが装備されていました。しかし、ColdFusion MXに移行してインタラクティブなデバッガはなくなり、多くの開発者をがっかりさせました。さて、この度、7年間の時を経て、デバッガが帰ってきました。今度は、Eclipseに構築されています。EclipseはFlex Builderを動かすのと同じエンジンです。
新しいデバッガの機能は以下のとおりです。
デバッガはColdFusionの一部として装備され、追加料金なしで使用できます。Eclipseをインストールし、ColdFusion 8を保有して、RDSアクセスを確保することだけが必要です。これらがあれば準備完了です。
また、クライアント側のAjaxデバッガも追加されましたが、Ajaxについては後ですぐに説明します。
ColdFusion 8では、管理者はユーザに自分自身のアプリケーションを管理できる権限を与えることができますが、これまでよりも厳しいセキュリティ管理が行われます。新しいセキュリティ機能には、以下のようなものがあります。
ColdFusion 8のリリース準備を行う中で、サードパーティのセキュリティリスクを解析する会社に依頼して製品を徹底的に解析しました。ここで、「ColdFusion 8は、新機能によって提供される機能に関して妥協することなく、アプリケーションレイヤ攻撃に対する復元力が非常に高いことを示した。」という評価を得ました。自分たちではそんなにうまく言えませんでしたが。
多くのColdFusion開発者がAjaxのサポートを要望してきましたが、その内容は次の2つの種類に分類されます。
Dojo、Prototype、JQueryなどを使用して本格的なAjaxフロントエンドを構築することを要望するユーザがいます。これらのアプリケーションは2つの部分に分かれます。クライアント部分はDHTML/CSS/JavaScriptで記述され、バックエンドはColdFusionなどの様々なバックエンドテクノロジで記述されます。通常、これらはJSONと呼ばれるXML形式を使用して統合され、バックエンドサーバとブラウザ間で送受信されたデータはJSONパケットとしてフォーマットされます。ColdFusionでは、JSONに対する組み込みサポートを提供することによりこのような統合を驚くほど簡単に行い、簡単な関数を使用してデータを変換できるようにし、JSONパケットとしてCFC結果を自動的にエンコーディングすることまでできます。
また、ずっと簡単なことを望んでいるユーザもいます。実はこちらのほうが多数派です。このようなユーザは、Ajax型の機能をすばやく簡単に活用する手段である、Ajax型のコントロールとウィジェットを要望しています。ColdFusionではこれを実現しました。
簡単な例であるauto-suggestコントロールから始めましょう。このコードスニペットをご覧ください。
<!--- Get data --->
<cfquery datasource="cfartgallery" name="data">
SELECT artname
FROM art
ORDER BY artname
</cfquery>
<!--- The form --->
<cfform>
Art:
<!--- Populate auto-suggest control --->
<cfinput type="text"
name="artname"
autosuggest="#ValueList(data.artname)#">
</cfform>
データベース駆動型のauto-suggestコントロールを作成するのに必要なのはこれだけです。コントロールは通常のテキストフィールドのように見えますが、一旦ユーザが入力を開始すれば、中断があると候補のリストがポップアップ表示されます。これはAjaxコントロールではありません(データはすべてクライアント側にあるため、非同期のコールバックはありません)が、とても役に立つ例です。
同じ例のAjax版を示します。
<cfform>
Art:
<cfinput type="text"
name="artname"
autosuggest="cfc:art.lookupArt({cfautosuggestvalue})">
</cfform>
ここでは、auto-suggestコントロールは、auto-suggest参照に対して非同期に呼び出される、サーバ上のColdFusionコンポーネントをポイントします。問題のCFCは次のようになります。
<cfcomponent output="false">
<cfset THIS.dsn="cfartgallery">
<!--- Lookup used for auto suggest --->
<cffunction name="lookupArt"
access="remote" returntype="string">
<cfargument name="search" type="any"
required="false" default="">
<!--- Define variables --->
<cfset var data="">
<!--- Do search --->
<cfquery datasource="#THIS.dsn#" name="data">
SELECT artname
FROM art
WHERE artname LIKE '#ARGUMENTS.search#%'
ORDER BY artname
</cfquery>
<!--- And return it --->
<cfreturn ValueList(data.artname)>
</cffunction>
</cfcomponent>
ColdFusionは必要とされるクライアント側のJavaScriptを生成し、この例は機能します。非常に簡単です。
以下に、SELECTタグのコントロールに関する別の例を示します。最初のコントロールで選択が行われ、次のコントロールは関連するオプションで更新されます。
<cfform>
<table>
<tr>
<td>Select Media Type:</td>
<td><cfselect name="mediaid"
bind="cfc:art.getMedia()"
bindonload="true" /></td>
</tr>
<tr>
<td>Select Art:</td>
<td><cfselect name="artid"
bind="cfc:art.getArt({mediaid})" /></td>
</tr>
</table>
</cfform>
ここでは2つのCFSELECTタグが使用されており、それぞれCFCメソッドにバインドされています。最初のCFSELECTタグはgetMedia()メソッドに設定されています。2番目のタグは、最初のタグが変更されるときは必ずgetArt()への呼び出しによって設定され、最初のタグの値が引数として自動的に渡されます。
次に、ライブデータグリッドの例を示します。これはソートやページングなどをサポートします。
<cfform>
<cfgrid name="artists"
format="html"
pagesize="10"
striperows="yes"
bind="cfc:artists.getArtists({cfgridpage},
{cfgridpagesize},
{cfgridsortcolumn},
{cfgridsortdirection})">
<cfgridcolumn name="lastname"
header="Last Name"
width="100"/>
<cfgridcolumn name="firstname"
header="First Name"
width="100"/>
<cfgridcolumn name="email"
header="E-Mail"
width="200"/>
</cfgrid>
</cfform>
ここでも、データはCFCメソッドへの非同期呼び出しを行うことによってロードされ、ページが変更されたとき、またはデータをソートし直したときにメソッドが再度呼び出されます。
新しいColdFusion Ajaxサポートは強力で洗練されており、ここですべてを紹介することはできません。詳細については、「Designing and developing with Ajax features in ColdFusion 8」を参照してください。このテーマについては後日記事で取り上げる予定です。
ColdFusionは長い間、魔法で動く封印されたマシンであり、内部構造を決して明かさないブラックボックスでした。これがユーザにとっては問題の原因でした。以下のようなことを考えたことがありませんか。
ご覧のように、複数インスタンスを利用するメリットは数多くあります。これらの情報はすべて、またこれ以外の情報も、新しいColdFusionサーバモニタリングによって入手できるようになりました。1台または複数のサーバを監視でき、様々な統計や仕様をドリルダウンしそれにアクセスできます(装備されているFlexフロントエンドを使用)。また、警告を作成してサーバがそれ自身の状態を監視し問題が発生する前に対処できるようにすることもできます。
これでもまだ十分でないなら、モニタリングAPIを利用して自分自身の監視フロントエンドを記述することもできます。
もはやColdFusionはブラックボックスではありません。
監視機能の使用の詳細については、「ColdFusion 8 server monitoring, Part 1: Using the Server Monitor in development」*を参照してください。
今までの理由がすべて不十分であったとしても、ColdFusion 8をデプロイする最も説得力のある理由の1つは、これまでよりもずっと高速であることです。ColdFusion 8では、既存のアプリケーションをコードをまったく変更しないでこれまでよりも速く実行できます。
私たちは、240万行を超す顧客のCFMLのコードに対し詳しいテストを行い、コードがどのように実行され、ボトルネックがどこで発生するかを調べました。次に、当社の開発者を動員して、パフォーマンスを引き出すことに専念させました。
以下の統計をご覧ください。
CFSETタグは4倍以上の速度で実行されます。CFPARAMタグはColdFusion MX 7の場合の35倍の速度で実行されます。これらは一部の統計の一例に過ぎません。
実際にはどのような意味があるでしょうか。
私たちがテストを行ったすべてのColdFusionアプリケーションは、ColdFusion 8ではこれまでより速く実行されました。大部分のアプリケーションで平均して30~40%のパフォーマンスの向上が見られ、アプリケーションによってはColdFusion MX7に比べ3、4倍のパフォーマンスを示したものもあります。
また、ColdFusion 6や7のコードの多くはそのままで機能します。心配されるような中断も問題もなく、きちんと機能します。
良いことはあっても悪いことはありません。これがアップグレードする理由にならないなら、私にはどんなものが理由になるのかわかりません。
ColdFusion 8はこれまでのアップグレードとは一味違います。これは今までで最も重要で劇的なリリースであり、この重要な製品に対するAdobeの意欲の確かな証拠です。新しい統合の機会、言語の強化、セキュリティと管理の向上、驚くような性能の向上を得るために、ColdFusion 8を使ってみてはいかがでしょうか。ColdFusion デベロッパーになるために、今ほどエキサイティングなタイミングはありません。
新しいデザインになったColdFusionデベロッパーセンターで新しいリソースをご覧ください。
また、新しい記事や更新された記事などの、ColdFusion 8の使用に関する情報もすべてご参照ください。
Tutorials & Samples |
ColdFusion Blogs |
More |
ColdFusion Cookbooks |
More |
| 07/27/2011 |
Passing a list with |
|---|---|
| 05/27/2011 | AUTOMATED SANITIZED Resultset with ColdFusion |
| 03/16/2011 | Using Metadata To Add Static Variables to ColdFusion Components |
| 03/10/2011 | Find an extension |