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のポリシーなんだな。
その点、リナはもとよりFreeBSDも、みんなで渡れば怖くないって方針。両者共、guile 3になったぞ。それで、良い事有るのか?
Postscript
突然ポストスクリプトって何よ。これは、以降の内容の前ぶりだ。このps語は2017年10月にやってるな。3年もたってるから特集するのを許してね。雑誌だと1年周期だから、まあ許されるだろう。しばし、情報収集。
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の手続きを集めて紹介してる。
色の名前は、特に車や化粧品で、ブランドイメージを上げるために、次々と発明されています。