2012年10月5日金曜日

node.js + express + socket.io 仕様変更対応

expressとsocket.ioのAPI仕様が変わったらしく、適当にアップデートしたら動かなくなってしまった。
対処方法は下記の通り。

サーバー側
var express = require('express')
  , app = express();
  , io = require('socket.io').listen(app.listen(3000));

app.configure(function(){
 app.use(express.static(__dirname + '/public'));
});

クライアント側 HTML
<script src="/socket.io/socket.io.js"></script>

参考にしたページ
「Cannot GET /socket.io/socket.io.js」の解決法 (Node.js v0.8.0/express v3.0.0/socket.io v0.9.6)

2012年10月3日水曜日

vimで一括処理

文字コードや改行コードを一括で変換したい時や特定の文字列を置換したい時に、nkfがなくても、sedを知らなくても、vimさえあればなんとかなります。

1. Vimを起動する

2. カレントディレクトリを置換対象のファイルがあるディレクトリに移動する
:cd foo

3. 引数リストにファイルを追加する
例. カレントディレクトリ以下の拡張子がcのファイル。
:args  **/*.c

4. 確認する
:args

5. 置換する
例. エンコーディングをutf-8、改行コードをLF、タブをスペースにする。
:argdo fenc=utf8 ff=unix et | update

余談
argdoの他にbufdo、tabdo、windoもある。
argsの他に個別に追加削除するためのargaddやargdeleteもある。

2012年5月14日月曜日

UnityとKinectとOpenNIを組み合わせる

UnityとOpenNIとKinectかXtion Proを使って、Unity内のオブジェクト操作する環境を構築する方法についてまとめておこうと思う。

前提条件: OpenNI一式とUnityが動作していること。
検証した環境: Mac OSX Lion、Unity 3.5、Xtion ProまたはKinect


  1. OpenNIのダウンロードページから"PrimeSene Unity Wrapper Unstable Build v0.9.7.4"(2012.5.14時点の最新)をダウンロードする
  2. ダウンロードしたopenni_unity_toolkit-0.9.7.4.zipを展開するとOpenNI_Unity_Toolkit-0.9.7.4.unitypackageが出来る。
  3. UnityのProjectにOpenNI_Unity_Toolkit-0.9.7.4.unitypackageをインポートする。方法はメニューから"Assets"->"Import Package"->"Custom Package ..."でOpenNI_Unity_Toolkit-0.9.7.4.unitypackageを選択。
  4. Unity 3.5を使っている場合、3でインポートしたパッケージ内のNIInput.csにエラーが起こるのでここを参考に次の通り修正する。295行目の"return Input.GetRotation(deviceID);"を"return Quaternion.Euler(Vector3.zero);"。306行目の"return Input.GetPosition(deviceID);"を"return Vector3.zero;"にそれぞれ書き換える。
  5. "OpenNI"->"Prefabs"->"Sample Prefabs" "OpenNI"->"Sample Scenes"にある各種サンプルをHierarchyに追加して動かしてみる。
以上だが、Cheetah3Dで自作したキャラクターにリグを組んでインポートしたら、回転と前後左右が逆になった。右手系と左手系の変換が上手くいっていないようで、久しぶりにBlenderを使おうかと。

参考
[Unity][Blender] BlenderからUnityへキャラクターをインポートする

2012.5.14 手順の5番目の記述が間違えていたので修正


2012年2月29日水曜日

GitoliteをMac OS X Lion Serverにインストールする

クライアントからgitolite-adminがclone出来ずに非常に悩んだのだが、最終的には次のサイトを見て分かった。
gitolite で Git リポジトリへの SSH アクセスを制御する
Gitolite git clone error

ポイント
  1. ssh-keygenで生成するファイルは、普段利用しているid_rsa.pubでは無く、別のものにする。
  2. Appleの提供するGitを使うならサーバーにXcodeをインストールする。
  3. 2でインストールされたGitを使うなら、サーバーのgitユーザーのホームフォルダにある.gitolite.rcに下記の一行を追加する。
  4. $ENV{GIT_EXEC_PATH} = "/usr/libexec/git-core";

以上の全てを満たしておかないと、クライアントからgitolite-adminをcloneしようとした時に下記のエラーが出る。
$ git clone GITUSER@SERVERNAME:gitolite-admin
Cloning into 'gitolite-admin'...
Warning: No xauth data; using fake authentication data for X11 forwarding.
Assertion failed: (argv0_path), function system_path, file exec_cmd.c, line 30.
error: git-shell died of signal 6
fatal: The remote end hung up unexpectedly

特に上記ポイントの3番目は忘れがちなので注意が必要だ。

2012年2月25日土曜日

AndroidとMacをBluetoothのSPPで接続してデータ送受信

AndroidのサンプルコードにBluetoothChatというものがある。
これを改造してMacと繋いで文字列を送受信したので手順を書いておく。

EclipseでBluetoothChatのプロジェクトを作り、BluetoothChatからサンプルコード一式を取ってきて追加する。

BluetoothChatService.javaのUUIDを次のように変更する。
private static final UUID   MY_UUID_SECURE = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

今回、BluetoothChatService.javaのInsecureと書いてある部分は使わないので、メンバ変数から、MY_UUID_INSECUREとmInsecureAcceptThreadを削除する。この状態でビルドするとエラーが出るので、そのエラーに関連する部分もまとめて削除する。
さらにBluetoothChat.javaやリソースXMLの方も、insecureと書いてある部分は使わないので削除してよい。

この状態でビルドしたものをインストールして起動後、メニューボタンを押してMake discoverableを選んでMacから接続しておく。

接続が出来ていれば、Mac側に/dev/tty.NexusOne-BluetoothChatのようなデバイスファイルが出来ているはずだ。
ここまで出来たら、シリアルコンソールで接続する。
例えばscreenを使うなら以下のようにする。
sudo screen /dev/tty.NexusOne-BluetoothChat 9600

双方から文字列をやり取り出来れば完了だ。

Tips
図1のエラーが出る場合は、Mac側から設定を削除した後にもう一度最初から接続設定をするとうまくいくかもしれない。または図2および図3のようにBluetoothの設定画面を開いて、プロトコルを現在RS-232Cが設定されていたらモデムに、モデムならRS-232Cに設定して適用するとうまくいくかもしれない。


図1

図2

図3

参考にしたサイト
BluetoothChatでシリアル接続(SPP)を行う
Androidアプリ開発 ~Bluetooth SPP による無線通信~

2011年12月31日土曜日

phpのデバッグ

php.iniでエラー表示がOff(下記)になっている環境でデバッグする場合。
display_errors = Off
スクリプトに、ini_set( 'display_errors', 1 ); と書く。
<?
ini_set( 'display_errors', 1 );
...何らかの処理....
?>
そうしておいてテストすると、こんな風にエラーが表示される。
php -f foo.php

Fatal error: Call to undefined function bar() in /home/como/foo.php on line 15
リリース版では元に戻すのを忘れずに。

2011年12月29日木曜日

Lion ServerでのApache設定

Mac OSX Lion ServerのWebサーバのDocumentRootは、
/Library/Server/Web/Data/Sites/Default/
設定ファイルは、
/etc/apache2/sites/0000_any_80_.conf
システム環境設定→共有→Web共有→コンピュータのWebサイトフォルダを開く... からだと、
/Library/WebServer/Documents
が開かれてしまうので注意する。