2013年5月31日金曜日

iPhone/Androidゲームアプリ『ワイはスラッガー』リリースしました!

どうも、俺@仕事中です。

5/24(金)にcocos2d-xで開発したゲームアプリ『ワイはスラッガー』をリリースしました。
・iOS版はこちら
・Android版はこちら

使用したcocos2d-xのバージョンはv2.0.4です。




これまでcocos2d-iphonecocos2d-android-1を利用してきたのですんなりとcocos2d-xも利用できました。
よく出来てるね、cocos2d!

c++もだいたい問題なく入れました。
phpとかjavaとか経験ある人だと多分そんなに苦労することなくc++学習できると思います。
近いうちにcocos2d-xの記事書きます。

しかし、ゲーム開発は一般のwebシステム開発と違って、数字に強くある必要がありますね。。
物理的な計算とか時間的な計算とか、座標とか、、、結構苦労しました><

『ワイはスラッガー』是非一度DLして遊んでみて下さい!

以上でえぇぇぇぇぇぇす。

2013年5月24日金曜日

dyld: Symbol not found: _OBJC_CLASS_$_NSJSONSerializationでハマった

どうも、俺@帰宅です。

iOSアプリ開発しててハマったのでφ(..)メモメモ

iOSv5.0以上だと問題なく動作するのに、
iOS4.3端末だとビルドは通りますが実行するとタイトルにもある
dyld: Symbol not found: _OBJC_CLASS_$_NSJSONSerialization
Expected in: /System/Library/Frameworks/Foundation.framework/Foundation
のエラーが出ちゃいました。

あ、先に解決方法から書いちゃいますが、
僕の場合はFacebook-SDKのv3.5.1を使っていた為、iOS4.xサポート外だったというオチです。。
チェンジログをちゃんと読め、ということですね。
なのでここから、iOSv4をサポートしているFacebook-SDKのv3.2.1を落としてきて対応しました。

で、本題の
dyld: Symbol not found: _OBJC_CLASS_$_NSJSONSerialization
ですが、これはそのまま
「NSJSONSerializationが見つからねぇよ!」というエラーです。
なぜiOSv4.3端末で見つからねぇかと言うと、NSJSONSerializatoinクラスはiOSv5以上で利用可能だからです。
参考:Apple開発者サイト

でも、deployment targetを4.3に指定してるとどうしてもiOSv4.3で動作させなければいけません。

もう一つ手がかりとなるのが、Xcode上に表示される
dyld`dyld_fatal_error:
0x2fe01080: trap 
0x2fe01084: mov r0, r0
のようなエラーです。
これはiOSv5.0以上に対応しているが、
それ未満には対応していないframeworkを呼び出したりしている場合に出やすいエラーです。
まさに今回の現象にズバリマッチしています。

そういう場合は読み込んだframeworkを "Optional" にするなどして対応出来るのですが、
今回の僕の場合はどのframeworkもOptionalに出来ませんでした。
で、組み込んだframeworkやSDKを1つずつチェックしてて、
Facebook-SDKのChangelogに気付いたという事でした。

もしFacebook-SDK(iOS)を利用してて同様のエラーに遭遇した人は確認してみてください。


以上でぇぇぇぇえす。

2013年4月13日土曜日

Node.jsのexportsとmodule.exportsについて

どうも、俺@休日中です。

最近少しだけ、プライベートでNodeをいじっています。
そういえば、初めてNodeを触ってからもう2年も経つんだなぁとシミジミ。
安定版なんかもうv0.10.3なんですね。

さて、過去のオデの日記で「node.jsで自作モジュールの作り方」というエントリーをポストしてますが、
この頃は多分あまりexportsとmodule.exportsの意味を理解していなかったようです。
※今もしていません。

今回それらを調べてみたところ、
exports
 関数をモジュール化する
module.exports
 オブジェクト(関数、配列、JSON、など)をモジュール化する
という認識で良いような気がしました。

あまり意味が分からない場合は、
Node.js Module – exports vs module.exports(※英語)にあるように、
標準は「module.exports」、補助的に「exports」という事なので、
特に深く考えずmodule.exportsを使うという認識でほぼ間違いはない気がします。

前回の僕のエントリーを元に考えます。
・exportsの場合
Person.js
exports.setName = function(name) {
  this.name = name;
};
exports.hello = function() {
  console.log("hello!");
};
exports.myName = function() {
  console.log(this.name);
};
app.js
var p = require("/path/to/Person");
p.setName("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
これらはつまり、setName(name)、hello()、myName()という3つの関数を
var p = require("/path/to/person");
をp変数にオブジェクトとしてexportして使っています。
「意味的にPersonオブジェクトを生成して・・・」というより、上記3つの関数をまとめたオブジェクト、という感じでしょうか。

・module.exportsの場合]
Person.js
var Person = function(name) {
  this.name = name;
};
Person.prototype.hello = function() {
  console.log("hello");
};
Person.prototype.myName = function() {
  console.log(this.name);
};
module.exports = Person;
app.js
var Person = require("/path/to/Person");
var p = new Person("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
こっちは、Personオブジェクトを取り出して使っています。

両方とも意味合いは同じですが、Person型のオブジェクトとして利用するという意味合いを持たせるには
module.exportsを利用するべきです。

ちなみにexportsとmodule.exportsが1つのファイル(例:Person.js)に混在している場合は
module.exportsが優先されてしまうので要注意。

以上でぇぇぇぇぇす。
もし間違いがあればご指摘下さいm(___)m

2013年4月8日月曜日

c++ 整数同士で割り算(除算)を行うと結果がゼロになっちゃう

どうも、俺@仕事中です。

C言語またはc++で整数同士の割り算を行った場合、
int a = 3;
int b = 5;
float z = a/b;
変数zの結果が0(ゼロ)になっちゃう!

こういう場合は

float z = (float)a/b;

のように、変数a(または変数b どちらでも)をfloat型またはdouble型でキャストしてやればOKです。
なぜなら、a/bはこの場合3/5 = 0...3 という結果になり、それがint同士で除算しているため
コンパイラに答えが0(ゼロ)と判断されてしまうからです。

以上でぇぇえぇっぇす。

2013年3月29日金曜日

CentOSにapache2.4.3をインストール

どうも、俺@寝る前です。

最近アプリ開発してばっかの俺が久しぶりにLinuxネタです。

2012/2月にapache2.4.1がリリースされて1年ちょっと経過し、
じわじわと情報が増えてきたところでようやく僕もapache2.4.3をインストールしてみました。
※2013/03/28時点での最新はv2.4.4

まずソースをDLして展開。
# wget 'http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.4.3.tar.gz'
# tar zxvf httpd-2.4.3.tar.gz
# cd httpd-2.4.3
これまでだと、このまま./configureしてたのですが、2.4からはそれはNGです。
INSTALLファイルにこう書いています。
Consider if you want to use a previously installed APR and 
APR-Util (such as those provided with many OSes) or if you 
need to use the APR and APR-Util from the apr.apache.org
project. If the latter, download the latest versions and 
unpack them to ./srclib/apr and ./srclib/apr-util (no 
version numbers in the directory names) and use 
./configure's --with-included-apr option.
つまり--with-included-aprオプションを使うならaprとapr-utilをDL&展開して
./srclib以下にapr と apr-utilという名前で置きなさい。
ということらしい。
# cd ./srclib
# wget wget http://ftp.tsukuba.wide.ad.jp/software/apache//apr/apr-1.4.6.tar.gz
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-util-1.5.1.tar.gz
# tar zxvf apr-1.4.6.tar.gz
# tar zxvf apr-util-1.5.1.tar.gz
# mv apr-1.4.6 apr
# mv apr-util-1.5.1 apr-util
あと途中でPCREも必要だと怒られたので入れておきます。
# wget 'ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz'
# tar zxvf pcre-8.32
# ./configure --prefix=/usr/local/pcre/v8.32
# make
# make install
ではapacheのインストールを行います。
※オプションは適宜ご自由に。
# ./configure --prefix=/usr/local/apache2/v2.4.3 --with-included-apr --enable-module=so --enable-mods-shared=most --enable-ssl --enable-rewrite --with-mpm=prefork --with-pcre=/usr/local/pcre/v8.32
--with-mpm=preforkオプションを付けておかないと、デフォルトでevent-mpmでインストールされてしまいます。

非同期で多アクセスには強いですが、僕のようなPHPerな開発者にはprefork-mpmがオススメです。
# make
# make install
これで上手くインストールされるはずです。

後は基本的にこれまでのバージョンのものと同じですが、apacheの設定ファイルなんかは
order allow,deny
allow from all
だったものが、v2.4からは
Require all granted
# 禁止の場合は
# Require all denied
になります。
さらには、192.168.0.10のみ許可する場合は

  Require ip 192.168.0.10

となり、逆に192.168.0.10のみ拒否する場合は

  Require all granted
  Require not ip 192.168.0.10


# または

  Require all granted
  
    Require ip 192.168.0.10
  

のようになります。
うーん、なぜ今さら変えてくるかapache.org。
これまでの書き方は非推奨となるそうで、一応まだ使えるみたいです。

あと、MaxClientsはMaxRequestWorkersに書き変わりました。


以上でぇぇぇぇす。