2011年10月26日水曜日

enchant PROを使ってゲーム開発してハマったとこ4つとこれからいじりたいとこ



enchant PROを使ったゲーム一番のりです


3Dスロット風ゲームです。


9leapアプリから「ぼか☆すろ」を開いて遊ぶ事が出来ます。


9leap : ぼか☆すろ by hanachin_ - どこでも遊べる、投稿型ゲームサイト


http://dl.dropbox.com/u/3622136/9leap/play.png


このエントリでは開発環境と、アプリ開発中にハマったところ4つと、これからいじりたいとこを書きます。


開発環境について


ソース書くのはMacBook Airで作業しました。


enchant PROを使用した作品の動作確認にはAndroidの実機が必要だと考え、開発用の実機としてICONIA TAB A500を学校から借りました。


しかしICONIA TABではOrientationセンサーと3Dしか動作が確認出来ませんでした。


またCameraはlogcatのログを読む限りでは初期化されてるようですがプレビュー表示が出来ませんでした orz


なので今回は3Dだけを使ったゲームを作ることに決めました。


ハマったところや問題点


※僕の環境(とその時試した状態)ではうまく動かなかったけど、他の人のところでは問題なく動くかもしれません


ゲームのソースは9leap : ぼか☆すろ by hanachin_ - どこでも遊べる、投稿型ゲームサイトから入手出来ます。


1. プラグインの読み込み


enchant('nineleap');


enchant.js初心者なので明示的にプラグインの名前を指定する方法を知らず、プラグインが読み込まれないことがありハマりました。


2. 縦長の画面におけるGameのtouchイベントの発生するエリアとScene3Dの描画エリアの違い


game = new Game(320, 320);


という風にGameクラスのインスタンスを作成しています。


Scene3Dは縦長の画面全体を使って描画されてるっぽいです。


画面全体のうちどこかを触ったときに何かしたいとき



game.rootScene.addEventListener('touchstart', function (e) {
// ...
});


このようにSceneのtouchstartイベントに書くと赤線で囲った範囲しか反応しません。


http://dl.dropbox.com/u/3622136/9leap/touch_area.png


Gameクラスを320x320で初期化しているからだと思います。


ちなみに未解決です。いい方法あったら教えてください。


3. Labelで描画したテキストの残像が消えない


var label = new Label('foobar'); // 1
game.rootScene.addChild(label);
label.text = 'hoge'; // 2
label.text = 'fuga'; // 3


のようなコードで、1で初期化したテキストの描画が2でテキストを再設定した後も消えず、3で再設定すると2は消えるが1は残ったまま、というような事がありました。


9leapにあがっているARサンプルでも同じ現象を確認しました。


なので、それを解消するためにこのようなコードを書きました。



var bg = new Sprite(100, 20);
bg.backgroundColor = '#fff';
game.rootScene.addChild(bg);

var score = 100;
var scoreLabel = new Label('score: ' + score);
var updateScore = function () {
bg.x = 0;

scoreLabel.text = 'score: ' + score;
}
scoreLabel.addEventListener('enterframe', updateScore);
game.rootScene.addChild(scoreLabel);


スコアを毎フレーム再表示する処理です。


スコアを表示するLabelの後ろに背景Spriteを設置しています。


scoreLabel.textを再設定する前にそのSpriteのxを移動させて背景を再描画し、labelのtextの残像を消しています。


4. 箱が明るくならない

箱を明るく表示させたいのに3Dのボックスの明るさのいじり方が分からず暗いままでした。


http://dl.dropbox.com/u/3622136/9leap/play_old.png


結論からいうと箱を自己発光させました。


surface.emission、Surface3Dのemissionというプロパティに値を渡すことで発光させる事が出来ました。



surface.emission = [0.8, 0.8, 0.8, 1.0];


箱を明るく表示させるためには光源の位置を移動させるなどの方法があると思いますがドキュメントにそれらしい事が書いてありませんでした。


このemissionというプロパティもenchant PROのドキュメントには書かれていませんでした。


enchant PROのソースを読むとSurface3Dでまだドキュメントが用意されてないプロパティとして




  • ambient

  • diffuse

  • specular

  • emission

  • shininess


などがありました。


EP_GLという変数を通してAndroid側のOpenGLのオブジェクトをいじっているようです。


なので




  1. emissionなどのプロパティに渡す値はOpenGLの同等の関数に渡す値を渡せばよい

  2. JSで渡すならどうするだろう?


と考え、配列を渡すことで上手く発光させる事が出来ました。


これからenchant PROをいじるなら


EP_はおそらくenchant PROの頭文字を取った接頭辞で、他にもEP_がついてる変数が




  • EP_SENSOR

  • EP_CAMERA

  • EP_ZXING

  • EP_AR

  • EP_MEDIA

  • EP_SOUND


など、いくつかあります。


これらのオブジェクトの持つプロパティについてどうなってるのか、気になります。


for in文を使ってこれらの持つオブジェクトのプロパティやメソッドを調べたいですね。


まとめ


4つほどつまずく事もありましたがAndroidネイティブの機能を手軽に呼び出すことが出来ました。


今後使う人が増えたりドキュメントが充実したり情報が増えるといいなー!





2011年10月24日月曜日

enchant.jsでゲームを作ってる中、考えたことつまずいたこと、これから(OJAG Naha Hackathonその後の話)



OJAGの勉強会でenchant.jsのハッカソンに参加しました。


OJAG workshop@Naha Vol.12に参加してゲーム作ってきた! - はなちん C-x C-c


その後9leap×ピアプロ 初音ミクチャレンジに応募するべく作品を制作しました。


出来上がった作品は2作品です。どちらもソースコードは公開しています。


1つめ


4日間程度かかりました。画像とBGMを友達に頼んで制作。長い時間遊べるテトリス的なものを目指しました。


9leap : ミク☆キュン! by hanachin_ - どこでも遊べる、投稿型ゲームサイト


制作中工夫した点



  • 自分では作れない画像を友人に制作依頼

  • BGMも依頼

  • プログラムで使いやすいように画像を作ってもらう

  • ソースコードを編集したら誰かにすぐ見てもらえる環境作り

  • ゲームのパラメータをソースコード書き換えずいじれるようにする


遭遇した問題点



  • Firefoxで音がならない事件


などなど。細かい事は後から書く or 発表します。


2つめ


3Dスロットゲーム。enchant PROを使用


9leap : ぼか☆すろ by hanachin_ - どこでも遊べる、投稿型ゲームサイト


工夫した点



  • enchant PROが出た翌日からコンテストに間に合わせるために制作開始

  • 明るさを設定する方法がドキュメントに書かれてない


    • とりあえずproのソースを読んだ



  • 前はscriptのsrcに指定するだけでutilプラグインやnineleapプラグインが使えるようになった気がするのですが、出来なくなってた


    • enchant('util', 'nineleap');で解決



  • まず、動作確認が出来る実機を使って、動くセンサーがあるか、あるならその値を取得出来るか試した


    • ARを使いたかったがICONIA TAB A500で上手くうごかなかった

    • カメラも動かなかったので諦めて別の方向で試す




などですかね


全体として意識していたところ


週末ものづくり講座


この授業を受けています。かなり刺激を受けております。(授業でAndroidアプリも1つ作成したのですがそれはまた別のエントリにて)


enchant.jsの作品もその授業の一環として制作し授業内でも進捗の報告やデモ等しました。


そこから引用すると



具体的なプロセス:
- 1. 良いアイデアを見つけたら、3日以内にそのプロトタイプを作成し、評価する。
- 2. 評価の結果が良ければ開発を続ける。悪ければ、また新しくプロトタイプを作成する。
- 3. 良いモノが出来あがればマーケットに投稿。そうでなければOSSとして公開する。

といった感じです。授業もこの流れ。


この流れを実践出来るように頑張ってみました。


ミク☆キュンはとりあえず作って何人かに見せて、感想を貰い改良し(取り入れない/実装出来なかったものもありますが)、最終的に9leapでソースコードと共に公開しました。


評価はまだ途中かな? プレイ数ものびるかと思いきやそこまで伸びませんでしたね。


理由はいくつかあると思いますが



失敗から得られた知見を大切にする。

と書いてあるのでここに残しておきます。


疑問や思い浮かんだ解決策など



  • 同時期に同じジャンルでもっと本格的なゲームが投稿された


    • 被らないジャンルを狙う戦略を取った方が良い?



  • 複雑すぎた


    • キャラクターを3人に増やしたりルールが複雑になった。


      • シンプルな方がうける?



    • 1プレイに39秒の制限をつけ制限時間を延ばす仕組みを作ったがそれだとプレイ数がのびない


      • むしろ制限時間をへらす方法を考えるべき?

      • プレイ時間が短い方が何回もプレイ出来る?

      • 何回もやりたくなる変化とか仕掛けが必要なのかも、今だと玉うつだけでスコアぐらいしか変動する余地がない



    • サウンドやフォントも3人分用意したのでスマートフォンでの動作が重くなった


      • 画像よりも音声、特にBGMが圧倒的に重かった。

      • キャッシュするようなプラグインを使うべき?





  • enchant PRO出たばかりのものでドキュメントが少なかった


    • ソースコード読む力をもっとつける? いじったAPIが少ないけど3Dプログラミングの知識があればもっといけた?



  • enchant PRO試せる実機がなかった


    • 友達のものを借りる手もあったのでは?

    • 2.3以上じゃないと試せないしばりが今後も出てきそうだしAndroid2.2の端末のままでいいのかな?

    • もしもこれがiPhoneから出ていて、僕がiPhoneを持っていたら、実機はほぼ1種類に縛れるから試せたのかも?



  • どのぐらいまで出来てるものを試せばいいのかな?

  • 時間をかけずに大量のゲームを作るにはどううれば?


    • やっぱり作り置き、というかコピペや参照出来るソースが必要?

    • ネタ作りに時間が結構かかるのでネタ本があるといい?

    • パクったほうがいい?



  • ゲームを更新すると最近投稿されたゲームに表示される


    • おそらくトップに表示されないとプレイされる回数は非常に少なくなる。

    • 常にトップに表示されるために自動更新の仕組みがあると便利?



  • 宣伝用にYoutubeとニコニコ動画にも動画をあげた


    • だが再生されなかった。そもそも再生されるためにもある程度の宣伝が必要っぽい。

    • 再生してもらえるようなBGMだったりカテゴリを選ぶべきだったのかな?



  • enchant PROのデバッグが実機でしか出来ない


    • 実機でデバッグするために毎回、フォルダをzipで固めてウェブにあげる必要がある


      • 自動化できないか?





  • ゲーム作りが初めてだった

  • 初音ミクでなければならないゲームではなかった


    • もっとキャラを生かすべきだったのか?




ざっとでてくるのはこんな感じでしょう。


まだ審査期間があるので結果は分からないけれど、途中で何度も細かいところで引っかかった。


都度解決したが一部解決出来ていない点や疑問も残った。


次回はこれを直すようにしたら今より少しだけましになるのではないだろうか。


enchant.jsを使って9leapに投稿してみて


enchant.jsを使うとほんとに簡単にゲームが作れた。enchant PROを使うと3Dがめっちゃお手軽に扱えた。


短期間で集中して何か作るのは楽しい。9日間のチャレンジ、9日間でゲームを作る!という企画は本当に素晴らしいと思う。


工夫したり苦労した点は次回につなげて行きたい。


今後


4Gamer.net ― プログラミングは最高だ。無差別級ゲームコンテストも発表されたUEI「enchant.js meetup!」レポート


によればopen leapという学生以外でも参加出来る無差別チャレンジがあるっぽいので是非応募したい。


こんな素敵な場所を提供している9leap : トップページ - どこでも遊べる、投稿型ゲームサイトさんはすごくいいサイトなので皆さん是非参加してみて!


まぁenchant.js以外にも面白そうなことがあったら積極的にものつくろうと思います!


ものつくりと発表はセットらしいので、今後は発表など出来たらいいな!





2011年10月16日日曜日

OJAG workshop@Naha Vol.12に参加してゲーム作ってきた!



昨日は日本Androidの会 沖縄支部の勉強会に参加しました。


成果物は9leap : OJAG Naha Hackathon by hanachin_ - どこでも遊べる、投稿型ゲームサイト


今回の勉強会は




  • 9leapの伏見様(@)のお話


    • 今回のために来沖(日帰り)してくださったみたいです。超ありがたいです。

    • enchantと9leapの紹介

    • ライブコーディング



  • enchant.jsを使ったハッカソン!


    • ハックとマラソンを掛け合わせた言葉で皆で集まって開発する感じのイベント

    • 今回は2時間半ちょい黙々とゲーム作成。



  • 懇親会


    • 10時間で21本ゲーム作成の話などなど



  • 懇親会2


    • 居酒屋でMacBookを4台並べながらのアイデアソン




という感じでした。


僕も2時間半ぐらい黙々といじってTouchTheNumbers風のゲームを作成しました。懇親会も楽しかったです。


以下、当日聞いた内容の自分なりのまとめと、ハッカソンで作ったもの、作ってた時の過程を書きます。


9leapについて


9leapという若いプログラマ向けのゲームコンテストサイトがあります。(enchant.jsで作られたゲームが数多く投稿されています)


その9leapのプロジェクトリーダーの伏見様が1時間ほどenchant.jsの紹介とライブコーディングをしてくださいました!(テキストエディタはCotEditorでした)


スライドはまだあがってないようですが内容的には「enchant.js & PRO」第21回 html5とか勉強会 ショートセッションのような感じでした。


enchant.jsについて


enchant.jsはJSでBASICみたいにゲームを短く楽しく書けてしかも軽い、モダンなブラウザがあればどこでもゲームが動く!というすごいものです。


確かに書いてみるとめっちゃ楽でした。1枚の画像にまとめられてる複数の絵を切り出すのがプロパティ指定するだけで出来たり。


ゲームがっつり書いたことない自分でも2時間半で1つゲームが作れました!


こんなに簡単に作れるなんて中身がどうなってるのか気になるので是非enchant.jsソース読みしたい。


あと、ゲームつくり楽しかったのでリトライしてみたくなりました。っていうかリトライしますw


enchant PRO

スマートフォンのカメラ等をenchant.jsから簡単に扱えるらしい。ARも簡単に書けるようでめっちゃ気になる…


ハッカソンで作ったもの


TouchTheNumbers(5x5のますにランダムに配置された1から25までの数字を順番よく押して時間を競うゲーム)を作りました。


先輩のiPod touchでプレイしてハマってしまったのが理由。


動きのあるサンプル見せてもらったのに動きが地味なのもの作ってしまったので後でもっと楽しい感じに書き直そうかと orz


9leapで公開したので以下のリンクからプレイ出来ます!


9leap : OJAG Naha Hackathon by hanachin_ - どこでも遊べる、投稿型ゲームサイト


作ってた時の過程


画像の出し方、移動程度は予習してました。


目標は「必ず完成させて公開する」でした。


私が今受講している週末ものづくり講座の影響です。


ステップ

ステップとしては




  1. 数値を画像に変換


    1. まずは0から9までの変換

    2. それを利用してn桁対応



  2. 数値の入ったますを作る


    1. まずは普通のますを作る

    2. 数値を画像に変換してそのますにのっける



  3. 1から25までの数値の入ったますをランダムに配置

  4. 1から順に押されているかのチェック

  5. 時間の計測

  6. 9leap公開・スコア送信


という感じで進めていきました。


数値の入ったますを作る処理が出来るまででハッカソンの時間の2/3、順に押されてるかのチェックと時間の計測を実装したとこで2時間経過、その後9leap公開、送信ちょっとした修正で30分ぐらいかかりました。


ソース

ソースコードは以下のような感じ。


9leap : OJAG Naha Hackathon by hanachin_ - どこでも遊べる、投稿型ゲームサイトからzipで一式落とせます。



Array.prototype.shuffle = function() {
var i = this.length;
while(i){
var j = Math.floor(Math.random()*i);
var t = this[--i];
this[i] = this[j];
this[j] = t;
}
return this;
}

enchant();

count = 0;

window.onload = function() {
var game = new Game(320, 320);
game.fps = 15;
game.preload('font.png');
game.onload = function() {
function makeBlock(w, h) {
var block = new Sprite(w, h);
block.x = 0;
block.y = 0;
return block;
}
function squareBlock(size) {
var bg = makeBlock(size, size);
return bg;
}
function addBorder(block, size, color) {
var wrap = new Group();
var bg = makeBlock(block.width + size * 2, block.height + size * 2);
bg.x = 0;
bg.y = 0;
bg.backgroundColor = color;
block.x += size;
block.y += size;
wrap.addChild(bg);
wrap.addChild(block);
return wrap
}
function numBlock(n) {
var block = new Group();
block.x = 0;
block.y = 0;
block.width = 44;
block.height = 44;
// 64
var bg = squareBlock(44);
bg.backgroundColor = "#fff";
var bg = addBorder(bg, 2, "#2f4f4f");
block.addChild(bg);

var nums = (""+n).split('').map(function (x) { return parseInt(x); });
for (var i = 0; i < nums.length; i++) {
var sp = numSprite(nums[i]);
sp.x = i * 16 + 8;
sp.y = 16;
block.addChild(sp);
}
return block;
}
function numSprite(n) {
var sp = new Sprite(16, 16);
sp.image = game.assets['font.png'];
sp.x = 0;
sp.y = 0;
sp.frame = n + 16;
return sp;
}

function init() {
// var scene = new Scene();
var scene = game.currentScene;

var nums = [];
for (var i = 1; i <= 25; i++) { nums.push(i); }
nums.shuffle();

for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
var index = (i * 5) + j;
var block = numBlock(nums[index]);
block.x = j * 48;
block.y = i * 48;

var click = (function () {
var n = nums[index];
var b = block;
return function (e) {
var x = e.x;
var y = e.y;
if (b.x < x && x < b.x + 48
&& b.y < y && y < b.y + 48
&& count == n) {
count++;
b.backgroundColor = "black";
var paint = squareBlock(48);
paint.x = b.x;
paint.y = b.y;
paint.backgroundColor = "#fff";
scene.addChild(paint);

if (count == 26) {
var score = Math.floor((start / game.fps) * 10)/10;
game.end(10000 - score, "Your score is " + score);
}
}
}
});
block.addEventListener("touchstart", click());

scene.addChild(block);
}
}

count = 1;

//game.replaceScene(scene);
}

init();

start = 0;

game.rootScene.addEventListener('enterframe', function () {
start++;
});
};
game.start();
};


感想


ハッカソン楽しい。動いたもの公開して人が遊んでくれるとやっぱり嬉しい。


ゲームプログラミングやるとプログラミングが出来るよになるというのも話されていたのでゲームを作りたい。


そして作ったゲームを9leapにドシドシ投稿していきたいです。


刺激を受けた部分としては懇親会でお話されていた10時間で21本というのを聞いて自分も手をもっと早く動かせるようになりたいなぁ、と。


# enchant PROのARやTwitterでやりとりされていたnode.jsでエアホッケーとかすごく楽しそう





2011年10月6日木曜日

ハッカソンの前にenchant.js環境構築



日本Androidの会 沖縄支部 workshop@Naha Vol.12 : ATND


来る10月15日にOJAGの勉強会があります。当日予定されているハッカソンに向けて開発環境を整えます。


ハッカソンで使用するのは以下なライブラリ(appMobiも使うのですが別エントリでまとめます)


no title


HTML5とJavaScriptで簡単にゲームが書けるゲームエンジン、様々なプラットフォームに対応しています。


環境構築


GitHub ? Social Coding


このページのDOWNLOAD PACKAGESのバージョンが一番新しい奴をダウンロードして展開します。


これで環境構築は完了です。(多分)


使いか方は多分、HTMLファイルの中のscriptタグでenchant.jsを読み込むだけ。


あとはゲームの処理を別のJavaScriptファイルに書いてそれを同じようにscriptタグで読み込ませます。


HTMLとJavaScriptを何で書くかはお好みですがうちの学生としてはvimを使え、となるのかな?


私はIDE使った方が楽だと思います。エラー表示とか出るし。EclipseかAptanaお勧めです。


ついでに9leapも登録する

9leap : トップページ - どこでも遊べる、投稿型ゲームサイト


enchant.jsを使って作られたゲームがたくさん投稿されてるので参考になるはず。


登録しなくてもソースは読めますが自分もコンテストに参加してみたいので登録しておきます。


Twitterのアカウントがあれば簡単に登録出来ます。




  1. 右上のログインを押す

  2. Twitterのアカウントでログインを済まし連携アプリを認証を押す


おそらくこれだけで完了です。あれ?自分前に登録したっけ? @taka16_O あたりに確認取ってもらおう。


ドキュメント


enchant


開発者の方によるスライドが分かりやすいです。


とりあえずこれを参考にざっくり概要を理解。


GitHub Pages ? File Not Found ? GitHub


実際書くときはリファレンスとしてここを参照するかと。


次のステップ


ひとまずenchant.jsをダウンロードして展開すれば環境構築は完了です。


日本Androidの会 沖縄支部 workshop@Naha Vol.12 : ATND


no title


などに掲載されているチュートリアルやサンプルをなぞって書いていく事になるかと。


来週の放課後当たりに時間が取れればいいなぁ。


# クリエイター科な学生の方は画像素材等も自分で作れそうですね、相談してみよう…





2011年10月4日火曜日

7つの言語7つの世界 Io 3日目



ついにIoも3日目、雑ですがメモと感想を。

DSLを作る話。


phonebook.io

わざわざ文字列をパースしなくても、電話帳のリストを構文として解釈するようにIoを変更({}や:の意味をかえる)

phonebook.ioがそれ。ところでp64のforEachはforeachの間違いかな?なんかここだけ違う。Rubyっぽい。

演算子が自由に定義可能なのは2日目で見たけど{}までも変更出来るなんてヤバい。curlyBracketsメソッドを定義することで{}の動作をいじれる。





Ioのmethod_missing

forwardメッセージをいじればいい。

forwardではメッセージが存在してない場合親に転送する事をしているらしい。

なのでこれを上書きしちゃうとIoとは別ものに…

ここらへんから頭がこんがらがる。

Builder := Object clone
Builder forward := method(
writeln("<", call message name, ">")
call message arguments foreach(
arg,
content := self doMessage(arg)
if (content type == "Sequence", writeln(content)))
writeln("</", call message name, ">"))

Builder ul(
li("Io"),
li("Lua"),
li("JavaScript"))


平行性


Ioには3つ平行性ライブラリがある。



  • コルーチン

  • アクター

  • フューチャ

コルーチン

処理を自由に停止・再開出来る。

@や@@をつけて非同期にメッセージを送信する。@はフューチャを返す。@@は自分のスレッドでメッセージを開始出来る。

yieldを呼ぶと別の処理に制御をうつす。yield書かなくても適当に自動でyieldしてくれるらしい。

制御を移すタイミングをyield呼ぶことで自分で指示出来るのがポイントっぽい。

自分で制御を渡すことが出来るので協調動作も書きやすい。

JavaやCベースの言語はプリエンティブマルチタスキングと言われる平行性の概念を用いているらしい。

第12回 Haskellで学ぶ並列プログラミング(その3)並行プログラミングと並列処理 - 本物のプログラマはHas...:ITpro

実行している処理に割り込む形でタスクを切り替えるので,このような形のマルチタスクを「割り込み型(preemptive,プリエンプティブ)マルチタスク」と呼びます。これに対して,スケジューラではなく実行する処理の側で明示的にタスクを切り替える形のマルチタスクを,「非割り込み型(non-preemptive,ノンプリエンプティブ)マルチタスク」あるいは「協調的(co-operative)マルチタスク」と呼びます。

プリエンティブマルチタスキングな平行方式と変更可能な状態を持つオブジェクトを組み合わせると、予測出来ずテスト方法もアレでデバッグが難しくなる云々。

確かに勝手に割り込んで色々変え合ってたら大変だよね。

「アクターのような高レベルの抽象化を実現する基本的な構築ブロック」がコルーチンらしい。

うーん、書いて自分で読み返してみてイミフ orz

アクター

アクターはメッセージの送受信、アクターを作る事が出来るとか。

受信したメッセージはキューに入れてコルーチンで処理していく。

なのでスレッドのように互いに制限なく変更することが出来るわけではないみたい。

キューで処理していくのでちゃんと制御されてるとか。

Ioでは@@で非同期メッセージ送ればそれがアクターになる超絶便利機能。

x @@foo; y @@bar;


すると同時に実行される。fooとbarの中でyieldを呼んで制御を移す事も出来る。Ioかっけー

フューチャ

@で非同期メッセージを送るとFutureオブジェクトが帰って来る。

非同期メッセージが完了する前にFutureオブジェクトを使うと、完了して値が帰って来るまでブロックされる。

時間かかる処理を@で呼び出しといてFutureの値使わない処理ごにょごにょしてから、Futureの値を使う処理をかく(とFutureの値が帰って来るまで待つ)感じなのかな。

Ioにはデッドロックを自動的に検出する機能もあるらしい。

試してみよう


XMLのやつ



  • 本文のLispMLを改良してインデントさせる

  • 本文のLispMLを改良して属性を処理出来るように。第1引数がMapだったら属性を追加



なんかXMLのやつ想像以上に時間かかった。

args first codeをdoStringしてるんだけど、doMessageでも出来んのかな?

自分の場合上手くいかなくてなんか結構汚い感じ。

これは他の人の回答めっちゃ参考にしないといかんなー

角括弧のリスト構文



  • 角括弧を使ったリスト構文を作成



LispMLに苦労したけどこっちは5分ぐらいで出来たw

これだけで[]でリストが作れるようになる。すげー!

添字アクセスまで作る気力は私に無かった。

ちょっと疑問点




  • 最後の連続したとじ括弧は1行にまとめちゃってもいいのかな?

  • インデントどうつけよう

感想


平行性の話がまだきちんと理解出来てない感じ。

でもIoだと、ただ単にメッセージに@@とか@つけりゃ平行動作・協調動作させたり処理待ちも勝手にやってくれてかなり便利そう。

Io奥が深い…




2011年10月2日日曜日

7つの言語7つの世界 Io 2日目



no title


この資料が分かりやすかった。


以下メモ書き




  • 言語の基本的な動作を覗く

  • ループ


    • loop(処理)

    • while(条件, 処理)

    • for(カウンタ名, 初期値, 終了値(含む), senderを伴うメッセージ)

    • for(カウンタ名, 初期値, 終了値(含む), 増分, senderを伴うメッセージ)



  • 条件分岐


    • ifは関数

    • if(条件, 真の場合, 偽の場合)

    • if(条件) then(真の場合) else(偽の場合)

    • if(条件1) then(条件1が真の場合) elseif(条件2) then(条件2が真の場合) else(偽の場合)

    • if(条件, 真の場合, 偽の場合)は真偽のコードどちらかを評価した結果を返す



  • 演算子


    • OperatorTableで演算子表を確認出来る


      • 優先順位が分かる

      • 演算子の追加はaddOperator(演算子, 優先順位)



    • 1 + 2は1 +(2)というメッセージにコンパイルされる。1に対して+(2)というメッセージ送る

    • addOperatorでOperatorTableに演算子を追加しないとエラーが出る例





$ io
Io 20110905
Io> List ++ := method(a, a foreach(v, call target append(v)))
==> method(a,
a foreach(v, call target append(v))
)
Io> list(1, 2) ++(list(3, 4))
==> list(1, 2, 3, 4)
Io> list(1, 2) ++ list(3, 4)

Exception: nil does not respond to 'foreach'
---------
nil foreach Command Line 1
List ++ Command Line 1

Io> OperatorTable addOperator("++", 4)
==> OperatorTable_0x7fc798c73040:
(略)
Io> list(1, 2) ++ list(3, 4)
==> list(1, 2, 3, 4)




  • メッセージ


    • メソッド呼び出すとcallスロットにcallオブジェクトが設定される

    • callオブジェクトのスロットはsender(送信元), target(宛先), arguments(引数)

    • メッセージの引数はmethod(arg, arg)の様にargを書くと評価される

    • メッセージの引数を書かないと評価されない


      • method(call message argAt(0)) <- argAt(0)で0番目の引数を取る事が出来るが評価はされない



    • えばるならevalArgAt

    • ほんとに,以外はほぼメッセージ… 純粋! かっこいい!

    • unlessの例


      • call sender doMessage(call message argAt(2))

      • 送信元の環境で2番目の引数を評価

      • 短くやる方法がevalAtArg



    • animalsの例


      • プロトタイプを辿りながらスロットを出力していく

      • selfはcallのtargetに設定されてるのかな

      • 1つのオブジェクトが複数のプロトタイプを持つ場合もあるらしい


        • どういうことだろうww





    • メッセージリフレクションとオブジェクトリフレクション


      • クラスの存在なし

      • call messageやselfやprotoなどメッセージやオブジェクトにアクセスする手段がいっぱい





  • asなんとかメソッドでデータ形式の変換


セルフスタディ 試してみよう


既にあるメソッドを勉強して使いこなさないとすっきり書けないですね。



本を見ながら書いたもの




感想


他の方の回答を調べたらめっちゃすっきり書かれてる。


この違いがどこからくるのか、かける時間かリファレンスをちゃんと見てるのか良い方法があるのか気になる。


今回は間があいてしまいました。1週間1言語はやはりちゃんとやらないとついていけない orz


1ヶ月の夏休み中は内定先の企業様でバイトをさせて頂きました。


プライベート時間の確保が学校居るときより出来なくなりました(週1日は元同級生と基本情報の勉強をするため空けてたり、週末も色々あったりで) orz


時間をうまく使う技術身につけないと会社入ったらあっという間に老いて死んじゃうので今のうちどうにかせねば…


今月はScheme修行の本文からもっと深く読めてない部分(Yコンビネータ等々)も読むし、PHPの勉強も始めるし、3日目はしっかり読んで、さっと練習問題まで終わらせてしまおうと思います。