graph-eps

guile 3.0.5

guile 3のメンテナンス版が最近出たってんで、OpenBSDで挑戦。

ob$ CC=cc ./configure --without-threads
ob$ gmake
   :
  SNARF  socket.doc
  SNARF  regex-posix.doc
  CCLD     libguile-3.0.la
  CCLD     guile
  GEN      guile-procedures.texi
allocating JIT code buffer failed: Not supported
jit.c:5804: fatal: assertion failed
Abort trap (core dumped)
gmake[3]: *** [Makefile:4295: guile-procedures.texi] Error 1
gmake[3]: Leaving directory '/tmp/guile-3.0.5/libguile'

見事にエラーなんで、どんなコードだったか拝んでおく。 jit.c

5799  /* Init the thread's jit state so we can emit the entry
5800     trampoline and the handle-interrupts trampoline.  */
5801  j = initialize_thread_jit_state (SCM_I_CURRENT_THREAD);
5802
5803  jit_pointer_t enter_mcode_addr = emit_code (j, emit_entry_trampoline);
5804  ASSERT (enter_mcode_addr);

jitって、動的にコンパイルするんだよな。コンパイルされた方にスイッチして、そちらを実行だな。そんな危ない橋をユーザーに渡らせるなんて、許しませんって言うOpenBSDのポリシーなんだな。

WX now mandatory in OpenBSD

その点、リナはもとよりFreeBSDも、みんなで渡れば怖くないって方針。両者共、guile 3になったぞ。それで、良い事有るのか?

Postscript

突然ポストスクリプトって何よ。これは、以降の内容の前ぶりだ。このps語は2017年10月にやってるな。3年もたってるから特集するのを許してね。雑誌だと1年周期だから、まあ許されるだろう。しばし、情報収集。

Postscript プログラミングメモ

PostScript実習マニュアル (良記事)

Postscriptの基本

キャンバスはgostscriptパッケージの中にあるgsコマンドを起動すれば現れる。はずなんだけど、オイラーのdebianでは出てこなかった。このパッケージを積極的に入れた記憶は無いので、何かのお供で入ったんだろう。積極的にgsを使うなら、gohostscript-xパッケージも入れる必要がある(オイラーの所の特殊事情かも知れないけどね)。

emacsから使うなら、下記の設定追加する。

;; postscript
(setq  ps-run-dumb '("gs" "-r72" "-sPAPERSIZE=a4"))

C-c C-s で、gsを走らせる。次に、C-c C-bで描画してみる。それが気にいらなければ、C-c C-l の消しゴムで消す。 コードを書き直して、また、C-c C-b -> C-c C-l の繰り返し。飽きたら、 C-c C-qで終了。

graph

Using Grapheps from Other Languages

これ、前回見つけたやつ。冒頭にある、graph-eps ってのは、ポストスクリプト語のライブラリィーだ。さすがにこれを裸で使うのはキツイので、schemeから使えるようになってる。 そう、slib経由でね。

このページの下の方にscheme語の例と、それを変換したps語の絵とコードが載ってる。 グラフを書いているにも関わらず、全てがASCII文字(のコード)になってるのは、オイラーに取って、好印象だ。

早速この例を探してみると、下記に掲載されてた。

5.9.2 PostScript Graphing これは、もう試してみる鹿。

try by gauche

コピペしてeps.smってファイルにした。最初からslib使うので、そのように起動。

sakae@pen:/tmp/eps-test$ gosh -u slib
gosh> (load "eps.scm")
 *** ERROR: unbound variable: load-color-dictionary
    While loading "/usr/local/lib/slib/grapheps.scm" at line 24
    While loading "./eps.scm" at line 4
Stack Trace:
_______________________________________
  0  (load-color-dictionary feature filename)
        at "/usr/local/lib/slib/require.scm":169
  1  #(lvar thunk #f 1 0)
        [unknown location]
  2  (eval expr env)
        at "/usr/local/share/gauche-0.97/0.9.10/lib/gauche/interactive.scm":303

のっけからエラーの洗礼。どうもeps-graphってモジュールの読み込みに失敗してるようだ。

try by guile

余りgaucheばかりにこだわっていてもしょうがないので、セカンドオピニオンとして、入れたばかりのguileで試してみる。

sakae@pen:/tmp/eps-test$ guile
GNU Guile 3.0.5
Copyright (C) 1995-2021 Free Software Foundation, Inc.
  :
scheme@(guile-user)> (use-modules (ice-9 slib))
scheme@(guile-user)> (load "eps.scm")
ice-9/boot-9.scm:1669:16: In procedure raise-exception:
Unbound variable: load-color-dictionary

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In ice-9/boot-9.scm:
   2806:4  8 (save-module-excursion #<procedure 5616f4256270 at ice-9/boot-9…>)
  4351:12  7 (_)
In /tmp/eps-test/eps.scm:
      4:0  6 (_)
In /usr/local/share/guile/3.0/slib/guile-2.init:
    257:4  5 (with-load-pathname _ _)
In ice-9/boot-9.scm:
   2806:4  4 (save-module-excursion #<procedure 5616f4256030 at ice-9/boot-9…>)
  4351:12  3 (_)
In /usr/local/lib/slib/grapheps.scm:
     24:0  2 (_)
In /usr/local/lib/slib/require.scm:
   169:25  1 (_ "/usr/local/lib/slib/clrnamdb.scm")
In ice-9/boot-9.scm:
  1669:16  0 (raise-exception _ #:continuable? _)

両scheme共、load-color-dictionaryが見つからないエラーのようだ。

seek error

と言う事は、slibの設定で、何か不足が有るのかな? 目を皿のようにして、インストール方法を探すと、

  The catalog also supports color-name dictionaries.  With an
SLIB-installed scheme implementation, type:
     (require 'color-names)
     (make-slib-color-name-db)
     (require 'new-catalog)
     (slib:exit)

こんなオプション扱いが見つかった。どうもこれっぽいな。

sakae@pen:/tmp/eps-test$ sudo gosh -u slib
gosh> (require 'color-names)
#t
gosh> (make-slib-color-name-db)
 *** ERROR: unbound variable: make-slib-color-name-db
Stack Trace:
_______________________________________
  0  (make-slib-color-name-db)
        at "(standard input)":2
  1  (eval expr env)
        at "/usr/local/share/gauche-0.97/0.9.10/lib/gauche/interactive.scm":303

make-slib-color-name-dbってのは、どこのモジュール所属?

-- Function: make-slib-color-name-db

    Creates an alist-table relational database in library-vicinity
    containing the "Resene" and "saturate" color-name dictionaries.

    If the files 'resenecolours.txt', 'nbs-iscc.txt', and
    'saturate.txt' exist in the library-vicinity, then they used as the
    source of color-name data.  Otherwise, 'make-slib-color-name-db'
    calls url->color-dictionary with the URLs of appropriate source
    files.
gosh> (require 'color-database)
#t
gosh> (make-slib-color-name-db)
 *** ERROR: unbound variable: create-database
Stack Trace:
_______________________________________
  0  (create-database (in-vicinity (library-vicinity) "clrnamdb.sc ...
        at "/usr/local/lib/slib/mkclrnam.scm":303
  1  (create-database (in-vicinity (library-vicinity) "clrnamdb.sc ...
        at "/usr/local/lib/slib/mkclrnam.scm":303
  2  (eval expr env)
        at "/usr/local/share/gauche-0.97/0.9.10/lib/gauche/interactive.scm":303

今度は河岸を変えてdebian(32Bit)で確認。但し引っかかったコードで、何を欲しているか確認。 require.scmの該当箇所にprint文を挿入。

((color-names)
 (lambda (filename)
   (display feature)  (display #\newline)
   (display filename) (display #\newline)
   (load-color-dictionary feature filename)))

これで、走らせる。

debian:t$ gosh -u slib
gosh> (load "eps.scm")
resene
/usr/share/slib/clrnamdb.scm
 *** ERROR: unbound variable: load-color-dictionary
    While loading "/usr/share/slib/grapheps.scm" at line 24
    While loading "./eps.scm" at line 4
Stack Trace:
_______________________________________
  0  (load-color-dictionary feature filename)
        at "/usr/share/slib/require.scm":171

該当箇所はgrapheps.scmの(require 'resene)であった。

gosh> load-color-dictionary
#<closure (load-color-dictionary table-name . db)>

ちゃんと該当の手続きは存在してるんだけどな。

slibの修復

もう、やりたい放題にやる。だって、作成されてから年月が経過して、時代にそぐわなくなっていると思うからな。

slib/ の中に、公開されてるgraph-epsをgrapheps.psって名前で突っ込む。

grapheps.scmに変更を加える。

(require 'color)
;(require 'resene)
;(require 'saturate)
(require 'filename)

色気を外す。次にplot関数の中のsystemに呼んでるgvをgsに変更する。 サンプルスクリプト中のset-colorはコメントアウトしとく。gvも忘れずにgsに変更。

塗りつぶしの色が黒になってるんで、2本目の線が隠れててしまう。塗りつぶしを禁止する。

(in-graphic-context (clip-to-rect plotrect)
                    (plot-column irradiance 0 1 'line)
                   ; (set-color "Bright Sun")
                   ; (plot-column irradiance 0 1 'mountain)
                    )
(rule-horizontal bottomedge "Wavelength in .um" 5)
; (set-color 'seagreen)
debian:t$ cat am1.5.html
0.234 66.2 123.4
1.456 88.4 444.3

起動すると指定のURLからデータをDLするはずなんだけど、内容が変わってしまっていて、どうにもならない。

URLの結果は am1.5.htmlにキャッシュされる仕組みになってるんで、同名なファイルに ダミーデータを作成。データの並びは、左からX値、Y1値(左側のスケール用)、Y2値(右側スケール用)ってなってる。

gosh> (load "try.scm")
GPL Ghostscript 9.27 (2019-04-04)
Copyright (C) 2018 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Loading NimbusSans-Regular font from /usr/share/ghostscript/9.27/Resource/Font/NimbusSans-Regular... 4129892 2569655 3057492 1748379 2 done.
Loading NimbusSans-Italic font from /usr/share/ghostscript/9.27/Resource/Font/NimbusSans-Italic... 4195772 2751135 3077596 1765315 2 done.
>>showpage, press <return> to continue<<

やっと表示された。お疲れ様です。

作成された、solarad.epsを確認。まずは、冒頭部分。

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 600 300
%%Title:
%%EndComments:
0 0 600 300
% "graph-eps" library for creating PostScript graphs
% http://people.csail.mit.edu/jaffer/Docupage/grapheps

これは、slibが書き込んでいるんだな。次は、graph-epsの内容が続く。自前のps用ライブラリィーになる。それが終わると、サンプルのschemeコードが変換したデータになる。

% End of "graph-eps"

/slib:G0
[
 [      0.234   66.2    123.4]
 [      1.456   88.4    444.3]
] def
whole-page
[ 0.25 2.5 ] slib:G0 1 column-range setup-plot
(Solar Irradiance   http://www.pv.unsw.edu.au/am1.5.html) () title-top
gpush
 :
[ slib:G0 0 2 ] line plot-column
gpop
rightedge (Integrated .W/(m^2)) -10 rule-vertical

grestore
end
showpage

gsで閲覧すると、図が縦長にビローンとなってしまうけど、下記のようにPDFを作って見ると、 指示通り、300x600のサイズになった。そんなものなのか。

sakae@pen:/tmp$ ps2pdf -dEPSCrop solarad.eps
sakae@pen:/tmp$ firefox solarad.pdf

色は色々

上で散々悩まされた色関係。slibの作者さんは、強いこだわりがあるようで、 Color-Name Dictionaries なんてのを見るべしって言ってる。

また、slibの説明の中でも、Mathematical Packagesの章にわざわざcolorの手続きを集めて紹介してる。

色の名前は、特に車や化粧品で、ブランドイメージを上げるために、次々と発明されています。


This year's Index

Home