出社2日目

Webアプリの配備

WARファイルの生成

GrailsからTomcatに移植するには、GrailsでWARファイルを作成し、Tomcatに配備すればよい。

  • Webアプリの完成版をWARで出力するGrailsコマンド
$ grails prod war
TomcatにWARファイルを配備

Tomcat6なら、Managerを使えばWARファイルをアップロードするだけで配備できるので、わざわざwebappsフォルダ内に展開する必要は無い。
ただし、Managerを開く事ができなければ、この方法での作業は進まない。
(手動で入れる事もできるけど)

TomcatのManagerアクセス権限の設定方法

Tomcatを入れたばかりで、Managerのアクセス権限を設定していないと、パスワード入力が通らなかったり、403エラーが出て、Manager画面を開けなくなる。
そこで、下のページを参考にして、Tomcat用のアカウントを何個か作り、Manager用のアカウントで開けるようにする。
BASIC認証(UserDatabaseRealmレルム) - ユーザー認証 - サーブレット入門

TomcatGrailsアプリを走らせる

何の問題も起きない。GrailsはGroovyで動いていて、Groovyはコンパイル時にJavaと同じバイトコードに変換されるため、Javaで動いているも同然。だから、Tomcatにそのまま移植できても、凄いけど不思議ではない。
問題はここからだ。

Grailsで設定したCSS、サイトメッシュによるレイアウトをそのままApacheに移植するためのURLマッピング

コンテキストパス(WebアプリのルートURLからドメインURLを抜いた部分)は同じにしておかないと、Apache経由でアクセスした時にレイアウトが正しく表示されなかったり、404エラーになったりする場合がある。

  • Tomcatに直接アクセスした場合のURL
http://localhost:8080/ssbbs_test7-0.1/
  • Apache経由でアクセスした場合のURL
http://localhost/ssbbs_test7-0.1/

さらに、URLの末尾のスラッシュを抜いた場合も、Apache経由だと、どういうわけか404エラーになるので、末尾のスラッシュを抜いた状態でもインデックスにアクセスできるように、設定を1行余分に追加する必要がある。

# nano /etc/httpd/conf.d/proxy_ajp.conf
(中略)
ProxyPass /ssbbs_test7-0.1/ ajp://localhost:8009/ssbbs_test7-0.1/
ProxyPass /ssbbs_test7-0.1 ajp://localhost:8009/ssbbs_test7-0.1/

これで動くようになった。

Perlを使った文字コード変換

Windowsコード(CP932)とUTF-8の変換

CP932でエンコードされたテキストファイルを読み込んで、文字コード変換したデータをそのまま別のファイルに出力するだけのプログラムを作成した。
また、その逆変換プログラムも作った。
Perl 5.8.x Unicode関連

フォルダ単位のテキストファイル一括変換

次に、ファイル毎ではなくフォルタ単位での一括変換プログラムに挑戦した。
フォルダの管理、ファイルリスト取得などにはフォルダハンドルを使う。
Perl入門(ファイルとディレクトリ)
また、出力先フォルダに、既に出力ファイルと同名のファイルがある時は変換を行わず、次のファイルへスキップする処理を考えて入れた。
ファイル名の照合には、Perlならではの方法を探して使った。(あるんじゃないかと思ってたら、やっぱりあった。)
[perl]配列から条件にマッチする要素を取り出す