cocos2d-x javascriptではcc.Sprite.initWithFileが使えない

首題の通りのようです。

cc.Sprite.initWithFile does not exist | Obj-C based 2D engine for iOS, OSX and Android

こんな感じで書きたかったんですが無理みたい。

var Enemy = cc.Sprite.extend({
	ctor:function(file_name){
		this.initWithFile("enemy.png");
	},
	//updateをオーバーライド
	update:function(dt){
		cc.log(dt);
	}
});
initWithSpriteFrameNameはあるのでそっちは大丈夫ぽいですが。1枚もの画像から作る場合はextendしない方が良いっぽいです。 なので、こんな感じで逃げました。
var Enemy = function(arg){
	var sprite = cc.Sprite.create("enemy.png");
	//updateをオーバーライド
	sprite.update = function(dt){
		cc.log(dt);
	};
	return sprite;
};

Time::Pieceのバグ?newからのオブジェクトとstrftimeからのオブジェクトの引き算がおかしい

perlにTime::Pieceという便利なライブラリがありますが、newから作成したオブジェクトとstrftimeから作成したオブジェクトの引き算をすると誤作動するようです。

use Time::Piece;

my $now = new Time::Piece(time());
my $now_from_strptime = Time::Piece->strptime($now->strftime('%Y-%m-%d %H:%M'),'%Y-%m-%d %H:%M');
my $today_str = $now->strftime('%Y-%m-%d');
my $from_str = $today_str.' 12:00';
my $to_str = $today_str.' 15:00';
my $from = Time::Piece->strptime($from_str,'%Y-%m-%d %H:%M');
my $to = Time::Piece->strptime($to_str,'%Y-%m-%d %H:%M');

my $now_minus_from = $now - $from;
my $to_minus_now =  $to - $now;
my $to_minus_from = $to - $from;
my $from_minus_to = $from - $to;
my $to_minus_now_strp = $to - $now_from_strptime;
my $now_strp_minus_from = $now_from_strptime - $from;

print <<EOT;
# 基本時間の定義
now:	$now
now_from_strptime: $now_from_strptime
from:	$from
to:	$to

# strftimeから作成したもの同士の引き算は正常に動く
to-from: $to_minus_from

# newから作ったものと、strftimeから作成したものの引き算はおかしい
now-from:	$now_minus_from
to-now:	$to_minus_now

# newから作ったものでも、strftimeで作りなおせばOK
now_strf-from:	$now_strp_minus_from
to-now_strf:	$to_minus_now_strp
EOT

1;
で、実行結果が下記です。
# 基本時間の定義
now:	Sat Sep 21 22:14:48 2013
now_from_strptime: Sat Sep 21 22:14:00 2013
from:	Sat Sep 21 12:00:00 2013
to:	Sat Sep 21 15:00:00 2013

# strftimeから作成したもの同士の引き算は正常に動く
to-from: 10800

# newから作ったものと、strftimeから作成したものの引き算はおかしい
now-from:	4488
to-now:	6312

# newから作ったものでも、strftimeで作りなおせばOK
now_strf-from:	36840
to-now_strf:	-26040
やっているのは、nowを現在時刻でnewにより作り、それよりも過去のfromとtoという2つの時刻をstrftimeで作成。Time::Pieceオブジェクト同士の引き算を文字列で評価すると秒数になるのですが、明らかに挙動がおかしいです。3つのオブジェクトを普通にprintしてみると、一見ちゃんと作れてるっぽくはあるのですが。
そこで、nowから一度strptimeで文字列時刻を取り出してstrftimeで作りなおして再度引き算してやるとうまくいきます。
Time::Pieceにおいてnewは使わない方が良いのかな…。

cocos2d-xの環境構築

最近流行りのcocos2d-xの環境を構築してみました。構成は下記のようになってます。

まず参考にしたのはここ。
[Mac] cocos2d-x でクロスプラットフォーム(iPhone, Android)開発環境の構築 | ラクイシロク
ほぼこれの通りに進めればうまくいったのですが、Android NDKとcocos2d-xの依存関係ではまったので、環境情報とNDKのダウンロード方法だけ追記しときます。

Mac OS X 10.8.4
cocos2d-x-2.1.4
Eclipse 4.2.1
android-ndk-r8e

cocos2d-xはこちらから2.1.4を選択
Cocos2d-x | Download

次にAndroid SDKのダウンロード。Eclipseはもう既にあるけど、EclipseもBundleされているやつしか見つからなかったので、それを落として、展開して出てきたsdkディレクトリをandroid-sdkとリネームしてtoolsフォルダへ移動
Android SDK | Android Developers

続いてAndroid NDKをダウンロード。android-ndk-r8e-darwin-x86_64.tar.bz2にする。
現時点での最新版はr9だが、cocos2d-xが対応しておらず起動時にエラーになってしまうので古いものをURL直打ちで取得。

あとは先ほどのブログの手順にならって構築。

インストールしているSDKのバージョンと、デフォルトで作成されるプロジェクトが想定しているバージョンに差異がありエラー。下記の2点を修正しました。ちなみに私のSDKのバージョンは18でした。

  • AndroidManifest.xmlのUses SDK -> Min SDK versionが8だったので、18へ変更
  • Unable to resolve target 'android-8'というエラーも出ていたので、project.propertiesを見るもandroid-18だった。あれ、おかしいなと思い一度7など別の値に変更した後、もう一度18に戻すとうまくいった

WordPressからはてなブログへ移行(はてな記法を使っていた場合)

このブログ、元々はてなブログで書いていたのですが、一時的にWordPressへ浮気してました。
最近再度はてなブログへ戻ってきたのでその時のプロセスを書いておきます。

WordPressからWXR形式でエクスポート

ツール->エクスポートからブログのデータをエクスポートします。WXR形式のファイルが得られます。拡張子はxml

Movable Type(MT)形式に変換

WXR形式のままでははてなブログへ入らないので、下記のツールを使ってMT形式へ変換します。
小物置き場 - WxrToMt

はてなブログへインポート…しかし!

これではてなブログへインポートできる形式になったわけですが、問題発生!
なんとはてなブログへインポートすると、BODY部分がHTMLとして読まれてしまうので化け化けになるという…
WordPress時代もはてな記法のプラグインを利用して書いていたので、はてな記法で書いててそのままはてなブログに移行できないってどういうこと?
とか思いましたが、下記の方法で迂回しました。

MT形式のファイルを、はてなダイアリーにインポート

はてなダイアリーにもMT形式の受け口があり、こちらにインポートするとめでたくはてな記法が生かされた形でインポートしてくれます!

はてなダイアリーからはてなブログへインポート

はてなブログにはインポートする時の受け口がMT形式はてなダイアリーからの2つがあり、前述したようにMT形式からだとHTMLとして読み込まれ悲惨なんですが、はてなダイアリーからだとプレーンテキストとして読み込んではてな記法もばっちりです!

ちなみにはてなブログに戻ってきた理由は、こっちの方がプレビューの表示などが軽くて高速だったのと、はてな記法で書くならやっぱはてなが便利だよねという理由からです。

Linuxワンライナー集

特定の名前の入ったプロセスをまとめてKILLするコマンド。例えば、perlという文字列の入るプロセスをkillしたい場合はこんな感じで。grepで条件を柔軟に絞れるので非常に便利。

kill  `ps -ef | grep perl |  awk '{print $2;}'`
メモリを消費しているプロセスを分かりやすく表示する。
ps alx |  awk '{printf ("%d\t%s\n", $8,$13)}'

gitの便利コマンド備忘録

備忘録的に…。

まだpushしていないcommitを見る(masterブランチの場合)

git log origin/master..master
commit間のファイル差分を見る
git diff --stat commit commit
複数のcommitをくっつける(squash)する、or 消す
# squashしたいcommitが20個以内にある場合、下記のコマンドを打つと
git rebase -i HEAD~20
# 下記のような感じで画面に出力される。
# squashしたいやつをpick -> squashに変えると前のコミットと同居される
# 消したいやつは行ごと消す
pick 4526f6a add hoge
pick d12c991 modify hoge
pick 44e1104 modify hoge again
mergeを取り消す。 git mergeしてコンフリクトが起きたのでとりあえずもとに戻したい時に打つコマンド。 mergeの時はmerge前の状態がORIG_HEADに保存されているらしい。
git reset --hard ORIG_HEAD
リモートブランチを最終更新日順にリストする
(for i in `git branch -r | colrm 1 2` ; do echo `git log --date=iso8601 -n 1 --pretty="format:[%ai] %h" $i` $i ; done) | sort -r 

Perlでディレクトリ内の各ファイルを再帰的に処理する関数

あるディレクトリ内を再帰的に処理し、その結果を変数の中に詰め込む関数を作ってみました。

sub recursive {
    my ( $base_dir, $result, $function ) = @_;
    my( @files );
 
    @files = glob( $base_dir.'/*' );
 
    for my $file_name ( @files ){
        if ( -d $file_name ){
            # process recursively
            recursive( $file_name, $result, $function );
        } elsif ( -f $file_name ){
            # process file
            $result = &$function($file_name,$result);
        }
    }
}
こんな感じで使えます。
package Hoo;
use strict;

sub recursive {
    my ( $base_dir, $result, $function ) = @_;
    my( @files );
 
    @files = glob( $base_dir.'/*' );
 
    for my $file_name ( @files ){
        if ( -d $file_name ){
            # process recursively
            recursive( $file_name, $result, $function );
        } elsif ( -f $file_name ){
            # process file
            $result = &$function($file_name,$result);
        }
    }
}

package Foo;

my $result = [];
my $func = sub {
    my ($file_name,$result) = @_;
    push @$result, "$file_name!!\n";
    return $result;
};

# Users/myself/hogeの下に1.txt, 2.txt, 3/1.txtというファイルがあったと仮定
Hoo::recursive("/Users/myself/hoge",$result, $func);

print $_ for @$result;

# /Users/myself/hoge/1.txt!!
# /Users/myself/hoge/2.txt!!
# /Users/myself/hoge/3/1.txt!!