2013年7月12日金曜日

Android 4.xにしたらonPreviewFrameが呼ばれなくなったので対策した

画像認識やAR用途などでカメラからの映像をキャプチャしたい場合、onPreviewFrameで行うことがあると思う。
しかしAndroid 2.x (Gingerbread)では呼ばれていたonPreviewFrameが、Android 4.x (Ice Cream Sandwich)で動かしたら呼ばれなくなっていた。 その対策方法を見つけたのでメモしておく。

問題の起こるコード
class CameraPreviewSurface implements SurfaceHolder.Callback, Camera.PreviewCallback {

    // 中略
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
        if (mCamera != null) {
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.setPreviewCallback(this);
            } catch (IOException e) {
                if(camera != null) {
                    mCamera.release();
                    mCamera = null;
                }
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mCamera.stopPreview();

        // 中略

        mCamera.setParameters(params);
        mCamera.startPreview();

    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {

        // 中略

    }
}

そして、以下が対策済みのコード
class CameraPreviewSurface implements SurfaceHolder.Callback, Camera.PreviewCallback {

    // 中略
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
        if (mCamera != null) {
            try {
                mCamera.setPreviewDisplay(holder);
                // 不要 mCamera.setPreviewCallback(this);
            } catch (IOException e) {
                if(camera != null) {
                    mCamera.release();
                    mCamera = null;
                }
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mCamera.stopPreview();

        // 中略

        mCamera.setParameters(params);
        mCamera.setPreviewCallback(this); // stopPreviewを呼んだら、startPreviewを呼ぶ前にsetPreviewCallback
        mCamera.startPreview();

    }

   @Override
   public void onPreviewFrame(byte[] data, Camera camera) {

        // 中略

     }
}

stopPreviewを呼ぶとそれ以前のsetPreviewCallbackは無効になるらしい。

参考にしたページ
Android Camera - A Problem I Spent Almost Twenty Hours On
Thanks!

2013年3月30日土曜日

NATIVE INSTRUMENTS KOMPLETE AUDIO 6 を Linux から使う

Linuxでマルチチャンネル録音がしたくなりUSBオーディオインターフェースをいくつか検討した結果、ついに手頃な物を見つけた。

それがこのNATIVE INSTRUMENTS KOMPLETE AUDIO 6だ。

実際Ubuntu 12.04のデスクトップPCと、Raspbian “wheezy”のRaspberry Pi、それぞれに接続してみたらあっさりと認識された。

入力をWAVファイルに録音するには、arecordを使って以下のようにすれば良い。
arecord -c 6 -f S32_LE -r 48000 output.wav
オプションに'-c 6'とある通り6 ch同時録音している。
1〜6 chを自由に指定できると良いのだが、未だ成功していない。

2013年3月29日金曜日

CentOS 6.4 に GitLab 5.0.0 をインストールしてはまったこと

インストールは基本的にはGitLabのドキュメントの通り進めれば良いGitLabのinstallation.mdだけではだめで、gitlab-recipesのドキュメントも参考にしながら進めていく。
とはいえ見落としなどいくつかの躓きがあったのでメモ。

躓きポイント1
CentOSのadduserはuseraddのエイリアスである。よってDebian系のadduserとは使えるオプションが違う。
useraddでgitという名前のユーザーを追加する場合は次の通り。
useradd -c "GitLab" git


躓きポイント2
nginx用の設定ファイルはgitlab-recipesのこれを/etc/nginx/conf.d/gitlab.confとして書き込む。
さらに、/etc/nginx/conf.d/default.confと、/etc/nginx/conf.d/gitlab.confが重複するので、/etc/nginx/conf.d/default.confの中身を全てコメントアウトする。

躓きポイント3
そのままではnginxが/home/git以下にアクセス出来ないので、次のようにしてnginxをgitグループに加えることでアクセス権を与えるようにする。
usermod -G git nginx
ちなみに、アクセス出来ない時のエラーは以下のようにして確認できる。
tail -f /var/log/nginx/gitlab_error.log

躓きポイント4
アクセス権を適切に設定する。
chmod 710 /home/git
chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/authorized_keys
git cloneやgit pushはssh経由で行われるが、関連するファイルやディレクトリのアクセス権を適切に設定しておかないとクライアントからのアクセス時にパスワード無しの鍵を登録しているにも関わらずパスワードの入力を求められ先に進めなくなる。
自分が犯した失敗は/home/gitのアクセス権が710以外になっていたのと、/home/git/.ssh/authorized_keysのモードが600以外になっていたことである。
特に/home/gitのグループアクセス権に実行権限のみを付けておくことは重要だ。この実行権限がないとwebからもgitからもアクセス出来なくなる。
設定を間違えたときのエラーの詳細はサーバー側で
tail -f /var/log/secure
としてログを眺めつつ、クライアントから
git clone git@servername:myrepo.git
などとすることで確認できる。


躓きポイント5 (2013.4.4追記)
インストール後にGitLabサーバーのFQDNを変えた場合への対応方法。
1. gitlab/config/gitlab.ymlの設定
gitlab:
    host: 新しいFQDN

2. Emails have incorrect URL in link to project の問題で配信されるメール中のリンクが変わらないので、gitlab/config/environments/production.rbに次の一文を追記。
config.action_mailer.default_url_options = { host: '新しいFQDN', port: 80 }

3. gitlab-shell/config.ymlのgitlab_urlの値の設定
gitlab_url: "http://新しいFQDN/"

4. 1〜3の対応をした上で、gitユーザーになってGitLabを再インストール
bundle install --deployment --without development test postgres
必須ではないかもしれないが、これを実行しないとgitlabサービスをリスタートした直後に配信されるメール中のURLが最初は新しく設定したURLになるものの、すぐに元に戻ってしまっていた。 想像だが非同期のタスクが動き出すとDB内の古い値でgitlabのスクリプト内の変数を書き換えてしまうのではないだろうか。

参考資料
gitlabhq / doc / install / installation.md
gitlab-recipes
GitLab 5.0 を CentOS 6.4 にインストールした

2013年2月2日土曜日

MacでGIMP 2.8.xの動作が重い時の対処方法

2.8からMacにネイティブ対応したGIMPだが、キーボードを押したときに固まる現象が起きており使い物にならなかった。
しかしついに対処方法が分かったのでメモしておく。

この問題を解決するにあたり様々な言語環境でGIMPの挙動を調べた。
その結果、Google日本語入力が入っていると固まることが判明した。

しかし、Google日本語入力は普段使いで恩恵を受けているので消したくない。
そこで編み出したのが以下の手順である。

1. 以下の図ように言語とテキスト(私の場合は英語にしているのでLanguage & Text)の環境設定から、ローマ字入力にはことえりを使うようにする。
2. 次に、同じ画面のリストをスクロールして、ひらがなのみGoogle日本語入力を使うようにする。
3. そしてGIMPを使うときはことえりローマ字入力モードにしたままにしておく。

以上の手順で、GIMP は固まること無く動作させることが出来た。

検証環境
Mac OS X 10.8.2
GIMP 2.8.3
Google日本語入力 1.0.556.1