LANDISK で eqn2gif online を動かす

[戻る]
こちらで書いたように LANDISK (HDL-160U) に eqn2gif を動かしたいと考え, 構築しました. ここではその Tips を書いて行きます.

必要なファイル

eqn2gif を CGI で動かすという野望のためには, ps2img 単体で動く必要があります. そのため

の二つのファイルがまず必要です.

また, psimglib.pl 内で使うため

  1. Ghostscript
  2. platex
  3. file コマンド (file-4.17.tar.gz)
  4. netpbm ツール群
コマンドが必要です.

このうち, Ghostscript と platex は各リンク先に Landisk での コンパイル方法とバイナリを置いているので割愛します. 残る二つについて, これからインストール方法を書きますが, 最後に バイナリも置きますので面倒くさい人は入手して使ってもかまいません.

必要ファイルのインストール

まずは file コマンドですが, ソース展開後

# ./configure --prefix=/mnt/hda3/bin/usr/local
# make
# make install
とすると安直に出来ます. 素の環境では /mnt/hda3/vroot/mnt/hda3/bin/usr/local/bin/file と /mnt/hda3/vroot/mnt/hda3/bin/usr/local/share/file/ に出来ますので, それらを /mnt/hda3/bin/usr/local/bin/file, /mnt/hda3/bin/usr/local/share/file/ にコピーするといいでしょう.

次に netpbm ですが, コンパイルしようとしたのですが厄介でした. debianを 覗くとバイナリがあったので, 貰うことにしました. 必要なファイルは

の中にありました.

これらを展開して (適当なディレクトリで "/mnt/hda3/vroot/usr/bin/dpkg-deb -x *.deb ." とする) 以下のようにファイルを取り出しコピーします.

# cd usr/bin
# cp pgmtoppm pnmscale ppmquant ppmtojpeg /mnt/hda3/bin/usr/bin 
# cd ../../usr/lib
# cp libppm.so.9.16 libpbm.so.9.19 libpgm.so.9.19 libpnm.so.9.16 libjpeg.so.62.0.0 /usr/lib
# cd /usr/lib
# ln -s libppm.so.9.16 libppm.so.9
# ln -s libpbm.so.9.19 libpbm.so.9
# ln -s libpgm.so.9.19 libpgm.so.9
# ln -s libpnm.so.9.16 libpnm.so.9
# ln -s libjpeg.so.62.0.0 libjpeg.so.62
そうそう, コマンド実行前にルートパーティションを R/W モードにすることを 忘れないようにしてください.

さらに適当な linux マシンから ps2epsi と rgb.txt をかっぱらい, それぞれ /mnt/hda3/bin/usr/bin/, /mnt/hda3/bin/usr/X11R6/lib/X11/ にコピーします.

ついでなので, 先ほど書いた ps2img, psimglib.pl も /mnt/hda3/bin/bin にコピーし, eqn2gif という名前で ps2img へシンボリックリンクを張ります. さらに /mnt/hda3/bin/tmp も掘りパーミションを 777 にします.

ここまで来るとディレクトリ構成は以下のようになっているはずです.

+-mnt
| +-hda3
|   +-bin
|     +-tmp
|     +-bin
|     | +-ps2img
|     | +-psimglib.pl
|     | +-eqn2gif     → ./ps2img
|     +-usr
|       +-bin
|       | +-pgmtoppm
|       | +-pnmscale
|       | +-ppmquant
|       | +-ppmtojpeg
|       | +-ps2epsi
|       +-local
|       | +-bin
|       | | +-file
|       | +-share
|       | | +-file
|       | | | +- 以下省略
|       | | +-ghostscript
|       | | | +- 以下省略
|       | | +-teTeX
|       | |   +- 以下省略
|       | +-lib
|       | | +-libmagic.*
|       | +-include
|       |   +-magic.h
|       +-X11R6
|         +-lib
|           +-X11
|             +-rgb.txt
+-usr
  +-local
  | +-share
  |   +-ghostscript  → /mnt/hda3/bin/usr/local/share/ghostscript
  +-lib
    +-libppm.so.9.16
    +-libppm.so.9    → ./libppm.so.9.16
    +-libpbm.so.9.19
    +-libpbm.so.9    → ./libpbm.so.9.19
    +-libpgm.so.9.19
    +-libpgm.so.9    → ./libpgm.so.9.19
    +-libpnm.so.9.16
    +-libpnm.so.9    → ./libpnm.so.9.16
    +-libjpeg.so.62.0.0
    +-libjpeg.so.62  → ./libjpeg.so.62.0.0

eqn2gif の設定

続いて /mnt/hda3/bin/bin/psimglib.pl を開いてパスの設定をします. 具体的には

  1. $CMD_file を "/mnt/hda3/bin/usr/local/bin/file" に
  2. $CMD_ppmquant を "/mnt/hda3/bin/usr/bin/ppmquant" に
  3. $CMD_pgmtoppm を "/mnt/hda3/bin/usr/bin/pgmtoppm" に
  4. $CMD_pnmscale を "/mnt/hda3/bin/usr/bin/pnmscale" に
  5. $CMD_platex を "/mnt/hda3/bin/usr/local/share/teTeX/bin/platex" に
  6. $CMD_dvips を "/mnt/hda3/bin/usr/local/share/teTeX/bin/dvips" に
  7. $CMD_ps2epsi を "/mnt/hda3/bin/usr/bin/ps2epsi" に
  8. $CMD_gs を "/usr/local/share/ghostscript/gs" に
  9. $ColorFile を '/mnt/hda3/bin/usr/X11R6/lib/X11/rgb.txt' に
  10. $CMD_PPMTOGIF を "/mnt/hda3/bin/usr/bin/ppmtojpeg" に
  11. $tmpdir を "/mnt/hda3/bin/tmp/" に
します. さらに, ps2img を開き @INC=(".",@INC) と書かれている所を @INC=("/mnt/hda3/bin/bin",@INC) と書きかえます.

さて, 勘の鋭い方はお分かりのように $CMD_PPMTOGIF を tojpeg にしています. つまり, 本方法だと出力ファイルは gif でなく jpeg になっちゃいます. これは, debian を使ってインストールしたら, ppmtogif が見当たらなかったからです. 探したけど分からないしめんどうくさいので jpeg を吐くようにしました. このため, eqn2gif という名前の割には jpeg を出す妙なプログラムになっちゃいました.

# /mnt/hda3/bin/bin/eqn2gif 'y=f(x)' hoge.jpg 3 SteelBlue1
と実行し, hoge.jpg という以下のようなファイルが出来たら成功です.

オブジェクトダウンロード

コンパイルや設定がめんどうな人のために, ここまでのバイナリを ここに置いておきます. /mnt/hda3/bin の下で展開し, さらに /mnt/hda3/bin/ETC にあるファイルを 上記にしたがって /usr/lib にコピーしてください.

なお, このパッケージには GhostscriptTeX は入っていません. リンク先にバイナリパッケージを置いてますので別途入れてください.

また, 動作確認した Landisk には既に Namazuの設定を行っています. っというわけでもしかしたらそこで入れた何かのファイルが必要かもしれません.

CGI 作成

さて, 無事 eqn2gif が動くようになったのでいよいよ WEB ブラウザから 利用可能なよう CGI を組み込みます. 本家では, セキュリティの観点からいろいろ制限を加える 高度なことをしているようですが, 一般公開する気は無く LAN 内で仲間内で使うだけなので, まぁ大丈夫だろうとほっといてます.

それが こちらです. apatch から見える所に展開し, 同じ所に data というディレクトリを堀り, パーミションを 777 にします. その後, eqnfig.cgi をアクセスしてください. 使い方は本家と大体同じです.

くどいかもしれませんが, 本家と違ってセキュリティはまったく考慮していません (ヒント: \input{"/etc/passwd"}). ので, 気心の知れた仲間内しかアクセスできない閉じた LAN でのみ使用して下さい. 比較的大きな組織内 LAN の場合でも IP アドレスによる制限等なんらかの措置を 設けた方がいいでしょう. 万一, インターネット上で一般公開するんだという大それたことを考え, しかも実行した挙げ句, 損害を被ったとしても私は一切関知しません.

なお画像ファイルが溜まりますので, cronで定期的に削除する必要があります. 本来ならば こちらで書いた rmoldpdf のように, 一定時間経過したファイルのみ消すようなスクリプトを動かさないと, 今まさに利用している瞬間に cron が起動したら変なことになりそうですが, どうせ数人でしか使わないサービスなので真夜中に一気に消しても大丈夫でしょう. 例えば, /mnt/hda3/share/html/eqnfig 配下に置いたとしたら

3 1 * * 5 '/bin/rm /mnt/hda3/share/html/eqnfig/data/*'
といった感じでいいと思います.

ちなみに Landisk は 15 年程前のワークステーションくらいの性能しかありません. まぁ速度はあきらめてください. それから本 Tips は eqn2gif をオンラインで動かすことを最終目標としています. ので、他の ps2img 群ツール (ps2gif/png/bmp, tex2gif/png/bmp, eqn2png/bmp) の動作は考慮していません.

おわりに 〜老婆心ながら〜

なお, こんなもん作っといて言うのもなんですが, 目的にもよりますが, 学会等の発表でしたら, 数式を書くのはできるだけ避けるべきだと思います. 「実際の所こんなに複雑なんだけど...」とイメージを与える手段はありますが, よほど簡単な式以外は書くべきではないでしょう. ダラダラとした式があって, その変数を一つ一つ説明するプレゼンテーションが 始まると, 少なくとも私は聞きません. 内職を始めます. 資料に式を入れたいと考えたら, その前に, その式は本当に入れる必要があるか, そしてその式を簡潔に表す絵や言葉で表現できないか再考してみてください.

この意味が分からない人は この辺を一読してみることを薦めます.


2006.5