FreeBSD 5.2.1-R に lha(autoconf/automake 版)をインストールした記録。
今度、UNIX サーバ上のプログラム内で、Windows マシンでアーカイブしたファイルを解凍・伸長してやる必要が出てきた。ターゲットマシンは Sun Cobalt だが、開発に使うのは FreeBSD である。
実は、開発に使う FreeBSD 5.2.1-RELEASE-p10 には packages から lha-1.14i_2 を入れている。こいつを外部プログラムとして実行してやればええわけやね。
zakuro# pkg_info|grep lha
lha-1.14i_2 Archive files using LZSS and Huffman compression (.lzh file
しかし、ググってみると、lha には 5.2.1-RELEASE の packages に入った後に更新された版があるので、その最新版である lha-1.14i-ac20040929 をソースからインストールしてみた。
インストールの前に、packages から入れた lha を待避しておく。
zakuro# mv /usr/local/bin/lha /usr/local/bin/lha.org
まず、ソースファイルを取得。
http://sourceforge.jp/projects/lha からリンクを伝っていって、
http://prdownloads.sourceforge.jp/lha/11617/lha-1.14i-ac20040929.tar.gz
をダウンロードする。
以前の lha は手動でコンパイラのオプションなど与えてコンパイルする必要があったようだが、今は autoconf/automake 化されているのでわしのような「C の世界はちょっと・・・」という人間にも簡単に make 出来てありがたいことである。
ダウンロードしたファイルを解凍・伸長。
zakuro# pwd
/usr/local/src
zakuro# tar xvfz lha-1.14i-ac20040929.tar.gz
lha-1.14i-ac20040929/
lha-1.14i-ac20040929/tests/
lha-1.14i-ac20040929/tests/Makefile.in
<略>
lha-1.14i-ac20040929/src/util.c
lha-1.14i-ac20040929/src/lhdir.h
lha-1.14i-ac20040929/src/fnmatch.h
では、早速 configure してから make 実行。autoconf に対応したソフトのインストールは本当に楽だ。
zakuro# cd lha-1.14i-ac20040929
zakuro# ./configure
checking build system type... i386-unknown-freebsd5.2.1
checking host system type... i386-unknown-freebsd5.2.1
checking target system type... i386-unknown-freebsd5.2.1
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
<略>
config.status: creating tests/lha-test
config.status: creating config.h
config.status: executing depfiles commands
zakuro# make
make all-recursive
Making all in man
Making all in olddoc
Making all in src
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -DEUC -DSUPPORT_LH7 -g -O2 -MT append.o -MD -MP -MF ".deps/append.Tpo" -c -o append.o `test -f 'append.c' || echo './'`append.c; then mv -f ".deps/append.Tpo" ".deps/append.Po"; else rm -f ".deps/append.Tpo"; exit 1; fi
<略>
gcc -g -O2 -o lha append.o bitio.o crcio.o dhuf.o extract.o header.o huf.o indicator.o larc.o lhadd.o lharc.o lhext.o lhlist.o maketbl.o maketree.o patmatch.o shuf.o slide.o util.o
Making all in tests
"Makefile", line 287: warning: duplicate script for target "lha-test" ignored
むむ・・・。なんか Makefile の既述についてのワーニングが・・・
ワーニングだからほっておくか・・・
zakuro# make install
Making install in man
/bin/sh ../mkinstalldirs /usr/local/man/mann
/usr/bin/install -c -m 644 ./lha.n /usr/local/man/mann/lha.n
Making install in olddoc
Making install in src
/bin/sh ../mkinstalldirs /usr/local/bin
/usr/bin/install -c lha /usr/local/bin/lha
Making install in tests
"Makefile", line 287: warning: duplicate script for target "lha-test" ignored
"Makefile", line 287: warning: duplicate script for target "lha-test" ignored
あれれ・・・ make install でもワーニングが出たな。でも、まあ、ワーニングだから。良しとしよう。
で、できあがったファイルを見てみる。
zakuro# ls -la /usr/local/bin/lha*
-rwxr-xr-x 1 root wheel 273996 Mar 13 15:35 /usr/local/bin/lha
-r-xr-xr-x 1 root wheel 52060 Mar 13 14:39 /usr/local/bin/lha.org
packages で入れた lha より、えらく巨大になってるな・・・
ヘルプを見てみると、
◆lha-1.14i-ac20040929
usage: lha [-]<commands>[<options>] [-<options> ...] archive_file [file...]
commands: [axelvudmcpt]
options: [q[012]vnfto[567]dizg012e[w=<dir>|x=<pattern>]]
◆lha-1.14i_2
usage: lha [-]{axelvudmcp[q[num]][vnfodizg012]}[w=<dir>] archive_file [file...]
ということで、lha-1.14i_2 は usage に command や option の t を載せてなかったりして、なんか変。
まあ、x=<pattern> というオプションが lha-1.14i-ac20040929 の方には追加されていたりするので、それも大きくなった原因なんだろうけど、要は、packages の lha はコンパイル時に最適化されてたんだろうなあ。
ま、別にシビアなパフォーマンスを必要とするわけじゃないので、これはこれでいいのだ。
じゃ、Windows 上で日本語を含む名前のファイルを圧縮した LZH ファイルを使ってテストしてみる。
%lha l temp20050312.lzh
PERMISSION UID GID SIZE RATIO STAMP NAME
---------- ----------- ------- ------ ------------ --------------------
[MS-DOS] 23432 18.0% Mar 10 11:10 01通常平日下通過.csv
[MS-DOS] 23060 17.7% Mar 10 11:10 01通常平日上通過.csv
[MS-DOS] 26740 20.2% Mar 10 11:10 02通常平日下通過.csv
[MS-DOS] 37496 16.9% Mar 10 11:10 02通常平日上通過.csv
[MS-DOS] 24001 19.9% Mar 10 11:10 03通常平日下通過.csv
[MS-DOS] 23556 17.9% Mar 10 11:10 03通常平日上通過.csv
[MS-DOS] 16640 19.1% Mar 10 11:10 05通常平日下通過.csv
[MS-DOS] 16328 19.8% Mar 10 11:10 05通常平日上通過.csv
[MS-DOS] 18644 16.6% Mar 10 11:10 06通常平日下通過.csv
[MS-DOS] 18644 16.9% Mar 10 11:10 06通常平日上通過.csv
[MS-DOS] 12460 19.1% Mar 10 11:10 07通常平日下通過.csv
[MS-DOS] 9964 21.6% Mar 10 11:10 07通常平日上通過.csv
[MS-DOS] 10255 20.2% Mar 10 11:10 08通常平日下通過.csv
[MS-DOS] 10255 19.8% Mar 10 11:10 08通常平日上通過.csv
[MS-DOS] 5904 25.0% Mar 10 11:10 09通常平日下通過.csv
[MS-DOS] 5904 24.9% Mar 10 11:10 09通常平日上通過.csv
---------- ----------- ------- ------ ------------ --------------------
Total 16 files 283283 18.8% Mar 13 15:53
%lha e -e temp20050312.lzh
01通常平日下通過.csv - Melted : ooo
01通常平日上通過.csv - Melted : ooo
02通常平日下通過.csv - Melted : oooo
02通常平日上通過.csv - Melted : ooooo
03通常平日下通過.csv - Melted : ooo
03通常平日上通過.csv - Melted : ooo
05通常平日下通過.csv - Melted : ooo
05通常平日上通過.csv - Melted : oo
06通常平日下通過.csv - Melted : ooo
06通常平日上通過.csv - Melted : ooo
07通常平日下通過.csv - Melted : oo
07通常平日上通過.csv - Melted : oo
08通常平日下通過.csv - Melted : oo
08通常平日上通過.csv - Melted : oo
09通常平日下通過.csv - Melted : o
09通常平日上通過.csv - Melted : o
%ls -la
total 354
drwxr-xr-x 2 shinoda admin 1024 Mar 13 16:05 .
drwxr-xr-x 3 shinoda admin 512 Mar 13 15:55 ..
-rw-r--r-- 1 shinoda admin 23432 Mar 10 11:10 01??????????????.csv
-rw-r--r-- 1 shinoda admin 23060 Mar 10 11:10 01??????????????.csv
-rw-r--r-- 1 shinoda admin 26740 Mar 10 11:10 02??????????????.csv
-rw-r--r-- 1 shinoda admin 37496 Mar 10 11:10 02??????????????.csv
-rw-r--r-- 1 shinoda admin 24001 Mar 10 11:10 03??????????????.csv
-rw-r--r-- 1 shinoda admin 23556 Mar 10 11:10 03??????????????.csv
-rw-r--r-- 1 shinoda admin 16640 Mar 10 11:10 05??????????????.csv
-rw-r--r-- 1 shinoda admin 16328 Mar 10 11:10 05??????????????.csv
-rw-r--r-- 1 shinoda admin 18644 Mar 10 11:10 06??????????????.csv
-rw-r--r-- 1 shinoda admin 18644 Mar 10 11:10 06??????????????.csv
-rw-r--r-- 1 shinoda admin 12460 Mar 10 11:10 07??????????????.csv
-rw-r--r-- 1 shinoda admin 9964 Mar 10 11:10 07??????????????.csv
-rw-r--r-- 1 shinoda admin 10255 Mar 10 11:10 08??????????????.csv
-rw-r--r-- 1 shinoda admin 10255 Mar 10 11:10 08??????????????.csv
-rw-r--r-- 1 shinoda admin 5904 Mar 10 11:10 09??????????????.csv
-rw-r--r-- 1 shinoda admin 5904 Mar 10 11:10 09??????????????.csv
-rw-r--r-- 1 shinoda admin 54077 Mar 13 15:53 temp20050312.lzh
う〜む、化け化けじゃのお。
わしの locale で EUC を設定してないからかいのお?
perl 内部から日本語ファイル名が引けるかやってみる。
%cat > test.pl
open (IN, "01通常平日下通過.csv");
@d = <IN>;
close(IN);
print $d[0];
print $d[1];
print $d[2];
print $d[3];
exit();
こんな感じのプログラムを作成。これを実行して「01通常平日下通過.csv」が読み込めれば問題なし。
%perl test.pl
1,下,平日,2005/2/11,,,,,,,,,,,,,,,,,,,,,,,
広島駅,猿猴橋町,的場町(本), 稲荷町,銀山町,胡町,八丁堀(本),立町,紙屋町東,本通 ,袋町,中電前,市役所前,鷹野橋,日赤病院前,広電本社前,御幸橋,皆実町6丁目(本,広大付属学校前,県病院前,宇品2丁目,宇品3丁目,宇品4丁目,宇品5丁目,海岸通,元宇品口 ,広島港
,,,,,,,,,,,,,,,5:59, 6:00, 6:02, 6:03, 6:04, 6:05, 6:06, 6:07, 6:08, 6:09, 6:11, 6:15,,,,,,,,,,,,,,,6:08, 6:09, 6:11, 6:12, 6:13, 6:14, 6:15, 6:16, 6:17, 6:18, 6:20, 6:24
おお、ちゃんと読めてるじゃん。
さすが日本の生んだ archiver!!ちゃんと EUC コードで出力しているようだ。
実はこれ、
%lha e -e temp20050312.lzh
という具合に -e オプション(TEXT code convert from/to EUC)を付けているので、解凍時に TEXT ファイルのコードを EUC 変換してくれているので、ファイルの中身もちゃんと EUC で表示されている。
ただ単に、
%lha e temp20050312.lzh
とすると、ファイルの中身は Shift_JIS のままである。(まあ、それでもファイル名は EUC 変換されるのでプログラム内からファイルを読み込むことは出来るけどね)
lha では日本語ファイル名の利用が OK のようなので、unzip(ZIP ファイルの解凍)も試してみる。
%unzip temp20050312.zip
Archive: temp20050312.zip
inflating: 05簿 �� 鋪.csv
inflating: 05簿�� 潼csv
inflating: 06簿 �� 鋪.csv
inflating: 06簿�� 潼csv
inflating: 07簿 �� 鋪.csv
inflating: 07簿�� 潼csv
inflating: 08簿 �� 鋪.csv
inflating: 08簿�� 潼csv
inflating: 09簿 �� 鋪.csv
inflating: 09簿�� 潼csv
inflating: 01簿 �� 鋪.csv
inflating: 01簿�� 潼csv
inflating: 02簿 �� 鋪.csv
inflating: 02簿�� 潼csv
inflating: 03簿 �� 鋪.csv
inflating: 03簿�� 潼csv
わ、わ。駄目だ、こりゃ。化け化け。
%perl test.pl
%
ファイル名も Shift_JIS で出力されてしまうので、EUC で書いた perl プログラム内で指定したファイル名とはマッチしないんだなあ。
まあ、プログラム内で Shift_JIS に変換してやれば良いんだろうけど、やはり気持ちわるいなあ・・・。
日本語の混ざったファイル名を使用する時は lha 最高!!unzip は駄目、駄目。
ということで、LHA 最高!最高!!
|
|