OSXで iolanguage を使うためのメモ。

 

iolanguageについて2009

このメモでは、finkやdarwin portを使わず、Webからダウンロードしたファイルを解凍して、インストールしていきます。
また、iolanguageのアドオンとサンプルスクリプトに関する情報を扱います。
  • io language のデモ、サンプル一覧
  • 配布元について

     
  • io言語の配布元 
    そこにあるlatest.tar.gz2009年2月版 は、MacOS 10.4 では、何故かエラーが出でインストール出来ない。
    github にある、ちょっと古い 2008年版のファイルをダウンロードしてくる。
  • 日本語解説ページについて

    ioのインストールについて

    iolanguageの環境 は io と io static から成る vm (ランタイム)
    そして OpenGL や サウンド イメージ のような拡張機能を提供する io用の addon(アドオン) から構成されています。

    基本的にアドオンを入れなくても動作します。(計算や文字列表示、制御構文)
    しかし、OpenGL や画像を扱ったり、GUI , データベースを利用する場合は、アドオン(拡張機能)のインストール必要です。

    インストールについてはMac OSX Leopardにiolanguageの処理系をインストールする(rubyneko) と、io-LanguageでOpenGLを使ってみる(ottuの日記)、translate posts of io mailing list(ハタさんのブログ) の記事を参考にを参考にやってみた。

    githubからアーカイブをダウンロードし、解凍後、
    ターミナル.app を起動して、iolanguageのソース一式があるディレクトリに移動。  
    make vm ← io 本体のmake
    sudo make install

    make addons ←アドオンの make
    sudo make insall

    make port ← Darwin Ports や fink を導入していれば、アドオンに関連するライブラリの導入もやり易いかもしれない(使ってないので分からん)
    sudo make port
     
    使い方
    user$ io ←対話モードに入る
    Io 20080120
    Io> exit ←対話モードから出るにはexit
    user$
    sample/miscディレクトリにあるサンプルを実行。
    user$ cd ./sample/misc ←ディレクトリを移動し
    user$ ./HelloWorld.io  ← HelloWorld.io(これはテキストファイルなので編集可能) を実行
    Hello world! 
    Hello world (again) 
     
    アドオンをインストールしてない場合、エラーが出るのもある。 Exception: Failed to load Addon Random - it appears that the addon exists but was not compiled. You might try running 'make Random' in the Io source folder.
    ---------
    Object Random Cards.io 4

    関連するライブラリのインストールについて

    たとえば、Ioのアドオン同士、またはアドオンとライブラリが依存関係を持つものがあります。
    アドオンのmake 時のエラーメッセージに従って、必要なライブラリをインストールして下さい。
    OpenGL is missing Image addon
    Image is missing libtiff library →TIFF画像を扱うライブラリ http://www.remotesensing.org/libtiff/ から v3.8.2(stable) またはv4.0βをダウンロード
    Image is missing jpeg library →JPEG画像を扱うライブラリ http://www.ijg.org/ から File:jpegsrc.v6b.tar.gz をダウンロード
    インストール。
    もし libpng がなければそれもインストール。
    それぞれのライブラリは configureしてから、 sudo make install すると入ります。
    ./configure
    sudo make install
    ※ここで忘れてはいけないのは、libjpegライブラリだけmakefileがダメダメなこと。sudo make install では、ヘッダ(jpeglib.h)とライブラリファイル(jpeglib.a)が自動インストールされません。sudo make install後に、usr/local/以下にそれぞれ直接コピーする必要があります。具体的には、libjpeg.aを、 usr/local/lib に入れてから、jpeglib.h, jconfig.h , jmorecfg.hを、 usr/local/include に入れる。

    アドオンのインストールには、既にライブラリが多くインストールされていれば楽です。
    例えば、
    最初に必要がライブラリが分かっていれば、 先にB、C、D、E、F をインストールしておけば良いので、Aのインストールが楽になります。
    しかし全く情報がなく、芋づる式に必要なライブラリが判明していくケースは厄介です。
    
    やることは複雑に見えて単純、以下↓の繰返しです。

    【ライブラリのインストール】 を行う方法

    「▼」をクリックすると、中の項目が開閉します。読み終わった項目は必ず閉じて下さい。
    もし、make中に何か別のライブラリが必要とエラーが出た場合は「▼」をクリックします。

    ライブラリを入手して解凍 、解凍したディレクトリで ./configure & make する

    ▼もし別のライブラリが必要なら、それを探して【ライブラリのBインストール】を行なう
    完了したら、ここへ再び帰ってきて作業を進める。
    sudo make install インストールする
    これで完了
    
    
    完了!

    関連ライブラリのインストール例

    関連ライブラリをインストールした時のメモ書き。全部入れなくてもとりあえずは動く。
    インストール前にとりあえず、やることを整理しておきます。
    そのライブラリを入れるには、それが依存しているライブラリも必要です

    ◆アドオンの依存関係
    Box , Image <--- OpenGL <-- Flux
    OpenGL <-- GLFW

    Imageアドオンでの拡大縮小処理はCairoが担当している
    OpenGL は glut が絡んでいる
    OpenGLのResourceManager オブジェクトが、Fluxアドオンのインターフェーステーマを管理している。

    ◆ライブラリの依存関係(Image アドオンを動作させるために必要なもの)
    GUI、や3D、画像、フォントを扱う場合は最低限上記のものをインストールしておけば充分かもしれない。
    他に、OpenGL や zlibなど 基本的な物もそろえておきます。(OSXに最初から入っているものもあります)

    ◆ライブラリ(サウンド) MacOSX10.4の GNU make 3.80にはバグがあって、ffmpeg を正常にmakeできません。 このようなエラーメッセージが表示されます。
    ffmpeg-export-2009-04-21$ sudo make make(6934) malloc: *** vm_allocate(size=4272951296) failed (error code=3) make(6934) malloc: *** error: can't allocate region make(6934) malloc: *** set a breakpoint in szone_error to debug
    ffmpeg をインストールする場合は、先にmake 3.81を導入してから行なって下さい。
    GNU make のバージョンは、 make --version で調べることができます。
    ◆ライブラリ(データベース) 他には、SQL関係 と TagDB があります。

    ◆その他 (未インストール)

    ▼ アドオンに必要なライブラリの インストール記録を見る ←をクリックするたびに、詳細記事が開閉します。

    Io language Samples

    これらは、Makefile のあるディレクトリ階層から、sample/ に入った内にあります。ターミナルから起動して実行します。

    Miscディレクトリ
    ここには、様々なサンプルプログラムがあります。アドオンを使わないので、すぐに試せます。(有名な「Hello World」など)
    MainFile.io
    Control.io
    Hanoi.io
    Sort.io
    Dir.io
    ErlangChallenge.io
    ControlFlow.io
    Account.io
    except.io
    BottlesOfBeer.io
    Super.io
    HelloWorld.io
    Inheritance.io
    vtest.io
    qsort.io
    Ackerman.io
    CommandLineArgs.io
    SimpleCoro.io
    Cards.io
    WeakLink.io
    Conditions.io
    Decompile.io
    Foreach.io
    Brackets.io
    tailtest.io
    Shootout ディレクトリ
    Language Shootout Benchmarks 用のコード。このベンチマークは、処理時間、メモリ、ソースコードの量が少なければ少ない程スコアが高いというルールです。
    各言語の結果は 、
    The Computer Language Benchmarks Gameで見られます(英語)

    SpeedTest ディレクトリ
    速度比較テスト。Ioのバージョンが大昔の 20050615 なので、あてにならない。

    Io language Addon Samples

    Io アドオンの サンプルスクリプトのいくつかを試してみた。
    これらは、Makefile のあるディレクトリ階層から、addons/各アドオン名/samples に入った内にあります。
    
    
    【要約】:
    OpenGLアドオン は普通に動く。まだテクスチャの貼り方が分からない。
    Cairoアドオン は 日本語文字列の表示できる。図形や画像表示もできる。
    Fontアドオン は 日本語文字列の表示ができない
    Imageアドオン も普通に動作する。
    Portaudioアドオン はwavの再生を確認
    Pythonアドオン使えば文字列操作が簡単?
    Cursesアドオンはターミナル上で、階層メニューやASCII的なダイアログを作ることができます。
    Curses については、Cursesによる対話的なプログラム作成 を参照して下さい。
    Fluxアドオン は、ボタンやテキスト欄等のGUI が表示を確認。複雑なものについては未確認。
    
    アドオンのインストール後のサンプル類について、Mac OSX では、ioファイルのアイコンが黒いやつはメインで実行可能。白いのは直接実行しないタイプまたは実行に必要な条件がそろっていません。
    
    また、実行ioファイルの改行コードが異なっている場合
    ファイルがあるのにNo such file or directoryというメッセージが出ることがあります。
    
    ./main.io : No such file or directory
    MacOSX なら、そのファイルの改行コードをLF(UNIX)に保存しなおすと、正常に実行できるようになります。 もし何も反応無ければ、 chmod +x main.io すると実行できます。

    Cairoアドオン:runAll.io(成功)

    ベクターグラフィックスの描画、PNG画像の読込み。 runAll.io を実行するとCairoアドオンサンプルフォルダ内の全てのサンプル ioスクリプトが実行され、 自動的に描画結果がpngファイルとして書き出されます。 curveRectangle.png multiSegmentCaps.png gradient.png image.png setLineCap.png textAlignCenter.png dash.png fillAndStroke.png setLineJoin.png imagePattern.png text.png clipImage.png clip.png arc.png fillAndStroke2.png curveTo.png path.png arcNegative.png textExtents.png これは、Cairo の使い方を知らないと、使いこなすのは難しそうです。 Cairoの描画コマンドや、コンテキストの初期化や、終了方法については、 Cairo ライブラリのドキュメントを参考にして下さい。

    Cairo で 日本語フォントを表示してみよう

      MacOSX の場合、(システムorユーザーどちらでも) ライブラリ/Fonts にインストールされているフォントなら認識されます。 フォント名は、PostScript名を指定します。 フォントファイル名が日本語名 ならば OSX付属の Fontbook.app で読込み、情報を見るで、PostScript名を指定。 みかちゃん.ttf → mikachan ※ PostScript名が英文以外のもは認識されません。   半角ひらがなフォント(なつみかん等)、どせいさんフォント 日本語フォントは、スクリプト中で以下のように設定して下さい。 Cairo アドオンのサンプルスクリプトで、これらを試すことができます。 stevedekorte/addons/Cairo/samples/text.io # 大阪フォント selectFontFace("Osaka", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # Impact selectFontFace("Impact", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # GD-高速道路ゴシックJA-TTF selectFontFace("GD-HighwayGothicJA-TTF", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # M+2 フォント selectFontFace("mplus-2p-bold", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # みかちゃんフォント selectFontFace("mikachan", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # ヒラギノ selectFontFace("HiraKakuPro-W3", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) selectFontFace("HiraKakuStd-W8", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # 絵文字フォント selectFontFace("HoeflerText-Ornaments", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # Osakaユニコード selectFontFace("Apple_osaka_unicode", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # メイリオ selectFontFace("Meiryo-Bold", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # 絵文字フォント selectFontFace("AppleSymbols", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) # 中国語フォント selectFontFace("GB18030Bitmap", FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD)  

    OpenGLアドオン:balls.io(成功)

    立方体の中をボールが跳ね回るサンプル

    OpenGLアドオン:cube.io(成功)

    ウインドウ内の立方体を、マウスカーソルで撫でるようにドラッグすると立方体が回転する。

    OpenGLアドオン:cylinder.io(成功)

    ワイヤーフレームによる円筒を、マウスで操作できる。

    OpenGLアドオン:cylinder.io(成功)

    ワイヤーフレームによる円筒を、マウスで操作できる。

    OpenGLアドオン:game.io(失敗)

    Exception: Object does not respond to 'docSlot' --------- Object docSlot game.io 107

    OpenGLアドオン:grabTextureTest.io(失敗)

    /stevedekorte/addons/OpenGL/samples/grabTextureTest.io display grabbing Exception: Image does not respond to 'grabTexture' --------- Image grabTexture grabTextureTest.io 25 Screen grab grabTextureTest.io 49 Screen display [GLUT] 0 Screen run grabTextureTest.io 81

    OpenGLアドオン:Mandlebrot.io(失敗)

    ウインドウが表示されない calc time 0.4652729034423828 print time 0.7628169059753418 total time 1.2280898094177246

    OpenGLアドオン:polygonSmoothing.io(成功?)

    半円形が回転するデモ。ポリゴンの継ぎ目をスムーズに表示するらしい。 マウスボタンを押すたびにno smoothing と jitter width alpha blendingが切り替わる

    OpenGLアドオン:sphere.io(成功)

    ポリゴンで出来た球体をマウスでぐりぐりできる。

    OpenGLアドオン:events.io(成功)

    ジョイスティック、キーボードやマウス入力を検知するデモ。 押されたキーの内容、マウスカーソルの座標 マウスドラッグ、押されたマウスボタンの番号やフラグを表示する

    OpenGLアドオン:lines.io(成功)

    重なった正方形が回転するデモ。それぞれ回転スピードが違うので、時々きれいな模様になります。

    OpenGLアドオン:test2.io(失敗)

    コードが表示された。 Box clone do(setOrigin(); setSize()); Box clone do(setOrigin(); setSize()); union := Box clone do(setOrigin(); setSize());

    Fluxアドオン;Calc.io ,

    電卓が起動した!
    Flux アドオンは io のGUI を担当します。 描画はOpenGL や Cairoが関連している らしい /stevedekorte/addons/Flux/samples/Calculator/Calc.io ボタンをクリックして数字を出します。数字が表示される欄はテキストエリアのようです。
    終了するにはメニューバーから選ぶとOK
    Fluxアドオン;ファイルブラウザ(失敗)
    ウインドウは出たものの、真っ黒。何かが足りない

    Fluxアドオン;スライドショー(失敗→成功)

    launchPath を System launchPath に修正したら起動成功。 これはプレゼン用の簡単なスライドショーを再生します(ウィンドウアプリケーション)。 下矢印キーで進み、上矢印キーで戻ります。 /stevedekorte/addons/Flux/samples/Slideshow user$ ./main.io 同じディレクトリにあるテキストファイル slides.txtを読込み、表示します。 行頭がタブになっている場合は本文、 タブインデントされてない行は、ページのタイトルとして、表示されます。 また、この行はページ分割の境界としても機能します。 終了するにはメニューバーから Quit を選びます。

    Fluxアドオン;ボタンイベントのテスト(修正後に成功)

    /stevedekorte/addons/Flux/samples/Test user$ ./main2.io foo と書かれたボタンがあり、それをマウスでクリックすると ボタンに書かれた文字が Please don't push this button again. に変化する。 【ボタンイベントの仕組み】 オブジェクトから Controller という名前のクローンを作る Controller に push という名前のメソッドを作る ボタンオブジェクト b を作ったら、 seActionTarget で、バインドするオブジェクト名を指定(Controller ) setAction で、そのメソッド名を指定(push) これでボタンを押した時に、 Controller オブジェクトの push メソッドが実行される。 main2.io
    #!/usr/bin/env io Flux // バックと文字色を設定し直した。 Controller := Object clone do( push := method(button, button setTitle("Please don't push this button again.") ) ) app := Application clone app appDidStart := method( app mainWindow setTitle("Test") b := Button clone b setTitle("Foo") b setWidth(300) b setActionTarget(Controller) b setAction("push") b textColor = Color clone set(1, 1, 1, 1) app mainWindow addSubview(b) app mainWindow backgroundColor set(0.5,0.5,0.5, .1) ) app run

    Fluxアドオン;china.io(修正後、成功)

    これはチャイナチェッカーというボードゲームです。 日本では、ダイヤモンドゲームと呼ばれています。 対面側の陣地に自分の色のコマを全部移動したら勝利。 コマを飛び越えると遠くまで移動することができる。 普通に実行するとエラーが出るので、ちょっと修正する。
    addons/Flux/samples/China usr$ ./china.io launchPath: Exception: ChinaApp does not respond to 'launchPath' --------- ChinaApp launchPath china.io 1598
    そこで、1598行目に追加
    ChinaApp do( launchPath :="." <---追加: lunchpath をカレントディレクトリに writeln("launchPath: ", launchPath)
    Hキー:ヘルプを見る。(キー操作説明が出る) Mキー:CPUのターンを実行 Gキー:決着がついたらこれでリセット Dキー:Developer Mode (コンストラクションモード) chinaConfig.io を編集すれば、プレイヤー数を増やしたり、盤面サイズを変更できます。 画像ファイルはどうやって読込まれるんだろう?

    Fluxアドオン;デバッガ(失敗)

    Content-type: text/html Cache-Control: no-store, no-cache, must-revalidate, max-age=0 Exception: nil does not respond to 'removePrefix' --------- nil removePrefix menu.io 23 Page setPath menu.io 277

    Imageアドオン:test.io (成功)

    79行目 を self setImagePath(Path with(System launchPath, "images/lotus.png")) に修正。 読込む画像を lotus.tiff , lotus.png, lotus.jpg などに変えてテスト。 ↓読込む画像が見つからない場合
    Imageアドオン:test.io (失敗)
    Exception: Image error reading file on Image/samples/./t.jpg --------- _open Image.io 9 Image open test.io 14 Viewer setImagePath test.io 80 Viewer run test.io 85

    Imageアドオン:scale.io (成功)

    このサンプルはコマンドライン上で動作します。 普通に実行すると使い方を教えてくれます。Usage: io script.io infile outfile width height このサンプルスクリプトにスペースで区切られた引数を渡すと、指定した高さと幅の画像として保存されます。 書式は、scale.io [入力ファイル] [出力ファイル] [幅px] [高さpx] $user ./scale.io ./images/lotus.png ./lotus_p.png 180 250 出力された画像→

    Fontアドオン:test.io (半分成功)

    test.io と同じ階層にフォントファイル( Comic Sans MS 、 Brush Script )を置いた場合 スクリプトの箇所をこのように変更するとうまく表示されます。 ・スクリプトと同じ階層にフォントを置いた場合 monoFont := Font clone open("./Brush Script") setPixelSize(12) sansFont := Font clone open("./Comic Sans MS") setPixelSize(12) serifFont := Font clone open("./Brush Script") setPixelSize(12) 2byte文字を含むフォント(例:みかちゃん.ttf)は認識されません。 ・システムにインストールされているフォント monoFont := Font clone open("/Library/Fonts/osaka.unicode.ttf") setPixelSize(12) ・ユーザーごとにインストールされているフォント sansFont := Font clone open("/Users/ユーザー名/Library/Fonts/mplus-2p-black.ttf") setPixelSize(12) serifFont := Font clone open("/Users/ユーザー名/Library/Fonts/GD-HighwayGothicJA-TTF094b.ttf") setPixelSize(12) 日本語フォントも表示できますが、ひらがなや漢字を含む表示は今の所成功してません。 実体参照も× あいう 、 \u3042\u3044\u3046 ↓フォントが見つからない場合(失敗)
    Exception: Font cannot open resource --------- message 'open' in './test.io' on line 4

    Fontアドオン:test2.io (半分成功)

    中央寄り表示。ウインドウ下部にある灰色のバーが右に伸びるアニメーション。

    Fontアドオン:terminal.io (失敗)

    起動しない Exception: Object does not respond to 'GLApp' --------- Object GLApp terminal.io 3

    ObjcBridgeアドオン:(失敗)

    ObjectiveC と連携する為のアドオンらしい。 MacOSX 用でダブルクリッックで立ち上がるアプリが、作成されているが、 クリックしても反応がない。まだ何かライブラリが必要なのかもしれない。 Bridgetest ディレクトリのReadMeによれば、先に、IoLanguage bundle projectを実行せよ、とある。
    In order to run this test, you'll first need to build the IoLanguage bundle project in Io/Projects/OSXBundle.
    Xcode で、BridgeTest.pbprojを実行したが…エラーで失敗。
    /usr/bin/ld: warning -L: directory name (../../../../IoDesktop/_libs) does not exist /usr/bin/ld: warning -L: directory name (../../../../IoServer/_libs) does not exist /usr/bin/ld: warning -L: directory name (../../../../IoVM/_libs) does not exist

    ODEアドオン:tutorial1.io(失敗)

    3D物理エンジンのサンプル libodeが必要らしい。 Exception: Error loading object '/opt/local/lib/libode.dylib': 'dlopen(/opt/local/lib/libode.dylib, 10): image not found' --------- message 'open' in './tutorial1.io' on line 5

    Pythonアドオン:UsingPython.io(成功)

    Python は使ったことがないので分かりませんが、動作してます。 モジュールのロード、文字列の分割、英文大文字←→小文字の置換処理。 Which version of python are we running? 2.3a2+ (#4, Mar 2 2003, 17:13:46) [GCC 3.1 20020420 (prerelease)] System path is returned as a list /Library/Frameworks/Python.framework/Versions/2.3/lib/python23.zip /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3 /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/plat-darwin /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/lib-tk /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/lib-dynload /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/plat-mac /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/plat-mac/lib-scriptpackages /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/Numeric /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/PIL Load the string module Split a string Brave brave Sir Robin list("Brave", "brave", "Sir", "Robin") Load a C module (.so) Current time is: 1237516680.1858310699462891 Another way to invoke a method UPPERlower --> upperLOWER

    AppleExtrasアドオン:pong.io(失敗)


    Exception: Object does not respond to 'GLApp' --------- Object GLApp pong.io 33

    AppleExtrasアドオン:roller.io(失敗?)

    いきなり真っ黒なフルスクリーン画面に。丸い玉が反応するが意味が分からない。 ESCキーで画面から抜ける。「アプリケーションの強制終了」でIoを選択し強制終了。 AppleSensor という名前から、おそらくアップルのノートパソコンに搭載されている傾きセンサーでも感知するのかもしれない。 ノートパソコンを傾けると、丸い玉も転がるとか。

    AppleExtrasアドオン:test.io(失敗)

    getLightSensors() error: failed to find ambient light sensor getLightSensors() error: failed to find ambient light sensor 強制終了

    GLFWアドオン: lesson02.io(失敗)

    Mac OSX アプリケーションで動かさないと実行できないらしい。詳細不明。 Working in unbundled mode. You should build a .app wrapper for your Mac OS X applications. glfwOpenWindow failing because it can't become a foreground application
    libsndfile & libportaudio 導入後 ・PortAudio アドオンは libportaudio入れるだけでwavが再生可能。 ・Libsndfile アドオン は、libsndfile の他に、libportaudio、 libavcodec ライブラリが必要。 実は同じサンプルプログラムが収録されてたりする。 Libsndfile アドオンの sndplay.ioは動かない s := Sound clone setPath(Path with(launchPath, "max.wav")) load PortAudio アドオンの sndplay.ioは、動く。 s := Sound clone setPath(Path with(System launchPath, "sounds/max.wav")) load もし、サンプルプログラムがlunchPathのせいで動かない場合、System launchPathにすれば動く可能性があります。 LibSndfile(Sound オブジェクト)で対応するフォーマット一覧(ソースより抜粋)。 wav , aif(apple) , au(unix μ-law) , paf(Ensoniq Paris), svx(amiga) ,nist(Timit database ,Groningen speech corpus), voc(Creative Voice Format),sf( ircam ),w64(wave64), mat4(GNU Octave 2.0), mat5(GNU Octave 2.1)

    PortAudio アドオン:loopback.io 失敗

    何故か無音

    PortAudioアドオン:sndplay.io(成功)

    音声の再生。 サンプル音声 sounds/max.wavを再生する 内容は"This is Ma-Ma-Maxheadroom" 永久に続き、ctrl+Cでも終わらないので、 ターミナルを終了させるしかない。

    Libsndfile アドオン:mp3filestream.io (失敗)

    Exception: Failed to load Addon AVCodec - it appears that the addon exists but was not compiled. You might try running 'make AVCodec' in the Io source folder. --------- Object AVCodec mp3filestream.io 50

    LibSndFileアドオン:loopback.io(失敗)

    Exception: Failed to load Addon PortAudio - it appears that the addon exists but was not compiled. You might try running 'make PortAudio' in the Io source folder. --------- Object AudioDevice loopback.io 4

    LibSndFileアドオン:sndplay.io(失敗)


    音声の再生。 サンプル音声 sounds/max.wavを再生する 内容は"This is Ma-Ma-Maxheadroom" 永久に続き、ctrl+Cでも終わらないので、 ターミナルを終了させるしかない。

    Cursesアドオン:docbrowser.io(成功)

    Cursesアドオンはターミナル上で、テキストを使ってGUIもどきの階層メニューやダイアログを作ることができます。 ターミナルから、階層メニューを表示しています。 このサンプルでは実行中のオブジェクトをブラウズしています。 「>」カーソル が現在選択している項目です。 ↓↑で項目移動、←→ キーで リスト項目から出る/潜る。ESCキーで終了。 例えば、このようにリスト階層を進んでいくことができます。 _object>Addons>Core>CLI> commandLineLabel

    Cursesアドオン:browser.io(成功)

    実行中のスクリプト内のメソッドや変数の内容を見ることができます。 これはslotSummary やgetSlot メソッドで見ているのと同じです ↓↑で項目移動、←→ キーで リスト項目から出る/潜る。ESCキーで終了。 「>」カーソル位置によって 変数の内容が変化する。
    >_object Inspector_0x5e7b10 _proto Object_0x5003d0 down method(...) next method(...) object method(...) objectSlotNames method(...) objectStack list(Object_0x50c5b0) offset 0 previous method(...) selectNextSlot method(...) selectPreviousSlot method(...) selectedSlotName "_object" ←現在選択されている項目 setObject method(obj, ...) setSelectedSlotNamemethod(...) show method(...) type "Inspector" up method(...)

    Regexアドオン: libpcre が必要。




    ここから下は古い情報なので、たぶん役に立たないでしょう。

    インストール方法

    MacOSX版をダウンロードする。
    ターミナルから、解凍した io の makefile が あるディレクトリに移動する
    make
    sudo make install
    すると、インストールされ、3つのバイナリ版ができあがる。
  • ioServer (サーバー用、正規表現やデーターベース等の機能、CGIとして使う場合に)
  • ioDesktop (フォント描画やウインドウなど、強力な機能拡張版、GUI部品もあるようです)
  • io     (必要最低限な版)
    これらは、/usr/local/bin/ にインストールされます(インタプリタ)
    動作テストを行うには。  
    make newtest
    make test
    これをクリアできれば、問題なしです。  
    ●テスト成功例
    SQLite3
    SQLite3Test
    ---------------
    5 tests, 0 failures
    ./binaries/ioServer bindings/SkipDB/_unitTests/run.io

    ●テスト失敗例
    test_4_Dot - failed
    Exception: 'Object' does not respond to message 'v1'
    Coroutine_0x1593e20-Coroutine_22625824
    (略)
    nil
    ---------------
    4 tests, 4 failures
    なお、サンプルスクリプトは、mvディレクトリに収録されています。
     

    サンプルスクリプト

      サンプルスクリプトが動くか試してみましょう。まずは サンプルスクリプトが収録されている vm ディレクトリに移動。
    ターミナルから...
      cd vm
    このmvディレクトリには io のバイナリ版も生成されているので以下のように実行します。 使い方は 「./io 実行したいioスクリプトファイル名のあるパス」
     
    (※_sampleCode ディレクトリ内の拡張子 io のスクリプトファイルを実行しています。
    io本体は、必要最低限版を使って実行しています。)
    ./io _sampleCode/HelloWorld.io
    ./io _sampleCode/Cards.io
    ./io _sampleCode/Calc.io
    ./io _sampleCode/Hanoi.io
    ioDesktop については次の項で説明します。

    サンプルとチュートリアル

     
    ソース版で作成されたioDesktopを使って、別のサンプルを試してみようと思います。

  • まずは、実験をやりやすくするために、ioDesktop を vm ディレクトリにコピーして下さい。
    OpenGLのサンプルは他にも ダウンロードしたファイルの、「 IoFull-2005-12-21/bindings/OpenGL/_sampleCode」ディレクトリにあります。

    例えば、ダウンロードしたファイル名を nehe.io とした場合は...
    cd IoFull-2005-12-21/vm
    ./ioDesktop nehe.io
    以下のサンプルデモを試すことができます。ターミナルから、以下のコマンドを入力。
    ./ioDesktop ../bindings/OpenGL/_sampleCode/demos/balls.io (ボールが跳ね回るデモ)
    ./ioDesktop ../bindings/OpenGL/_sampleCode/demos/polygonSmoothing.io (スムージング)
    ./ioDesktop ../bindings/OpenGL/_sampleCode/demos/cube.io (立方体をマウスでグリグリ動かせる)
    ./ioDesktop ../bindings/OpenGL/_sampleCode/demos/DreamMachine.io (激しくフラッシュ)
    ./ioDesktop ../bindings/OpenGL/_sampleCode/demos/events.io (マウスでドラッグした時のGLUTイベント処理)
    また、OpenGLのチュートリアルは、ioのアーカイブに収録された「IoFull-2005-12-21/bindings/OpenGL/_docs/tutorial/index.html 」から探すことができます。 (iolanguageのサイトからでも見つけられます。)
    ここの各サムネイルをクリックした先にあるファイルをダウンロードして、vm ディレクトリにコピーします(ディレクトリに分けて整理した方が混乱しない)。


    各チュートリアルのスクリプトについてはこちら

    フォント表示のサンプルを試したい場合は、
    ./ioDesktop ../bindings/Font/_sampleCode/fontTest.io
    このデモはTTFフォントは /IoFull-2005-12-21/resources/library/fonts/Free ディレクトリから読み込んでいる。 日本語TTFフォントを読み込みは可能ですが、ひらがなやカタカナは、うまく表示されないので、なにか工夫が必要。

    その他

    一方、ウインドウ付きアプリケーションは
    計算機や、GarageBandライクな音楽作成ソフト SongJam 等がサンプルとして用意されてます。
    これらは、
    ./IoDesktop ./apps/SongJam/main.io
    すると実行されるはずなのですが、現時点(2005-12-21版 現在)では
    Exception: 'Object' does not respond to message 'autoImportResources'
    というエラーが出てしまいうまく実行されない、
    これは、収録されているサンプルが旧式のため動かないのらしい。 
    今のところは、配布元が、正しく動くファイルに置き換えてくれるまで待つしかない。

    便利なこと(UNIX環境の場合)

    通常、コマンドラインから
    ./ioDesktop main.io
    と書いて実行しなければならないが、MacOSXを含むUNIX環境では、
    既に io を「usr/local/bin」 にインストールしている場合。
    例えばmain.io スクリプトの行頭に 「#!/usr/local/bin/ioDesktop」 という行を追加しておけば、
    スクリプトの置き場所に関係なく
    ./main.io
    と書くだけで、ioDesktopを使い ioスクリプトを実行することができます。
    (※ chmod +x main.io で実行権限を有効にしておくこと)
    これは、Perlスクリプトを CGIで動かすのと似ています。
    io スクリプトをCGI として使うには、「#!/usr/local/bin/ioServer」と、書くとのこと。  
  • io言語 による OpenGL チュートリアル

    io アーカイブにあった OpenGLチュートリアル に関するメモ。 NeHe Tutorial を io言語 用に移植したものとのこと。 日本語訳されていないので、各チュートリアルごとに、io言語側と、OpenGL側 それぞれ 気になったポイントを簡単に解説。
    チュートリアルの場所は、 /IoFull-2005-12-21/bindings/OpenGL/_docs/tutorial/index.html
    // NeHe Tutorial #2
    @ io言語 :io と GLUT との連携 appendProto(OpenGL), glutEventTarget(self)、main , init , draw メソッドからなる構成。reshapeによるリサイズ時の連携
    @ OpenGL:ウインドウの構築&リサイズ処理, glutMainLoop, glutSwapBuffers 等GLUTの初期化,ポリゴンの描画の基本 glBegin(GL_TRIANGLES と GL_QUADS)
    // NeHe Tutorial #3
    @ io言語 :特になし
    @ OpenGL:ポリゴン、頂点に色を指定する glColor3d。ローカル座標軸の移動 glTranslated
    // NeHe Tutorial #4 派手な正方形 と 三角形 , 回転
    @ io言語 :timer メソッドによる GLUT との連携
    @ OpenGL: ローカル座標軸の回転 glRotated , glutTimerFunc関数による アニメーション
    // NeHe Tutorial #5 派手な立方体 と 三角錐
    @ io言語 :特になし
    @ OpenGL:各面の色を指定する glColor3d。glBegin(GL_TRIANGLES と GL_QUADS) , ポリゴンモデルの回転
    // NeHe Tutorial #6 立方体にテクスチャを貼る
    @ io言語 :グローバル変数みたいの。jpeg画像を読込み&テクスチャ化 self image := Image clone open(Path with(launchPath, "画像名.jpg"))
    @ OpenGL:ポリゴンにテクスチャを張付ける, glTexCoord2d , glVertex3d
    // NeHe Tutorial #7 光源を使ってみる (参考#6)
    @ io言語 :引数を伴った リストエレメントの使い方(光源), jpeg テクスチャ化, キーボードからのキー入力。テクスチャ表示法を配列リストで管理 ( texture at(filter) )
    @ OpenGL:環境光(Ambient Light)と拡散光(Diffuse Light), ミップマップ, ニアレスト,リニアの3つのテクスチャ表示法を比較。
    // NeHe Tutorial #8 テクスチャを半透明にする
    @ io言語 :キーボード入力 key := key asCharacter。if 文の使い方(条件と結果)。
    @ OpenGL:テクスチャの半透明ブレンド効果
    // NeHe Tutorial #9 星、ディスコライト ( 難易度注意? )
    @ io言語: オブジェクトを使って構造体。 配列リストとforeach文の使い方と各配列へのアクセス。jpeg テクスチャ化
    @ OpenGL:複数の星をアニメーションさせる。
    // NeHe Tutorial #10 ウォークスルー
    @ io言語: 外部テキストデータの読込み&コメント行排除処理。 構造体。 asNumber。ファイルのOpen Close。degreesToRadiansによる単位変換。三角関数
    @ OpenGL:読み込んだテキストデータからパラメータを読み取り複数の頂点リストを生成。3D空間の構成。
    // NeHe Tutorial #11 たなびく旗 (参考#6)
    @ io言語:多次元配列リスト append(), setX 関数等。多次元配列へのアクセス方法。 2重のforループで、動的にポリゴンの座標に合わせてテクスチャを張る。三角関数。
    @ OpenGL:テクスチャを張る。三角関数による波のうねり
    // NeHe Tutorial #12 ディスプレイリスト (参考#6と#8)
    @ io言語:データと OpenGLとの連携 glGenLists , glNewList
    @ OpenGL:ディスプレイリストの使い方 glGenLists , glNewList , glCallList
    ディスプレイリスト= 指定した複数のOpenGLコマンドをまとめて登録できる機能。複雑な形状も1回登録しておけば、指定した形状を glCallList 関数を呼び出すだけで、いつでも簡単に呼び出せるようになる。

    その他

    IoFull-2005-12-21/bindings/OpenGL/_docs/OpenGL.html より。
    GLU, GLUT API は部分的に実装されています。io 言語でOpenGL関連を利用する際に注意すること。
  • 各APIには(float int 型など)すべての変数型関数が用意されていますが、io 言語では、float またはdoble 型のみ呼び出される仕様となってます。 例えば、glNormal3b, glNormal3d, glNormal3f, glNormal3i, glNormal3s の関数をしても、実際にはglNormal3dが呼び出されます。

  • 数値としてベクトルが返される(たとえば glGetDoublev) 関数は、常に返値をリスト エレメントとして格納します。そのため、あらかじめ 十分な大きさを持たせた リストエレメントを設定しておく必要があります。もしリストの大きさが足りなければ、その部分の返値はカットされてしまいます。

  • 配列変数を引数とする 関数(例:複数の点の座標を扱う glVertex2dv, glVertex2fv, glVertex2iv, glVertex2sv, glVertex3dv, glVertex3fv, glVertex3iv, glVertex3sv, glVertex4dv, glVertex4fv, glVertex4iv, glVertex4sv)を扱う場合は、io言語では配列に相当するリストエレメントを必ず指定してください。そのときのリストの大きさは適切なものを指定します。もし、引数リストが短すぎた場合は、引数は 0.0 に修正されるか、可変長の入力データのせいで、ほかのメモリ領域を侵害するセグメントエラーが発生する恐れがあります。

  • 出力、入力ともに ポインタを指定するもの(例: glReadPixels関数)は、バッファオブジェクト上で処理する。バイト配列は、出力処理のために事前に割り当てなければいけません。セグメントエラーを回避するために、正しいサイズを割り当てる必要があります。
  • Obj method_name := method ( 引数, 引数 ,
    val := 10 //ローカル変数
            -内容-
    return val //返値
    )
    リストエレメント (配列のように使える)
    texture := list(1) // texture という名前の長さ2 (0と1) のリストを定義
    texture at(0) // texture リストの 0 番目 を参照

    エラー
    改行コードがMacのままの時など。
    //: bad interpreter: No such file or directory

    エラーメッセージ
    Exception: 'Object' does not respond to message 'Demo' //'Object' は メッセージ 'Demo' に応答しません

    Coroutine_0x1153590
    -------------------
    ? Demo neh.io line 46 //エラーの起きた行
    Coroutine setResult A2_Exception.io line 63
    Coroutine main [unlabeled] line 0
    Last modified 2009.03.20
    modified 2006.05.09

    Tsukubado