Jewel-mmo開発日記 http://dgames.jp/dan RubyでMMORPGを開発しています。その開発の過程を綴った日記です。 C言語を知ってて良かった話 http://dgames.jp/dan/permalink/20111021 C言語を知ってて良かった話低級言語Rubyの世界。--メカじい「まだいたのか。いつまで突っ立てるんだ。他の連中はとっくに行っちまったぞ。暗くなる前にささっと帰れ」子供「あの…。何か仕事はありませんか…?」メカじい「仕事?人を雇う余裕なんてねぇよ。前らが知っ... <h2>C言語を知ってて良かった話</h2> <p>低級言語Rubyの世界。</p> <p>--</p> <p>メカじい「まだいたのか。いつまで突っ立てるんだ。他の連中はとっくに行っちまったぞ。暗くなる前にささっと帰れ」</p> <p>子供「あの…。何か仕事はありませんか…?」</p> <p>メカじい「仕事?人を雇う余裕なんてねぇよ。前らが知ってるマシンランゲジなんてここじゃ何の役にも立たねぇ」</p> <p>子供「あの一応Rubyが書けます。あとCも少しだけ…」</p> <p>メカじい「なんだと!Cが書けるのか!?」</p> <p>子供「はい。古い井戸の水汲みをRubyで制御してて…あの重量センサが調子悪くって、Cで拡張して…」</p> <p>メカじい「……」</p> <p>子供「その…ただIOの調子悪かっただけで繰り返しリトラ…」</p> <p>メカじい「んー、金曜の夜だけ店の灯りが消えねえんだ。ちょっと見てくれ。安心しろお前らの大好きなマシンランゲじだ。パスワードは…」</p> <p>子供「はい!」</p> 2011-10-21T00:00:00+09:00 36歳からでもリフティングはうまくなるか? http://dgames.jp/dan/permalink/20111020 36歳からでもリフティングはうまくなるか?夏に36歳になった。36と言えばプログラマを引退すべきと言われるかもしれない年齢だ。35歳までしかプログラミングできないかどうかは興味深いところではあるけども、それはさておき、今日はリフティングについて考えてみる。... <h2>36歳からでもリフティングはうまくなるか?</h2> <p>夏に36歳になった。36と言えばプログラマを引退すべきと言われるかもしれない年齢だ。</p> <p>35歳までしかプログラミングできないかどうかは興味深いところではあるけども、 それはさておき、今日はリフティングについて考えてみる。</p> <p>このところの週末は特別な事情がない限り、3年生の息子の通う地元の少年サッカーチームで親コーチをしてる。 コーチと言ってもオレはもともとサッカー経験者ではない。 とはいえ、コーチの役割はサッカーの手本を子供に見せることだけではないし、小さな子達をまっすぐ並ばせるだけでも骨の折れる作業なので、仕事はいくらでもあるのだ。</p> <p>今年でコーチ3年目だけど、3年生になると子供の成長力が急激に上がるのを日々目の当たりにしている。おそらくゴールデンエイジと言われる12歳あたりではより高い成長力が期待できるのだろう。小学生の間でリフティング回数も10回程度から100〜1000回程度まで劇的に上昇する。</p> <p>では大人のリフティング力についてはどうだろう。</p> <p>2年半コーチをやってきた経験からすると、30代後半が中心メンバーであるコーチ達のリフティングはほとんど上達しない。上達するどころか衰えていくこともあるはずだ。</p> <p>でもコーチの中にも例外はいる。もともとスポーツが得意だった38歳のあるお父さんコーチは、少し前からサッカーを初めてとんでもないスピードで上達しているし、うちのチームではオレも例外的な存在。子供の頃からサッカーはおろか運動全般が苦手だったけども、リフティングだけは30歳を過ぎてから100回を超えた。これまでほとんど右足だけでしか蹴れなかったので、今は左右の足で交互に蹴るパタンを練習している。これも練習しただけ着実に回数が上がる。</p> <p>オレがボールを蹴り始めたのは28歳のとき。職場のメンバーとでフットサルをはじめたのがきっかけ。リフティングは最初は5回を超えるのも大変だったが、その後の地道な練習で最高170回をマーク。リフティングの練習時間はたぶんトータルで30時間くらい。最近は暇があると左右両足のリフティングを練習してるけど、練習時間は年間で2時間いかないくらいのペースじゃないかと思う。想像だけど単位時間あたりの上達量は、ゴールデンエイジには負けそうだけど、普通の子供には引けを取らないペースじゃないかと思う。</p> <p>これは練習さえすれば誰でも出来ることだと思う。つまり単に練習をするかしないのかだけのことだ。</p> <p>お父さんコーチは子供の頃サッカーを経験してた人が多いのだけど、リフティングが得意でない人もいる。30回続かない人もいる(今の子どもはレベルが高い!)。そもそもリフティングが得意でないコーチはリフティングを見せてくれない気がする。100回出来るまでやり続けろ言われたら果たして何割が合格できるだろうか。</p> <p>さて、30歳を過ぎてからリフティングの練習をしていたオレからすれば、そんなコーチたちがすぐに上達するだろうことは簡単に想像できる。何もやってなかったオレとはそもそも足の器用さがぜんぜん違うのだから。今からでも少し練習すれば着実に上達するはずなのだ。</p> <p>しかし、ある程度以上のスキルを既に獲得しているコーチが上達する例は見たことがないし、これから先も上達する気配はない。 あくまでうちのチーム内の何人かを見ての話ではあるけども。</p> <p>なんにせよ結局のところ30歳代の既にサッカーのできるコーチたちはもううまくなりそうな気がしないのだ。これはリフティングに限った話ではない。なぜだろう?</p> <ul> <li>今さら練習したところでもう上達しないと思い込んでいる</li> <li>努力してまでうまくなりたいとは思っていない</li> <li>そもそも上達することに興味がない(それなりにできるので特に困っていない)</li> </ul> <p> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=479736310X&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=4569621988&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> </p> <p>こんな理由じゃないかな。これは実質的に限界に達しているということかもしれない。 でももっとうまくなれる可能性は多分にある。第一線で活躍してるプロなら話は違うだろうけど、ある程度のレベルまでならこの年からでもサッカーにおいて上達できる要素はたくさんあるはずだ。</p> <p>で、自分がプログラマーとして既にこれ以上成長できないほどのレベルかといえば、全くそんなことはないわけで、なんだか似た話かもしれない。最近リフティングやってなかったけど、もう少しだけ積極的に練習継続してみよっと。 </p> 2011-10-20T00:00:00+09:00 一瞬でiPhone付属イヤホンの低音を2.5倍響かせる方法 http://dgames.jp/dan/permalink/20111019 一瞬でiPhone付属イヤホンの低音を2.5倍響かせる方法これは曲のベース音などの低音をよく聞きたい時によく使う手法。iPhoneやiPod付属のイヤホンを用意音量を少し大きめにする両手の中指の腹で左右耳のイヤホンを軽くおさえる音が小さいと効果を感じにくい... <h2>一瞬でiPhone付属イヤホンの低音を2.5倍響かせる方法</h2> <p>これは曲のベース音などの低音をよく聞きたい時によく使う手法。</p> <ol> <li>iPhoneやiPod付属のイヤホンを用意</li> <li>音量を少し大きめにする</li> <li>両手の中指の腹で左右耳のイヤホンを軽くおさえる</li> </ol> <p> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=B003UIRICC&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=B002ZJXM1I&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> </p> <p>音が小さいと効果を感じにくいので屋外で試すと効果的。 あと指先ではダメ。指の腹、指紋のうずまきの中心をイヤホンにあてること。</p> <p>前はイヤホン苦手で外で音楽聴けなかったんだけど(耳が痛くなった)、 この <a href="http://www.amazon.co.jp/o/ASIN/B003Y5HWCM/bilbo-22">Appleの純正イヤホン</a> は楽に使えて <a href="http://www.amazon.co.jp/o/ASIN/B0040ZO8RM/bilbo-22">shuffle</a> 以来ずっと愛用してる。</p> 2011-10-19T00:00:00+09:00 息子がプログラミングをはじめた http://dgames.jp/dan/permalink/20111013 息子がプログラミングをはじめた今年3年生になった息子に前から「ゲーム作りたいゲーム作りたい」と言われていた。プログラミング環境を用意してあげたいと思っていたところ、同僚の@fum1h1roがMacbookAir11インチ(昨年のモデル)を格安で譲ってくれた... <h2>息子がプログラミングをはじめた</h2> <p>今年3年生になった息子に前から「ゲーム作りたいゲーム作りたい」と言われていた。プログラミング環境を用意してあげたいと思っていたところ、同僚の @fum1h1ro がMacbook Air 11インチ(昨年のモデル)を格安で譲ってくれた。</p> <p>というわけで息子のプログラマー人生がスタート。</p> <p>したのだけど、どうやってプログラミングを練習させたものか難しい。</p> <p>さしあたって初日はターミナルからirbを開く方法を教えて、そこで変数の初期化と乱数と足し算を教えた。具体的にはこんなの。</p> <pre>hp = 1 hp = hp + rand(10)</pre> <p>息子の性格を踏まえてこのような地味なところからのスタートしている。 好きなことに対してだけは粘り強くて、そして単純に小さい頃から数字が好きだったので、こんなやり方が許されているところは多分にある。</p> <p>で、こっから先どうしようかなと悩んでて、いい方法ないかなあ...。</p> <p>そもそも3年生だと、持っている知識が少なくてなかなか難しい。とはいえ、国語の教科書を引っ張り出してきてアルファベットを使ったローマ字表記を一気に覚えてしまったくらいやる気はある。</p> <p>子どもがプログラミングを学ぶにはやっぱりゲームかな。irb上でメソッドを呼び出していくことで進行させられるゲーム。息子はしょっちゅう武器やモンスターなどのゲームデータを紙に書きまくってるから(ほんとにとんでもない量の…)、アイテムやその発生率をCSVか何かで簡単に定義できると面白そう。</p> <p>ただ単にアイテムリストを一覧表示するプログラムなんてのも好きそうだ。自分で作ったリストがゲーム即座に反映されたりHTMLで表示できたりしたらそれだけで楽しそう。</p> <p>irbくらい容易に開始できるならJavaScriptの方がいいかもしれない。JavaScriptならブラウザ内に簡単に図形や画像を描画できる。node.jsを使えば当然irbみたいなことも出来るだろうし応用範囲が格段に広い。CoffeeScriptもいいかもしれないなあ。</p> <p>そう考えると昔98上で動かしていたN88-BASICはすごかった。パソコンの電源を入れれば勝手に起動して、その場でソースを編集できて実行できて、文字だけじゃなくて線や円がスクリーンに描画できて、シンプルなマシン語世界に簡単に入ることができたりしたわけで。</p> 2011-10-13T00:00:00+09:00 #yokohamarb のRubyレシピブック読書会が面白い http://dgames.jp/dan/permalink/20111009 ブロックは難しい。持論としてブロックが理解できたらRuby中級者を名乗っていいとかねがね思っている。C言語から来たプログラマには、以下のようなコードの仕組みと流れがまったく想像できないものである。ary.eachdo|e|putseendオレはブロックを理... <h2>#yokohamarb のRubyレシピブック読書会が面白い</h2> <p>@1syo が中心となって開催している <a href="http://www.amazon.co.jp/o/ASIN/4797359986/bilbo-22">Rubyレシピブック</a> を用いたYokohama.rbでの恒例セッション。昨日で3回目だったかな。</p> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=4797359986&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> <p>これが面白い。どういう意味で面白いかというと、まず単純にRubyを深く学ぶことができて面白い。 ふだん何気なく使っているRubyの機能も、ちょっと掘り下げてみれば知らないことが山ほど出てくる。 そして、ふっと湧いた謎をその場の参加者みんなで考察してゆく流れがとっても心地良い。</p> <p>昨日は「008繰り返し」から。</p> <h3>008繰り返し</h3> <p>まず「whileは使わない」という話が出る。いやそんなことはない普通に使うでしょ。</p> <p>例えばこんなの。</p> <pre>while e = ary.shift ... end</pre> <p>aryがキューでここに要素が入ってきたら、要素を頭から取り出しつつ処理をしていくときとか。</p> <p>会場で自分の書いたソースをgrepしてみたらこんなのが見つかった。</p> <pre>rand &lt; 0.7 ? self.lv += 1 : break while true</pre> <p>これは可読性が低いって言われた。たしかにそうかも知れない。でもこのくらいだと1行にまとめたい衝動が我慢出来ない。</p> <p>今あらためてgrepしてみるとこんなのが見つかった。</p> <pre>create while count &lt; 5 </pre> <p>これはActiveRecord::Baseを継承したモデルのクラスメソッドでやってるのだけど、 こっちはwhileを使うとうまく書けるいい例じゃないかな。</p> <p>untilは個人的にあまり使わないなあ。ということはやっぱりwhileを使う頻度がそもそも少ないということかもしれない。unlessは普通に使うわけだし。</p> <p>もちろんforも使わない。</p> <p>繰り返し処理をもう一度実行するredoは使ったことがないのだけど、これは単に自分の発想が及ばなかっただけで実際使える機能じゃないかな。</p> <p>さてここで書籍に書かれていないretry(索引にも載っていない!)をネタにかつてないほど盛り上がったのだけど長いので省略。</p> <p>個人的にretryは「勘違いによって罠となり得るから繰り返し処理では使えなくした」と推測してる(もしくはそんな話しを聞いたことがある気がする)のだけどどうだろう。</p> <h3>009メソッド呼び出し</h3> <p>メソッド呼び出しにおけるカッコの省略基準について質問が出た。個人的な使い分けとしてはメソッドの戻り値を利用する場合はカッコを書くという基準でやってて、でこれは<a href="http://i.loveruby.net/ja/ruby/codingstyle.html">青木さんのコーディングスタイル</a>がそうだから...と説明してその場で青木さんのコーディングスタイルを読んだのだけど、そんなことどこにも書いていないっ!</p> <p>それが青木さんスタイルと思ってたのだけど完全に勘違いっだのかな?青木さん本人から直接聞いたという可能性もなくはないけど...それはないかなー。</p> <h3>010ブロック</h3> <p>ブロックは難しい。持論としてブロックが理解できたらRuby中級者を名乗っていいとかねがね思っている。</p> <p>C言語から来たプログラマには、以下のようなコードの仕組みと流れがまったく想像できないものである。</p> <pre>ary.each do |e| puts e end</pre> <p>オレはブロックを理解するまで1〜2年ほどかかったのだけど、やっぱり他にもそういう人がいた。</p> <p>そのあと1.9では変数がシャドウイングされることをみんなで確認。なるほどー。</p> <p>さらに「;」を使ってブロックローカル変数が書けることを初めて知った。勉強になるー。</p> <pre>ary.each do |e; x| x = "hello" puts e, x end puts x # エラー: undefined local variable or method `x'</pre> <p>この節の最後にprocが出てくるんだけど、ここはまた時間がかかりそうなので次回のお楽しみとすることとした。紙面上はたった6行だけど。</p> <p> <a href="http://www.amazon.co.jp/o/ASIN/4797359986/bilbo-22">レシピブック</a> は初心者から上級者まで楽しむことの書籍として非常に良い選択だったと思う。@1syo GJ!</p> 2011-10-09T00:00:00+09:00 #rubykaigi 2011に行ってきた http://dgames.jp/dan/permalink/20110719 とにかくいろんなことが多すぎて、とても書ききれない。やっぱりまとまらないので思いついたまま書いていく。@nagachikaのLTはとっても良かった。個人的にLTの中で一番面白かった。@nagachikaは、昨年のRubyKaigiの直後Yokohama.r... <h2>#rubykaigi 2011に行ってきた</h2> <p>書きたいことが多すぎて逆に書けなくなりそうなので、まとめようとせずだらだらと思いついたことを書いていく。</p> <h3>1日目</h3> <p>金曜から3泊するつもりで池袋のホテルをとっておいたのだけど、会社関係の用事でチェックインが午前4時に。 忙しかったので開催スケジュールもろくに確認出来ていないまま、なんとか開始時間に滑り込んだ。もしホテルをとってなかったら何時入りになったのかわからない。</p> <p>初日の最後は闇RubyKaigiだったわけだけど、できればエントリしたいなと思い立って当日に資料を書き始める。会場でスライド作りをしてたわけで、初日の発表はあまり聞けなかった。</p> <p>幸運なことに闇トーカーに選ばれて「打倒tDiaryメンバー募集」というタイトルで脱tDiaryとPipinについて話させていただいた。Yokohama.rbについては我らが @1syo に丸投げして、完全に個人的な内容でいくことにした。時間切れのドラが鳴ってしまったけど、LTだしまあ最低限言いたいところまでは言えたので、自分的に目的は果たせた。</p> <p>tDiary方面に対して挑発的なタイトルだけども、相手は元祖モヒカンのただただしだし、ハンドアックスを投げつけることに躊躇はいらないと思った。というかオレの攻撃力じゃカスリ傷ひとつ与えられる気がしないので、躊躇すること自体がおこがましい。なので容赦なく投げたが、投げ返される覚悟はちゃんとしてたよ。</p> <p>翌日たださんに「だんさんをとっちめなきゃ」と言われたり、きたさんに凄まれたりしてたいへん光栄です。</p> <p>発表内容とかPipinについての詳しいことは別エントリであとで書く。</p> <h3>2日目</h3> <p>1日目のあと、池袋でVDD方面のオーストラリア組と一緒に飲んでたのだけど、あのAndyの異様なハイテンションの中にあってコーラしか飲まなかったため体調は前日よりも良し。</p> <p>さて2日目のメインイベントは「ゆRuby」。 お昼に3Fの和室で「toRuby, guRuby, Yokohama.rb 出張版」という形で勉強会を開催。</p> <p>しかし、Yokohama.rbの名前が入ってはいるものの、実質Yokohama.rbが貢献することは何もなくて、勉強会を勉強させてもらうために参加させていただいた次第。本当はYokohama.rbからも何か企画を提案出来ればよかったのだけど、こちらの力不足で形にできなかった。とうわけで結果的にも本当にただおじゃまさせていただいただけで、この辺でもこれからの課題が浮き彫りに。</p> <p>guRubyの「初めてのRuby」読書会セッションは著者のyuguiさんに本人に朗読してもらうという豪華セッション。和室で「正座禁止」というゆるさを強制される中、yuguiさんは厳格で厳しくって、個人的にあの雰囲気のyugui先生好き。</p> <p>後半はこれまた豪華で咳さんによるdRuby体験セッション。dRubyを触るのが8年ぶりくらいだったので新鮮だった。toRubyは安定感があって貫禄の存在なので、あの空気感をYokohama.rbのメンバーが経験できたのは良かったと思う。</p> <p>ゆRubyにYokohama.rbが参加させてもらう形を実現したのは@1syoによる働きかけによるもので、Yokohama.rb側からすればたいへんなGJ。きっと今後の勉強会運営において、貴重な経験になるに違いない。 toRuby, guRubyのみなさま、本当になんにもお手伝いできませんでしたがいい体験ができました。本当にありがとうございました。</p> <p>角谷さんの話はこれからの活動を考える上での大きなヒントになるはず。冒頭でYokohama.rbに言及していただいて光栄だった。</p> <p>2日目本編終了後、懇親会の開始まで少し時間があったので、急遽その場にいた10人くらいでぞろぞろと池袋ジュンク堂で行われているというRubyKaigi写真展にいくことにした。到着すると壁に10枚ちょっとの写真が貼ってあるだけで一瞬拍子抜けしたんだけど、実際写真を見てるとどれだけいても飽きないという不思議な空間だった。2006年から毎年の写真が並んでいて、どこを見てもいろんな思い出があって感慨深い時間を過ごすことができた。行って大正解だった。</p> <h3>3日目</h3> <p>3日目はゆっくり発表を見ることができた。</p> <p>特に島田さんの存在が印象に残っている。</p> <p>昼にRails勉強会@東京が行われているという噂を聞きつけて3Fへ行ってみると、なんと@1syoが仕切っているではないか。最近Rails勉強会に顔を出してなかったけど、こっちでも活躍してたのね。</p> <p>後半はAkitaOnRailsさんが飛び入り参加してのスピーチ。突然激アツのスピーチが始まって、英語力が足りないことを悔やみつつも、英語を学ぶモチベーションをもらうことができた。ハプニング的な展開まで含めてとてもアツイ場になっていた。</p> <p>アジャイル系の本は買ったことなかったのだけど、薄くて読みやすいと聞いて<a href="http://www.amazon.co.jp/o/ASIN/4274068560/dgames0a-22">アジャイルサムライ</a>を買いに行ったら、おさださんが「一番最初に売れたのはだんさんの<a href="http://www.amazon.co.jp/o/ASIN/4777512924/dgames0a-22">本</a>ですよ!!」と教えてくれて、またRubyKaigi直前に立て続けに売れちゃって在庫の調達が大変だったとか、光栄なお話をいただいてびっくり。この辺の話しを突然元気いっぱいに言われてドキッとしてしまったのだけど、あくまできのこ派なので自重。</p> <h3>まとめ</h3> <p>とにかくいろんなことが多すぎて、とても書ききれない。やっぱりまとまらないので思いついたまま書いていく。</p> <p><a href="http://d.hatena.ne.jp/nagachika/20110717/lt_rubykaigi2011">@nagachikaのLT</a>はとっても良かった。個人的にLTの中で一番面白かった。@nagachikaは、昨年のRubyKaigiの直後Yokohama.rbを立ち上げることをWebで表明したとき真っ先に参加表明をしてくれた人で、そのあと<a href="http://d.hatena.ne.jp/nagachika/20100831/start_ruby_trunk_changes">ruby-trunk-changesがはじまった</a>り、コミッタになったり、Yokohama.rbでも発表してもらったりと、この一年ほんと活躍してるのを近くで見てたし、何かとお世話になったり。</p> <p>@1syo。さんざん話題になっていたので今更特に書くまでもないのだけど、もしYokohama.rbが100人の村だったら30人が@1syoです。というくらい彼が今のYokohama.rbを形作ってるし動かしてる。スライドでの登場回数も得点王争いに参加できるほどだったんじゃないかな。3日目はもう燃え尽きてたけど、大変だったぶんいろんなことを動かしたと思うよ。横浜の坂本龍馬。</p> <p>他にもYokohama.rbのメンバーが活躍してるところや、楽しそうにしているところをたくさん目撃した。</p> <p>今回、今までのRubyKaigiと比べて個人的に大きな違いがあって、それはYokohama.rbというホームがあったということ。 一般参加した去年はランチにいくにしても夜ふらっと飲みに行くにしてもメンバー探しに一苦労してたわけだけど、今回はその心配がまったくなかった。ランチ行きましょうと #yokohamarb のハッシュタグをつぶやけば、誰かしらつかまるという安心感は初めての経験だった。でもこっやって内輪で仲良くしてると、外の人がボッチ感を感じちゃう気持ちがわかるので難しいんだけど、よくも悪くも今までとは全然違った。</p> <p>先日一緒にハッカソンをやった姉妹rbであるMinami.rbのメンバーもともずっと仲良くさせてもらった。つじたさんとも会えて良かった。</p> <p>Yokohama.rbと関係ないところでは、岡山からひとりで来たという学生さんと話す機会があってパワーを貰ったり。そして、なによりたださんと絡めて嬉しかった。また最後の席が偶然柴田(@hsbt)さんでちょっとだけPipinについて話ができたことも幸運だった。</p> 2011-07-19T00:00:00+09:00 #railshachathon ふりかえり http://dgames.jp/dan/permalink/20110626 次をやりたい新しい人たちを呼びたい第何回が参加のハードルを高くしてる毎回が第1回初めてでも楽しめます、と書く時間を長くみんな一緒の部屋でひとりチームをやってみたい足りないとかない決算の方法を考える... <h2>#railshachathon ふりかえり</h2> <p>来週のYokohama.rbの懇親会でふりかえりをやるという提案もあったけど、帰りの電車でさくっとふりかえった。 ただし一部の具合の悪くなった人たちは不参加。</p> <h3>keep</h3> <ul> <li>mと@watarumの参加</li> <li>運営<ul> <li>段取り</li> </ul></li> <li>minamiの人たちと交流できた</li> <li>ファウンダー同士の交流。hubだから</li> <li>日本酒がうまかった</li> <li>山喜<ul> <li>回線</li> <li>畳の匂いが良かった</li> <li>一階はいろいろキレイ</li> <li>海近</li> </ul></li> <li>プロジェクタがあった</li> <li>品評会の場所が調度良かった</li> <li>13時入りは時間が確保できた</li> </ul> <h3>problem</h3> <ul> <li>募集を分けたのは?</li> <li>連絡がゆきとどかなかった?</li> <li>成果物の実用性が?</li> <li>電源タップ</li> <li>たぶん部外者が #railshackathon で不謹慎なツイートをしてた</li> </ul> <h3>try</h3> <ul> <li>次をやりたい</li> <li>新しい人たちを呼びたい</li> <li>第何回が参加のハードルを高くしてる</li> <li>毎回が第1回</li> <li>初めてでも楽しめます、と書く</li> <li>時間を長く</li> <li>みんな一緒の部屋で</li> <li>ひとりチームをやってみたい</li> <li>足りないとかない決算の方法を考える</li> </ul> 2011-06-26T00:00:00+09:00 bundlerでgemを作ってみる http://dgames.jp/dan/permalink/20110619 githubのDashboardのNewRepositryでリポジトリを作成し、そのあと表示される以下のヘルプの手順でOK。ExistingGitRepo?cdexisting_git_repogitremoteaddorigingit@github.co... <h2>bundlerでgemを作ってみる</h2> <p>昨日のYokohama.rbで#railshackathonに向けたアイデアソンでいろいろ話してたら 新しいブログシステムのメージが具体化してきた。</p> <p>実装はbilbo以上に小さくできそうな気がしているので、もうアイデアをメモするよりもメモがわりにプロジェクトを立ち上げてしまっていいかなと。</p> <p>で、どうせだから今回はgem化してみよう。</p> <p>以前@jugyoに教えてもらったjewelerを使ってみようかなと思ったけど、gem作成においてより後発のbundlerを使ってみることにする(thx @takkanm @nagachika)。</p> <h3>雛形の作成</h3> <pre>gem install bundler</pre> <p>新しいgem化するプロジェクト名をpipinとすると、</p> <pre>bundle gem pipin</pre> <p>これでpipin gemの雛形ができる。</p> <pre>=&gt; create pipin/Gemfile create pipin/Rakefile create pipin/.gitignore create pipin/pipin.gemspec create pipin/lib/pipin.rb create pipin/lib/pipin/version.rb</pre> <h3>Hello Pipin</h3> <p>ひな形として作成されたlib/pipin.rbに"Hello Pipin!"の表示を追加する。</p> <pre>module Pipin # Your code goes here... puts 'Hello Pipin!' end</pre> <p>それとpipin.gemspecのTODO(2箇所)を書き換えてbuildする(TODOという文字列が残っているとbuildできない)。</p> <pre>rake build =&gt; pipin 0.0.1 built to pkg/pipin-0.0.1.gem</pre> <p>gemファイルが作れた模様。</p> <h3>gem install</h3> <p>次のようにbuildで作成されたpkg/*.gemファイルを直接指定したらインストールできた。</p> <pre>gem install pkg/pipin-0.0.1.gem</pre> <p>実行してみる。</p> <pre>ruby -r pipin -e '' =&gt; Hello Pipin!</pre> <p>うまくいった!</p> <h3><a href="RubyGems">RubyGems</a>.orgで公開</h3> <p>pipin.gemspecの s.authorsとs.emailをRubyGems.orgに作成したアカウントに合わせてbuildした上で、</p> <pre>gem push pkg/pipin-0.0.1.gem</pre> <p>でOK。</p> <h3>githubへ</h3> <p>githubのDashboardのNew Repositryでリポジトリを作成し、そのあと表示される以下のヘルプの手順でOK。</p> <pre>Existing Git Repo? cd existing_git_repo git remote add origin git@github.com:dan5/pipin.git git push -u origin master</pre> 2011-06-19T00:00:00+09:00 oink雑談 http://dgames.jp/dan/permalink/20110610 oink雑談今回は全然メモとれなかった。あるプロジェクトのドラフト見せてもらって、あとはずっとデザイン哲学についての話しをしていた。千駄ヶ谷のコーヒーはハウスブレンドだった... <h2>oink雑談</h2> <p>今回は全然メモとれなかった。 あるプロジェクトのドラフト見せてもらって、あとはずっとデザイン哲学についての話しをしていた。</p> <ul> <li>千駄ヶ谷のコーヒーはハウスブレンドだった</li> </ul> 2011-06-10T00:00:00+09:00 MacにCoffeeScriptをインストール http://dgames.jp/dan/permalink/20110607 以下の内容でhello.coffeeを作成する。hello=-&gt;console.log("HelloWorld!")hello()以下で実行。coffeehello.coffeejsファイルを生成する場合は-cを使う。coffee-chello.co... <h2>MacにCoffeeScriptをインストール</h2> <h3>手順</h3> <ol> <li>nvmをインストール ... nvmはnode.jsのrvm</li> <li>nvmでnode.jsをインストール</li> <li>npmでcoffee-scriptをインストール</li> <li>環境設定(未解決)</li> <li>Hello World</li> </ol> <h3>nvmとnode.jsのインストール</h3> <p>gitはインストール済み。</p> <pre>git clone git://github.com/creationix/nvm.git ~/.nvm . ~/.nvm/nvm.sh setopt no_nomatch nvm sync nvm install v0.4.8</pre> <p>最後のnvm installでnode.jsの0.4.8をインストールしている。</p> <p>以下は上記にたどりつくまでの試行錯誤のログ。</p> <pre>git clone git://github.com/creationix/nvm.git ~/.nvm . ~/.nvm/nvm.sh nvm sync nvm install latest</pre> <p>としたら、installのところで以下のようなメッセージが出てうまくいかない。</p> <pre>nvm_version:27: no matches found: v*.*.* nvm:40: no matches found: -# nvm: install N/A failed!</pre> <p><a href="http://d.hatena.ne.jp/magicalhat/20110510/1305000613">zshのとき</a>は以下を実行するといいらしい。</p> <pre>setopt no_nomatch</pre> <p>ここで改めてもう一度、</p> <pre>nvm sync</pre> <p>うまく行った模様。 さっきまで出ていた以下のようなメッセージが消えた。</p> <pre>nvm_version:27: no matches found: v*.*[02468].* nvm_version:27: no matches found: v*.*.*</pre> <p>改めて、</p> <pre>nvm install latest</pre> <p>を実行。がしかし、</p> <pre>nvm: install N/A failed!</pre> <p>と言われて止まってしまう。</p> <p>nvm ls で最新版を調べて、</p> <pre>nvm install v0.4.8</pre> <p>としたら無事インストールできた。</p> <ul> <li>参考<ul> <li><a href="http://d.hatena.ne.jp/z3100/20110501/1304255662">http://d.hatena.ne.jp/z3100/20110501/1304255662</a></li> <li><a href="http://blog.sarabande.jp/post/2320225420">http://blog.sarabande.jp/post/2320225420</a></li> </ul></li> </ul> <h3>CoffeeScriptのインストール</h3> <pre>npm install coffee-script</pre> <h3>環境設定</h3> <p>まだこの作業は未完了。</p> <p>ログイン後、以下でnvmが使えるようになる。</p> <pre>. ~/.nvm/nvm.sh</pre> <p>さらにuseコマンドでバージョン指定。</p> <pre>nvm use v0.4.8</pre> <p>これでnodeが使えるようになる。</p> <p>coffeeコマンドは以下にある。</p> <pre>.npm/coffee-script/1.1.1/package/bin</pre> <p>毎回直接呼ぶのは面倒なわけだけど、 どうしたものやら(未解決)。</p> <p>とりあえず毎回以下を実行してしのぐことにする。</p> <pre>. ~/.nvm/nvm.sh nvm use v0.4.8 alias coffee='~/.npm/coffee-script/1.1.1/package/bin/coffee'</pre> <h3>Hello World</h3> <p>以下の内容でhello.coffeeを作成する。</p> <pre>hello = -&gt; console.log("Hello World!") hello()</pre> <p>以下で実行。</p> <pre>coffee hello.coffee</pre> <p>jsファイルを生成する場合は-cを使う。</p> <pre>coffee -c hello.coffee node coffee.js</pre> <ul> <li>参考<ul> <li><a href="http://tech.kayac.com/archive/coffeescript-tutorial.html">http://tech.kayac.com/archive/coffeescript-tutorial.html</a></li> </ul></li> </ul> 2011-06-07T00:00:00+09:00 いま改めて静的なブログシステムを採用してはどうか http://dgames.jp/dan/permalink/20110605 今のシステムでは最初からトラックバックを捨てている。今後もいらない。コメント機能がほしいかは微妙なんだけど、メンテが面倒なのでない方がいいかな。返事を書くの苦手だし。関連ツイートとかブックマークコメントを表示するブラウザ動作の機能ならあってもいいかもしれな... <h2>いま改めて静的なブログシステムを採用してはどうか</h2> <p>新しいblog環境案について考える。</p> <h3>ふりかえり</h3> <p>いまのblog環境の不満点。</p> <ul> <li>重い<ul> <li>SinatraをCGIで動かしているから</li> </ul></li> <li>システムを全然メンテできてない</li> <li>大量の写真を気軽に扱いたい</li> </ul> <p>いいところとしては、</p> <ul> <li>記事の投稿が楽。<ul> <li>ローカルのdraft.txtに記事を書いて(複数エントリも書ける)、make updateするだけ</li> </ul></li> </ul> <p>かな。いいところは他にもあるんだろうけど特には思い浮かばない。</p> <h3>静的か動的か</h3> <p>さて。</p> <p>まず最大の不満点は重いことなのだけど、これはCGIで無理やり動かすから遅いわけで、ふつうにサーバー起動させれば負荷はほぼゼロにできる。しかし、今使っているさくらのプランではサーバー起動が禁止されているし、ブログのために新たなサーバー環境を用意するのもどうかなと思っている。</p> <p>そもそもなんでblogを動的なシステムにしてるんだろうか。静的なシステムじゃだめだろうか。</p> <p>静的なシステムでも、新しい記事をアップするたびに毎回ブログ全体を構築し直せば、今と同じUIを実現できるはず。動的でなければ成り立たない仕組みは今は使ってない。全体を再構築しなければならない理由は、「前の5件」で順々にページをめくる機能があるからだ。これはカテゴリ表示のときも同じ。</p> <p>いっそのこと記事単体のhtmlとそのファイル名のリストをサーバー側に置いて、あとはブラウザ側のJavaScriptでUIを構築すればいいじゃんって考えたんだけど、そうするとJavaScriptが不十分な環境だと記事がひとつも読めなかったり、SEO的に問題がでそう…。</p> <p>もろもろ含めて見えてくるのは、基本静的で一部JavaScriptを使って動的に見せるというラインかな。JavaScriptが動作しない環境では人間にとって便利な一部のUIがなくなる感じ。この場合CGIや動的な仕組みは一切なし。ただしrssの生成等にcronを使う。</p> <p>静的なhtmlベースでの運用は、なんといっても安心感がある。運用コストも低い。</p> <h3>システムのメンテを楽にしたい</h3> <p>Sinatraにしてもそれなりに進化の速度が早いので、便利な半面、最新版追従の作業がしばしば発生する。</p> <p>これも静的にしたい理由のひとつで、静的なhtmlの生成の方がシンプルで外部ライブラリへの依存度も減る。動的にhtmlを生成しないのであれば、haml等のテンプレートエンジンだけあればいい。</p> <h3>tumblrとか使ってみたら?</h3> <p>外部のblogサービスを使う手についても考えるんだけど、なかなか踏み切れない。</p> <p>さがしあたってのネックは写真。新しいシステムでは、たくさんの写真を手軽に扱いたいのだけど、既存サービスの上に乗せようとすると容量その他で制約がでてきそう。</p> <h3>トラックバックやコメント機能</h3> <p>今のシステムでは最初からトラックバックを捨てている。今後もいらない。</p> <p>コメント機能がほしいかは微妙なんだけど、メンテが面倒なのでない方がいいかな。返事を書くの苦手だし。 関連ツイートとかブックマークコメントを表示するブラウザ動作の機能ならあってもいいかもしれない。</p> 2011-06-05T00:00:00+09:00 oink雑談 http://dgames.jp/dan/permalink/20110603 oink雑談ほぼ週に一度、株式会社oinkgamesの事務所でテーマを決めずに雑談をしている。今日で4回目かな。以下てきとーな議事ログ。オレ遅刻手土産に3本のコーラ世界で売れるのはお茶じゃなくてコーラアメリカのお茶は甘い。炭酸入り「oinkはコーラじゃない... <h2>oink雑談</h2> <p>ほぼ週に一度、株式会社oinkgamesの事務所でテーマを決めずに雑談をしている。 今日で4回目かな。</p> <p>以下てきとーな議事ログ。</p> <ul> <li>オレ遅刻<ul> <li>手土産に3本のコーラ</li> <li>世界で売れるのはお茶じゃなくてコーラ</li> <li>アメリカのお茶は甘い。炭酸入り</li> <li>「oinkはコーラじゃないですよ」</li> </ul></li> <li>iPadの対戦ゲームでみんなで遊ぶ<ul> <li>音と絵が合ってない?</li> <li>面白いけど売れてないんだろうなー</li> </ul></li> <li>iPadウォーリーのゲーム<ul> <li>対戦の画面の向きがダメ</li> </ul></li> <li>iPad牽引ビームのゲーム<ul> <li>慣れてくると面白そう</li> </ul></li> <li>iPhoneアプリを売る<ul> <li>面白いけどぜんぜん売れてなさそう</li> <li>日本のサイトは有名なゲームを紹介するけど、海外のサイトは「オレこんなのみつけたぜ」的なノリ</li> </ul></li> <li>子供用アプリを紹介するブログがない<ul> <li>ひどいアプリ。アイテム課金になっててエサとかを勝手に買えちゃう?</li> <li>いや、15分とか過ぎれば認証がかかる</li> <li>設定自体によっては?</li> <li>海外の子供向けアプリはえげつない。のがある</li> <li>子供向けアプリに広告とか課金ボタンが出てほしくない</li> </ul></li> </ul> <p>以下、iPadの話題かな。</p> <ul> <li>よくできた子供向けアプリ</li> <li>今日の残念アプリ<ul> <li>同期していない。可能性はある</li> <li>はしに次のページボタンがあるといいのに</li> </ul></li> <li>もりかわさんのアプリ<ul> <li>間がいい</li> <li>とてもよくできてる</li> </ul></li> <li>子供向けじゃないけど子どもが何時間でも遊べそうなアプリ</li> <li>バランスを取るゲーム<ul> <li>ここできくちさん(でざいな)登場</li> <li>最長のハマり</li> <li>鳥がなあ。鳥がきついよ</li> <li>雪だるまが溶けてる!</li> <li>こうなってきたら最後がみたい</li> <li>おっさんでた!</li> </ul></li> </ul> 2011-06-03T00:00:00+09:00 RubyのFiberを使ってマイクロスレッドでタスクを管理する http://dgames.jp/dan/permalink/20110108 RubyのFiberを使ってマイクロスレッドでタスクを管理する@fum1h1roの開発した社内スクリプト言語ではコルーチンが簡単に書ける。この言語を使ってゲームを開発するようになって、ようやくこのコルーチンの便利さが理解できた。RiteVMが出ることだし、... <h2>RubyのFiberを使ってマイクロスレッドでタスクを管理する</h2> <p>@fum1h1ro の開発した社内スクリプト言語ではコルーチンが簡単に書ける。 この言語を使ってゲームを開発するようになって、ようやくこのコルーチンの便利さが理解できた。</p> <p>RiteVMが出ることだし、RubyのFiberについて調べてみるとまさにこれ!ということがわかり、 ちょっと触ってみたのでメモしておく。</p> <p>そもそもFiberがどんな時に便利なのかピンと来ない人も多いかもしれない。 オレ自身ごく最近までその便利さが理解できなかった。 だが、もはやこれがないと(ゲームの)プログラムが書けないと言っていいくらい必須なものとなりそうなのだ。</p> <p>Fiber(コルーチン)が使えるのはこんなケースだ。</p> <p>1回ボタンが押されると3発のミサイルが発射される仕様のゲームがあったとする。</p> <ol> <li>1発目のミサイルはボタンを押した瞬間に発射される</li> <li>2発目のミサイルはボタンを押した1秒後に発射される</li> <li>3発目のミサイルはボタンを押した2秒後に発射される</li> <li>ボタンが押されてから3秒間はミサイルを発射することができない</li> </ol> <p>今までならカウンタ変数を設けて、カウンタが一定値に達したことを条件としてミサイルの発射処理を実行していた。</p> <p>ここでFiberを用いると上記のような処理を直接的かつシンプルに表現できる。</p> <p>以下にFiberを使ったコードを具体的に示す。TaskクラスはFiberを継承したクラスでその小さな実装はあとで紹介する。</p> <pre>maintask = Task.new do is_ready = true is_over = false Task.create { Task.sleep 5; is_over = true } until is_over if is_ready #and pad_pushed?(:a) is_ready = false puts "fire1!" Task.create do Task.sleep 1 puts "fire2!" Task.sleep 1 puts "fire3!" Task.sleep 1 is_ready = true end end Task.yield end Task.join Task.yield true end until maintask.resume sleep 0.1 puts "." end</pre> <p>タスクは親子関係を持っていて、タスクの中ではTask.createを用いていくつでも子タスクを作ることができる。 Task.yieldが呼ばれるとそこでいったん処理が中断し、 Task.sleepは与えられた秒数だけ処理を中断する。</p> <p>パッドのボタンが押されたとき、ミサイルの発射処理を行うのは以下の部分だ。</p> <pre> is_ready = false puts "fire1!" Task.create do Task.sleep 1 puts "fire2!" Task.sleep 1 puts "fire3!" Task.sleep 1 is_ready = true end</pre> <p>簡単に説明すると、まず最初のミサイルを発射した後、新しいタスク(fiber) 作成している。 タスクの中では1秒待って次のミサイルを発射し、もう1秒待ってミサイルを発射し、もう1秒待ってミサイル発射準備を整えているわけだ。is_readyがtrueになるまではここに来ないので次のミサイルを発射することはできない。</p> <p>ここで作られたタスクは裏で動くことになるので、Task.createメソッド自体はすぐに処理が終了して帰ってくる。</p> <p>is_overがtrueになるとループが終了するが、 メインタスクが起動してから5秒後にis_overをtrueにするという処理も冒頭でタスク化している。</p> <p>ちなみに、ミサイルの発射部分のタスクは次のようにそれぞれ別のタスクとして書くこともできる。</p> <pre> Task.create { Task.sleep 1; puts "fire2!" } Task.create { Task.sleep 2; puts "fire3!" } Task.create { Task.sleep 3; is_ready = true }</pre> <p>このすれば、最初にパッドが押されたタイミングを基準として発射時間を管理することができる。</p> <p>maintaskの最後に次の2行がある。</p> <pre> Task.join Task.yield true</pre> <p>joinはタスクの終了を待つメソッドだ。引数を省略すると子スレッドすべての終了を待つ。 最後でTask.yieldにtrueを渡しているのはmaintask.resumeの戻り値をプログラムの終了条件としているためだ。</p> <p>Fiberを使って処理を書いていくといろんなものがタスク化出来ることに気づく。 きっと発射されたミサイルもそれぞれが独立したタスクとして管理されることだろう。</p> <p>このように少なくともゲームにおけるキャラクター操作、そしてエフェクト表示やサウンド再生のタイミングなどは、Fiberを用いることでとてもシンプルに管理できるようになるのだ。</p> <p>RiteVMがでればゲームにRubyを組み込むことはこれまでとは比較にならないほど容易になるだろう。 Rubyで本格的なゲームを作れる日は近いはず。</p> <p>最後に上記コードを走らせるのに必要なTaskクラスの実装を載せておく。 joinとjoinに関連した部分で長くなっているが、それでも50行ほどの小さなコードだ。</p> <pre>class Task &lt; Fiber @@current_task = nil attr_accessor :tasks, :status def initialize(*args) super @tasks = [] @status = :run end def alive? @status end def resume(*args) @@current_task = self r = super(self) @@current_task = nil dead_tasks = [] @tasks.each do |t| begin t.resume(t) rescue FiberError t.status = nil dead_tasks &lt;&lt; t end end @tasks -= dead_tasks r end def create_task(*args, &amp;block) @tasks &lt;&lt; Task.new(*args, &amp;block) end def join(*args) args = tasks if args.empty? Task.yield while args.flatten.any?(&amp;:alive?) end def self.create(*args, &amp;block) @@current_task.create_task(*args, &amp;block) end def self.join(*args) @@current_task.join(*args) end def self.sleep(sec) t = Time.now self.yield while Time.now - t &lt; sec end end</pre> <p>ツッコミは @dan5ya まで。</p> 2011-01-08T00:00:00+09:00 組み込みスクリプト言語とRiteVM勉強会開催のお知らせ http://dgames.jp/dan/permalink/20110105 組み込みスクリプト言語とRiteVM勉強会開催のお知らせ今週の土曜日の夕方から組み込みスクリプト言語の勉強会をやります。同僚の@fum1h1roが自社のゲーム開発用に開発したスクリプト言語の実装や開発に至った経緯について発表してくれる予定です。この社内スク... <h2>組み込みスクリプト言語とRiteVM勉強会開催のお知らせ</h2> <p>今週の土曜日の夕方から組み込みスクリプト言語の勉強会をやります。</p> <p>同僚の @fum1h1ro が自社のゲーム開発用に開発したスクリプト言語の実装や開発に至った経緯について発表してくれる予定です。 この社内スクリプト言語は、JavaSriptぽい(ハッシュとかないのでもっとシンプル)言語で、コンパイルにはRaccを使い、VMはCで実装しています。</p> <p>後半は「RiteVM勉強会」をやりたいと思います。 今年公開されると期待される組み込みRubyについて思いを巡らせながら想像で勉強してみたり、どんな環境で動いて欲しいかの要望をMatzに送るべくまとめてみたりする予定です。</p> <ul> <li>ATNDがあります ... <a href="http://atnd.org/events/11603">http://atnd.org/events/11603</a></li> </ul> <p>場所はいつもYokohama.rbでも使っている東神奈川の地区センターの和室です。</p> <p>よろしくお願いします。</p> 2011-01-05T00:00:00+09:00 Rubyのmapメソッドの使い方 http://dgames.jp/dan/permalink/20101206 まとめます。a=["a","abc","abcdef"]上記のようにaが文字列の配列だった場合、mapを使うと…l=a.map{|e|e.length}.maxputsa.map{|e|e.rjust(l)}このような2行で、当初の目的を達成することができ... <h2>Rubyのmapメソッドの使い方</h2> <p>(この記事は<a href="http://atnd.org/events/10430">Ruby Advent Calendar jp: 2010 : ATND</a>の6日目です。前日は<a href="http://typo.okkez.net/2010/12/05/try-activegroonga#">okkez</a>さんでした。)</p> <p>Rubyにはmapメソッドというたいへん便利なメソッドがあります。</p> <p>配列aにはいくつかの文字列が入ってるとします。</p> <pre>a = ["a", "abc", "abcdef"]</pre> <p>この文字列を次のように右寄せで表示したいとき、どう書けばいいでしょう。</p> <pre> a abc abcdef</pre> <p>いろんなやり方がありそうすが、ここではmapメソッドを使った例を紹介すると同時に mapメソッドの使い方について詳しく解説します。</p> <h3>まずeachメソッドで書いてみる</h3> <p>まずその前に。</p> <p>mapメソッドを使った書き方を紹介する前により易しいeachメソッドを使って書いてみます。</p> <pre>a = ["a", "abc", "abcdef"] l = 6 a.each {|e| puts e.rjust(l) }</pre> <p>実行結果</p> <pre> a abc abcdef</pre> <p>eachメソッドで配列の値をひとつひとつ順番に取り出してputsしています。 配列から取り出した値は変数eに代入され、要素数だけブロックが繰り返し実行されます。 (eはただの変数名です。別にeでなくても任意の好きな名前をつけることができます。)</p> <p>文字列をレシーバにしてrjustメソッドを呼び出すと、rjustメソッドは文字列を右詰にして返します(左の余白はスペースで埋められます)。右詰めしたあとの文字列の長さは引数で渡しています。</p> <pre>"a".rjust(6) #=&gt; " a"</pre> <p>rjustメソッドの挙動は上記のような感じです。</p> <p>同じ処理をCやJavaで書くと、このeachの例のように繰り返しを使うことが多いのではないでしょうか。</p> <h3>mapメソッドを使ってみる</h3> <p>さてここからが本番です。</p> <p>mapメソッドを用いた書き方を紹介します。</p> <pre>a = ["a", "abc", "abcdef"] l = 6 a = a.map {|e| e.rjust(l) } puts a</pre> <p>実行結果</p> <pre> a abc abcdef</pre> <p>配列の内容が変数eに順々に入ってくるのはeachのときと同じですが、 mapメソッドは戻り値で配列を返します。</p> <p>上の例でmapメソッドが返す配列は、もとの配列aの要素それぞれにrjustメソッドを適用した結果になります。 具体的には配列aの中の文字列は、それぞれ次のように置き換えられて、その結果が新しい配列として作られます。</p> <pre>"a" → " a" "abc" → " abc" "abcdef" → "abcdef"</pre> <p>上の例ではmapメソッドの戻り値を改めてaに代入して全体を新しい配列に置き換えていますが、 ここでmap!メソッドを使えば、もとの配列aを直接書き換えてしまうこともできます。</p> <pre>a = ["a", "abc", "abcdef"] l = 6 a.map! {|e| e.rjust(l) } puts a</pre> <p>map!は、レシーバの内容を変更してしまう破壊的なメソッドです。</p> <p>(おっと、説明を忘れていましたが、putsメソッドは引数に配列を渡すと要素それぞれを改行しながら表示してくれます。putsに渡すとき「a.join(\n)」として配列をひとつの文字列に変換してもいいのですが、幸いその必要がありません。)</p> <p>実はaを置き換えなくても次のようにmapの戻り値を直接putsの引数にすることも可能です。</p> <pre>puts a.map {|e| e.rjust(l) }</pre> <p>(こうすると、aは置き換えられることなく最初の内容が保たれます。)</p> <p>慣れないうちは結合の優先順位をイメージしにくいかもしれません。参考までに省略されているカッコを書くとこうなります。</p> <pre>puts(a.map {|e| e.rjust(l) })</pre> <h3>もっとmapメソッドを使ってみる</h3> <p>さっきのコードでは、文字列の長さを6と決めて右詰の処理を行っていました。</p> <pre>l = 6</pre> <p>この6という数値は、配列の中に含まれる文字列の最も長い文字列の長さを表したものです。</p> <p>ここでもmapメソッドを使えば最も長い文字列の長さを簡単に求めることができます。</p> <pre>a = ["a", "abc", "abcdef"] b = a.map {|e| e.length } l = b.max puts l #=&gt; 6が表示される</pre> <p>aの要素に対してlengthメソッドを適用した結果をbに代入しています。 bは次のような配列になります。</p> <pre>[1, 3, 6]</pre> <p>maxメソッドは配列の中から最も大きい値を探し出して返してくれます。</p> <pre>[1, 3, 6].max #=&gt; 6</pre> <p>なお、上の例は変数bを省略して次のように書くこともできます。</p> <pre>l = a.map {|e| e.length }.max</pre> <h3>まとめ</h3> <p>まとめます。</p> <pre>a = ["a", "abc", "abcdef"]</pre> <p>上記のようにaが文字列の配列だった場合、mapを使うと…</p> <pre>l = a.map {|e| e.length }.max puts a.map {|e| e.rjust(l) }</pre> <p>このような2行で、当初の目的を達成することができます。 特に1行目の最も長い文字列の文字数を求めるところでは、eachよりmapを使ったほうがすっきり書けます。</p> <p>mapメソッドはとっても便利でかつ使えるケースが多いので、ぜひともこの機会に覚えてください!</p> 2010-12-06T00:00:00+09:00 とあるスクリプト言語に配列が欲しい http://dgames.jp/dan/permalink/20101110 以下のような関数を用意したい。言い方を変えれば配列はこのような操作ができるものであってほしい。sizea=[1,2,3]size(a)//=&gt;3size([1,2])//=&gt;2eacha=[1,2,3]each(a,puts)//=&gt;1/... <h2>とあるスクリプト言語に配列が欲しい</h2> <p>昨日の話はclassを導入しなくてもプロトタイプベースでオブジェクト指向をやるという方向性もあるのかもしれないと思った。</p> <p>プロトタイプベースというのをよく知らなかったんだけど。 あれこれ頭ん中で考えているとそういうのが自然と分かってくるね。</p> <p>考えるだけでずいぶんと勉強に。 普ものだなあ段何気なく使ってたものについてほんと考えさせられる。</p> <p>さて今日は配列に期待することを書き出してみるぞ!</p> <h3>リテラル</h3> <p>Rubyっぽい書き方に慣れているのでRubyっぽく書いてみる。</p> <pre>a = [1, 2, 3] a[0] // =&gt; 1</pre> <p>もちろん最後の「,」は省略可能だが書いてもいい。</p> <p>空の配列も作成可能。</p> <pre>a = []</pre> <h3>アクセス</h3> <pre>a = [1, 2, 3] a[0] // =&gt; 1 a[3] // =&gt; nil</pre> <p>インデックスは0からがいい。ところでなんでLuaは1からなんだろうか。 範囲外(というか未代入)にアクセスするとnilが返る。</p> <p>こういう書き方も許して欲しい。</p> <pre>[1, 2, 3][1] // =&gt; 2</pre> <h3>配列に代入できるもの</h3> <p>事なる種類の値を同じ配列に入れることもできる。</p> <pre>a = [1, "hello", [1, 2, 3]] a[2][2] // =&gt; 3</pre> <p>もらちろん多次元配列も!</p> <h3>配列操作関数</h3> <p>以下のような関数を用意したい。 言い方を変えれば配列はこのような操作ができるものであってほしい。</p> <h4>size</h4> <pre>a = [1, 2, 3] size(a) // =&gt; 3 size([1, 2]) // =&gt; 2</pre> <h4>each</h4> <pre>a = [1, 2, 3] each(a, puts) // =&gt; 1 // =&gt; 2 // =&gt; 3</pre> <p>上記は以下と同じ意味。</p> <pre>a = [1, 2, 3] each(a, fanction(e) { puts(e) }) </pre> <h4>map</h4> <pre>a = [1, 2, 3] a = map(a, to_s) p(a) //=&gt; ["1", "2", "3"]</pre> <h4>flatten</h4> <pre>a = [1, 2, [3, 4, 5]] a = flatten(a) p(a) //=&gt; [1, 2, 3, 4, 5]</pre> <h4>その他</h4> <ul> <li>map!, flatten! ... 破壊的に</li> <li>push, pop, shift, unshift, delete ... これも破壊的か</li> <li>sort, reverse, sort!, reverse!</li> </ul> <p>ほんとはこう書きたいけどこれは難しいだろうしまた別の話やね。</p> <pre>a.size() a.map(to_s)</pre> 2010-11-10T00:00:00+09:00 とあるスクリプト言語のオブジェクト指向への道のり http://dgames.jp/dan/permalink/20101109 Klassクラスを次のように定義したとする。classKlass{functionmethod1(){...}functionmethod2(){...}}これをオブジェクト(ハッシュオブジェクト)に関連付けなくてはいけない。ここでmixinという新たな仕... <h2>とあるスクリプト言語のオブジェクト指向への道のり</h2> <p>職場に独自の小さなスクリプト言語とそれを動かすVMがある。</p> <p>ゲームの組み込みに使われているんだけど、VMで動作する特性上使い勝手がよく、 文法もJavaScriptによく似ていて取っ付き易い。</p> <p>そして素晴らしいことに要望を出すとすぐに改善されるのだ。 先日は0を真に変えてもらったりもした(偽になるのはnilとfalseだけとなった)。</p> <p>まだ配列とハッシュがないのだけど、これも近々サポートされることになりそう。 そこで、その先にある(と思われる)オブジェクト指向言語化について考えてみた。</p> <p>次の3ステップでオブジェクト指向化できないかな? ツッコミどころはありそうだけど、たたき台ということで。</p> <p>※ここから先興味のある方はJavaScriptをイメージしてもらうといいかも</p> <h3>その1。「値.関数名()」と書いたらレシーバを第1引数として渡す</h3> <p>次のようにメンバ変数(ハッシュ)に関数を代入して呼び出すと、 強制的に第1引数に自分自身が渡される。</p> <pre>value.method = function(self, a) { ... } value.method(a)</pre> <p>考えたのだけどハッシュに関数を入れた場合、 selfが欲しいケースの方が断然多いんじゃないかな。</p> <p>だたしselfが不要な場合もあるかもしれないので、 そのときは次ように「!」を使って呼び出す方法も用意しておく。</p> <pre>value!method(value, a)</pre> <p>これは負荷対策以外に意味はないけど。</p> <h3>その2。メンバ関数(インスタンスメソッド)の定義方法</h3> <p>関数側も引数の定義でselfと毎回記述するのはウザイ。</p> <pre>function method(self, a) { puts(self.keys) }</pre> <p>そこで次のように書けたらどうだろうか。</p> <pre>function method(@, a) { puts(@keys) }</pre> <p>関数内の@は自動的に「self.」に置き換えられる。</p> <p>関数定義は次のような形の方がよりいいかな。</p> <pre>function @method(a) { puts(@keys) }</pre> <p>なんかインスタンスメソッドを定義しているように見えていい感じだ。</p> <p>しかしどうせならclassキーワードを導入したらどうだろう。</p> <pre>class Klass { function method(a) { puts(@keys) @method2() } function method2() { } }</pre> <p>おぉこれでいいじゃないか!</p> <p>もちろん@は「self.」に展開されるだけなので、上の@method2()のように関数呼び出しにも使える。</p> <p>さてここまで来ればオブジェクト指向言語まであと一歩。</p> <h3>その3。ミックスイン</h3> <p>Klassクラスを次のように定義したとする。</p> <pre>class Klass { function method1() { ... } function method2() { ... } }</pre> <p>これをオブジェクト(ハッシュオブジェクト)に関連付けなくてはいけない。 ここでmixinという新たな仕組みを用意する。</p> <pre>obj = {} mixin(obj, Klass) obj.method1() obj.method2()</pre> <p>mixinはKlassクラスが持っている関数のポインタそれぞれをobjのメンバに代入する関数だ。 イメージとしては次のような感じ。</p> <pre>obj.method1 = Klass.method1 obj.method2 = Klass.method2</pre> <p>あくまで静的にメソッド呼び出しを解決したいので、 mixinするクラスに階層などはない。 同じ関数名があればあとからmixinしたものが優先される。</p> <p>class型という新しい値が必要になっちゃうかな。</p> <p>ちなみにmixinは次のように書けた方がいいかもしれない。</p> <pre>obj = {} obj.mixin(Klass)</pre> <p>でもここまできたらこう書きたいよね!</p> <pre>obj = new(Klass)</pre> <p>またはこうかな。</p> <pre>obj = Klass.new</pre> 2010-11-09T00:00:00+09:00 クオリティと門とYokohama.rb http://dgames.jp/dan/permalink/20100904 「横浜へなちょこプログラミング勉強会」の@hkhumanoidと毎回運営を手伝ってくれる仲間に感謝しつつ、これからはじまるYokohama.rbをよろしくお願いします。... <h2>クオリティと門とYokohama.rb</h2> <h3>In rubykaigi2010,</h3> <p>@kakutani の発表をみてこんなことを思った。 以下、まずは当日感じたままを書いておく。</p> <p> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=4150503338&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=415050332X&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> </p> <p>「クオリティ」とよばれるものがあらしい。バイク乗りたちの言葉らしい( <a href="http://www.amazon.co.jp/o/ASIN/415050332X/bilbo-22">この本</a> に出てくる話らしい)。</p> <p>この「クオリティ」はライダーがバイクで走っているときに感じる言葉に表せないようなもの。 とにかく「いい感じ」な何かだと認識した。</p> <p>この「クオリティ」を自ら得るためには「門」を建てればいい。 かくたにさんにとっての「門」はrubykaigiであると。</p> <p>で、あとの詳しい話はもう覚えてないんだけど、そのとき「クオリティ」というものが何であるかはすぐに理解できた。 そして「門」が、「クオリティ」に通じるための有効な手段であることも同意できた。</p> <p>ここまでを認識した時点ですぐに「<a href="http://groups.google.com/group/yokohamarb">Yokohama.rb</a>」が頭に浮かんだ。 思いついてしまえば、すごく自然なことで、今までなかったのがおかしなくらい自然なことのように思えた。</p> <p>発表が終わって、かくたにさんが大ホールの階段を上がっていくとき、「Yokohama.rbを立ち上げます!」とのどまででかかったんだけど「お疲れさまでした」としか言えなかった。</p> <p>帰りの電車であるrubykaigi参加者にYokohama.rbについて話してみたら「参加してみたい!」言ってくれたので、このとき立ち上げることを決意した。家に帰るとすぐにtwitterで宣言した。</p> <h3>By the way,</h3> <div class="amazon"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=bilbo-22&o=9&p=8&l=as1&asins=4797336021&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div> <p>2010年の春から横浜で「ふつうのHaskellプログラミング読書会」というのを開催している。</p> <p>横浜には @hkhumanoid が立ち上げた「<a href="http://groups.google.com/group/yhprogramming">横浜へなちょこプログラミング勉強会</a>」という地域勉強会があり、Googleグループには100名くらいのメンバーが参加していた(と思う。2010の春の時点で)。</p> <p>そのとき残念ながら「横浜へなちょこプログラミング勉強会」の活動は休止してしまっていた。</p> <p>なんとか復活させたいと思っていたところに、会場の予約その他を手伝ってくれるという @saytx が現れて、ならばとMLに「ふつうのHaskellプログラミング読書会」を提案し、活動を再開させることができた。そして今日はその<a href="http://groups.google.co.jp/group/yhprogramming/web/haskell-6">6回目の読書会</a>。</p> <p>この「ふつうのHaskellプログラミング読書会」の運営はとても楽なものだった。数ヶ月前まで運営されていた「横浜へなちょこプログラミング勉強会」という箱があり、面倒だと思われた事務手続きを一手に引き受けてくれる人までいた。オレ自身はMLへ参加のお知らせを投げるだけだったので(根回しはしたわけだけど)、あまりに楽過ぎて、とても自分が主催しているとは思えなかった。</p> <p>今では自分で会場を予約したり、ATNDにページを作ったり、懇親会の会場を予約したりすることにも慣れた。いつの間にか横浜で勉強会を開くスキルがすっかり身に付いていたのだ。</p> <p>Yokohama.rbを立ち上げるのに必要なものは全部そろっていた。 そしてYokohama.rbという門を建てた。ここクオリティがあると信じている。</p> <h3>Anyway,</h3> <p>「横浜へなちょこプログラミング勉強会」の @hkhumanoid と毎回運営を手伝ってくれる仲間に感謝しつつ、これからはじまるYokohama.rbをよろしくお願いします。</p> 2010-09-04T00:00:00+09:00 勝手にレベルの上がるのを見守るRPG http://dgames.jp/dan/permalink/20100826 勝手にレベルの上がるのを見守るRPG先日ボタンを押すだけで経験値が増えるRPGを考えたのだが、もう一歩進んで、見てるだけで勝手にレベルが上がるのはどうだろうかと思った。操作が不要なわけだから、ただプログラム回してひたすら経験値を上げるだけの簡単なゲームと思... <h2>勝手にレベルの上がるのを見守るRPG</h2> <p>先日ボタンを押すだけで経験値が増えるRPGを考えたのだが、 もう一歩進んで、見てるだけで勝手にレベルが上がるのはどうだろうかと思った。</p> <p>操作が不要なわけだから、ただプログラム回してひたすら経験値を上げるだけの簡単なゲームと思って試しに実装しようと思ったんだけど、 いざ作り始めてみるとこれが難しい。</p> <p>一般的なRPGとは操作方法がまったく違うわけで、つまりUIがまったく違うので、そもそも基本画面をどんな形にすれば良いのかが決まらない。</p> <p>ただ見てるだけだとちゃんとしたゲームにならないので、そこに何を足せば面白くなるのか、 何かを足すにしても出来るだけ少ないシステムで面白くするにはどうすればいいかというところで悩んで、 実装が進まなくなってしまった。</p> <p>以下メモ。</p> <ul> <li>shachiは町を歩いています</li> <li>shachiは町を出ました</li> <li>shachiはスライムに遭遇しました</li> <li>shachiは戦っています</li> <li>shachiは戦っています</li> <li>shachiはスライムを倒しました<ul> <li>=&gt; 「やくそう」を入手</li> </ul></li> <li>shachiはぼーっとしています</li> <li>shachiはやる気がありません</li> <li>shachiはドラゴンに遭遇した</li> <li>shachiは戦っています</li> <li>shachiは剣の扱い方がわかりません</li> <li>shachiは敵と戦う勇気がありません</li> <li>shachiは戦っています</li> <li>shachiはダメージを与えることができません</li> <li>shachiはドラゴンにまったく歯が立ちません</li> <li>shachiはドラゴンを倒しました<ul> <li>=&gt; shachiはレベルが上がりました</li> </ul></li> <li>shachiは町に戻りました</li> <li>shachiは剣の修行をしています<ul> <li>成果はありませんでした</li> </ul></li> <li>shachiは剣の修行をしています<ul> <li>=&gt; shachiは剣のレベルが上がりました</li> </ul></li> </ul> 2010-08-26T00:00:00+09:00 test http://dgames.jp/dan/permalink/20100602 testtest...... <h2>test</h2> <p>test...</p> 2010-06-02T00:00:00+09:00