月別アーカイブ: 2012年10月

PASCALでグラフィックス

コンピュータアルゴリズム事典の第10章のプログラムが実行できるようにしてみました。
SDLを使いました。
——————— ここから
uses sdl;
Const
  width = 640 ;
  height = 480 ;
  colordepth = 16 ;
Type
  Pixel = Word ; { Must have colordepth bits }
Type
  { This type mimics the pixel surface srtucture: ‘height’ sequential rowsof ‘width’ pixels each. }
  TpixelBuf = Array [0..height-1, 0..width-1] of Pixel ;
var
  scr: PSDL_Surface; // Our main screen
  pixelcolor: Pixel ;
(***** Dot *******)
procedure Dot(X, Y: integer);
begin
  (* [x,y]にドットを書く*)
  if (x >= 0) and (x < width) and (y >= 0) and (y < height) then
  begin
   Tpixelbuf(scr^.pixels^)[y,x] := pixelcolor;
   SDL_UpdateRect (scr, 0, 0, 0, 0) ;
  end;
end;
(***** プロッタのシミュレーション *****)
var LastX, LastY: real; (* 大域変数 *)
procedure InitPlot; (* プロッタの初期化 *)
begin
  LastX := 0; LastY := 0;
  SDL_Init(SDL_INIT_VIDEO); // Initialize the video SDL subsystem
  scr:=SDL_SetVideoMode(width, height, colordepth, SDL_SWSURFACE);
  if scr = nil then
  Begin
   Writeln (‘Couldn”t initialize video mode at ‘, width, ‘x’,height, ‘x’, colordepth, ‘bpp’) ;
   Halt(1)
  End ;
  pixelcolor := SDL_MapRGB(scr^.format, 255, 255, 255);
end;
procedure EndPlot(); (* 終了処理 *)
begin
  SDL_Delay(10000);
  SDL_FreeSurface (scr) ;
  SDL_Quit; // close the subsystems and SDL
end;
————- ここまで
と本にある、
procedure Line(X1, Y1, X2, Y2: integer);
procedure Circle(Xcenter, Ycenter, Radius: integer);
procedure MoveAbsolute(X, Y: real); (* 絶対座標を指定してペン移動する *)
procedure DrawAbsolute(X, Y: real); (* 絶対座標を指定して線分を描く *)
procedure MoveRelative(X, Y: real); (* 相対座標を指定してペンを移動する *)
procedure DrawRelative(X, Y: real); (* 相対座標を指定して線分を描く *)
procedure DrawCircle(R: real); (* 現在位置を中心として円を描く *)
をplot.pasとして作成します。
個別のプログラムで、
[PASCAL/algo_pas/10]head Dragon.pas
program Dragon(Plotter);
{$INCLUDE plot.pas} (* 追加する *)
(***** 非再帰版ドラゴンカーブ *****)
省略
end.
とします。
fpc -k-L/opt/local/lib Dragon.pas
でコンパイルして、実行できます。
元のままだと表示して、すぐ終了してしまうので、
EndPlotを呼ぶと10秒後に終了します。
1画素づつ書いて表示を更新しているので処理が遅いので書いている状態が良くわかります。

追記11/1
原点が左上になっているので、本のような結果になりません。
左下を原点にするには、書き込んでいる部分を
Tpixelbuf(scr^.pixels^)[(height-1-y),x] := pixelcolor;
にすればOKです。
プログラムによっては、表示領域以外に書き込むのでパラメータの調整が必要です。
DrawTreeでは、
MoveAbsolute(1000, 0); Tree(6, 500, 0)

MoveAbsolute(300, 0); Tree(6, 100, 0.0)
に変更すると本と同じ様な表示が得られます、

追記
GNUPLOTで表示出来るようになりました。

uses BaseUnix,Unix;
var gp: text;
(***** Dot *******)
  procedure Dot(X, Y: integer);
  begin
  (* [x,y]にドットを書く*)
  writeln(gp, X,' ', Y);
  end;
  procedure InitPlot;  (* プロッタの初期化 *)
  begin  
	LastX := 0;  LastY := 0;  
	popen (gp,'/opt/local/bin/gnuplot -persist', 'W');
	Writeln(gp, 'plot "-" with dots');
  end;

  procedure EndPlot(); (* 終了処理 *)
  begin
	Flush(gp);
  end;

gegl

MacPortでインストールした
gegl @0.2.0_3+graphviz+python27+vala (active)
ffmpeg-devel @20121025_0+gpl2+gpl3+mmx+nonfree (active)
でコンパイルして実行するとエラーになります。
[~/src/gegl]cat test1.c
#include <gegl.h>
int main(int argc, char **argv)
{
  gegl_init (&argc, &argv);
  //# other GEGL code
  gegl_exit ();
}
[~/src/gegl]./test1
GEGL-geglmodule.c-Message: Module ‘/opt/local/lib/gegl-0.2/ff-load.so’ load error: dlopen(/opt/local/lib/gegl-0.2/ff-load.so, 10): Symbol not found: _av_open_input_file
Referenced from: /opt/local/lib/gegl-0.2/ff-load.so
Expected in: dynamic lookup
ネット検索すると、パッチがみつかりました。
https://bugs.archlinux.org/task/30936?getfile=9280
修正するために、ビルドして
sudo port build gegl +vala +graphviz
cd /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_gegl/gegl/work/gegl-0.2.0/
のコードにパッチを当て、
make
make install
で実行出来る様になりました。
追記 10/31
gegl @0.2.0_4+graphviz+python27+vala (active)
で問題なくなりました。

fpcでgtk2

サンプルプログラムが
/usr/local/share/examples/fpc-2.6.0/gtk2/
にあります、そのままmakeするとエラーになるので
sudo ln -s /opt/local/lib/libgtk-quartz-2.0.dylib /usr/local/lib/fpc/libgtk-x11-2.0.dylib
sudo ln -s /opt/local/lib/libgdk-quartz-2.0.dylib /usr/local/lib/fpc/libgdk-x11-2.0.dylib
sudo ln -s /opt/local/lib/libgtkglext-quartz-1.0.dylib /usr/local/lib/fpc/libgtkglext-x11-1.0.dylib
sudo ln -s /opt/local/lib/libgdkglext-quartz-1.0.dylib /usr/local/lib/fpc/libgdkglext-x11-1.0.dylib
して、
fpc -k-L/opt/local/lib/ -k-L/usr/local/lib/fpc ファイル名
でコンパイルします。
MacPortで
gtk2 @2.24.13_0+no_x11+quartz (active)
をインストールしているので、X11はないですがfpcがX11を要求するのでそれにあわせます。
他に影響がでないようにfpc/にリンクを張っています。
Makefileは、fpcmakeでMakefile.fpcから作成するようですが、
fpcmake -Tall -r .
Makefileが生成されますが、ターゲットの記述がうまくできません。
/usr/local/share/examples/fpc-2.6.0/gtk2/にあるMakefileは問題なく実行できますが、
マルチプラットホームになっているので手動で別途作成しました。
コンパイルでエラーになるものもありましたが、上記方法で実行ファイルが生成できました。

追記 10/28
gTRUEの定義が変更になったようで以下の修正でエラーは出なくなりました。
gtk_demo/drawingarea.inc: LongInt(gTRUE),
gtk_demo/drawingarea.inc: LongInt(gTRUE),
gtk_demo/drawingarea.inc: LongInt(gTRUE),
helloworld/helloworld.pas: Result:=LongInt(gTRUE);
scribble_simple/scribble_simple.pas: LongInt(gTRUE),
scribble_simple/scribble_simple.pas: LongInt(gTRUE),
scribble_simple/scribble_simple.pas: if event^.is_hint = LongInt(gTRUE) then

gtkmandel.rb その2

gtkmandel.rbですが、一画素づつの書き込みで表示出来る様になりました。
CPU速度の向上でこんな方法でもそれほど待たされる事無く表示できます、
color_intでカラーマップを設定するようにして、
def colors_init
  $colors = []
  colormap = Gdk::Colormap.system
  for i in 0 .. 125
   $colors[i] =Gdk::Color.new(250*256 – (i*2)*256, (i*2)*256, 0)
   colormap.alloc_color($colors[i], false, true)
  end
  for i in 0 .. 125
   $colors[i+126] =Gdk::Color.new(0,250*256 – (i*2)*256, (i*2)*256)
   colormap.alloc_color($colors[i+126], false, true)
  end
  $color_max = $colors.size – 1
end

def calc_internal(preview)
の最初で
gc = preview.style.fg_gc(preview.state)
して、ループの中でbufに格納している部分で直接画素単位で書き込みます。
  if depth >= max_depth
   idx=0
  else
   idx = color_max * depth / max_depth
  end
  gc.set_foreground(colors[idx])
  preview.window.draw_point(gc, x, y)
で出来ました。tkmandel,rbと比べると、中心部分が黒くなっていません。
この部分のidxは0なので、カラーマップの指定で0,0,0にすれば黒くなります。

gdkからgdk2への変更を考えると、draw_rowの置き換える方法を見つけたかったわけですが、
見つける事が出来ませんでした。

Mac OS X /usr/bin/gem

OSに付属のgemでは、サーバーが変わっていてエラーになります。
http://techracho.bpsinc.jp/baba/2011_07_01/3676
で書かれているのと同じ症状です。
[~/src/Ruby]wget http://files.rubyforge.vm.bytemark.co.uk/rubygems/rubygems-update-1.x.y.gem
でファイルが取得出来ます。.x.yはバージョン番号です。

結局以下の手順でアップデートしました。
[~/src/Ruby]sudo /usr/bin/gem install rubygems-update-1.1.0.gem
[~/src/Ruby]sudo /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/update_rubygems
1.1にすることで1.4にアップデートできました。
[~/src/Ruby]sudo /usr/bin/gem install rubygems-update-1.4.0.gem
Successfully installed rubygems-update-1.4.0
1 gem installed
Installing ri documentation for rubygems-update-1.4.0…
Installing RDoc documentation for rubygems-update-1.4.0…
[~/src/Ruby]sudo /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/update_rubygems
RubyGems 1.4.0 installed
File not found: README
[~/src/Ruby]sudo /usr/bin/gem install rubygems-update-1.5.0.gem
Successfully installed rubygems-update-1.5.0
1 gem installed
Installing ri documentation for rubygems-update-1.5.0…
Installing RDoc documentation for rubygems-update-1.5.0…
ここまでは問題ありませんが
[~/src/Ruby]sudo /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/update_rubygems
./lib/rubygems/custom_require.rb:31:in `require’:
undefined method `end_with?’ for “no such file to load — Win32API”:String (NoMethodError)
上記URLでは、1.4.2がOKでしたが、Macでは1.4.1, 1.4.2 でも同じエラーで駄目でした。

10/23追記
sudo /usr/bin/gem install rubygems-update –version 1.4.2
sudo /usr/bin/update_rubygems
/usr/bin/gem -v
1.4.2
で1.4.2に出来ました。

[~/src/Ruby]sudo /usr/bin/gem install rubygems-update-1.6.0.gem
ERROR: Error installing rubygems-update-1.6.0.gem:
rubygems-update requires Ruby version >= 1.8.7.
1.5.1, 1.5.2, 1.5.3 でも同じエラーでした。
1.4.0にすることで、
[~/src/Ruby]sudo /usr/bin/gem update
Updating installed gems
Updating RedCloth
Building native extensions. This could take a while…
Successfully installed RedCloth-4.2.9
Updating actionmailer
Fetching: i18n-0.6.1.gem (100%)
Fetching: multi_json-1.3.6.gem (100%)
以下略
でアップ出来る様になりました。

[~/src/Ruby]/usr/bin/ruby -v
ruby 1.8.6 (2009-06-08 patchlevel 369) [universal-darwin9.0]
[~/src/Ruby]/opt/local/bin/ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [powerpc-darwin9]
で両方インストールした状態です。
[~/src/Ruby]/opt/local/bin/ruby1.9 -v
ruby 1.9.3p286 (2012-10-12 revision 37165) [powerpc-darwin9]
も入れてあります。

gtkmandel.rb

「オブジェクト指向スクリプト言語Ruby」本にあるgtkmandel.rbを動かそうとしています。
gtk2をMacPortでインストールしているので、gtkのバージョンが違うのでその修正が必要です。
まず、
#require ‘gtk’
require ‘gtk2’
に変更して、あとはエラーになる部分を修正していきます。

#window = Gtk::Window::new(Gtk::WINDOW_TOPLEVEL)
window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
に修正

#preview = Gtk::Preview::new(Gtk::PREVIEW_COLOR)
#preview.size(Width, Height)
Previewが無いようなので、
preview = Gtk::DrawingArea.new
preview.set_size_request(Width, Height)
にしました。これで画面が表示されます。

calc_internalの
preview.draw_row(buf, 0, y, Width)
preview.draw(nil)
が動作してないようです。
2行をコメントアウトすると終了しますが、有効だと終了しません。
エラーにならないので、draw_rowは有るけれど仕様が違うようです。
この2行をコメントアウトして
Width.times do |x|
 if buf[x*3,3] >= colors[4]
  preview.window.draw_point( preview.style.fg_gc(preview.state), x,y)
 end
end
にして1画素毎に設定すると楕円が描かれ終了します。

無理矢理色をつけてみました。
red = Gdk::Color.new(65535, 0, 0)
green = Gdk::Color.new(0, 65535, 0)
blue = Gdk::Color.new(0, 0, 65535)
colormap = Gdk::Colormap.system
colormap.alloc_color(red, false, true) #(8)
colormap.alloc_color(green, false, true) #(8)
colormap.alloc_color(blue, false, true) #(8)
gc = preview.style.fg_gc(preview.state)
カラーマップを設定して、
Width.times do |x|
 if buf[x*3,3] <= colors[4]
  gc.set_foreground(red)
  preview.window.draw_point(gc, x, y)
 end
 if buf[x*3,3] <= colors[8]
  gc.set_foreground(green)
  preview.window.draw_point(gc, x, y)
 end
 if buf[x*3,3] <= colors[16]
  gc.set_foreground(blue)
  preview.window.draw_point(gc, x, y)
 end
end
画素毎の値で色を変えています。

draw_imageかdraw_rgb_imageでbufの中の1ライン分を表示させれば良いと思うのですが、
gcをどうしたらいいか判っていません。

GNU Smalltalk

動かしているのは、
gst @3.1_4+gtk+tcltk (active)
で環境は、
[~/src/SmallTalk]uname -a
Darwin Mac.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:57:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_PPC Power Macintosh powerpc PowerMac10,1 Darwin

/opt/local/share/smalltalk/examples/
にサンプルプログラムがあります。
[~/src/SmallTalk/examples]gst
GNU Smalltalk ready
st> FileStream fileIn: ‘Queens.st’.
st> ^Rook test: 3!
_____
|*|_|_|
|_|*|_|
|_|_|*|
 略
6
>st
か、Queens.stの最後に
^Queen test: 8!
を追加して
[~/src/SmallTalk/examples]gst Queens.st
でも実行できます。
st> FileStream fileIn: ‘Lisp.st’.
FileStream
st> LispInterpreter example02.
123
st> FileStream fileIn: ‘Prolog.st’.
FileStream
st> PrologInterpreter example03.
?- remove.
yes
?- hanoi(3).
[move,disc,from,left,to,right]
[move,disc,from,left,to,center]
[move,disc,from,right,to,center]
[move,disc,from,left,to,right]
[move,disc,from,center,to,left]
[move,disc,from,center,to,right]
[move,disc,from,left,to,right]
yes
PrologInterpreter

/opt/local/share/smalltalk/に*.starのPackageがあります。
PackageLoader fileInPackage: すると’BloxGTK’.と’GTK’.”は、
Object: nil error: did not understand #methodsFor:
Smalltalk.MessageNotUnderstood(Smalltalk.Exception)>>signal (AnsiExcept.st:216)
Smalltalk.UndefinedObject(Smalltalk.Object)>>doesNotUnderstand: #methodsFor: (AnsiExcept.st:1556)
でエラーになり、Javaは、
Loading package Java
Object: FileStream error: could not open JavaRuntime.st
でエラーになりました。他はロード出来ました。
ネットで見つかるプログラムは、GTKを使う物が多いですが実行できません。
gtk2 @2.24.13_0+no_x11+quartz (active)をインストールしています。

GLUTを使った
http://fossies.org/unix/privat/smalltalk-3.2.4.tar.gz:a/smalltalk-3.2.4/packages/opengl/test/test.st
は実行できました。wgetで取得すると<>がhtmlの表記になっているので置き換えが必要です。

PPC MacでErlang

MacPortで
erlang @R15B02_0+ssl+wxwidgets
をインストールしました。
http://www.geocities.jp/m_hiroi/func/abcerl01.html
を参考に使ってみます。
[~/src/Erlang]erl
Erlang R15B02 (erts-5.9.2) [source] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.2 (abort with ^G)
1> c(tak).
{ok,tak}
2> timer:tc(tak, tak, [18, 9, 0]).
{2150340,9}
3> timer:tc(tak, tak, [18, 9, 0]).
{2148129,9}
4> c(tak, [native]).{ok,tak}
5> timer:tc(tak, tak, [18, 9, 0]).
{496404,9}
6> timer:tc(tak, tak, [18, 9, 0]).
{528265,9}
7>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
a
ネイティブコードにコンパイルすると実行時間が1/4ほどになるようです。

wxwidgetsを有効にしてあるので、デモを動かしてみます。
[wx-0.99.2/examples/demo]pwd
/opt/local/lib/erlang/lib/wx-0.99.2/examples/demo
[wx-0.99.2/examples/demo]erl -smp
Erlang R15B02 (erts-5.9.2) [source] [smp:1:1] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.2 (abort with ^G)
1> l(demo).
{module,demo}
2> demo:start().
{wx_ref,35,wxFrame,<0.34.0>}
3>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
q

-smpを付けて起動する必要があります。

PPC MacでHaskell

MacPortで探すと
ghc @7.4.2 (lang, haskell)
The Glorious Glasgow Haskell Compilation System
でインスートルしてみると
[~/src/Haskell]sudo port install ghc
—> Computing dependencies for ghc
Error: Cannot install ghc for the arch(s) ‘ppc’ because
Error: its dependency ghc-bootstrap only supports the arch(s) ‘x86_64’.
Error: Unable to execute port: architecture mismatch
ネットで探すと10.5対応は
haskell-platform-2010.2.0.0.i386.dmg
でPPCは未対応の様です。

hugs98 @plus-Sep2006 (lang) The HUGS Haskell Interpreter
nhc98 @1.20 (lang) The nhc98 Haskell Compiler
の二つをインストールしました。

http://www.f13g.com/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0/Haskell/%C6%FE%CC%E7/

http://www.haskell.org/haskellwiki/Haskell入門_5ステップ
を参考に
[~/src/Haskell]nhc98 hello.hs
[~/src/Haskell]./a.out
Hello, World!
無事動いているようです。付属のサンプルをコンパイルしてみます。
[~/src/Haskell]cp /opt/local/share/doc/nhc98/examples/ZooQuiz.hs .
[~/src/Haskell]nhc98 -I/opt/local/include/nhc98/NHC/ ZooQuiz.hs
Warning: The module Binary is called NHC.Binary in its interface file (/opt/local/include/nhc98/NHC/Binary.hi)
[~/src/Haskell]./a.out
Have you thought of an animal
動くようです。

[~/src/Haskell]hugs

__   __ __  __  ____   ___      _________________________________________
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||---|| ___|| World Wide Web: http://haskell.org/hugs
|| || Bugs: http://hackage.haskell.org/trac/hugs
|| || Version: September 2006 _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions
Type 😕 for help
Hugs> :load hello.hs
Main> :main
Hello, World!

openGLの使ったデモが動きました。
[GLUT/BOGLGP/Chapter03]pwd
/opt/local/lib/hugs/demos/GLUT/BOGLGP/Chapter03
[GLUT/BOGLGP/Chapter03]runhugs Polygons.hs
で実行できます。

PPC Macでlua

MacPortで
lua @5.1.4_4 (active)
lua-glut @0.5_0 (active)
インストールするとサンプルもインスートルされます。
/opt/local/share/doc/lua/test/
/opt/local/share/doc/lua-glut/examples/
それぞれのフォルダで
lua xxx.lua
で動かせます。
[doc/lua-glut/examples]lua glut_test2.lua
_VERSION = Lua 5.1
luagl.VERSION = 0.5
luaglut.VERSION = 0.5
measured fps: 5.3763440860215
measured fps: 14.910536779324
measured fps: 15.108593012276
measured fps: 15.108593012276

http://www.geocities.jp/sanpontze/lua.html
にC言語との組み合わせて使う方法があります。
次のMakefileでMac上でも動作しました。
CC = gcc
CFLAGS = -I/opt/local/include
LIBS = -L/opt/local/lib -llua
prog = list-1 list-2 list-3.dll
all: $(prog)
list-1: list-1.c
   $(CC) $(CFLAGS) $< -o $@ $(LIBS)
list-2: list-2.c
   $(CC) $(CFLAGS) $< -o $@ $(LIBS)
list-3.dll: list-3.c
   $(CC) $(CFLAGS) -dynamiclib $< -o $@ $(LIBS)
clean:
   -rm $(prog) *~