ページ

2011年12月5日月曜日

Skyrim恐るべし

おもしろすぎて、休日の時間が吸い取られる...

2011年10月31日月曜日

swig生成コードがerror: no matching function for callとのたまったら

以下の条件に当てはまるか確認します。

  1. エラー該当コード行が以下のようなデフォルトコンストラクタを呼ぶコード
    Ogre::ResourceManager::ResourceMapIterator result;

  2. Ogre::ResourceManager::ResourceMapIteratorはデフォルトコンストラクタを呼べない


当てはまる場合は、デフォルトコンストラクタを呼ばないコード生成をswigにさせましょう。
具体的には、以下のような2行を、該当コードを生成するクラス用interface宣言より前に記述します。

%feature("valuewrapper") Ogre::ResourceManager::ResourceMapIterator;
class Ogre::ResourceManager::ResourceMapIterator;

詳しい説明は、こちら

結果、コードが以下のように代わり、デフォルトコンストラクタが呼ばれないコードとなります。
SwigValueWrapper< Ogre::ResourceManager::ResourceMapIterator > result;

keywords: swig, default constructor

2011年10月7日金曜日

Ubuntuでkey repeatが効かなくなった時の対処

Ogre3Dライブラリを使用して遊んでいると、頻繁にkey repeatが効かなくなることがあります。
その時は

  1. メニューのシステム => 設定 =>キーボードを選択

  2. 全般タブのリピート・キーのチェックボックスを、一度OFFして、すぐにON


で復帰させることが出来ます。

ちなみに、Ogre3Dでkey repeatが効かなくなるのは、Ogre3Dがinput methodとして使っているOISの終了処理が適切に行われていないためと思われます。

2011年9月9日金曜日

cmake環境におけるmake実行状態を詳細に表示する

cmakeは非常にすばらしいツールなのですが、コンパイル時に問題が起きたときに何をやっているのか良く分からない事が良くあります。これは、生成するMakefileに.SILENTが設定されているために、実行処理のほとんどが表示されないことが要因の一つと考えられます。(順調にコンパイルできているときは、すっきりした見栄えで好きなのですが...)
そのような時は、CMakeLists.txtに
set(CMAKE_VERBOSE_MAKEFILE true)

実行コマンドの全てが表示されるMakefileが生成されるようになるので、自動設定されたコンパイルフラグやリンクパスの確認ができます。

2011年9月8日木曜日

Ubuntu 11.04にastah(旧JUDE)を入れる

Umbrelloも良かったんですが、今時なツールも使ってみようかと思いましてastahを入れてみました。Ubuntu 11.04にastahを入れるポイントは2点です。

  1. sun-javaを入れる
    Sun JavaはPartnerリポジトリに移動しています。リポジトリに追加してインストールしましょう。

  2. フォントを入れる
    日本語に豆腐(ーとかが豆腐になる)がある場合、vlgothicを入れるとなくなります。またフォントが綺麗になります。

2011年8月26日金曜日

華やかさをサポートしてみた

いま日本でもっとも多く手に入るモデル形式、PMD/VMDをサポートしてみました。



まずは何とか動いているというレベルですが、自作のショボい棒人形と違って、とても華やかになりますね。でも時々スカートが荒ぶって、あられもない姿になってしまうので、まだ多くの修正/調整が必要そうです。まぁ、男の子遺伝的にはウェルカムなんですが、見えそうで見えないところに夢があるような気がするので…

PMDは、Lat式ミクVer2.3(Latさん作)
VMDは、スイートマジック(くきょ@せっきょんさん作)
コードは、irrmmdmeshio (ousttrueさん作)を取り込む形で作成しました。
皆さん、いい仕事してますね。

2011年8月15日月曜日

仮想3D空間を作って遊びたい

理由はよく分からない。
世界征服を目指す男の子遺伝子のせいなのだろうか?
とにかく作ってみた。



シュールな絵になってしまった。
世界征服感がまったくない。
もっと人が必要な気がする。



う~ん、いいんじゃないか。
世界征服っぽい感じがでてますね。
ただ、ちょっと世界に動きが感じられないのが問題だ。
物理エンジンを搭載してみよう。



拳王様のお通りだぁ~

あれ、こんな事したかったんだっけ・・・

MMDのモデルに対応してみるのはどうだろうか

今時のモデルフォーマットといえば、MMDのモデルデータ(PMD)かな?
初音ミクと戯れるのもいいかもしれない。

2011年8月3日水曜日

Rubyの拡張ライブラリのプロファイルをとる方法メモ



Rubyからロードされて実行される拡張ライブラリの処理をプロファイルする方法です。
(gprofなどの一般的な方法は、拡張ライブラリ内の処理まではプロファイルしてくれません)
現状、プロファイルできることが判明しているのは、oprofileとgoogle-perftoolsです。
どちらもubuntuならaptで簡単にinstallできました。

oprofile


システム全体のプロファイリングを目的としているものなので、まわりで動いているプロセスも全部プロファイルされてしまいます。
また、カーネル側の設定によっては使えないので、クラウド系サービスなどの環境でカーネル設定を変更できない場合は使えません。
$ sudo opcontrol --reset
$ sudo opcontrol --start
$ ruby load-ext.rb
$ sudo opcontrol --shutdown
$ opreport -l

google-perftools


私としては、こちらがお勧めです。
下記の方法で、サンプリングによる関数呼び出しのプロファイル結果が出ます。
$ LD_PRELOAD=/usr/lib/libprofiler.so CPUPROFILE=./profile.out ruby load-ext.rb
$ google-pprof --text /usr/bin/ruby ./profile.out_5941

5941はプロセスIDです。
プロファイル絡みでは、これ以外にヒープのメモリリークチェックやプロファイル結果のグラフ化などができます。

2011年7月15日金曜日

スマートフォンリンク ナビクレイドル(SPX-CS01)


とても面白そうだったのでSPX-CS01を購入しました。


特徴



  1. クレイドルなのでスマートフォンを車に置く場所として使える

  2. クレイドルについているmicroUSB端子でスマートフォンを充電できる

  3. クレイドルについているBluetoothでスマートフォンと通信でき、スマートフォンの音を出せる

  4. クレイドルにステレオミニジャックがついているので、車の音声外部入力(AUX)に接続することで車から音を出せる

  5. クレイドルのジャイロ/GPS連携でスマートフォンが高性能ナビになる

  6. ハンズフリー電話になるらしい(まだ電話がかかってこないので...)


感想


わたし的には大ヒットです。スマートフォンを充電しながら音楽が聞けるので、とても便利です。また、クレイドルにスマートフォンを載せなくてもBluetoothリンクできるので、同乗者のスマートフォンからでも(リンクさせれば)音楽を流せるはずです。

音楽再生手順は以下。



  1. PCで音楽入手し、DropBoxフォルダに置く

  2. スマートフォン側DropBoxアプリで同フォルダを同期(ダウンロード)

  3. クレイドルとスマートフォンをBluetoothでリンク

  4. スマートフォンで音楽再生すると車のスピーカから音楽が流れる


CD焼きから解放されて大満足です。

本来のメイン機能であるナビもクレイドルのジャイロ/GPSのおかげで精度/追従性が極めて高く、十分使えます。
ですが



  • ダッシュボードに配置すると(夏なので)スマートフォンが焼けそう

  • スマートフォンの画面はナビとしては少し小さい気がする

  • 別に7年前の純正ナビで困ってない

  • なんか邪魔


という保守的な理由からナビ機能は当面ベンチを温めてもらうことにしました。
何で買ったんだっけ…


愛車(初期型アテンザ)メモ



  • 音声外部入力(AUX)なんて近代的なものはついていないので、確保する必要あり。愛車には純正ナビがついていたので「純正ナビの外部入力への接続」をディーラに付けてもらった。

  • クレイドルの配置に関しては、運転席と助手席の間にあるカップ置きがちょうどいい

  • クレイドルの音声外部出力端子から音を出すには、DriveNetアプリの設定->クレイドル設定にある「内蔵スピーカを使用する」をオフにしないといけない。

  • 「純正ナビの外部入力への接続」した場合、外部入力をスピーカに出すには、テレビのチャンネルにあるVTRを選択すればよい。

  • 音が聞こえない場合は、(クレイドルではなく)スマートフォンの音量を確認。


2011年7月7日木曜日

Debian からUbuntuへ



お堅いDebianから元気一杯なUbuntu(11.04)に乗り換えてみました。
予想に反してほとんど困ることがなく移行できてしまいました。同系統だからでしょうか。
しかし、インストール環境もデスクトップも、とてもグラフィカルで安定したものになりましたね。

ネタがないので、ちょっと戸惑った事だけメモとして残しておきます。

ディスクの準備に気をつけよう


昔と違ってインストーラがグラフィカルかつスムースなのでシステムの根幹を変更しているような、あの緊張感に浸れません。
でも観光気分でのんきにクリックを繰り替えしていると、ディスク上の全パーティション消されます。
かわいい顔してても、やることはやるんですね。
ディストリビューションとは関係ない大事なファイルが入っているパーティション(別途確保している/homeとか)まで消されますので慎重に進めましょう。

PPPoEの設定はDSL


ネットワークの設定もGUIなんですね。設定->ネットワーク接続を開くと、ルータ予定のPC(今回移行実施PC)とかだと認識されている2つのEther I/Fが表示されているタブが見えるはずです。ここでどっちが外につながるんだっけ?、とか考えながら設定項目を見てしまいがちなんだけど、これはフェイクです。この設定はPPPoE設定では使いません。
設定は、DSLタブ->追加ボタン->DSLタブにあり、そこにあるユーザ名とパスワードエントリに入力するだけ。Ether I/Fは勝手に適切な方を選んでくれるみたい。どうやってんだろ...

FirewallやNAT設定は、UFW


なんだか強そうな名前になりましたね。iptablesのラッパーかな?
設定方法はググったらたくさん出てくるので、変更点メモだけ残しておきます。
パケットの転送を許可

/etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

/etc/ufw/sysctl.conf
net/ipv4/ip_forward=1

NATの設定

/etc/ufw/before.rulesの最初にnatルール追加。
また、MTU調整用ルール追加。
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through ppp0 - Change to match you out-interface
-A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT

# Don't delete these required lines, otherwise there will be error
*filter
...
# Path MTU Discovery Problem
-A ufw-before-forward -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
...

あと、ppp0をフレッツなら1454にしないとアクセスできないサイトが出ますので、ifconfigを使ってppp0のMTUを1454に変更します。
http://progma.blog136.fc2.com/blog-entry-10.html

2011年7月5日火曜日

スマートフォン(MEDIAS WP N-06C)とPCとUSB接続


付属のUSBケーブルをN-06Cに挿してPCに接続する状況下で
N-06CがUSB接続を認識してくれない(USB認識通知が出ない)事があります。

そんな時は、迷うことなく伝家の宝刀「再起動」です。
N-06Cの電源を一度off/onすると、私の場合は直りました。

まぁ、データ移動(音楽とか)だけでしたら、いまどきは
Dropboxなどのクラウド系サービスを使った方が楽ですね。

不具合繋がりでもう一つ。
N-06Cはまれに(2回/4日確認)再起動してますね。
条件はよく分かりませんが、夜中にされるとなかなか不気味です。

次のアップデートに期待しましょう。

P.S.
7/7のアップデート以降、再起動しなくなった気がする


GitHubにpushするREADME.mdの見た目を事前に確認する方法



見栄え調整のためだけに、3回もcommitしてしまいました。

  • gem install github-markup

  • gem install rdiscount

  • github-markup REAME.md > README.html

rdiscountは、.md(markdown)フォーマットで必要になります。
その他のフォーマットに関しては、下記にて確認しましょう。
http://rubydoc.info/gems/github-markup/0.5.3/frames

P.S.
もっとよい方法がありました。
下記リンクに書き込めばリアルタイムで変換結果を見ることができます。
http://github-preview.herokuapp.com/
これは非常に便利ですね。

ws2_32.dllとmsvcrt-ruby191.dllとSocket Error



MinGW環境上においてRuby拡張ライブラリでネットワークプログラムを書くときのメモ。

  • リンクの際には-lmsvcrt-ruby191より先に-lws2_32をいれるべし。


WSARecvFrom()がエラーで、WSAGetLastError()結果がWSAENOTSOCKだったら上記を確認。

2011年7月1日金曜日

携帯(N905i)からスマートフォン(MEDIAS WP N-06C)へメール移動


N905iに与えた度重なる衝撃のせいか、SDカードを認識してくれません。
しかたがないので、USB経由でメールを移動/変換/導入させました。
その方法をメモしておきます。

ちなみに、N905i側はi-modeメール、N-06C側はSPモードメールを前提としています。
この場合のポイントは、i-modeメールのデータをSPモードメールがimportできる.eml形式にすることです。



  1. datalinkを使って、メールをN905iから吸い出す

  2. datalinkを使って、メールをOutlook Expressにexport

  3. Outlook Expressを起動させ、取り込まれたメール(docomoディレクトリができてる)を一覧を表示させる

  4. メールを全選択、それらをドラッグ&ドロップ(※これ重要)でどこかのtmpフォルダに放り込む (これにより.emlファイルになる)

  5. PC Link Toolを使って、N-06CのSDカード内を見えるようにする

  6. PC Link Toolのメニューのファイル追加を使って、上記tmpフォルダに放り込んだ.emlファイルを、private/docomo/mail/importにコピーする

  7. SPメーラを立ち上げ、メニューボタン->取り込み、で上記importディレクトリからファイルを取り込む



ところが、最近のWindowsには、Outlook Expressがついて無いんですね!

我が家はWindowsXPなので上記で移行できましたが、もしいまどきのOSを使用されているなら、調べた限りでは
datalink[export] => Outlook => [import]Thunderbird[名前を付けて保存] => .eml
という手段でできるような気がします。

そろそろ、新しいWindowsとPC買おうかな。


Rubyの拡張ライブラリをC++で書く場合のメモ


ライブラリとしてロードされる関数は、C リンケージ化しておく


require “libcore.so”

としてRubyプログラムからロードしたい場合は以下のように書く。
extern "C" {
void Init_libcore();
}
void
Init_libcore()
{
// ロード時に呼び出したい初期化処理
// ここではSoundというRubyクラス作成処理を呼び出している
SoundAdapter::init();
}

作成するRubyクラスのC++実装部は、class method化しておく (static付けとく)


SoundというRubyクラスを実装する例
class SoundAdapter
{
public:
static VALUE cSound;
static void init();
static VALUE ruby_new(VALUE self);
static VALUE ruby_loadSound(VALUE self, VALUE fileName);
}
void
SoundAdapter::init()
{
cSound = rb_define_class("Sound", rb_cObject);
rb_define_singleton_method (cSound, "new",RUBY_METHOD_FUNC(ruby_new), -1);
rb_define_method(cSound, "loadSound",RUBY_METHOD_FUNC(ruby_loadSound), 1);
}

rdocに認識してもらうためには



  • rb_define_method()等では、RUBY_METHOD_FUNC()を使用 (これによりrdocのパーサが定義クラスのメソッドとして認識してくれるため)

  • class method処理内容は自動で認識してくれないので、コメントで頑張る


/*
* Document-method: new
*
* call-seq:
*  new() -> SoundObject
*
* fileNameの音声ファイルをロードし、そのfileIdを返却するメソッド。
*
* ====Return
* 音声ファイルID
*/
VALUE
SoundAdapter::ruby_new(VALUE self)
{
Sound* sound = new Sound();
return Data_Wrap_Struct(cSound, NULL, NULL, sound);
}
/*
* Document-method: loadSound
*
* call-seq:
*  loadSound(fileName) -> fileId
*
* fileNameの音声ファイルをロードし、そのfileIdを返却するメソッド。
*
* ==== Args
* fineName: 音声ファイル
* ==== Return
* fileId: 音声ファイルID
*/
VALUE
SoundAdapter::ruby_loadSound(VALUE self, VALUE fileName)
{
Sound *sound;
Data_Get_Struct(self, Sound, sound);
int fileId = sound->loadSound(StringValuePtr(fileName));
return INT2NUM(fileId);
}