TKC Works

ギジュツ的なメモ、読書感想文など

Ansible Inventoryファイルでオプション設定

最近はAnsibleをちょこちょこ試してみています。
例えばVagrant仮想マシンを普通に立ち上げるとポート番号とか認証キーがデフォルト値じゃないので.ssh/configに以下のように書いたりする。

Host ansible_sample
   HostName 127.0.0.1
   User vagrant
   Port 2222
   IdentityFile /Users/hoge/ansible_sample/.vagrant/machines/default/virtualbox/private_key

するとInventoryファイルは

[web]
ansible_sample

と書くだけでよいのだが、いろんなファイル見なきゃいけないのは嫌なのでInventoryファイルだけで完結できないかなと。

Inventoryファイルの書き方を調べてみるといろいろとオプションがあった。
http://docs.ansible.com/intro_inventory.html

上のVagrantの例だとこんな感じ。

[web]
127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user=vagrant ansible_ssh_private_key_file=/Users/hoge/ansible_sample/.vagrant/machines/default/virtualbox/private_key

CouchbaseのPHP SDKでハマったこと

Nginxとphp-fpmの組み合わせで、Phalconで作ったWebアプリケーションからCouchbaseに接続してたんだけど、
"502 Bad gateway"とか "PHP Fatal error: Allowed memory size of ..."が頻発して困った。

とりあえずこの辺を参考にして、
http://webhoric.com/web-dev/nginxphp-fpm-502-bad-gateway

php-fpmのmax_requestsとかphp.iniのmemory_limitとかをガッツリ増やしてみたが変わらず。。

結果はむしろphp-fpmのmax_requestsを増やしすぎたのがよくなかった。

CouchbaseのPHP SDKは接続にコストがかかるからあまり多重に繋ぐなと書いてあった。
http://docs.couchbase.com/developer/php-2.0/performance-tuning.html

おそらくphp-fpmの子プロセスが死なずに残り続けてたのでSDKがCouchbaseに繋がる限界数に達してた。。
とりあえずmax_requestsを一桁にするとエラーが起こらなくなった。チューニングしながら最適値を見つける必要があるが。

Swiftで分割したStoryboardの呼び出し方

チームでアプリを開発する場合や一つのStoryboardが大きくなりすぎるのが嫌な場合など、Storyboardを分割したくなるけど、じゃあどうやって呼び出すの?となるので書いておく。

  • 基本的にはObjective-Cの時と同じ
  • UINavigationControllerを使っている場合はちょっと違うので注意
  • Storyboard上でIs Initial View Controllerのチェックを入れるのを忘れずに
//UIViewControllerの場合
@IBAction func hogeButtonTapped(sender: AnyObject) {
    let story = UIStoryboard(name: "Hoge", bundle: nil)
    let vc = story.instantiateInitialViewController() as HogeViewController
    self.presentViewController(vc, animated: true, completion: nil)
}

//UINavigationControllerの場合
@IBAction func hogeButtonTapped(sender: AnyObject) {
    let story = UIStoryboard(name: "Hoge", bundle: nil)
    let nc = story.instantiateInitialViewController() as UINavigationController
    self.presentViewController(nc, animated: true, completion: nil)
}

ファイル単位でARCを有効にする

ファイル単位でARCを有効にする

cocos2d-xでもSocket.IOでリアルタイム通信をやろうとした場合、
v3には標準のクラスに追加されたからそれを使えばなんとかなる。
ただし、Socket.IOのバージョンは0.9で1.0には対応してないしWebSocketオンリー。

C++でよいライブラリはないか探したけど見つからないので、
iOSからはこのobj-cのライブラリを使うことにした。
https://github.com/pkyeck/socket.IO-objc

ただし、一部ARCを有効にしないといけないファイルがあり、

//SocketRocket/SRWebSocket.m
#error SocketRocket must be compiled with ARC enabled

cocos2d-xで作成したプロジェクトは基本無効になっているためどうしようかと思っていたら、
ファイルごとに設定出来ることを発見。

Build Phases > Compile Sources で対象ファイルに-fobjc-arcを指定すればOK。

こちらを参考にさせて頂いた。
http://lab.dolice.net/blog/2013/05/10/objc-arc-switch/

UnityでiOSでもAndroidでもSocket.IOでリアルタイム通信

僕は別にアプリエンジニアじゃなかったんだけど、やらないといけなくなり、検証したのでメモ。
(Node.jsはv0.10.28、Socket.IOは0.9.17、Unityは4.3.4、iOSは7.1.2、Androidは4.4.2で検証)

スマホでSocket.IOを使いたい場合、ネイティブではこの辺のライブラリを使うと思う。
https://github.com/pkyeck/socket.IO-objc
https://github.com/Gottox/socket.io-java-client

ネイティブプラグインはよくわからなかったのでC#で書いてiOS,Android両方で使えるのはないかなと思っていたら
https://github.com/NetEase/UnitySocketIO
これが見つかった。他にはあまりなさそう。

で、一個問題があって、iOSだとEXC_BAD_ACCESSやら--aot-onlyと言われてうまく動かない。
SimpleJson.dllが古い、かつiOSでは使えないオプションが付いていたみたいなので、
SimpleJsonを自分でビルドし直した。
SimpleJson.csで#define SIMPLE_JSON_NO_LINQ_EXPRESSIONをアンコメントする必要がある。

ここが参考になった。
https://github.com/kaistseo/UnitySocketIO-WebSocketSharp
こっち使ってもよかったかも。
まあどちらにしてもSocket.IOといいつつWebSocketしか使えないし、1.0系に対応するかどうかはよくわからない。。

ちなみにDLLを更新した版はフォークしてここに置いた。
https://github.com/take4/UnitySocketIO

C#のサンプルコード※サーバー側はよくあるサンプルチャットなので割愛。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class NewBehaviourScript : MonoBehaviour {
    public GUIText text1;
    public string text = "";
    SocketIOClient.Client socket;

    // Use this for initialization
    void Start () {
        Debug.Log ("start");

        socket = new SocketIOClient.Client ("http://xxx.xxx.xxx.xxx:3000/"); 
        
        socket.On ("connect", (fn) => {
            Debug.Log("connect - socket");

        });
        
        socket.On ("message:receive", (data) => {
            Debug.Log(data.Json.ToJsonString());
            text = data.Json.ToJsonString() + "\n" + text;
        }); 
        
        socket.Connect();
    }
    
    // Update is called once per frame
    void Update () {
        text1.text = text;
    
    }

    void OnGUI() {
        if (GUI.Button( new Rect (30, 30, 120, 50), "PUSH")) {
            Dictionary<string, string> args = new Dictionary<string, string>();
            args.Add("message", "YO");
            socket.Emit("message:send", args);

        }
    }
}

f:id:take4kamada:20140711160943p:plain

追記

やっぱりこっちを使ったほうがよさげ
https://github.com/kaistseo/UnitySocketIO-WebSocketSharp https://github.com/KLab/websocket-unitymobile