2005年6月24日金曜日

(QEMU)Apache2+WebDAVでの、ファイル名の文字化けの修正

前回までで、WebDAVを使って、QEMUの中のFreeBSDと、ホストOSのWindowsとの間で、ファイルのやりとりができるようになりましたが、ファイル名が日本語だと文字化けしてしまいました。今回は、この文字化け対策を行います。



えーと、どうやら、この対策のためには、mod_encodingモジュールをインストールすればよいらしいです。残念ながら、今のところ、FreeBSDのportsにはなっていないようです。



■ 文字化けしたフォルダを削除する



ところで、文字化けしてしまったフォルダは、Windows上では削除できない場合があります。しかたないのでFreeBSD上で削除します。文字化けした名前を入力するのは大変ですが、この場合、大胆にも「rmdir *」で、うまいこと削除できます。rmdir *で、中身がからっぽのディレクトリがすべて削除されます。ファイルは削除されません。空のディレクトリで、削除されては困るものがある場合は、「rmdir *HOGE*」とかします。ここで例にあげた「HOGE」は文字化けしている中の、一部の文字列(1~2文字程度で十分)です。ls *HOGE*で、事前に確認するとよいでしょう。



文字化けしたファイルの削除も、*によるワイルドカードを使ったり、削除したくないファイルを別のディレクトリへ移動させたあと、「rm *」するなど、いろいろな方法でできます。



■ mod_encodingのソースコードをダウンロード















WebDAV Resources JP
の、
Download Page
にある
mod_encoding 20021209.tar.gz (2002/12/9)

mod_encoding for Apache2 20040616版
の2つをダウンロードします。



Windows上でダウンロードし、ダウンロードしたファイルを、WebDAVのフォルダにコピーすることで、FreeBSD側へもっていくことができますね。もしくは、先に、FreeBSDに、パッケージになっているwgetをインストールしておき、wgetでダウンロードしてもいいでしょう。



wgetは、このへんにあります。



ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/
i386/packages-5-stable/www/wget-1.8.2_7.tbz



■ GNU Make (gmake)のインストール



mod_encodingのコンパイルのために、gmakeが必要です。もしまだインストールされていなかったら、パッケージでインストールします。



freebsd# pkg_add ftp://ftp2.jp.freebsd.org/
pub/FreeBSD/ports/i386/packages-5-stable/
devel/gmake-3.80_2.tbz

■ libiconvのインストール

libiconvも必要です。たぶん、すでにインストールされているかもしれませんが、はいっていなかったら、インストールしてください。

freebsd# pkg_add ftp://ftp2.jp.freebsd.org/
pub/FreeBSD/ports/i386/packages-5-stable/
converters/libiconv-1.9.2_1.tbz

■ ソースファイルの展開

tar.gzを展開し、ダウンロードした新しいほうのファイルで、mod_encoding.cを上書きします。

> cd
> tar zxf /home/dav/mod_encoding-20021209.tar.gz
> cp /home/dav/mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c

■ mod_encodingをコンパイル

詳しいことは、ソースファイルに付属のREADME.JPを読んでおいてください。

まず先に、iconv-hookというのをコンパイルしておきます。

> cd mod_encoding-20021209/
> cd lib/
> ./configure
creating cache ./config.cache
checking for a BSD compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking whether make sets ${MAKE}... yes
checking for working aclocal... missing
checking for working autoconf... missing
checking for working automake... missing
checking for working autoheader... missing
checking for working makeinfo... found
(以下省略)

コンパイルします。

> gmake
/bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c iconv_hook.c
mkdir .libs
gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -Wp,-MD,.deps/iconv_hook.pp -c iconv_hook.c  -fPIC -DPIC -o .libs/iconv_hook.lo
(省略)
ar cru .libs/libiconv_hook.a  iconv_hook.o iconv_hook_default.o iconv_hook_eucjp.o iconv_hook_ja_auto.o iconv_hook_mssjis.o iconv_hook_ucs2_cp932.o iconv_hook_utf8_cp932.o iconv_hook_utf8_eucjp.o identify_encoding.o
ranlib .libs/libiconv_hook.a
creating libiconv_hook.la
(cd .libs && rm -f libiconv_hook.la && ln -s ../libiconv_hook.la libiconv_hook.la)

suでrootになったあと、インストールします。

> su
Password:
freebsd# gmake install
gmake[1]: Entering directory `/usr/home/nhh/mod_encoding-20021209/lib'
/bin/sh ./mkinstalldirs /usr/local/lib
/bin/sh ./libtool  --mode=install /usr/bin/install -c libiconv_hook.la /usr/local/lib/libiconv_hook.la

いったん、一般ユーザーにもどってから、つづきをコンパイルします。

freebsd# suspend



Suspended (signal)
> pwd
/usr/home/nhh/mod_encoding-20021209/lib
> cd ../

さて、本体のconfigureを実行するのですが、なんだかよくわかりませんでしたが、libiconv_hookやlibiconvが見つけてもらえなかったので、ちょっと変則的に実行します。LDFLAGSをつけます。

> env LDFLAGS="-L/usr/local/lib -liconv" ./configure --with-iconv-hook
creating cache ./config.cache
checking for a BSD compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking whether make sets ${MAKE}... yes
checking for working aclocal... missing
checking for working autoconf... missing
checking for working automake... missing
checking for working autoheader... missing
checking for working makeinfo... found
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether to compile with debug code... checking whether to wrap iconv with iconv_hook... yes
checking for iconv_hook in -liconv_hook... yes
checking for iconv in -liconv... yes
checking for libiconv in -liconv... yes
updating cache ./config.cache
creating ./config.status
creating Makefile
creating config.h

gmakeを実行します。

> gmake
apxs -c  -I/usr/local/include/iconv_hook  -liconv_hook -liconv -liconv mod_encoding.c
/usr/local/share/apache2/build/libtool --silent --mode=compile cc -prefer-pic -O -pipe -DAP_HAVE_DESIGNATED_INITIALIZER -D_REENTRANT -D_THREAD_SAFE  -I/usr/local/include/apache2  -I/usr/local/include/apache2   -I/usr/local/include/apache2 -I/usr/local/include -I/usr/local/include/iconv_hook  -c -o mod_encoding.lo mod_encoding.c && touch mod_encoding.slo
(省略)
/usr/local/share/apache2/build/libtool --silent --mode=link cc -o mod_encoding.la  -liconv_hook -liconv -liconv -rpath /usr/local/libexec/apache2 -module -avoid-version    mod_encoding.lo
/usr/bin/ld: cannot find -liconv_hook
apxs:Error: Command failed with rc=65536

ライブラリが見つからないよエラーがでてしまいましたので、手でコマンドを実行しなおします。-L/usr/local/libを補います。

> /usr/local/share/apache2/build/libtool --silent --mode=link cc -o mod_encoding.la  -L/usr/local/lib -liconv_hook -liconv -liconv -rpath /usr/local/libexec/apache2 -module -avoid-version    mod_encoding.lo

これでもまだダメで、mod_encoding.soができないので、手でコマンドを入力します。

> gcc -shared -o mod_encoding.so -L/usr/local/lib -liconv_hook -liconv -rpath /usr/local/libexec/apache2 mod_encoding.o
> ls -l mod_encoding.so
-rwxr-xr-x  1 nhh  nhh  10441 Jun 23 23:47 mod_encoding.so

■ mod_encodingをインストール



インストールします。

> fg
su (wd: ~/mod_encoding-20021209/lib)
freebsd# pwd
/usr/home/nhh/mod_encoding-20021209/lib
freebsd# cd ..
freebsd# gmake install
gmake[1]: Entering directory `/usr/home/nhh/mod_encoding-20021209'
apxs -i mod_encoding.so
/usr/local/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/local/share/apache2/build/libtool' mod_encoding.so /usr/local/libexec/apache2
/usr/local/share/apache2/build/libtool --mode=install cp mod_encoding.so /usr/local/libexec/apache2/
cp mod_encoding.so /usr/local/libexec/apache2/mod_encoding.so
Warning!  dlname not found in /usr/local/libexec/apache2/mod_encoding.so.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/local/libexec/apache2/mod_encoding.so
gmake[1]: Nothing to be done for `install-data-am'.
gmake[1]: Leaving directory `/usr/home/nhh/mod_encoding-20021209'

■ httpd.confの編集

/usr/local/etc/apache2/httpd.confに、以下の太字部分を追加します。

LoadModule alias_module libexec/apache2/mod_alias.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule encoding_module    libexec/apache2/mod_encoding.so



<IfModule mod_encoding.c>
  EncodingEngine    on
  NormalizeUsername on
  SetServerEncoding     UTF-8
  DefaultClientEncoding JA-AUTO-SJIS-MS SJIS



  AddClientEncoding "cadaver/" EUC-JP
</IfModule>



#
# ExtendedStatus controls whether Apache will generate "full" status

■ Apacheの再起動



設定を反映させるために、Apacheを再起動します。

freebsd# apachectl restart

■ 文字化けしていないことの確認

Windows上で、Webフォルダに対して、日本語のファイルやフォルダを作成し、F5キーを押して再表示しても文字化けしないことを確認します。

apache20



上記のhttpd.confの設定では、FreeBSDのファイルシステム上でのファイル名は、UTF-8になってしまいます。それでいいかは、あとで考えることにして、とりあえず、ちゃんと日本語でファイル名が見えることだけ確認してみましょう

今のnkfはUTF-8を変換できますので、nkfをインストールします。

freebsd# pkg_add ftp://ftp2.jp.freebsd.org/pub/FreeBSD/
ports/i386/packages-5-stable/
japanese/ja-nkf-2.05.tbz

こんなかんじになります。一応、読めますね。

freebsd# rehash
freebsd# ls /home/dav/ | nkf
mod_encoding-20021209.tar.gz
mod_encoding.c.apache2.20040616
新しいフォルダ

WebDAVを用いたファイル交換については、だいたい、こんなかんじでしょうか。



0 件のコメント:

コメントを投稿