Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2010-03-31

[サッカー]少年サッカーの審判講習会に参加してきた

昨年の春から末っ子が地元のサッカークラブに入部したと同時に、オレ自身も少年サッカーのコーチとして息子と一緒に練習に参加している。

コーチになるとほぼ同時に4級審判の資格もとらされた。資格自体は講習を半日受ければ誰でもとれるくらい簡単なものだ。

が、資格を持っていても実際にゲームの審判をやるとなるとこれがたいそう難しい。 一緒に審判資格を取った他の3人のコーチたちは皆サッカー経験者なのだけど、オレだけはサッカー未経験者。 数年前から職場のメンバーと一緒にフットサルをやってはいたけど、それくらいの経験だけではとてもサッカーのルールを把握できないし、ましてや審判なんて……。

これまで副審は数回だけやったけど、主審の経験はなし。というかやれと言われてもできない。

とそんなさなか、ちょうど少年サッカーの審判技術向上を目的とした講習会があり、チームから「参加してこい」との指令がきたので行ってきた。 講習では実際に6年生の試合の審判(主審、副審ともに)を努める機会があるとの事前連絡を受けていたので、まずは必要な道具をそろえるところから始めた。

少年サッカーの審判が用意すべき道具

既に持っていたサッカー審判用の用具は、

  1. 審判服 . チームから上下および黒のストッキングが支給済み
  2. ワッペン . 資格取得時に支給された
  3. ルールブック. 資格取得時に支給された

だけだった。

他に必要なグッズをWebで調べ、それぞれ当日までに調達した。

  1. 警告・退場用のカード . Amazonで購入
  2. 記録用紙と用紙ケース、鉛筆 . Amazonで購入
  3. トス用のコイン . Amazonで購入
  4. 審判手帳 . Amazonで購入
  5. ホイッスル . 近所のホームセンター(島忠)で購入。160円
  6. 時計 . Amazonで購入

上の1〜4は アディダス レフリーセット2 でまとめて購入。時計は カシオの腕時計 が3980円と安かったので購入。

その他の道具

その他、場合によっては以下のものもあった方がいいらしい。

  1. 予備のホイッスル(隣のゲームの審判と音を変えるため)
  2. 予備の時計
  3. フラッグ

講習では時計は最低2つ、できれば3つ持った方がいいと言われた。 当然ながら副審も時間計るのね。今まで時計も持ってなかったよ……。

初めての主審……

1時間ほど一般的な注意事項について室内で説明を受けた後、いきなり実践。 数名の参加者のうち、主審の経験がないのはオレだけだったようだが、 ある試合のハーフ(20分)の主審を務めた。

想像した通り難しかった。まず段取りがよくわからないし、ゲーム中の位置取りも難しい。それと同時にファールの判定がよくわからず、あと副審がタッチラインを割った判定を下したのを一度見逃してしまったらしい。

ゲーム後、指導員の方に具体的にまずかった点を指摘してもらう。非常に良い経験になった。場数を踏むのが重要とのことで(そりゃそうだろう)、こういう機会があったのは個人的にタイミングが良かった。ルールについても理解が曖昧なところが多々あるので、そこはちゃんと自分で勉強しないとね。

しかし公式戦の主審はまだ到底無理だな……。

ふりかえり

KEEP

  • 道具は最低限足りていた
  • 事前にルールブックや市販の参考書を読んだ
  • ルールプックと同時に配布されたDVDも観た(全部じゃないけど)

PROBLEM

  • 経験不足
  • 副審の判定を見逃した
  • フリーキックのときの距離の判断がはっきりできなかった
  • 終了時の挨拶がぐだぐだになった
  • 主審時の移動範囲が狭かった

TRY

  • 主審のときもっと近くでプレーを見るように
  • 予備の時計とホイッスルを用意する
  • 日頃の練習で積極的に審判の練習を意識する
  • 日頃からゲームの審判に関心を持つ
  • フリーキックのときの距離の判断はボールの位置から歩いて測る。事前に確認しておく
  • ルールをもっと詳しく理解しておく
  • この本 を読んでおく
2010-03-26

[haskell]第1回ふつうのHaskellプログラミング読書会やります

しばらく活動が休止していた横浜へなちょこプログラミング勉強会ですが、活動再開する運びとなりました。

4/3にふつうのHaskellプログラミング読書会やります!

よろしくお願いします。

2010-03-26

[ruby]RubyのtimesとかeachをC言語のマクロで実装してみた

Rubyのtimes的なことをするのにいちいちfor文を書かなくていいようにならないかなと考えてみた。 ついでにeachとeach_with_indexも。

#include <stdio.h>

#define TIMES_DO(n, i) { int i; for(i = 0; i < n; i++) {
#define EACH_DO(a, e) { int __i__; typeof(a[0])* e; for(__i__ = 0; __i__ < sizeof(a) / sizeof(a[0]); __i__++) { e = &a[__i__];
#define EACH_WITH_INDEX_DO(a, e, i) { int i; typeof(a[0])* e; for(i = 0; i < sizeof(a) / sizeof(a[0]); i++) { e = &a[i];
#define END } }

int main(void)
{   
    char array[][8] = { "hello", "hi!", "bye" };

    TIMES_DO(5, i)
        printf("%d\n", i);
    END

    EACH_DO(array, e)
        printf("%s\n", *e);
    END

    EACH_WITH_INDEX_DO(array, e, i)
        printf("%d: %s\n", i, *e);
    END

    return 0;
}

実行結果

0
1
2
3
4
hello
hi!
bye
0: hello
1: hi!
2: bye

EACHの方はtypeofを使ってるのでgcc依存になってしまうみたい。

C++ならテンプレートを使ってtypeofをなくすことができそう。

2010-03-24

[iPhone][lua]iPhone上でLuaのHello Worldを実行

iPhoneのデバイス(実機)でLuaが実行できることを確認した。

難しいことはなかった。 lua-5.1.4をダウンロードしてsrc以下に含まれるソース(*.c, *.h)のうち以下を除くすべてをiPhoneアプリのプロジェクトに登録する。

  • Makefile
  • lua.c
  • luac.c

Luaのソースをプロジェクトに追加すると、以下のようなコードが実行できるようになるはず。

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int hello(void)
{
    lua_State *lua = luaL_newstate();
    luaL_openlibs(lua);
    if(luaL_dostring(lua, "print(\"HELLO WORLD!\")")) {
        printf("エラー\n");
        return -1;
    }
    return 0;
}

luaL_dostringでLuaスクリプトを文字列として与えている。

initWithNibNameあたりからhello関数を呼び出せばデバッガのコンソールで「HELLO WORLD!」の表示が確認できる。 シミュレータでもデバイスでもどちらでも動いた。

なんてかんたん!

2010-03-17

[開発][アイデア]開発中のMMORPG「レムノス」の現状

自分の考えを整理したいのと、オレ自身が考えを整理しなきゃいけない状況で開発メンバーが 現在の状況を正しく把握できるはずもないわけで(すいません)、今の状況をまとめておこうと思う。

これまでの流れ。

  1. オブジェクト指向にはまる。でもC++は大嫌い
  2. Rubyを知る。プログラミングが楽しくなる→Rubyでゲーム作りたい!
  3. Rubyを使ってさくっとCGIのオンラインカードゲームを作る→好評→ネットゲー楽しい!
  4. MMORPGを作ろうとプロジェクトを発足するも開発中止
  5. 個人的に研究開発をスタート(2004年)
  6. Railsが登場しプラットフォームをWebに定める
  7. Ruby×ゲーム開発を試行錯誤しているうちにRubyゲーム本の執筆依頼が来る→開発中断→出版(2007年)
  8. シナリオ担当加入
  9. 世界観の概要が決まる。「レムノス」構想スタート
  10. Ruby入門本の執筆依頼が来る→開発中断→出版(2008年)
  11. ゲームデザインを書き上げる(2008年)
  12. 子育てに忙しくなる→開発中断
  13. さらにRuby入門本の執筆依頼が来る→断る
  14. 開発再開。ブラウザで動作するクライアントを実装
  15. iPhone開発に興味を持つ
  16. 仕事が忙しくなる開発中断
  17. iPhone/iPadの可能性を探る←いまここ

個人的に初めてRubyで開発したオンラインカードゲームの公開が2002年。 MMORPGの開発は2003年から。

当初はWindowsアプリとしてゲームクライアントの実装しようと考えていたのだけど、 すぐにWebクライアントの可能性に惹かれてブラウザだけで遊べるこれまでにない形のRPGを作りたいと思うようになる。 そして今はWebブラウザとiPhone(iPad)で動作させる方向で試行錯誤してる。

2008年にゲームデザインが固まる。ここまでに4年かかっている。 4年間、自分の作りたいゲームのデザインを探し続けて、アイデアを取捨選択し続けた。

今進めているのはシナリオ面の作り込みとサーバーサイドプログラム実装(最近全然進んでないけど)。

「レムノス」というのはゲームの舞台となる惑星の名前。わかりにくいので補足しておくと、

  • Jewel-mmo …… MMORPGのコアシステム。システム実装側の構想/プロジェクト名
  • レムノス …… ゲームタイトル

という使い分け。

いま進められる作業を具体的に書き出してみる。

  • シナリオ/各種設定をWebで公開
  • テキストでのキャラクターデザイン→キャラクタのグラフィックデザイン
  • iPhone/iPadアプリの可能性を探ってそれに会わせたゲームデザインの修正
  • サーバーの実装(Rails+ShootingStar

おおざっぱだけど書き出してみた。 いきなり細かいことを書いてもあれなので。

また打ち合わせをやらないといろいろ忘れてそうだなあ。

2010-03-15

Re: iPadは「プログラミング黄金時代」の終焉の始まりか?

iPadと同カテゴリになりそうなChrome OSも、ネイティブアプリは一切動かせないので同様の問題を抱えている。

プログラミング黄金時代」の終焉の始まりか?

Chrome OSは大丈夫じゃないかな。

WebからWebアプリは書ける。例えばCGIスクリプトを編集するCGIを書くことは可能なわけで。 Google Docsができるんだから、サーバー側に置いたソースを編集する快適なエディタもきっと作れるでしょう。

Chrome OSでネイティブアプリを書けないというのは、WindowsでWindows自身を書き換えられないというのと同じだと思う。

でもiPadの場合はそうはいかない。

iPadでiPadのアプリを書くことはできない。 この辺はケータイとかゲーム機と同じ・・・。

2010-03-12

[iPhone]Mac未経験からiPhoneアプリ開発→申請できるようになるまでの流れ

先日無事初めてのアプリを公開した(すごーくシンプルなやつ)。 これから本格的にiPhone開発していきたいと思っているんだけど、 その前にここまでの流れというか道のりを忘れないように簡単にまとめておく。

iPhoneのみならずMacの操作もまったくわからない所からの話。 iPadの開発に関してもたぶん同じだと思う。

あくまで個人的な実感だけど、参考までにそれぞれの手順にかかる日数も記載した。

1. Mac本体を用意する

iPhoneの開発にはMacが必要だ。 オレはまったくMacを触ったことがなかったのでMacBookを買うところからのスタート。 まあiPhoneやるためにMacを買ったわけじゃなくて、単に前からずっとMacほしくてPCの買い替えのタイミングに買ったのだ。 そのあとiPhone開発もできるじゃんということで、iPhoneを買った。

というのが昨年(2009年)の夏の話。それから細々とだけど時間を取り繕ってiPhoneアプリを作ってる。

2. Macに開発環境をインストールする

iPhoneの開発にはXcodeというMac特有の開発環境とiPhone用のSDKが必要。 これらは標準のMacにはインストールされていない。

iPhone開発環境を含んだXcodeはAppleのサイトから無料でダウンロードできる(たしか登録が必要)。 3ギガくらいあるのでうちのADSLで落とすのに半日かかった・・・。

ちなみに最新のβ版だとiPadの開発もできる(2010年3月現在)。

3. シミュレータベースの開発

MacがあればiPhoneの実機がなくてもiPhoneシミュレータを使ってアプリを開発することができる。 シミュレータはiPhone(またはiPad)の外観がそのままPCのモニタに表示され、その画面内に開発中のアプリが表示される。 シミュレータに対するマウスクリックがタッチ操作となるという感じ。 シミュレータは実機とほぼ同じなんだけど、加速度センサーとかはシミュレートできない。

シミュレータを使うのはすごく簡単。Xcodeで新規プロジェクトを作る際、アプリのひな形となるいくつかのテンプレートが用意されているので、プログラムを1行も書かなくてシミュレータを使ったアプリ開発を体験できる。

開発環境のインストールからここまでの手順は、Macがあれば即日試すことができる。Mac本体を除けばここまでは無料だ。

4. 自分のアプリを実機で動かす

このステップがちょっと面倒くさい。

当然iPhoneまたはiPod touchのデバイス(こういうケースでは実機のことをデバイスと呼ぶ)は手元にあるものとして、その他に有料のDeveloper登録が必要だ(年間99ドル)。

自分で作成したアプリを動かすにはDeveloper登録だけではダメで、自分のデバイス固有の証明をWeb経由でAppleから取得して、それを使ってアプリをビルドしなければならない。 要はDeveloper登録をした者が持つデバイスのみでしか(自分で開発した)アプリが動かないように厳しい制限が設けられているわけだ。 ちなみにWebで申請すれば他人の持つデバイスでも同じようにアプリを動かすことができる。

手元のデバイスで動かすまでの手順はやや複雑(この手順自体は特にはまらなければ1、2時間で終えられる)。慣れてしまえばそんなに辛くはないけど・・・。

シミュレータで動いていればそのまま実機で動くので、アプリ自体を特別実機に対応させる必要はない。その辺は楽だった。 iPod touchでもiPhone向けにビルドしたアプリがそのまま動く。 一度動くところまで進んでしまえば、その後はただXcodeのアプリ実行先にデバイス指定するだけでよい。

運が悪いとDeveloper登録ではまって数日かかるかも。

5. アプリ開発について

XcodeやInterface Bulder(ビューを作成するGUIツール)を使ったことがなかったので(これらのツールはiPhone開発だけでなくMacのアプリを作るときにも使うもの。だと思う)、慣れるまで多少の時間がかかる。というかいまだに慣れてないので勉強中。

アプリの開発には大きく分けて、iPhoneの標準的な機能を使って作成する方法と、OpenGLを使う方法がある。 OpenGLの方は使ったことがないけど、こっちは普通のコンシュマーゲームを作るのと同じノリじゃないかな。

言語はObjective-C。・・・だけど、Objective-Cの中ではC言語がそのまま書けるので、Cを知っていればなんとかなるという感じ。 いまのところObjective-Cの勉強に特に時間をかける必要性は感じないし、別にCでいいじゃんと思う。

OpenGLは別として、iPhoneに出てくる部品をそれなりに扱えるようになるにはもう少し時間がかかりそう。 たぶん何も知らない状態からフルタイムで1ヶ月間がっつりiPhone開発に取り組めば、たいだいひと通りのことができるようになる、くらいの難易度じゃないかと思う。

初めてリリースしたTHE 合格の場合だと、iPhoneの一部の機能しか使ってないシンプルなアプリなので、何も知らない状態から初めて1、2週間くらいの作業量かな。

6. 無料アプリの申請

これがまた面倒くさい。

開発用とは別に申請用の証明を取得してアプリをビルドしないといけない。 またアプリの申請時にはいくつかの必須項目を入力しないといけない(まあほとんどはApp Storeに並ぶときに必要な情報なんだけど)。

あとはアプリのWebページ作ったり(もしかして必須でない?)。 まだリジェクトされたことがないので、リジェクト後の手続きの進め方はわからない。 アップデート申請は、一度申請を通した者にとっては難しい作業じゃない。

面倒と言っても、途中で心が折れなければ申請の作業自体は1日で十分できるはず・・・。なのでそんなにたいした作業があるわけじゃない。

申請したアプリがシンプルだったせいか、5日くらいで無事通過してApp Storeで公開された。

7. 有料アプリの申請

これがさらに面倒くさそう。

外貨の扱える口座が必要らしい。その他どんな手続きが必要なのかはまだやったことがないのでわからない。

まとめ

iPhoneの開発/申請では面倒な手続きもあるけど(主に申請関係)、まあ普通にWebで調べながらやってればなんとかなる。

書籍でおすすめなのは はじめてのiPhoneプログラミング (今調べたら新しく はじめてのiPhone3プログラミング が出てた)。今まさに読んでるところだけどこの本はわかりやすい。他にも何冊か買ったんだけど特にこれというものには出会っていない。

今後はアプリをしっかり作り込む術を身につけていく予定。

2010-03-11

[ruby][MyGame]MyGameで書いた3Dぽいテニスゲームのプロトタイプ

よくあるタイプのテニスゲームで座標を3Dで管理してる。 カメラを設けてシンプルに3Dを管理するという原理はこれと同じ。

Rubyでやりたい3D制御をイメージして書いたコードだったと思う。 たぶん3年くらい前に書いたコード。 当時は動かしながら書いていたけど、今はどうかな。動くかどうかは試してない。動かない可能性が高いと思う。

DxRubyが3Dに対応しつつあるようなので、もしかしたら何かの参考になるかもしれないと思って古いコードを引っ張りだしてみた。

# tennis.rb
require 'mygame/boot'
require 'tennis_helper'

COURT_H = 1189
COURT_W = 1097

class Player < Character
  image_resource 'images/player.bmp'
end

class Net < Character
  image_resource 'images/net.bmp'
end

class BallShadow < Character
  image_resource 'images/ball_shadow.bmp'
  attr_accessor :parent
  def update
    position.x = parent.position.x
    position.z = parent.position.z
  end
end

class Ball < Character
  image_resource 'images/ball.bmp'
  def initialize
    super
    start
  end

  def start
    @position = Vector3D[400, -200, 1300]
    @v = Vector3D[-4 - rand(6), -16 + rand(4), -10 - rand(20)]
    #@position *= [-1, 1, -1]; @v *= [-1, 1, -1]
  end

  def update
    @v.y += 0.5
    @position += @v
    if position.y > -10
      position.y = -10
      e = 0.7
      @v *= [e, -e, e]
    end
    if position.z.abs > 1500 or @v.z.abs < 0.1
      start
    end
  end
end

camera = Camera.new
players = Array.new(4) {|i|
  a = Player.new
  a.position.x = i % 2 == 0 ? -COURT_W / 2 : COURT_W / 2
  a.position.z = i / 2 == 0 ? -COURT_H : COURT_H
  a
}
players = []
net = Net.new
ball = Ball.new
ball_shadow = BallShadow.new
ball_shadow.parent = ball
bg = Image.new('images/bg.bmp')

MyGame.background_color = nil
g = Ground.new(camera)
main_loop(60) do
  [ball, ball_shadow].each {|e| e.update }
  bg.render
  camera.render(players, net, ball_shadow, ball)
  g.render
end

2Dの絵を使うのでcameraの向きが固定になっている(背景も2Dなので視点はほぼ固定)。なのでcameraに注視点の指定やアングルの指定はない。 cameraに注視点またはアングルが指定できれば、上記スクリプトで一応ぐりぐり回るはずだ(もちろんその場合は2D画像でなく3Dモデルを読み込む必要がある)。

当時何をやりたかったかと言うと、こんな風に書けるライブラリがあれば3Dのプログラミングも全然難しくないでしょって言いたかったんだと思う。

上記ソースが使うヘルパの実装もはっておく。

# tennis_helper.rb
class Vector3D < Array
  %w(x y z).each_with_index do |e, i|
    eval "def #{e} ; self[#{i}] ; end"
    eval "def #{e}=a ; self[#{i}] = a ; end"
  end
  %w(+ - * /).each do |e|
    eval "def #{e}d
            Vector3D[self[0] #{e} d[0], self[1] #{e} d[1], self[2] #{e} d[2]]
          end"
  end

  include Math
  def rotate_zyx(angle)
    ax, ay, az = angle
    px, py, pz = x, y, z
    px, py = px * cos(az) - py * sin(az), px * sin(az) + py * cos(az)
    pz, px = pz * cos(ay) - px * sin(ay), pz * sin(ay) + px * cos(ay)
    py, pz = py * cos(ax) - pz * sin(ax), py * sin(ax) + pz * cos(ax)
    Vector3D[px, py, pz]
  end
end

class Camera
  attr_accessor :position, :angle, :scale, :screen_z
  def initialize
    @position = Vector3D[0, -200, -2000]
    @angle = Vector3D[Math::PI / 20, 0, 0]
    @screen_z = 800.0
    @scale = 1.0
  end

  def to_screen(vector3d)
    temp = (vector3d - position).rotate_zyx(angle)
    perse = screen_z / temp.z
    [temp.x * perse + screen.w / 2, temp.y * perse + screen.h / 2, perse * @scale]
  end

  def render(*objects)
    objects.to_a.flatten.each do |e|
      e.view.x, e.view.y, e.view.scale = to_screen(e.position)
      e.render
    end
  end
end

class Character
  attr_accessor :position
  attr_reader :view
  def self.image_resource(fname)
    class_eval "def image_file_name; '#{fname}'; end"
  end

  def initialize
    @view = TransparentImage.new(image_file_name)
    @position = Vector3D[0, 0, 0]
  end

  def update
    @view.update
  end

  def render
    @view.render
  end
end

class Ground
  def initialize(camera)
    @camera = camera
    @tops = [
      Vector3D[-1000, 0, -1000],
      Vector3D[ 1000, 0, -1000],
      Vector3D[ 1000, 0,  1000],
      Vector3D[-1000, 0,  1000],
    ]
  end

  def render
    tops_2d = @tops.map {|top| @camera.to_screen(top) }
    # @view.render ...
  end
end
2010-03-11

[iPhone]iPhoneのプロジェクトに新しいviewとcontrollerを追加する手順

先日リリースしたアプリはiPhone SDKのプロジェクト新規作成で選択できる「Utility Application」テンプレートをそのまま利用したのだが、 今作っているRPGでは少なくとも5画面ほど遷移させる必要がある。

Interface Bulderをいじりながら「Utility Application」ベースのプロジェクトに新しいviewとcontrollerを追加することができたので、その手順をメモしておく(手探りで確立した手順なので正しいかどうか自身なし)。

  1. 「Utility Application」で新規作成したプロジェクトからInterface Bulderを開いておく
  2. Interface Bulder => File => New にてCocoa TouchのViewを選択
  3. File => Save を選んでFooという名前で保存。このとき作成中のプロジェクトに追加するチェックを入れておく
  4. FooというWindowのFile's Ownerをダブルクリックし、Class欄に「FooViewController」と入力する
  5. 次にFile's Ownerの下にあるViewをクリックしてClass欄に「FooView」と入力する
  6. File's Ownerをクリックし、File => Write Class Files... を実行してFooViewController.hとFooViewController.mを書き出す
  7. 次にFile's Ownerの下にあるFoo Viewをクリックし、File => Write Class Files... を実行してFooView.hとFooView.mを書き出す
  8. FlipsideViewのソースの中身を書き出したファイルにコピーする
  9. 作成した.hと.c内の「Flipside」をすべて「Foo」に置換する
  10. File's Ownerをクリックして「Foo View Controller Connections」ウィンドウ (左から2番目のタブ)内のOutlets => viewとFoo Viewを接続する

ここまででビルドは通るはず。

次に作成したFooViewContorollerを呼び出してFooViewを表示するようにする。

MainViewController.hの次の部分を修正する。

#import "FlipsideViewController.h"

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {
}

以下のように書き換える(動いたけど文法がわからないのでこれでいいのか自信なし)。

#import "FlipsideViewController.h"
#import "FooViewController.h"

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate, FooViewControllerDelegate> {
}

次にMainViewController.mを書き換えてしまう(もしくは新しいアクション用のメソッドを定義する)。 FilpsideをFooに書き換える。

- (IBAction)showIndo {
	FooViewController *controller = [[FooViewController alloc] initWithNibName:@"FooView" bundle:nil];
	controller.delegate = self;
	
	controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
	[self presentModalViewController:controller animated:YES];
	
	[controller release];
}

ちなみにUIModalTransitionStyleFlipHorizontalの部分をUIModalTransitionStyleCoverVertical(下から出てくる) やUIModalTransitionStyleCrossDissolve(半透明で徐々に切り替わる)に変えると切り替わるときのアニメーション方法を変えることができる。

あとflipsideViewControllerDidFinishの引数の方をidとしておく(idにするよりもっといい方法があるかもしれない)。

- (void)flipsideViewControllerDidFinish:(id)controller {
	self dismissModalViewControllerAnimated:YES];
}

これでinfoアイコンをクリックするとFooViewが表示されるようになる。

2010-03-09

[iPhone]LuaをXcodeでコンパイルしてみた

ソースファイルを突っ込んだら普通にビルドできた。

クジラ飛行机さんの書いた高速スクリプト言語「Lua」を始めよう!でLuaを勉強中。

iPhoneアプリの開発にLuaを使うにあたって悩んでいるのは、画像の制御をLuaでやるかどうかというところ。

当初はモデル部分だけをLuaで実装して、UIに関する部分はCで実装しようかと考えていた。 が、やろうと思えば画像等の管理をLua側でやることも可能なわけで、その辺りの設計をどうしようかなと。

とりあえず、UIはLuaを使わずに普通に作る形にした方が手っ取り早いのかな。Luaへの依存度を高くするのはいろいろ試してからの方がいいかもしれない。

2010-03-08

[mac][setup]MacBookバンドルアプリケーションのインストールメモ

先日Macのクリーンインストール後に行ったiPhotoその他アプリのインストールに関するメモ。

2009年の7月にMacBook pro(Leopard)を購入し、年が明けてからSnow Leopardにアップデートした。

その後、一度Snow Leopardのディスクでクリーンインストールを行ったのだが、なぜかiPhotoが入っていない(もしかしたら買ったときもデフォルトではインストールされていなくて、間違えてディスクから何かをインストールしてしまったことがあったのでそのとき入ったのかも)。 iPhoneで撮影した写真や動画はiPhotoで管理していたし、その他の方法でデータを管理する方法はわからない。

MacBookの箱から購入時についてきたDVDの一枚を取り出し、それをPCに差し込むとバンドルアプリケーションのインストールメニューが開く。カスタマイズでインストールするアプリを選択できるらしい。

  • CPU Help Files → 入れない
  • iPhoto → 使うので入れる
  • iMovie → 使うので入れる
  • GarageBand → 入れる。使う予定はないけど
  • iWeb → 入れない
  • iDVD → 入れない。何に使うのかわからない

インストールが完了したが、旧環境から持ってきたiPhotoのデータが開けない。 そこでソフトウェア・アップデートを実行してみる。 するとリストにiPhotoの更新があったのでアップデートを実行。アップデートが完了すると無事開けるようになった。

2010-03-07

[bilbo]ブログ記事に対するコメントをtwetterで

年末にブログシステムをcgi.rb実装からSinatra実装に移行してからこっち、コメント機能が無効になっていた。

ブログに対するコメントをtwitterで受け付けると面白いんじゃないかと思っていたのでその方向で実装してみた。

実装の作戦は以下の通り。

  1. 新規の日記エントリを作成したらそのエントリのタイトルとパーマリンクをtwitterで通知する(日記エントリとペアになるtweetを用意しておき、そのtweetへの返信をブログ記事へのコメントと見なす)
  2. twitterから自分のtweetsを取得して日記エントリに対応するものをキャッシュしておく
  3. twitterから自分のrepliesを取得してキャッシュしておく
  4. 2へのrepliesを日記エントリへのコメントとして日記ページに表示

1は今のところ手動、2と3はcronで定期的にスクリプトを実行、4はブログシステムが動的に処理という形。これで少し様子を見てみようと思う。

現状の問題点としては、コメントとしてポストされたtweetに対するrepliyを拾えていないところ。 各tweetに対する返信をたどることができれば木構造でコメント欄に表示できるんだけど、あるtweetに対する返信tweetは検索できないものと理解している(詳しくないのだけど)。

完全にtweetを木構造でたどれるようになると、もしかしたら爆発的な数になってしまうかもしれないけど、それはそれとして。