2013年6月23日日曜日

tmuxのCtrl+b+tの使いどころ

どうも、俺です。
 以前の記事でscreenをやめてtmuxへを書いてから、 ずっとtmuxを使い続けています。

attachやらdetachやら便利ですし、ペイン分割や移動やコピー、ペーストも使いやすいし、色んなコマンドもあってとても便利です。


1つ使いどころが分からないコマンドがありました。

Ctrl + b + t
時間表示。



その時の時間が表示されるコマンドです。
「へー、そんなコマンドもあるんや」と意識せずにいたのですが、ある時このコマンドが必要な場面に遭遇しました。

それが、一番上の画像のようにペインを複数分割した際に、
「今、俺どのペインさわってんの!?」ってなる場合があります。

一応枠線が緑色になるんですが、ペインが多いと分かりずらい。。

そんな時は迷わず

Ctrl + b + t
で、時間を表示させます。
すると、あら不思議、自分が操作しているペインが一目でわかる。


でしょ。


以上でぇぇぇえっぇす。

2013年6月21日金曜日

c++で親クラスのコンストラクタを呼び出す

どうも、俺@家です。

C++でとある基底(親)クラスから派生した子クラスのコンストラクタ内で
親クラスのコンストラクタを呼び出したい場合は、

// 親クラス
class Parent
{
public:
  // 親クラスのコンストラクタ
  Parent()
  {
  };
};


// 子クラス
class Child: public Parent
{
public:
  // 子クラスのコンストラクタ
  Child(): Parent()
  {
  };
};
と書きます。
簡単ですね。

ちなみに子クラスから親クラスの何らかのメソッドを呼び出したい場合は、
// 親クラス
class Parent
{
public:
  // methodParent()の定義
  void methodParent()
  {
  };
};

// 子クラス
class Child: public Parent
{
public:
  void Child::methodChild()
  {
    // 親クラスのmethodParent()を呼びたい
    Parent::methodParent();
  };
};
のように、親クラス名::メソッド名と書きます。
※楽して上のように書きましたが、
 関数の重複定義でコンパイルエラーになる場合があるので、
 宣言する.hファイルと関数の内容を書く.cppファイルとは別けて書きましょう。


ちなみにphpだと
// 親クラス
public class Parent
{
  public function __construct()
  {
  }
}

// 子クラス
public class Child extends Parent
{
  public function __construct()
  {
    parent::__construct();
  }
}
のように、parent::メソッド()のように書きます。


ちなみにObjective-Cはコンストラクタがなくてイニシャライザになりますが、同様に
// 親クラスの.mファイル
@implementation Parent
- (id)init
{
  if ((self = [super init])) {
  }
  return self;
}
@end


// 子クラス .hファイル
@interface Child: Parent
- (id)init;
@end

// 子クラス .mファイル
@implementation Child
- (id)init
{
  if ((self = [super init])) {
  }
  return self;
}
@end
のようにsuperを使って書きます。
そもそもParentクラスも少なくともNSObjectを継承するのでsuperが出てきちゃいますね。


以上でぇぇぇぇえす。

2013年6月9日日曜日

apache付属のhtpasswdコマンドがなくてもBasic認証用ファイルを作る

どうも、俺@休みです。

Linuxサーバにnginx入れててBasic認証したいとき。

# vim /path/to/nginx.conf

-----------------------------
 78   location /secret {
 79       alias /home/foouser/secret_directory;
 80       autoindex on;
 81       auth_basic "member only";
 82       auth_basic_user_file /home/foouser/secrect_directory/.htpasswd;
 83   }
とかやると、
http://hoge.jp/secret以下にBasic認証がかかるようになります。
※.htpasswdファイルは外部から見れないようにする必要があります。

で、この.htpasswdファイルですが、apacheがインストールされている環境では
$ htpasswd -c /home/foouser/secret_directory.htpasswd username
で新規作成できますが、 「nginxしか入れてねぇし、apache入れるん面倒やで」という人は以下のコマンドでもOK。
echo "username:$(openssl passwd -crypt your_password)" >> /home/foouser/secret_directory.htpasswd
上記はcrypt暗号化ですが、他にも色々あるみたいです。
ココに答えが!


以上デェぇぇぇす。

2013年6月6日木曜日

cocos2d-xでiOSとAndroidのクロスプラットフォーム環境構築

どうも、俺@残業するフリしてブログ書き中です。


決して仕事をサボってるわけではありません。
今日はcocos2d-xを使ってiOSとAndroidの両方でアプリを動かす最初の環境構築をめもめも。
開発環境はMacOS X 10.8.3です。
Xcodeのインストールとeclipseのインストール、Androidアプリ開発環境は整備済みとします。


ちなみに、Cocos2d xをさらにさわってみよう!のスライドとがおまるさんのcocos2d-x環境構築〜Androidテンプレート起動までその1がとても参考になりますよ!

長いので手順を記しておきます。
1)cocos2d-xをDLしテンプレートインストール
2)Android側の準備
3)Xcode側でHelloWorld作成&起動
4)Android側でプロジェクト作成し、フォルダをXcode側へコピーしbuild_native.shの実行
5)eclipseへ取り込み、Android端末で起動
6)拍手
となります。


まず、お決まりのcocos2d-x本体をDLしましょう。
2013.06.06時点での安定版最新はv2.0.4でした。

解凍して適当なディレクトリへ置きましょう。
$ unzip cocos2d-2.0-x-2.0.4.zip

$ mkdir ~/Documents/cocos2dx

$ mv cocos2d-2.0-x-2.0.4 ~/Documents/cocos2dx/v2.0.4
# 以下は好みに合わせてね
$ ln -s ~/Documents/cocos2dx/v2.0.4 ~/Documents/cocos2dx/current
次にcocos2d-xのテンプレートをインストールしちゃいます。
$ sudo ~/Documents/cocos2dx/current/install-templates-xcode.sh
これでとりあえずXcodeでcocos2d-xのテンプレートを選択できるようになり、そのプロジェクトが作れます。
もちろんHelloWorldアプリも起動しますよ。
とりあえず拍手しましょう。

では、Android側の準備をしましょう。

AndroidNDKをDLして好きなディレクトリへ置きます。※すでにしてる人は要らない。
$ ls -l /Devloper

drwxr-xr-x@ 19 koexuka  staff   646 5 10 14:57 android-ndk-r8d
次にcreate-android-project.shを編集します。
このファイルはAndroidでcocos2d-xプロジェクトを新規作成するときに実行するファイルです。
$ vim ~/Documents/cocos2dx/current/create-android-project.sh
------------------------------------------------------
  7 # set environment paramters
  8 NDK_ROOT_LOCAL="/Developer/android-ndk-r8d"
  9 ANDROID_SDK_ROOT_LOCAL="/Developer/android-sdk-macosx" # Android-SDKの配置されているPATHに
次にtemplate/android以下にあるbuild_native.shを編集します。
$ vim ~/Documents/cocos2dx/current/template/android/build_native.sh
------------------------------------------------------
  1 APPNAME="__projectname__"
  2
  3 # 以下を追加
  4 NDK_ROOT=__ndkroot__
  5 COCOS2DX_ROOT=__cocos2dxroot__
  6 GAME_ROOT=$COCOS2DX_ROOT/__projectname__
  7 GAME_ANDROID_ROOT=$GAME_ROOT/proj.android
  8 RESOURCE_ROOT=$GAME_ROOT/Resources
  9

〜(中略)〜

 46 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 47 # ... use paths relative to current directory
 48 # 二重定義になっちゃうので以下をコメントアウト(COCOS2DX_ROOT)
 49 #COCOS2DX_ROOT="$DIR/../.."
 50 APP_ROOT="$DIR/.."
これを記述しておくと、Android用プロジェクトを作成するたびにbuild_native.shを編集する手間が減ります。

これでAndroid側の準備も完了。
ではHelloWorldアプリを作りましょう。

まずXcodeで、TestCocos2dxプロジェクトを作成しましょう。

プロジェクト名は「TestCocos2dx」にします。

で最後にCreateしちゃいましょう。

できたぜ、Hello World!


次はAndroidで動くようにします。

さっき編集したcreate-android-project.shを実行します。
$ ~/Documents/cocos2dx/current/create-android-project.sh

# 1)パッケージ名入力。
jp.blogspot.koexuka.app.test

# 2)AndroidターゲットIDの入力。なぜか僕はいつもid:2(android v2.2以上)を選択します。
2

# 3)最後にプロジェクト名。iOS側と合わせておいたほうが分かりやすいかも。
TestCocos2dx
そうすると配置したcocos2dxディレクトリ以下にプロジェクトディレクトリができます。
$ ls -l ~/Documents/cocos2dx/current
drwxr-xr-x   5 koexuka  staff    170  6  6 17:22 TestCocos2dx
できたプロジェクトディレクトリの中にproj.androidというディレクトリがあります。
$  ls -l ~/Documents/cocos2dx/current/TestCocos2dx

drwxr-xr-x   6 koexuka  staff  204  6  6 20:22 Classes
drwxr-xr-x   5 koexuka  staff  170  6  6 20:22 Resources
drwxr-xr-x  17 koexuka  staff  578  6  6 20:22 proj.android
これをXcodeのプロジェクトディレクトリ側へ持っていきます。

ここが分かりにくいですが、Finderを二つ並べてドラッグ&ドロップします。
別に問題ないとは思いますが、Xcode側のプロジェクトが無駄に大きくなってしまうので
proj.androidフォルダをXcode上へドロップしないようにしましょう。


もう1つ面倒な作業をします。
cocos2d-xのAndroid用javaプログラムファイルを、先ほどのXcode側のフォルダへ移します。
$ cp -R ~/Documents/cocos2dx/current/cocos2dx/platform/android/java/src/org/cocos2dx/lib ~/Documents/XcodeProject/TestCocos2dx/proj.android/src/org/cocos2dx
図解すると以下の様な感じ。


ここまで来れば90%出来たも同然!
ではAndroid用にビルドさせます。
$ cd ~/Documents/XcodeProject/TestCocos2dx/proj.android
$ ./build_native.sh
最初は時間がかかるので、しばらくジーッと画面を見つめておきます。

うまくいくと最後に
Compile++ thumb  : box2d_static <= b2World.cpp
Compile++ thumb  : box2d_static <= b2WorldCallbacks.cpp
Compile++ thumb  : box2d_static <= b2Rope.cpp
StaticLibrary  : libbox2d.a
SharedLibrary  : libgame.so
Install        : libgame.so => libs/armeabi/libgame.so
make: Leaving directory `/Users/koexuka/Documents/XcodeProject/TestCocos2dx/TestCocos2dx/proj.android'
のような表示になります。

もしここでコケる場合、build_native.shの内容を見なおす必要があります。
PATHの指定とか間違えてるかも!?

では出来たファイルをeclipseへ取り込むぜ。
eclipseを起動し、「File」→「New」→「Project...」と進み、

「Android」内にある「Android project from Existing Code」を選択しNext!

「Root Directory」は先ほどのXcodeプロジェクト内のproj.androidを選択します。

オッケー!!これでeclipseにプロジェクトが組み込まれたはず!


ではAndroid端末をPCへ接続しドキドキしながらRunボタンを押下仕様じゃないか!
ほら動いた!
あ、ちなみにcocos2d-xはAndroidエミュレータで起動できませんのであしからず。。。


開発手順ですが、基本的にはXcodeで開発します。
Android端末での動作を確認したい場合は、
1)build_native.shを実行
2)eclipse画面へ
3)eclipseのRunボタン押下
だけでOKです。
Resourceフォルダ以下へ画像や音声ファイルを追加しても、勝手にbuild_native.shが取り込んでlibgame.soを生成してくれるので
その辺は気にしなくてOKですよ!

あー、長かった!


※2013.06.20 Android.mkについて追記
とても大事な事を書き忘れていました(汗
上記のようにiOS/Androidでのクロスプラットフォーム向け開発環境を構築して開発開始してからですが、
上述したとおり基本的にはXcodeで開発をします。

Androidへの転送手順も上述のとおりなのですが、その際に「Android.mkの編集」という作業が必要になります。
このファイルは、新しくクラスファイルを追加した場合など、都度編集しなければいけません。
vim proj.android/jni/Android.mk
---------------------------------------
LOCAL_SRC_FILES := hellocpp/main.cpp ¥
  ../../Classes/AppDelegate.cpp ¥
  ../../Classes/HelloWorldScene.cpp ¥
  ../../Classes/MyClass.cpp ¥         # ←のように自作ファイル(.cppのみ)を追記
  ../../Classes/Utils/MyUtil.cpp ¥    # ←どんどん追記していく
〜(略)〜

もしBox2Dを使っている場合などは、
vim proj.android/jni/Android.mk
--------------------------------------
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes ¥
  $(LOCAL_PATH)/../../libs/cocos2dx/Box2D ¥    # ←とか
  $(LOCAL_PATH)/../../libx/cocos2dx/cocoa ¥    # ←必要だったこれとか
〜(略)〜
のように書いていく必要があります。

ちなみに未確認ですが、

Cocos2d-xで新しく作ったクラスを毎回Android.mkに追加せずに済ます

のようにして簡略化させることもできるそうです。

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


2013年6月4日火曜日

[C++] xcodeで "In-class initializer for static data member of type 'const float' is a GNU extension" というWarningが出る

どうも、俺@仕事中です。
ずっとcocos2d-x(c++)を使っての開発中です。

タイトルの件ですが、Xcodeでビルドしたときに
In-class initializer for static data member of type 'const float' is a GNU extension
というwarningが出て 「なんか気持ち悪いなぁ」となる人へ。

これは直訳すると、
「const floatというというstaticなメンバ変数の初期化をするのはGNU拡張だよ」という意味です。
簡単に言うと、
「const floatは普通は使えへんで、せやけどGNU拡張機能でコンパイルできるようになっとるんやで、感謝せえよアホ」
という意味です。

C++(C言語も?)では
const float
という宣言は仕様で禁止されているそうです。

このワーニングが出る場合、動作に問題はありませんが一応直し方を教えてくれている天才がいました。
にゃんにょんProgramTips

ヘッダファイル(HogeClass.h)
// 宣言
public:
  static const float HOGE_FLOAT;
としておき、
定義ファイル(HogeClass.cpp)
#include "hoge.h"
const float HogeClass::HOGE_FLOAT = 10.0f;

// 以下メソッドの定義等
すばらしい!

まぁ、
#define HOGE_FLOAT 10.0
とかでも良いんでしょうけどね。型が分かりにくいですしね。

以上でぇぇぇぇぇす。