Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2011-10-21

C言語を知ってて良かった話

低級言語Rubyの世界。

--

メカじい「まだいたのか。いつまで突っ立てるんだ。他の連中はとっくに行っちまったぞ。暗くなる前にささっと帰れ」

子供「あの…。何か仕事はありませんか…?」

メカじい「仕事?人を雇う余裕なんてねぇよ。前らが知ってるマシンランゲジなんてここじゃ何の役にも立たねぇ」

子供「あの一応Rubyが書けます。あとCも少しだけ…」

メカじい「なんだと!Cが書けるのか!?」

子供「はい。古い井戸の水汲みをRubyで制御してて…あの重量センサが調子悪くって、Cで拡張して…」

メカじい「……」

子供「その…ただIOの調子悪かっただけで繰り返しリトラ…」

メカじい「んー、金曜の夜だけ店の灯りが消えねえんだ。ちょっと見てくれ。安心しろお前らの大好きなマシンランゲじだ。パスワードは…」

子供「はい!」

2011-10-20

36歳からでもリフティングはうまくなるか?

夏に36歳になった。36と言えばプログラマを引退すべきと言われるかもしれない年齢だ。

35歳までしかプログラミングできないかどうかは興味深いところではあるけども、 それはさておき、今日はリフティングについて考えてみる。

このところの週末は特別な事情がない限り、3年生の息子の通う地元の少年サッカーチームで親コーチをしてる。 コーチと言ってもオレはもともとサッカー経験者ではない。 とはいえ、コーチの役割はサッカーの手本を子供に見せることだけではないし、小さな子達をまっすぐ並ばせるだけでも骨の折れる作業なので、仕事はいくらでもあるのだ。

今年でコーチ3年目だけど、3年生になると子供の成長力が急激に上がるのを日々目の当たりにしている。おそらくゴールデンエイジと言われる12歳あたりではより高い成長力が期待できるのだろう。小学生の間でリフティング回数も10回程度から100〜1000回程度まで劇的に上昇する。

では大人のリフティング力についてはどうだろう。

2年半コーチをやってきた経験からすると、30代後半が中心メンバーであるコーチ達のリフティングはほとんど上達しない。上達するどころか衰えていくこともあるはずだ。

でもコーチの中にも例外はいる。もともとスポーツが得意だった38歳のあるお父さんコーチは、少し前からサッカーを初めてとんでもないスピードで上達しているし、うちのチームではオレも例外的な存在。子供の頃からサッカーはおろか運動全般が苦手だったけども、リフティングだけは30歳を過ぎてから100回を超えた。これまでほとんど右足だけでしか蹴れなかったので、今は左右の足で交互に蹴るパタンを練習している。これも練習しただけ着実に回数が上がる。

オレがボールを蹴り始めたのは28歳のとき。職場のメンバーとでフットサルをはじめたのがきっかけ。リフティングは最初は5回を超えるのも大変だったが、その後の地道な練習で最高170回をマーク。リフティングの練習時間はたぶんトータルで30時間くらい。最近は暇があると左右両足のリフティングを練習してるけど、練習時間は年間で2時間いかないくらいのペースじゃないかと思う。想像だけど単位時間あたりの上達量は、ゴールデンエイジには負けそうだけど、普通の子供には引けを取らないペースじゃないかと思う。

これは練習さえすれば誰でも出来ることだと思う。つまり単に練習をするかしないのかだけのことだ。

お父さんコーチは子供の頃サッカーを経験してた人が多いのだけど、リフティングが得意でない人もいる。30回続かない人もいる(今の子どもはレベルが高い!)。そもそもリフティングが得意でないコーチはリフティングを見せてくれない気がする。100回出来るまでやり続けろ言われたら果たして何割が合格できるだろうか。

さて、30歳を過ぎてからリフティングの練習をしていたオレからすれば、そんなコーチたちがすぐに上達するだろうことは簡単に想像できる。何もやってなかったオレとはそもそも足の器用さがぜんぜん違うのだから。今からでも少し練習すれば着実に上達するはずなのだ。

しかし、ある程度以上のスキルを既に獲得しているコーチが上達する例は見たことがないし、これから先も上達する気配はない。 あくまでうちのチーム内の何人かを見ての話ではあるけども。

なんにせよ結局のところ30歳代の既にサッカーのできるコーチたちはもううまくなりそうな気がしないのだ。これはリフティングに限った話ではない。なぜだろう?

  • 今さら練習したところでもう上達しないと思い込んでいる
  • 努力してまでうまくなりたいとは思っていない
  • そもそも上達することに興味がない(それなりにできるので特に困っていない)

こんな理由じゃないかな。これは実質的に限界に達しているということかもしれない。 でももっとうまくなれる可能性は多分にある。第一線で活躍してるプロなら話は違うだろうけど、ある程度のレベルまでならこの年からでもサッカーにおいて上達できる要素はたくさんあるはずだ。

で、自分がプログラマーとして既にこれ以上成長できないほどのレベルかといえば、全くそんなことはないわけで、なんだか似た話かもしれない。最近リフティングやってなかったけど、もう少しだけ積極的に練習継続してみよっと。 

2011-10-19

一瞬でiPhone付属イヤホンの低音を2.5倍響かせる方法

これは曲のベース音などの低音をよく聞きたい時によく使う手法。

  1. iPhoneやiPod付属のイヤホンを用意
  2. 音量を少し大きめにする
  3. 両手の中指の腹で左右耳のイヤホンを軽くおさえる

音が小さいと効果を感じにくいので屋外で試すと効果的。 あと指先ではダメ。指の腹、指紋のうずまきの中心をイヤホンにあてること。

前はイヤホン苦手で外で音楽聴けなかったんだけど(耳が痛くなった)、 この Appleの純正イヤホン は楽に使えて shuffle 以来ずっと愛用してる。

2011-10-13

息子がプログラミングをはじめた

今年3年生になった息子に前から「ゲーム作りたいゲーム作りたい」と言われていた。プログラミング環境を用意してあげたいと思っていたところ、同僚の @fum1h1ro がMacbook Air 11インチ(昨年のモデル)を格安で譲ってくれた。

というわけで息子のプログラマー人生がスタート。

したのだけど、どうやってプログラミングを練習させたものか難しい。

さしあたって初日はターミナルからirbを開く方法を教えて、そこで変数の初期化と乱数と足し算を教えた。具体的にはこんなの。

hp = 1
hp = hp + rand(10)

息子の性格を踏まえてこのような地味なところからのスタートしている。 好きなことに対してだけは粘り強くて、そして単純に小さい頃から数字が好きだったので、こんなやり方が許されているところは多分にある。

で、こっから先どうしようかなと悩んでて、いい方法ないかなあ...。

そもそも3年生だと、持っている知識が少なくてなかなか難しい。とはいえ、国語の教科書を引っ張り出してきてアルファベットを使ったローマ字表記を一気に覚えてしまったくらいやる気はある。

子どもがプログラミングを学ぶにはやっぱりゲームかな。irb上でメソッドを呼び出していくことで進行させられるゲーム。息子はしょっちゅう武器やモンスターなどのゲームデータを紙に書きまくってるから(ほんとにとんでもない量の…)、アイテムやその発生率をCSVか何かで簡単に定義できると面白そう。

ただ単にアイテムリストを一覧表示するプログラムなんてのも好きそうだ。自分で作ったリストがゲーム即座に反映されたりHTMLで表示できたりしたらそれだけで楽しそう。

irbくらい容易に開始できるならJavaScriptの方がいいかもしれない。JavaScriptならブラウザ内に簡単に図形や画像を描画できる。node.jsを使えば当然irbみたいなことも出来るだろうし応用範囲が格段に広い。CoffeeScriptもいいかもしれないなあ。

そう考えると昔98上で動かしていたN88-BASICはすごかった。パソコンの電源を入れれば勝手に起動して、その場でソースを編集できて実行できて、文字だけじゃなくて線や円がスクリーンに描画できて、シンプルなマシン語世界に簡単に入ることができたりしたわけで。

2011-10-09

#yokohamarb のRubyレシピブック読書会が面白い

@1syo が中心となって開催している Rubyレシピブック を用いたYokohama.rbでの恒例セッション。昨日で3回目だったかな。

これが面白い。どういう意味で面白いかというと、まず単純にRubyを深く学ぶことができて面白い。 ふだん何気なく使っているRubyの機能も、ちょっと掘り下げてみれば知らないことが山ほど出てくる。 そして、ふっと湧いた謎をその場の参加者みんなで考察してゆく流れがとっても心地良い。

昨日は「008繰り返し」から。

008繰り返し

まず「whileは使わない」という話が出る。いやそんなことはない普通に使うでしょ。

例えばこんなの。

while e = ary.shift
  ...
end

aryがキューでここに要素が入ってきたら、要素を頭から取り出しつつ処理をしていくときとか。

会場で自分の書いたソースをgrepしてみたらこんなのが見つかった。

rand < 0.7 ? self.lv += 1 : break while true

これは可読性が低いって言われた。たしかにそうかも知れない。でもこのくらいだと1行にまとめたい衝動が我慢出来ない。

今あらためてgrepしてみるとこんなのが見つかった。

create while count < 5 

これはActiveRecord::Baseを継承したモデルのクラスメソッドでやってるのだけど、 こっちはwhileを使うとうまく書けるいい例じゃないかな。

untilは個人的にあまり使わないなあ。ということはやっぱりwhileを使う頻度がそもそも少ないということかもしれない。unlessは普通に使うわけだし。

もちろんforも使わない。

繰り返し処理をもう一度実行するredoは使ったことがないのだけど、これは単に自分の発想が及ばなかっただけで実際使える機能じゃないかな。

さてここで書籍に書かれていないretry(索引にも載っていない!)をネタにかつてないほど盛り上がったのだけど長いので省略。

個人的にretryは「勘違いによって罠となり得るから繰り返し処理では使えなくした」と推測してる(もしくはそんな話しを聞いたことがある気がする)のだけどどうだろう。

009メソッド呼び出し

メソッド呼び出しにおけるカッコの省略基準について質問が出た。個人的な使い分けとしてはメソッドの戻り値を利用する場合はカッコを書くという基準でやってて、でこれは青木さんのコーディングスタイルがそうだから...と説明してその場で青木さんのコーディングスタイルを読んだのだけど、そんなことどこにも書いていないっ!

それが青木さんスタイルと思ってたのだけど完全に勘違いっだのかな?青木さん本人から直接聞いたという可能性もなくはないけど...それはないかなー。

010ブロック

ブロックは難しい。持論としてブロックが理解できたらRuby中級者を名乗っていいとかねがね思っている。

C言語から来たプログラマには、以下のようなコードの仕組みと流れがまったく想像できないものである。

ary.each do |e|
  puts e
end

オレはブロックを理解するまで1〜2年ほどかかったのだけど、やっぱり他にもそういう人がいた。

そのあと1.9では変数がシャドウイングされることをみんなで確認。なるほどー。

さらに「;」を使ってブロックローカル変数が書けることを初めて知った。勉強になるー。

ary.each do |e; x|
  x = "hello"
  puts e, x
end

puts x # エラー: undefined local variable or method `x'

この節の最後にprocが出てくるんだけど、ここはまた時間がかかりそうなので次回のお楽しみとすることとした。紙面上はたった6行だけど。

レシピブック は初心者から上級者まで楽しむことの書籍として非常に良い選択だったと思う。@1syo GJ!