ColdFusionバージョンアップ（CF9→CF11）

# はじめに
この記事は、ColdFusionのバージョン9からバージョン11に上げるためのノウハウを記したものです。
正確な技術情報に基づくものではなく、飽くまでも実績ベースのノウハウであることを予めご了承ください。

# 環境
IIS
Windows Server 2008 R2

# バージョンアップのポイント
- 一度CF9をアンインストールしてから、CF11をインストールする。アップグレードインストールは使わない。
- CF9をアンインストールするとき、CF9インストール時に作成された以下のものを手作業で削除する。
    - IISのWebサイトに作成される仮想ディレクトリ
    - IISのハンドラーマッピングに作成されるColdFusion関連のマッピング。\*.cfc、\*.cfmlなどにマッピングされているもの。
- なるべく、デフォルトのインストールディレクトリ「C:\ColdFusion11」を使用する。
- 以下の変更点に気を付ける
    - 文字コードがShift-JISからUTF-8ベースに変わる。
    - cfqueryの挙動が変わる。

# 説明
## 一度CF9をアンインストールしてから、CF11をインストールする。
### アップグレードインストールをなぜ使わないか
アップグレードインストールを一度試してみました。アップグレードインストールだと、追加でインストールしたCF11をアンインストールするだけで切り戻しが完了するため、その点は楽です。しかし、自分が試したケースではバージョンアップ後のWebサーバのレスポンスが極端に遅くなってしまい、使い物になりませんでした。同僚からも、「アップグレードインストールで成功した事がない」と言われてしまったので、この方針は捨てました。一般論として、クリーンインストールは成功しやすいという事もあります。
## CF9をアンインストールする際、手作業で削除するもの
ColdFusionは、コントロールパネルの「プログラムと機能」からアンインストールできるのですが、アンインストール時に、インストール時に作成したものを全てを削除してくれるわけではありません。以下は手作業で削除します。
### ◆IISのWebサイトに作成される仮想ディレクトリ
CF9によってIISのWebサイトに作成される仮想ディレクトリのうち、CFIDEに紐づく仮想ディレクトリが残っていると、CF11をインストールするとき、CF9のColdFusion Administratorのサイトが立ち上がってしまいます。
仮想ディレクトリを削除する手順は、以下の通りです。
1. Webサーバー設定ツールを使って、コネクタを削除します。Webサーバー設定ツールでコネクタを削除するには、以下の実行ファイルを起動し、「削除」を選択します。
(ColdFusion Home)/cfusion/runtime/bin/wsconfig.exe
2. 上記手順で仮想ディレクトリが削除されない場合は、IISのWEBサイトを開き、「cfdocs」「CFIDE」など、ColdFusion関連の仮想ディレクトリを手作業で削除します。

### ◆IISに登録されるハンドラーマッピング
CF9のインストール時に登録されたハンドラーマッピングがCF9のアンインストール後にも残ってしまう事があるので、手作業で削除します。
1. IISのマネージャを開き、サーバーを選択します。
2. ハンドラーマッピングを開きます。
3. 以下のハンドラーマッピングを削除します。
\*.cfc、\*.cfmlなど、ColdFusion関連のファイルにマッピングされているもの。同じ名前で登録されており、名前末尾だけ連番になっているので、すぐに分かります。
4. WEBサイトを選択し、同様にハンドラーマッピングを開いて、CF関連のマッピングを削除します。
### ◆CF9のディレクトリ
CF9のディレクトリが残ってしまうので、これも削除します。デフォルトのインストール先なら、以下を削除します。
C:\ColdFusion9
## CF11をインストールする際の注意点
### デフォルトのインストール先でないと、ハンドラーマッピングの登録に失敗することがある。
はっきりした原因は分からないのですが、Cドライブ以外のドライブにインストール用のディレクトリを作り、そこにインストールしようとしたところ、CF11のハンドラーマッピングが一部しかIISに登録されなかった事がありました。こうなると、CF11のWEBサイトにアクセスしても、IISのハンドリング時点でエラーになってしまいます。デフォルト以外のフォルダに正常にインストールできた事もあるので、全てのケースに当て嵌まる訳ではないのですが、特に理由がないなら、デフォルトのインストール先である「C:\ColdFusion11」に使った方が良いと思います。
### ColdFusion Administratorのパスワード登録に失敗することがある。
自分が遭遇したケースは以下の経過を辿りました。
1. CF11のインストールウィザードでColdFusion Administratorのパスワードを入力する。入力は成功する。
2. インストール完了後、ブラウザでColdFusion Administratorのログイン画面が起動する。ここで先ほどインストールウィザードで設定したパスワードを入力するものの、ログインエラーになってログインできない。
この場合、パスワードを再設定します。
1. コマンドプロンプトを管理者権限で開き、以下を実行。
(ColdFusion Home)\cfusion\bin\passwordreset.bat
2. 以下の質問に対し、「1」を入力。
Enter 1 for changing Admin Password and 2 for changing Admin Component(jetty) password :
3. 管理者のパスワードを設定。
[参考：ColdFusion Administratorのログインパスワードをリセットする](http://cfassociates.samuraiz.co.jp/index.cfm/faq/administrator/cf-admin-reset-password/)
### セキュリティパッチについて
セキュリティについて考えると、最新のアプリを動かし、最新のセキュリティパッチを当てるのが望ましいのは間違いありません。
今回のケースでは、インストールしたCF11がそもそも古い訳ですが、それでも、セキュリティパッチは当てたいところです。
自分はセキュリティアップデート6を当てたのですが、今思うと、もっと後のアップデートも当てられたかもしれません。確か、アップデート10当たりを最初に当てようとして、接続コネクタの再登録がうまくいかず、アップデート6に下げたのですが、それはアップグレードインストールを試したからで、クリーンインストールなら問題ないのかもしれない。ちょっと分かりませんが、クリーンインストールでセキュリティアップデート6は問題なく動きます。
## ソースコードの修正が必要になる箇所
### 文字コードがShift-JISからUTF-8ベースになる。
CF11で文字コードのベースがUTF-8に変わります。そのため、Shift-JISのcfmファイルで画面を作っている場合、特殊な文字「㈱」「~」などが文字化けします。これは、cfmファイルの中身をそのままにして、文字コードをUTF-8に変更すれば解決します。
### cfqueryの挙動が変わる
どこがどう変わったかがいまいちはっきりしないのですが、自分がバージョンアップをしたときは、以下の障害が発生しました。
#### Query Of Queryで文字列を比較するとき、文字列末尾の空白をCF9だと自動的にトリミングして比較しているが、CF11ではトリミングしなくなった。
上記の変更があったため、CF11に上げるとき、空白をトリミングする処理を明示的に追加しました。
#### cfqueryのname属性とresult属性に同じ名前を指定していた箇所で、recordcountが取得できなくなった。
cfqueryのname属性とresult属性の名前を異なるものに変更しました。


# 終わりに
これからCF9をCF11に上げるケースは少ないかもしれませんが、企業はできるだけ経費を抑えたいもので、動いている間はバージョンを上げたくない、という本音もあるでしょう。Visual Basic 6.0のプログラムを新規開発するケースもあるぐらいですから、CF9をバージョンアップしなければならないケースも、きっとどこかであると思います。その時、上記の経験が参考になれば幸いです。自分は4つのサーバーでCF9→CF11の移行を経験しました！　幸運を祈ります。