ここでは, Debian 環境において, 仮想 X サーバ Xvfb を用いて dcl で描画する絵のダンプを行なう手順を示す. 大量のダンプ処理中はその計算機において他のコンソール作業が出来なくなる. 仮想 X サーバへダンプする絵を飛ばすことでこの問題が解決できる.
この覚え書きは以下で構成される:
gtool を用いたアニメーション作成のための手引
http://www.gfd-dennou.org/arch/gtool/TEBIKI.gt3-dcl5.animation
DCL: 内部変数管理ルーチン
http://www.gfd-dennou.org/arch/dcl/dcl-f77doc/rc1/index_menu.html
描画実行は, X サーバの認証と仮想 X サーバの起動後に行なう. この方法には 2 つある. 数の少ないダンプ処理を行ないたい場合は以下の 1. の方法を, 多くのダンプ処理を行ないたい場合や, 1. の方法がうまくいかなかった場合は以下の 2. の方法を勧める.
xvfb をインストールすると xvfb-run というスクリプトも同時にインストールされるので, これを使って描画すると簡単便利である. ただし, 動作が多少遅い, 実行環境 (計算機のスペック) によってはうまく動作しない場合がある, という欠点がある.
1-1. 解像度, 色深度の設定を変更する.
/usr/local/xvfb-run
===================================================================== # XAUTHORITY=./Xauthority Xvfb :99 -screen 0 640x480x8 -nolisten tcp \ XAUTHORITY=./Xauthority Xvfb :99 -screen 0 1024x768x24 -nolisten tcp \ =====================================================================
1-2. 実行 (実行例は以下の「DCL の設定例」を参照)
$ xvfb-run [ダンプの設定をしたプログラム]
xauth によって Xサーバの認証設定ファイル XAUTHORITY を作成したあ と, 仮想 X サーバ Xvfb を起動する. 表示許可を出したディスプレイ に描画を行なう.
$ MCOOKIE=$(mcookie) $ XAUTHORITY=./Xauthority xauth add :99 . $MCOOKIE > /dev/null 2>&1 $ XAUTHORITY=./Xauthority Xvfb :99 -screen 0 1280x768x24 -nolisten tcp > /dev/null 2>&1 & $ DISPLAY=:99 XAUTHORITY=./Xauthority [ダンプの設定をしたプログラム]
やまだ由覚書:
2-2. xauth add :99 の許可を書き込んだ ~/.Xauthority を作成しておいて, ~/.bashrc に export XAUTHORITY=/home/usr/.Xauthority, export DISPLAY=:99 と書き込んでおけば, 実行は, 以下の 2 行だけでいいかもしれない (試してないけど).
$ Xvfb :99 -screen 0 1024x768x24 -nolisten tcp > /dev/null 2>&1 & $ ./[ダンプの設定をしたプログラム]
ここでは, xvfb-run を用いた場合の gt3-dcl5, ruby における仮想ダンプの設定例を示す. f77, f90 の設定は, ruby の設定と同様なので参考になるはずである.
仮想ダンプに必要な最低限のオプションは以下である:
$ xvfb-run gtcont ps.sum \ -sw:ldump=.true. -sw:iposx=50 -sw:iposy=50 \ -sw:lwait=.false. -sw:lwait1=.false.
仮想ダンプに必要な内部変数の設定を描画ウィンドウをオープンする前に設定する. 実行は以下のようにする.
$ xvfb-run ruby hoge.rb hoge.rb ================================================ DCL::swpset('LDUMP', true) DCL::swpset('LWAIT',false) DCL::swpset('LWAIT1',false) DCL::swpset('IPOSX', 50) DCL::swpset('IPOSY',50) DCL::gropn(1) (お絵描きメソッド) DCL::grcls ================================================
2. に準じるサブルーチンを呼んで同様の設定をすればよい.
仮想ダンプをする際は, マウス, キーボードの入力をせずにプログラムを終了させる必要がある. そのために必要な dcl の内部関数は以下である. 内部変数の変更は swpset というメソッド (サブルーチン) を用いる.
'LWAIT', 'LWAIT1'
改ページ, 画面クローズ時に一時停止しないように false に設定. これを指定しないと, マウスあるいは Enter によるページ送りをしようとして入力待ちが続く.
'IPOSX', 'IPOSY'
ウィンドウの位置の始点の設定. 50 前後とする. これを設定しないと仮想コンソールでマウスによる位置指定をしようとして入力待ちが続く.
生成した xwd ファイル (dcl_???.xwd) には, 黒い枠が出来てしまっている (かもしれない). その場合, netpbm のコマンドを用いてその枠を切り取ってから, gif に変換する. 切り取り範囲は xwdtopnm で作成した pnm サイズを参考にして (dcl の設定によってはサイズが変わるので) 自分で設定のこと.
$ xwdtopnm dcl_001.xwd | pnmcut 2 2 904 654 > tmp.pnm $ ppmtogif tmp.pnm > test1.gif
2004/06/22 更新 (by 山田 由貴子)