`(Hello ,world)

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-03-30

Amazon.comでのSICPの評価

| 00:49

Amazon.comでのSICPのページを見たら、Peter Norvig 先生がベストレビューだった。本人かどうかわからないけどpaul grahamもレビューを書いている。他にも有名人がいるかと見てみたけど、LokiAndrei Alexandrescuくらいしかわからなかった。

それにしても本当に星5個と1個ではっきりわかれてるな。1個の人は「退屈」とか『不親切」とかのコメントが多い。理解できないと評価もよくなりようがないよね。

Gauche-gd で図形言語

| 12:28

ImageMagickインストールにつまづいてしまったので、gdを試してみた。無事にインストールできて、SICPの図形言語ができました。

f:id:mokehehe:20080330122615p:image

#!/usr/local/bin/gosh

(use graphics.gd)

(load "./pict-lang.scm")

;; gd interface

(define *im* #f)

(define (screen w h . rest)
  (let-optionals* rest ((r 255)
                        (g 255)
                        (b 255))
                  (set! *im* (gd-image-create w h))
                  (gd-image-color-transparent *im* (color r g b))
                  (gd-image-interlace *im* 1)))

(define (outimg)
  (current-gd-image-format (if (memq 'png *gd-features*) 'png 'gif))
  (write *im*))

(define (color r g b)
  (gd-image-color-allocate *im* r g b))

(define (line col x0 y0 x1 y1)
  (gd-image-line *im* x0 y0 x1 y1 col))


;; test painter

(define wave
  (let ((p01 (make-vect 0.42 1.00)) (p02 (make-vect 0.58 1.00))
        (p03 (make-vect 0.00 0.80)) (p04 (make-vect 0.35 0.80))
        (p05 (make-vect 0.65 0.80)) (p06 (make-vect 0.00 0.60))
        (p07 (make-vect 0.30 0.60)) (p08 (make-vect 0.40 0.60))
        (p09 (make-vect 0.60 0.60)) (p10 (make-vect 0.70 0.60))
        (p11 (make-vect 0.20 0.55)) (p12 (make-vect 0.30 0.55))
        (p13 (make-vect 0.35 0.50)) (p14 (make-vect 0.65 0.50))
        (p15 (make-vect 0.20 0.45)) (p16 (make-vect 1.00 0.40))
        (p17 (make-vect 0.50 0.20)) (p18 (make-vect 1.00 0.20))
        (p19 (make-vect 0.25 0.00)) (p20 (make-vect 0.40 0.00))
        (p21 (make-vect 0.60 0.00)) (p22 (make-vect 0.75 0.00)))
    (segments->painter
      (list (make-segment p01 p04)
            (make-segment p04 p08)
            (make-segment p08 p07)
            (make-segment p07 p11)
            (make-segment p11 p03)
            (make-segment p06 p15)
            (make-segment p15 p12)
            (make-segment p12 p13)
            (make-segment p13 p19)
            (make-segment p20 p17)
            (make-segment p17 p21)
            (make-segment p22 p14)
            (make-segment p14 p18)
            (make-segment p16 p10)
            (make-segment p10 p09)
            (make-segment p09 p05)
            (make-segment p05 p02)))))

(define wave2 (beside wave (flip-vert wave)))
(define wave4 (below wave2 wave2))

(define (rotate4 painter)
  (let ((half (beside painter (rotate90 painter))))
    (below half (rotate180 half))))

(define (divide-x painter n)
  (if (> n 0)
      (let ((sub (divide-x painter (- n 1))))
        (below (beside (rotate270 sub) (rotate180 painter)) (beside painter (rotate90 sub))))
    painter))

(define test-painter
;  (square-limit wave 4)
;  (rotate4 (flip-vert (flip-horiz (corner-split wave 4))))
  (divide-x wave 5)
  )

(define-constant WIDTH  256)
(define-constant HEIGHT 256)

(define (draw-line v0 v1)
  (let ((x0 (floor->exact (xcor-vect v0)))
        (y0 (floor->exact (- HEIGHT (ycor-vect v0))))
        (x1 (floor->exact (xcor-vect v1)))
        (y1 (floor->exact (- HEIGHT (ycor-vect v1)))))
    (line (color 0 0 0) x0 y0 x1 y1)))

;; Entry point
(define (main args)
  (screen WIDTH HEIGHT)
  (let ((frame (make-frame
                (make-vect 0 0) (make-vect WIDTH 0) (make-vect 0 HEIGHT))))
    (test-painter frame))
  (outimg)
  0)

ImageMagick

09:42

SICPの図形言語がやりたくて、なにか画像処理のパッケージを使いたい。ImageMagickというのがいろいろできそうでよさげ。Gauche-bindingもある。

でやってみようとしたんだけど、インストールに失敗する。

$ ./auto
checking build system type... i686-pc-cygwin
checking host system type... i686-pc-cygwin
checking target system type... i686-pc-cygwin
checking for gosh... /usr/local/bin/gosh
checking for gauche-config... /usr/local/bin/gauche-config
checking for gauche-package... /usr/local/bin/gauche-package
checking for gauche-install... /usr/local/bin/gauche-install
checking for gauche-cesconv... /usr/local/bin/gauche-cesconv
checking for a BSD-compatible install... /usr/bin/install -c
configure: creating ./config.status
config.status: creating Makefile
config.status: executing im_head_n_tail commands
config.status: generating im_head.c and im_tail.c
gcc -g -O2 -I/usr/local/lib/gauche/0.8.12/include -fomit-frame-pointer -march=i686 -DUSE_I686_PREFETCH -fpic   -c -o im_head.o im_head.c
im_head.c:1: warning: -fpic ignored for target (all code is position independent)
gcc -g -O2 -I/usr/local/lib/gauche/0.8.12/include -fomit-frame-pointer -march=i686 -DUSE_I686_PREFETCH -fpic   -c -o im.o im.c
im.c:1: warning: -fpic ignored for target (all code is position independent)
im.c:121: error: initializer element is not constant
im.c:121: error: (near initialization for `Scm_ImageInfoClass.cpa')
im.c:173: error: initializer element is not constant
im.c:173: error: (near initialization for `Scm_ExceptionInfoClass.cpa')
im.c: In function `Scm_ExceptionInfoClass_reason_SET':
im.c:211: warning: assignment discards qualifiers from pointer target type
im.c: In function `Scm_ExceptionInfoClass_description_SET':
im.c:224: warning: assignment discards qualifiers from pointer target type
im.c: At top level:
im.c:282: error: initializer element is not constant
im.c:282: error: (near initialization for `Scm_ImageClass.cpa')
make: *** [im.o] Error 1

わからん。とりあえずCから使えるかテストする。

Cから使う

ImageMagick: MagickCore, Low-level C API for ImageMagick

  • MagickCore-config がない→無視
gcc core.c -lmagick
  • リンクエラー
$ gcc core.c -lmagick
core.c:(.text+0x70): undefined reference to `_MagickCoreGenesis'
core.c:(.text+0x1d2): undefined reference to `_MagickCoreTerminus'
collect2: ld returned 1 exit status
Gaucheバインディングインストールに失敗した行を見てみる
im.c:121: error: initializer element is not constant
im.c:121: error: (near initialization for `Scm_ImageInfoClass.cpa')
im.c:121: SCM_DEFINE_BUILTIN_CLASS(Scm_ImageInfoClass, NULL, NULL, NULL, NULL, SCM_CLASS_DEFAULT_CPL);
  • SCM_CLASS_DEFAULT_CPL の定義で、
SCM_EXTERN ScmClass *Scm_DefaultCPL[];
  • のSCM_EXTERN が、Cygwin だと
#  define SCM_EXTERN extern __declspec(dllimport)
  • となって、これが定数にはならないからだめぽい。
  • でもそれだとCygwinで拡張ライブラリが使えないことになっちゃうぞ?
  • 宣言時には CPA に NULL を与えておいて、実行時に値をセットするよう書き換え
// 宣言時
//SCM_DEFINE_BUILTIN_CLASS(Scm_ImageInfoClass, NULL, NULL, NULL, NULL, SCM_CLASS_DEFAULT_CPL);
SCM_DEFINE_BUILTIN_CLASS(Scm_ImageInfoClass, NULL, NULL, NULL, NULL, NULL);

// 初期化関数内
	Scm_ImageInfoClass.cpa = SCM_CLASS_DEFAULT_CPL;
  • リンクエラー
gcc  -Wl,--export-all-symbols -Wl,--enable-auto-import -shared -o  im.so im_head.o im.o im_tail.o im-lib.o -L/usr/local/lib/gauche/0.8.12/i686-pc-cygwin  -lgauche -lm  -lpthread  -lMagick
im.o: In function `im_im_write_image_to_uvector':
/cygdrive/c/temp/gauche-imagemagick-1.9/im.c:629: undefined reference to `_Scm_U8VectorClass'
/cygdrive/c/temp/gauche-imagemagick-1.9/im.c:629: undefined reference to `__imp__Scm_MakeUVectorFull'
im.o: In function `im_im_uvector_discard':
/cygdrive/c/temp/gauche-imagemagick-1.9/im.c:641: undefined reference to `_Scm_U8VectorClass'
collect2: ld returned 1 exit status

LiliamLiliam2012/02/15 18:39I was looking everywhere and this pppoed up like nothing!

dkonohlixdkonohlix2012/02/16 17:57V3oJQu <a href="http://rzczofnepdgc.com/">rzczofnepdgc</a>

uftqorobuftqorob2012/02/17 00:43scCwcf , [url=http://wtqgzbbvxrxg.com/]wtqgzbbvxrxg[/url], [link=http://ltdndbdxyrpl.com/]ltdndbdxyrpl[/link], http://gedbptbgtjkb.com/

uxinkjfuxinkjf2012/02/18 02:11eOKr6V <a href="http://mvrnsqzfymwr.com/">mvrnsqzfymwr</a>

トラックバック - http://cadr.g.hatena.ne.jp/mokehehe/20080330