Jet Fighter

なんとなく手持ち無沙汰な時間があったので、Jet Fighterというiphone MMO ゲームを手に入れてみた。

で、これは名前だけは知っているiMobを作ったところが作っているゲームらしい。あとからiMobの画面を見てみたら色以外まったく同じだった…

3日ほどやってみたんだが、結局やらなくなった。というか、なにがおもしろいんだ?これ…

概要説明

  • 一定時間ごとに行動ポイントが増えていく
  • ミッションをこなして経験値とお金を稼ぐ
  • 稼いだお金で武器や防御兵器、戦闘機などを購入する
  • 同じ程度のレベルの人を攻撃できる
    • 攻撃に成功するとお金と経験値を奪える
  • 友人を勧誘できる
    • 9桁の数字のコードが割り当てられているのでそれを入力する
    • GPSを使い、地理的に近い場所にいる人を勧誘できる

えっと、これだけ。レベル15ぐらいまでやったんだけど、展開に変化はまったくなかった。上位の人を見ると装備が同じぐらいのものだったのでだいぶやった方だと思うんだけど。

ちなみに、パラメータとしては、attackとかdefenceの二つがあるんだけど、別の人を攻撃する際に必要な値は人数。おそらくそれだけ。

レベル15ぐらいになるとみんな100とか200とかの友人(squadと呼ばれる)がいる。一応レベルの10倍までの人数しかカウントされないというようになっているようだが、それでも150人。武器の数も重要にはなるようだけど、この人数が多ければ勝ち。少なければ負け、っぽい。

つまり友人の数だけが必要で、あとはほんとに単なる作業。そのくせ時間拘束が厳しい。一定時間毎にポイントが溜まる形式なので放置でいいんじゃね?とか思うんだが、あっという間に上限まで溜まるので、無駄にしないためにはちょこちょこアクセスしないといけない。まあ別に無駄になるのを無視すればいいんだけど。

で、これがほんとにおもしろいの?友人の数が少なくて勝ったことがないからなのかもしれないけど。

もうちょっと戦略を考えたりする余地があったほうがおもしろいと思うんだけどなぁ。

いいところ

ただ、おもしろいなぁと思うところはそれなりにあった。おもにUIだけど。

  • 徹底して文字を入力させないところ
    • ボタンだけでできるようになっている
    • iphoneでは入力画面が出てくるのが遅いからか
  • 常時statusが表示されているところ

しかし正直これなら普通のWebページをiphone用にカスタマイズしたものでできる気がする。

あと、

  • 人数が重要

なので、強制的に人数を増やすこと(ミッションに人数が必要)と、簡単に人数を増やせる方法が用意されているのがすごいことだと思う。

これがなぜ受けたのか?

おれにとってはできることが少ないし展開がまったく変わらないのでおもしろくないと感じるが、大多数の人にとってはこれぐらいで十分おもしろいのかもしれない。

友人の数が少ないだけで、ある程度以上増えるとおもしろくなるのかもしれない。特にリアル友人を引き込めればいいのかも。facebookでmob warsが流行ったのはリアル友人とつながっていたからかもしれず、最初からiphoneで参入しようとしてもだめなのかも。

いずれにせよ

こういう形式のゲームは細かな時間でできるからiphoneなどには合うだろう。位置情報とかSMSとかTwitterとかと絡めればさらにおもしろいと思う。で、iphoneアプリじゃなくてwebサービスとして展開すればiphone以外にもユーザが増えていいのかもね。

1. CUDA for Mac

ここから入手

http://www.nvidia.com/object/cuda_get.html#macos

Toolkit, Visual Profiler, SDK合わせて90Mぐらい。

ドキュメントを入手

http://www.nvidia.com/object/cuda_develop.html

/usr/local/cuda/doc にも入る。

要件

インストール後の設定

  • PATH に /usr/local/cuda/binを加える
  • DYLD_LIBRARY_PATH に /usr/local/cuda/lib を加える
export PATH=/usr/local/cuda/bin:$PATH
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH

試しにcompile

% nvcc -V  (nvccはnvideaのcompiler)
% cd /Developer/CUDA
% make

バイナリは、
/Developer/CUDA/bin/darwin/release
にできる。

お試し
% cd /Developer/CUDA/bin/darwin/release
% export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
% ./deviceQuery
CUDA Device Query (Runtime API) version (CUDART static linking)
There is no device supporting CUDA.

Device 0: "Device Emulation (CPU)"
  CUDA Capability Major revision number:         9999
  CUDA Capability Minor revision number:         9999
(...)

ちょ、こいつ対応してないじゃん…


- 終 了 -

ついでにRuby版

ruby書くの2年ぶりぐらいかも。

def geopoEncode(latitude, longitude, scale)
  # 64characters (number + big and small letter + hyphen + underscore)
  chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"
  geopo = ""

  # Change a degree measure to a decimal number
  latitude = (latitude + 90) / 180 * (8** 10)
  longitude = (longitude + 180) / 360 * (8** 10)

  # Compute a GeoPo code from head and concatenate
  for i in 0..scale
    geopo += chars[(latitude / (8 ** (9 - i)) % 8).floor + (longitude / (8 ** (9 - i)) % 8).floor * 8,1]
  end
  return geopo;
end

def geopoDecode(geopo)
  chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
  latitude = 0
  longitude = 0
  for i in 0..(geopo.size-1)
    # What number of character that equal to a GeoPo code (0-63)
    order = chars.index(geopo[i])
    # Lat/Lng plus geolocation value of scale
    latitude  = latitude  + (order % 8).floor * (8 ** (9 - i))
    longitude = longitude + (order / 8).floor * (8 ** (9 - i))
  end

  # Change a decimal number to a degree measure, and plus revised value that shift center of area
  latitude = latitude * 180.0 / (8 ** 10) + 180 / (8 ** geopo.size) / 2 - 90
  longitude = longitude * 360.0 / (8 ** 10) + 360 / (8 ** geopo.size) / 2 - 180
  scale = geopo.size

  return latitude, longitude, scale
end

p geopoEncode(35.658578, 139.745447, 6) # -> Z4RHXX
p geopoEncode(48.858271, 2.294512, 6)   # -> C1qn6P
p geopoEncode(31.658578, 139.745447, 3) # -> Z3O
p geopoDecode("Z4RHXX")
p geopoDecode("C1qn6P")
p geopoDecode("Z30")

rangeの指定の仕方をすっかり忘れてたのでちょっと時間かかっちゃった。

GeoPoをPythonで

緯度経度を文字列で表現する方式GeoPo、というのがあるらしいというのを知った。んで、サンプルコードにPythonがなかったのでついかっとなってPHPをそのまんまPythonに移植してみた。

http://geopo.at/intl/ja/developer/sample_code.html

import math

def geopoEncode(latitude, longitude, scale):
  # 64characters (number + big and small letter + hyphen + underscore)
  chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"
  geopo = ""

  # Change a degree measure to a decimal number
  latitude = (latitude + 90) / 180 * pow(8, 10)
  longitude = (longitude + 180) / 360 * pow(8, 10)

  # Compute a GeoPo code from head and concatenate
  for i in range(scale):
    geopo += chars[int(math.floor(latitude / pow(8, 9 - i) % 8) + math.floor(longitude / pow(8, 9 - i) % 8) * 8)]

  return geopo;
def geopoDecode(geopo):
  # 64characters (number + big and small letter + hyphen + underscore)
  chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
  latitude = 0
  longitude = 0
  for i in range(len(geopo)):
    # What number of character that equal to a GeoPo code (0-63)
    order = chars.find(geopo[i])
    # Lat/Lng plus geolocation value of scale
    latitude  = latitude  + math.floor(order % 8) * pow(8, 9 - i);
    longitude = longitude + math.floor(order / 8) * pow(8, 9 - i);

  # Change a decimal number to a degree measure, and plus revised value that shift center of area
  latitude = latitude * 180 / pow(8, 10) + 180 / pow(8, len(geopo)) / 2 - 90
  longitude = longitude * 360 / pow(8, 10) + 360 / pow(8, len(geopo)) / 2 - 180
  scale = len(geopo)

  return (latitude, longitude, scale)

if __name__ == '__main__':
  print geopoEncode(35.658578, 139.745447, 6) # -> Z4RHXX
  print geopoEncode(48.858271, 2.294512, 6)   # -> C1qn6P
  print geopoEncode(31.658578, 139.745447, 3) # -> Z3O
  print geopoDecode("Z4RHXX")
  print geopoDecode("C1qn6P")
  print geopoDecode("Z30")

間違ってるというご指摘お待ちしております。転載、使用する方がいらっしゃいましたらご自由にどうぞ。ってほんとうに単に写しただけですが。

追記: NTEmacs

k12uから「NTEmacsでいいんじゃね?」と言われたのでプレリリース版で試してみた。

(emacs-version)
-> "GNU Emacs 23.0.90.1 (i386-mingw-nt5.1.2600) of 2009-02-02 on SOFT-MJASON"
(fboundp 'mw32-ime-initialize)
-> nil 

というわけで、同様みたい。え、攻めすぎ?

問題

どうも日本語入力にmeadowみたいにWindows IMEATOKを使えないみたいです。(mw32-ime-initialize)がそもそもないようです。一応標準の(Cannaなのかな?)かな漢字変換は使えますが、実用に耐えないレベルです。これではログとりに使えない…

Windowsでemacs

emacs本家がWindowsバイナリを配ってるではないですか。というわけで、これを使ってみることにする。

Download

ここからとれます。

http://ftp.gnu.org/pub/gnu/emacs/windows/

ここから最新の、例えばemacs-22.3-bin-i386.zip をとってきます。

Install

zipを展開して、適当なところに置きます。ぼくはC:/Program Files以下にemacs-22.3を置きました。

実行

emacs-22.3/bin/runemacs.exe を実行します。

ぼくはWindowsではbluewindを使っているのでこのrunemacs.exeを登録するだけでした。他の人はショートカットを作ったり、PATHを通したりするといいでしょう。
(Bluewind: http://cspace.s2.xrea.com/software/bluewind/ いつも使わせていただいております。感謝!)

.emacsをどこに置けばいいの?

http://www.gnu.org/software/emacs/windows/Installing-Emacs.html#Installing-Emacs

を見ると、

  • 1. HOMEという環境変数が設定されていればそこを使う
  • 2. HKCU\SOFTWARE\GNU\Emacs\HOMEというレジストリがあればそこを使う
  • 3. HKLM\SOFTWARE\GNU\Emacs\HOMEというレジストリがあればそこを使う。ただし、複数のユーザが同じHOMEを共有することになるので推奨しない。
  • 4. C:\.emacsがあった場合、C:/を使う。これは後方互換性のため。
  • 5. ユーザのAppDataディレクトリを使う。これは、通常ユーザのpreferenceディレクトリの下のApplication Dataディレクトリである。具体的な場所はWindowsのバージョンによってことなる。

一番簡単に調べるのは、C-x C-fを押して、

  ~/

と書き、TABを二回押すと~が展開されてHOMEが分かる。ここに.emacsを置けばいいみたいです。他にも、

  (insert (getenv "HOME"))

を*scratch*に書いて、C-x C-e で評価してやれば分かります。ぼくの場合は↓でした。

C:\Documents and Settings\faw\Application Data

なので、環境変数HOMEを設定しました。これはloginしなおさないと反映されない点に注意です。

また、、Windows(というかexplorer)では、"."で始まるファイル名を扱うことができません。そのため、~/.emacsではなく、

  ~/.emacs.d/initl.el

が代わりに使われます。.emacsをここにファイル名を変えて置けばいいみたいです。

作業ディレクト

bluewindを使っているので、ショートカットの作業ディレクトリを編集してやれば指定のディレクトリが最初のディレクトリとなります。