GLUT for Haskell
先日散歩をしていたら、道の真ん中に何やら、くねくねと動く帯みたいな物が。近づいて よく見ると 蛇ちゃんじゃないですか。(この言い草、蝦ちゃんみたいで、可笑しい、かな?)すかさず、銭の模様があるか確認。マムシだったら 怖いですから! 幸い、1メートルは優に超えるシマヘビちゃんでした。
これこれ、蛇ちゃんよ。道路を横断する時は、信号のある所を渡ろうね。そうじゃないと 交通事故に遭うよ。そうでなくても、今頃は、かわゆいカエル君が、事故に巻き込まれて いるからね。それと、子供達の通学時間帯は、出てこない方がいいよ。いじめられるからね。
HaskellでGraphcisするぞ
前回は、WindowsでHGLがまともに動かない状態だった。これはもう、メンテナーにメール するしかないね。こういうことも openSource に対する貢献だろうから。所で、誰宛に メールすればいいの?
c:\sakae>ghc-pkg describe HGL name: HGL version: 3.2.0.0 license: BSD3 copyright: maintainer: <libraries@haskell.org> .....
もろ、まんまのメアドだなあ。Haskellの人は親切だそうだから、期待してメールしてみよう。 返事が来るまでの間、他のグラフィックライブラリーも試してみよう。 何がいいか、ちぃと調べてみた。条件は、一度書いたら、Windows でも Unixでも動く事。そ して、出来れば、インストールが簡単な方がよい。中には、Windows命とおっしゃる方も おられるようですが。
いろいろ検討の末、GLUTを使う事にした。 Windows上ではGLUTの元になるOpenGLがすでに 用意されてて(M$公認ですね)、GLUTと言うラッパーを用意するだけで、使えるように なるそうだ。
GLUT on Windows
haskell windows glut をキーワードに検索したら、 Topのページがもろにヒット した。ここからglutのバイナリーを頂いて きて、dllをC:windows32へ入れてあげる。
次は、Haskellのライブラリィー構築だな。cabal install GLUT で、楽チンと思ったの ですが、そうは問屋が卸しませんでした。依存関係があって、OpenGLのインストールが 先に始まったのですが、エラー終了してしまいましたよ。
しょうがない、例の手動方式でやるか。所で、採ってきたtar玉は何処にあるのさ。遅い々 Windowsの検索機能を動かしたら、C:Documents and SettingssakaeApplication Datacabalpackageshackage.haskell.org こんな所に仕舞われていましたよ。
c:\sakae\OpenGL-2.2.3.0>runghc Setup.hs configure Configuring OpenGL-2.2.3.0... checking for gcc... gcc ..... checking Haskell type for GLintptr... Int32 checking Haskell type for GLsizeiptr... Int32 configure: creating ./config.status configure: test: too many arguments ..... configure: test: too many arguments configure: error: could not make ./config.status
ははは、見事に失敗してますねぇ。(笑ってる場合か? きっと、経験値が向上して、強く なれるチャンスでしょうから、嬉しいんです。マゾじゃないですからね!)
引数が多すぎてtestが失敗しましただと! Windowsは腐ってるんですかね。丁度今は梅雨時 ですし。。。と、冗談を言うぐらいですから、解決してます。
結論は、使っている端末(コピペが簡単と言う理由で、ckwを常用してます)が、適して いなかったと言う、とほほな理由でした。MinGWに付属してた端末を使いましょう。 詳細な理由は、unixの行末 LF vs. Windowsの行末 CRLF であり、unix系のソフトを 扱う場合、行末を考慮してくれる端末を使わないといけないそうです。 (それより、shの挙動の方が怪しそう)
ともあれ、OpenGLをインストールした後、Haskell用のGLUTが無事にインストール できました。この件を機会に、経験値が、10 だけUpしました。よかったね。
上記のページから、四角形ぐるぐるを頂いてきて動かしてみました。
c:\sakae\HS\glut>ghc -package GLUT main.hs c:\sakae\HS\glut>ls -l main* -rwx 6467650 2009-06-26 10:24 main.exe* -rw- 1878 2009-06-26 10:24 main.hi -rw- 1993 2009-06-26 10:13 main.hs -rw- 25997 2009-06-26 10:24 main.o
ちゃんと、ぐるぐるしましたよ。所で、実行ファイルが余りにも巨大すぎます。 stripしたら、どれぐらいになるのかな?
c:\sakae\HS\glut>strip main.exe c:\sakae\HS\glut>ls -l main.exe -rwx 2697728 2009-06-26 10:26 main.exe*
まだ大きいけど、小さくなりましたね。一体、どっちねん、はっきりしろって! こういう時は、逃げるが価値! main.hiって一体何物? バイナリーファイルみたいだし。 はい、ちゃんと調べました。依存関係を保持して、ghc -make する時の参考にするそうです。 バイナリーをテキストに直すオプションが用意されてました。
c:\sakae\HS\glut>ghc --show-iface main.hi Magic: Wanted 129742, got 129742 Version: Wanted [6, 1, 0, 3], got [6, 1, 0, 3] Way: Wanted [], got [] interface main:Main 6103 interface hash: 4dab207a3a44fd1699b43a66a17c0787 ABI hash: 8fe4f4c6ba63734f337974adbce37469 export-list hash: 96cfdae5c1e91839ef3b7a5d6799efa6 orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e where export main:Main main module dependencies: package dependencies: ghc-prim integer base base-3.0.3.1 array-0.2.0.0 containers-0.2.0.1 OpenGL-2.2.3.0 GLUT-2.1.2.1 ..... import base:GHC.Real 5c92d27c89a4dac63e4d8005d40398ab import base:Prelude eac9ca3c0ae6d00a0fc0f1832a247e5e 84e0930d0e1bd48ee2a0106930ab56c2 main :: GHC.IOBase.IO () vectorised variables: vectorised tycons: vectorised reused tycons:
GLUT on FreeBSD
こちらは、Windowsみたいに手はかからないでしょう。でも、OpenGLとか入っているのかなぁ。 まずは、基本を押さえておきますかね。 GLUTによる「手抜き」OpenGL入門 を見ました。Mesaなら既に入ってる。後は、 GLUTだな。さくっと、port/graphics/freeglutを入れて、後は、cabal install GLUTで御終い。 いざ試運転。
freeglut ERROR: Function <glutCreateWindow> called without first calling 'glutInit'.
あらら、微妙な差があるのね。それじゃ、落ち着いて、お茶でもしましょうか。
import Graphics.UI.GLUT main = do getArgsAndInitialize --initialDisplayMode $= [RGBAMode] --initialWindowSize $= Size 500 500 --initialWindowPosition $= Position 200 200 createWindow "Window Name" displayCallback $= myDisplay mainLoop myDisplay = do clear [ColorBuffer] renderObject Wireframe ( Teapot 1.0) flush
こちらは、ちゃんと Teapot が、表示されました。ここまでくれば、取り合えず動いて いるって事で安心してもいいかな? t. (Scheme風なら、#t )
とまあ、勢いで GLUTを入れてみたけど、rubyとかgaucheでは GLUTのサポートは あるのかしらん? この問いに、(Haskell風に) True が返ってきて欲しい所です。