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 が返ってきて欲しい所です。