2010年11月16日火曜日

iOS で正規表現を使う (3.0, 3.1, 3.2, 4.0)

iPhone / iPad アプリで正規表現を使いたいときはどうするのか調べてみました。


■iOS 4.0以上

NSRegularExpression があるのでそれを使えば万事解決です。


■iOS 3.2

http://blog.livedoor.jp/pnfhy316/archives/277806.html
こちらのブログでご紹介されているとおり、NSString rangeOfString:options: で NSRegularExpressionSearch を指定するのが楽です。

正規表現のグループ参照はできませんけれど、まぁしょうがないですかね。


■iOS 3.1, 3.0

http://d.hatena.ne.jp/KishikawaKatsumi/20081031/1225463896
こちらのブログでご紹介されているとおり、ライブラリを使うのがよいようです。

または最近調べてわかったのですが、 NSPredicate を以下のように使うと正規表現によるマッチングが可能になる模様です。
NSString *path = @"/path/to/img/img10001.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ matches '.*/img[0-9]{5}\\.png'", path];
BOOL matched = [predicate evaluateWithObject:nil];
キモは NSPredicate の format として matches という構文が使えることと、その中で正規表現が使用できるところですかね。実機の iOS 3.X で試したわけではないのですが、 NSPredicate 自体が iOS3.0 から使用可能になっていることと、 NSPredicate format 関連のドキュメントを見ても特に利用制限とかは書いていなかったので、普通に3.0から使えるんじゃないかと思ってます。もしよろしければ動作報告いただけるとうれしいです。


■iOS 2.X

iOS界のIEだと思って忘れましょう。お客さんに「頼むから対応してくれ」と言われても突っぱねる(すでに全体の1%以下ぐらいのはず)のがベストです。

2010年11月4日木曜日

iPhone / iPad でIPアドレスやMACアドレスを取得するクラスを書いてみた

たまには技術ネタを書きます。 iOS で IPアドレスや MACアドレスを取得するためのObjective-Cクラスを書いてみました。
コードはこちら。

https://gist.github.com/662203

ライセンスは記載のとおりMITライセンスです。

参考にしたサイトはこちら。

http://stackoverflow.com/questions/677530/how-can-i-programmatically-get-the-mac-address-of-an-iphone
http://iphonesdksnippets.com/post/2009/09/07/Get-IP-address-of-iPhone.aspx


■ほんのちょっとだけ説明

BSDのioctl()関数を使いますと、デバイスのIO周りのありとあらゆる情報を取ってくる事ができます。・・・らしいです。それを使ってIPアドレスやMACアドレスを取ってみました。大本のコードは確か StackOverflow あたりにあったのですが、もろにC言語ベタベタだったので使いやすくするためObjective-Cのクラスにしています。といってもまだまだ改善点が山ほどありますので好き勝手に触りまくってください。

っていうか今気づいた、二番目のサイトそのまんまほとんど同じコードじゃないですか>< 別にいまさら作らなくても良かったですね。

2010年10月26日火曜日

ゲームプログラマになりたい中学三年生のためにアドバイスを考えてみた

■発端
  1. 先日誕生日だったので実家に電話した
  2. おかんが出てきた
  3. おかんの友人の奥様の息子さんの話になる
    • なんでやねん
    • 中学3年で進学シーズンです
  4. なんかゲームプログラマーとかになりたいらしい
  5. けど情報科の高校とか嫌で工業高校がいいらしい
  6. あんたプログラマーでしょなんかアドバイスとかないの
という無茶振りを受けたのでこんな記事を書く事になりました。 あれ、又このパターン?


■いきなり結論

ゲームプログラマーですか? もちろんなれます。続けられるのであれば。

なんだか世の中には 一万時間の法則 というものがあるらしくて、一万時間ほど経験を積めば大成できるらしいです。私も身に覚えがちょっとだけあるので、この一万時間というのはあながち間違ってないのではないかと思います。リンク先の lifehacking.jp さんの記事によりますと、
2年:10000 / (2 x 365) = 13.7 時間
5年:10000 / (5 x 365) = 5.4 時間
10年:10000 / (10 x 365) = 2.7 時間
らしいので、こう考えることが出来ます。
一日 13.7 時間、365日、一日も休むこと無くPCの前に座ってプログラムを書いていられる!
おめでとう、2年でゲームプログラマーになれます!むしろイチローにだってなれますよ!
一日 8 時間、一日も休むこと無く学校に通ってプログラムの勉強ができる!
3年間学校に通うとすれば、卒業するまで毎日やってもまだ6割程度。残りは自分で身につけるため、まだまだ勉強を続ける必要があります。
一日 2.7 時間、365日、一日も休むこと無く家に帰ってからプログラムを書いて勉強できる!
それでも10年続ける必要があります。いまあなたが15歳なら、25歳です。5歳のときの自分、覚えてますか?
はい、相当大変だということがおわかりになるかと思います。つまりこれだけの大変なことをどうやって毎日続けるか、というのがゲームプログラマーになるキモのようです。早速次章以降で検証してみましょう。


■でもちょっとまった

ただちょっと思ったのが、多分彼はゲームプログラマーという仕事を勘違いされているんじゃないかと。ゲームプログラマー = ゲームを作れる人、と思われているのではないかと。実際私も中学生ぐらいの頃はそうでした。

しかし現実は ゲームプログラマー = ゲームを作れる人 ではなく、 ゲームプログラマー = ゲームの一部を作れる人 です。まずこれに気づいて、この現実を受け入れることがすごく大事です。

これはものすごく当たり前のことなのですが、たいてい子供時代に夢見ているゲームプログラマー像にはこれが含まれていません。実際、面白いゲームを作るには、
  • むちゃくちゃ面白いゲームのアイディア
  • 超カッコイイグラフィック
    • 2D
    • 3D
  • 爽快な音楽
    • BGM
    • 効果音
  • そしてもちろんプログラミング
と、これだけの要素が必要になってしまうわけです。もちろんアイディアも絵も音楽も借りてきたりフリーの素材を使ったりできますが、すべてがすべてフリーの素材でまかなえるわけではなく(そもそもやってみるとわかるのですが、すべてフリーの素材で作ると、自分が作ったものではないように感じられ気が萎えてしまいます)、どこかはオリジナルでやらなくてはなりません。で、当然自分ひとりでこれだけの要素をまかなえるかというと 普通は無理 なわけです。もちろん 例外 もいらっしゃいますが・・・とにかく、 ゲームは自分ひとりで作るものじゃないんです。

で、それではゲームプログラマーがやるプログラミングってなんなの、という話になりますが、一番地味です。どんな名作ゲームでもプログラマーが褒められることはまずありません。考えてみてください:
  • このゲームは話が面白い
  • このゲームはシステムが斬新
  • このゲームはゲームバランスが絶妙で対戦が面白い
  • このゲームはグラフィックが超綺麗
  • このゲームのBGMはマジ燃える
どれもゲームを褒める言葉なのですが、なんとまぁ、どの褒め言葉も全然プログラマーが褒められてません。

じゃあ何が楽しくてゲームプログラマーをやるのか?

最高の自己満足です。プログラムを書くこと自体が楽しいのです。以上。

さて、どうしてわざわざこのような事を書いたのかといいますと、実は彼がなりたいのはゲームプログラマーではなくてゲームに関わる仕事の何かじゃないかと思ったからなのです。単にゲームが好きで、PCを使ってゲームに関わる仕事がしたいなら、いくらでも他に道があります。絵を書いたり、音楽を作ったり、シナリオを書いたり。いろいろ試してみて、一番自分が好きになったものを極めればいいのです。ですので心あたりがあるのであれば、プログラミングと決めつけずに絵を書いたり音楽を作ったりシナリオを書いたり、ああそれより何より大事、自分以外のゲームに関わる仕事がしたい仲間を探してみたり、いろいろやってみてください。どうすればいいかわからない?私はプログラマーであって絵を書いたり音を作る方法は全然知りませんが、 Google先生が知っています。 思いつく限りGoogle先生に100回でも200回でも聞けばいいのです。一日 2.7 時間、365日、一日も休むこと無くプログラムを書くのに比べたら屁でもないぐらいカンタンですよね?


■それじゃあプログラマーになろう

よし、これだけ脅してもまだ プログラマー最高!! とお考えのHENTAI諸君、ようこそ!それではさっそく10年間続ける方法を考えます。
  1. 楽をして楽しんで毎日続ける
  2. ほんの僅かでもわからないことがあったら即ググれ
  3. エライ人と仲良くなれ
  4. 英語は絶対に意地でも覚えろ
  5. 入門書を読む
まず一番目。私が事あるごとに言ってますが、楽をしましょう。自分に一番あった方法を取って楽をして、そのかわり毎日続けましょう。ゲームプログラマーになりたいのだからまずはゲームプログラミングだろうと思われるかもしれませんが、実はゲームプログラミングはプログラミングの最高峰、最も難易度が高いのです。少なくともWebプログラミングや、最近流行りの iOS / Android でのプログラミングに比べれば、格段に難しく、いきなりここから入ると確実に心がバキバキ折れます。自分はガッツがあって、絶対最後までやり遂げてやると決めて最後までできる人でしたら、このいきなりゲームプログラミングから入ってゲームプログラマーになるのが最短ルートですが、私には到底不可能でした。

そこで最初はまず楽しむことをおすすめします。F1レーサーだって、最初からいきなりF1マシンに乗ったりはしません。最初は普通の車やカートに乗ります。同じように、いきなり難易度激高のC言語をマスターするのではなく、楽をして楽しんで毎日続けられてしかもためになる、そんなプログラミング言語がいいですよね。いくつか私のおすすめをご紹介しましょう。
Processing
本当におすすめです。ぶっちゃけこの言語だけで2Dグラフィックを使った簡単なゲームを作ることが出来ます。いちいち超面倒なrun loopの管理を自分でする必要もありません。そして使っていて面白い! http://akisute.com/2009/12/processing.html とか見ていただければ面白さが伝わるかと!Processingで何か色々作ってみて、遅いとか重いとかもっと難しいことがしたいと思ったら、DirectXとかバリバリ使ったものに挑戦すればよいのです。
Python
これは非常に地味な言語なのですが、プログラムのロジックやオブジェクト指向などを学ぶのに最適だと思ってます。なにより使っていて楽です。もっとも楽すぎてC言語に戻れなくなるかもしれませんが・・・
HSP
これも入門にはよさそうなのですが、使ったことがないのですみません、感想が出せなくて。
さて次、二番目。ほんの僅かでもわからないことがあったら即ググれ。自分で調べる力がないと仕事でプログラムなんぞ書いていられません。しかし、自分で調べるのは大変な作業で心が折れるときもありますし、なによりGoogle先生ですらわからないことはたくさんあります。

そこで三番目。エライ人と仲良くなれ。昔はそんなの絶対不可能でしたが、いまや Mixi Twitter はてな Facebook なんでもござれです。これらのサービスを使ってちょっと調べればHENTAIレベルの神プログラマの日々のつぶやきを簡単に見ることができます。テンション上がりますね。それにひょっとしたらHENTAIたちと仲良くなれるかもしれません。そうすればGoogle先生すら教えてくれない情報をお互いに交換し切磋琢磨することができるようになります。

中学三年生でプログラマーといえばやっぱり tefu 君をフォローするのがいいのかなと。

四番目。英語は絶対に意地でも覚えろ。これは英語が好きとか嫌いとか関係なく必須です。覚えてください。なぜかというとあなたの目の前にあるコンピューター自体が基本的には英語のような言語しか理解出来ないから(日本語もついでに表示できるよっていう程度に思っておけばよいかと)と、そのコンピューターの中身を作っている連中のほとんどが英語でしゃべっているからです。当然文章も全部英語です。今後もこの状態が変わることはまずないでしょう。なので意地でも覚えてください。どうしても嫌ならば、最後の手段。海外のゲームを買ってきて辞書片手に英語字幕のままプレイしてください。私はこれで覚えました。

最後、入門書を読みましょう。ぶっちゃけ私なんぞに聞くよりそのほうが何倍もいいです(これが言いたかった!)。でもどれを買えばいいかって?これが難しい。でも基本的にはGoogle先生に聞くか、エライ人に聞くかですよね?ここではひとつだけ私が最も好きな本を紹介しておきます。

4798021180ゲームプログラマになる前に覚えておきたい技術
平山 尚(株式会社セガ)
秀和システム 2008-11-15
by G-Tools

セガの中の人が書いている本なので大変スパルタですが、非常にためになります。


■ゲームプログラマーに必要なスキル?

いままではとっかかりのところを説明しましたが、うってかわって仕事でゲームを作るにはこれぐらいのスキルが必要だろうというところです。私は本業がゲームプログラマーではないのでなんともですが、これぐらいは知っておかないとなーと思ってます。なので以下の項目は 好き嫌いかかわらず覚えなくてはなりません。
  • プログラム言語系
    • C
    • C++
  • 学問系
    • 数学, 特に幾何学, 平面幾何は最低限必要, 3次元以上のものが分かれば嬉しい
      • ベクトル
      • 行列
      • 三角関数
    • 物理, 特に運動物理
    • 英語
C, C++はおそらく当分の間はゲームプログラミングの主流言語であり続けるので、覚えておいて全く損なしです。というか、メモリ管理を自分でできない言語でゲームのコアエンジンをかくのは絶対不可能なはずなので、将来的にもC, C++でなくてもそれと同等程度の言語が使われるはずです。

OpenGLとかDirectXを含めていないのは、そんな低レベルなところを直接自分で触ることはまずないと踏んでいるからです。行列の概念さえ理解できていればゲームエンジンにお任せできます。

あと数学の授業は真面目に受けておいたほうがいいです。どこの学校の、文系でも理系でも何でもいいので、嘘でもいいのでうけておきましょう。どうせ細かいことまで覚えて居られませんが、キーワードだけ覚えておけば後からGoogle先生に聞くことが出来ます。私は数学をサボっていたせいで、この年にして勉強し直しです><


■まとめ

こんだけ書いておいて何なんですが、私ゲームプログラマじゃないんです!(キリッ

いや、 ゲームっぽいもの なら作ったことあるんですよ一応><

あ、そうだ、もし世の中のゲームプログラマになりたい中学三年生ぐらいのお子さんをお持ちのお母さん方が万が一
何かの間違いでこのページをご覧になってらっしゃいましたら、一言だけお願い申し上げます。どうかあたたかい目で見守ってあげてください。やりたいとお子さんがおっしゃられたことをやらせてあげてください。私は中学生高校生の身にもかかわらず家に行きこもってネトゲばっかりしてたり、山口から一人で新幹線に乗って大阪東京までネット友達の元まで遊びに行ってましたが、それでも両親は反対しませんでした。おかげさまでネトゲから英語を無駄に身につけたり東京に交友関係ができて東京で就職する際に助かったりいろいろいいことがありました。
そのかわり彼女がいないんですが今ではものすごく感謝しておりますので、どうかよろしくお願いします。

おしまい。