2008/04/02

ColdFusionとJava

ColdFusionはイシカワさんと違って素人なのですが(そもそも私はWeb系全般に疎い…。それに比べてイシカワさんはCFの日本語の参考書を全種類買い集めた人です)。隣で他人がColdFusionのソースの改修でアワアワしていたので、なんとなくソースを見ていて、ナゾなところを、ちまちまとググっておりました(好奇心&手伝いです)。

そんなこんなでウワサには聞いていたけど、CFってホントにJavaで実装しているんだなぁ、と妙に実感したサンプルソース。

<cfset fr=CreateObject("java","java.io.FileReader")>
<cfset fr.init("/tmp/testfile.txt")>
<cfset br=CreateObject("java","java.io.BufferedReader")>
<cfset br.init(fr)>
<cfloop condition="true">
  <cfset line=br.readLine()>
  <cfif not IsDefined("line")><cfbreak></cfif>
  <cfoutput>#line#<br></cfoutput> <!--- この部分 --->
</cfloop>
<cfset fr.close()>
参照元:逆引きColdFusion(1)

上記のソースで私にはよくわからなかったのが、initで、これはなんだろうと思ってググってみたら、リファレンスでは以下のような定義になっていました。

Use the init method, with appropriate arguments, to call an instance of the class.

CFML Reference

initメソッドでjavaのクラスのインスタンス生成というわけなんですね。initのカッコの中は当然コンストラクタの引数。なるほど。

さらにもう一つ、冒頭のソースで躓いたのは、

<cfloop condition="true">

conditionの後の""に条件式を入れるようですが、trueの存在がなんとなく唐突に見えてナットクがいきづらかったのですね。

  <cfif not IsDefined("line")><cfbreak></cfif>

で、読みこんだ行がカラッポだったら、ループを抜けるのでどーでもいいといえばどーでもいいのでしょうが、

<cfloop condition="br.ready()">
  <cfset line=br.readLine()>
  <cfoutput>#line#<br></cfoutput>
</cfloop>

とかの方がなんとなく、個人的には読みやすい気がする…。この辺は普段、自分がそういう書き方ばかりをしているせいなのでしょうか(あ、でも条件式にreadyメソッドを入れることが適切なのか、Javaに疎いので実はあまりわかっていません。どーなんでしょう?)。

ちなみにあれやこれやのサーフィンの道中に、書き込み速度のやり方の比較実験の記事も見つけました(読み込みにあらず)。

CFFILE vs Java.IO.BufferedWriter

CFFILE tag を使うより、圧倒的にJava.IOを使った方が早いんですね。

5.5MBくらいの書き込みでCFFILE tagをフツーに使っていたら600秒かかっていたものが、Java.IOを利用したら、1秒になったそうです。上記サイトの筆者は、当然のことながら、CFFILEはとても手軽だけど、大きいファイルを扱う時にはJavaのメソッドを使った方が良さそうだという結論をくだしています。

まーそりゃそうだろうな、と思いつつも、600秒って10分ですよ。落ちているかと思って、途中でブラウザを閉じてもおかしくない長さですよね。道具は適切に使い分けたいものですね。

memo→本日のブックマーク

はてなのブクマ

ColdFusionのブクマ。ColdFusionは手軽だし、エラーとかも返してくれて結構いいツールだと思うけど、なんで流行らないのでしょーか?

ColdFusionカフェテリア

フォーラム。CF8って.NET Framework 2.0も使えるのか。へー。ほー。でも.NETを使うと今のところWinに環境が限定されちゃうもんね(悲)。Monoプロジェクトに期待したいところだけど、そのままの移植は厳しそうかなぁ…。

Coldfusion-Style

なんか追っかけていたら色々と…。

0 件のコメント: