2013年7月23日火曜日

cocos2d-x Xcodeで"Symbol not found: ___CFObjCIsCollectable"というエラーが出る、でも大丈夫

どうも、俺@家です。

タイトルの件ですが、Xcodeでcocos2dxなアプリを開発しててiOSシュミレータで実行しようとすると、
Error loading /System/Library/Extensions/AudioIPCDriver.kext/Contents/Resources/AudioIPCPlugIn.bundle/Contents/MacOS/AudioIPCPlugIn:  dlopen(/System/Library/Extensions/AudioIPCDriver.kext/Contents/Resources/AudioIPCPlugIn.bundle/Contents/MacOS/AudioIPCPlugIn, 262): Symbol not found: ___CFObjCIsCollectable
  Referenced from: /System/Library/Frameworks/Security.framework/Versions/A/Security
  Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
 in /System/Library/Frameworks/Security.framework/Versions/A/Security
のようなエラーメッセージが出まくる場合。
問題ない、大丈夫。no problem。
だってほら、シュミレータ実行できてるでしょ。
iOSシュミレータのバグだそうです。

Error: symbol not found: __CFObjCIsCollectable - stack overflow

以上でぇぇぇぇぇす。

2013年7月1日月曜日

tcpdumpじゃないtcpセッションツールmiruoが凄すぎた

どうも、俺@家です。 

最近、ネットワーク関連の調査でtcpについて調べたり、tcpdumpを使って通信のやり取りを見まくっていました。
 ネットワークについてボトルネックを調べるときは、Linuxサーバのカーネルの設定を見なおしたり、tcpdumpでtcpセッションの内容を確認したりします。
ググればたくさん出てきますが、ネットワーク関連については割と新しめのポストで
Linux Books Support Siteなどが参考になりした。

ところでtcpdumpですが、当然ながらとても便利です。
オプションも豊富で自分の知りたい情報を知ることができます。
ただし、大量アクセスのあるサイトで使うとあらゆるオプションを駆使してフィルタリングしても、ログが大量に出力されて解析が大変ですね。

「どこかの天才がもっとシンプルにTCPセッションを見れるツール作ってないかなぁ」と思っていたら、いました天才が。
高負荷サイトのボトルネックを見つけるには
しかも日本人、しかも2年も前。KLabの開発すげー。
miruoというツールです。

早速インストールしましょう。
※CentOS 6.2


git clone https://github.com/KLab/miruo.git
cd miruo
./configure
make
〜略〜
make[1]: *** [miruo.o] エラー 1
make[1]: ディレクトリ `/usr/local/src/miruo' から出ます
make: *** [all] エラー 2
ありゃ、エラーが出た。

makeのログをたどってみると、

miruo.h:24:17: error: pcap.h: そのようなファイルやディレクトリはありません
きっとpcapらしきライブラリが足りないみたい。


yum install libpcap-devel
よし、インストールを続けよう。


make
make install
make[1]: ディレクトリ `/usr/local/src/miruo' に入ります
test -z "/usr/local/sbin" || /bin/mkdir -p "/usr/local/sbin"
  /usr/bin/install -c miruo '/usr/local/sbin'
make[1]: `install-data-am' に対して行うべき事はありません.
make[1]: ディレクトリ `/usr/local/src/miruo' から出ます
これで/usr/local/sbin/miruoがインストール完了です!
〜に対して行うべき事はありません、と注意されますが、
心のなかで「そうなんですね」と返事しておきましょう。

このmiruoですが、「怪しいTCP通信」だけをピックアップして表示してくれるツールです。
なのでtcpdumpのように全TCPパケットを表示することもないので、解析がしやすくなります。
例えば
1392             0.343 |   (Client IP):50861 == (My Server IP):80    | Total 3 segments, 126 bytes
1392:0000 19:27:28.800 |          SYN_SENT >----S-> SYN_RECV          | 9098F675/00000000   78 - <mss=1410, wscale=4, timestamp 560465119 0, sackOK>
1392:0001 19:27:28.801 |       ESTABLISHED <-a--s- -="" 1392:0002="" 19:27:29.144="" 2e7570d5="" 66="" closed="" lt="" mss="1460," sackok="" syn_recv="" wscale="7>">---R--> CLOSED            | 9098F676/00000000   60 - <>

の場合だと、
1)クライアント→SYN→サーバ
2)サーバ→SYN+ACK→クライアント
3)クライアント→RST(強制終了)
のようなやり取りが行われていたり、

1431             0.345 |   (Client IP):48646 == (My Server IP):80    | Total 13 segments, 2185 bytes
1431:0000 19:27:28.824 |          SYN_SENT >----S-> SYN_RECV          | 6F591A36/00000000   74 - <mss=1420, sackOK, timestamp 14126836 0, wscale=5>
1431:0001 19:27:28.824 |       ESTABLISHED <-a--s- -="" 1431:0002="" 19:27:28.830="" 66="" b1fea867="" established="" lt="" mss="1460," sackok="" syn_recv="" wscale="7>">----S-> SYN_RECV          | 6F591A36/00000000   74 - <mss=1420, sackOK, timestamp 14126936 0, wscale=5>
1431:0003 19:27:28.830 |       ESTABLISHED <-a--s- -="" 1431:0004="" 19:27:28.903="" 66="" b1fea867="" established="" lt="" mss="1460," sackok="" syn_recv="" wscale="7>">-A----> ESTABLISHED       | 6F591A37/B1FEA868   60 - <>
1431:****              |                                              |
1431:0010 19:27:29.074 |         FIN_WAIT1 >-A---F> ESTABLISHED       | 6F591B62/B1FEACEE   60 - <>
1431:0011 19:27:29.074 |         FIN_WAIT2 <-a---f -="" 1431:0012="" 19:27:29.169="" 54="" b1feacee="" gt="" last_ack="" lt="" time_wait="">-A----> CLOSED            | 6F591B63/B1FEACEF   60 - <>
の場合は
1)クライアント→SYN→サーバ
2)サーバ→SYN+ACK→クライアント
3)クライアント→SYN (またSYNかよっ!
4)サーバ→SYN+ACK→クライアント (ほらよっ、二度目やで!
5)クライアント→ACK (やっと接続
のようなやり取りが行われていたり、一目瞭然です。



/usr/local/sbin/miruo --live
と打てば通常のtcpdumpコマンドと同等の結果を得ることも出来ます。
※ポートやホストの指定はできますが、tcpdump独自のオプション(-xや-v、-nなど)は使えませんので、
それらを使いたい場合はtcpdumpを使いましょう。

サーバ側のネットワーク関連のカーネルパラメータのチューニング不足や、クライアントからの不自然なパケット(または攻撃)などを捉える事が用意に出来ます。

SYN再送を補足するかどうか、RSTフラグのパケットを補足するかどうか、到達に◯ミリ秒以上かかった通信を補足するかどうか、などいくつか使えそうなオプションも用意されているので用途に合わせてオプション駆使することも可能です。
超便利。


以上でぇぇぇぇす。

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暗号化ですが、他にも色々あるみたいです。
ココに答えが!


以上デェぇぇぇす。