Ubuntu上で、MMDAgentにTwitterのTLを読み上げさせる方法

既に気付いている方もおられると思いますが、Launchpad 上の PPA に MMDAgent の deb パッケージを突っ込んであるので、使い方を書いておきます。公式の Linux 版の MMDAgent では Windows 版にある機能のいくつかが未実装となっていますが、この PPA のパッケージでは全機能を独自に実装してあり、Windows 版と同様に使えるようにしてあります。ただし、Windows 版とのバイナリ互換性はありませんので、Windows 用に配布されているプラグインをそのまま使うことは出来ません。また、公式版にはないいくつかの機能を追加してあります(それらについてはまた後日、気が向いたら書きます)。


[使用モデル:DIVAっぽいど(ままま氏)、こっちむいてBabyステージ(39歳P氏)]

今回は、MMDAgent のインストール方法と、Emacs で twittering-mode を使っている人のための TL の読み上げの設定方法を紹介します。

MMDAgentとサンプルスクリプトのインストール

端末を起動し、以下のコマンドでPPAからMMDAgentをインストールします。パッケージはわりと巨大(ダウンロードするサイズが70MBくらい)なので覚悟してください。

sudo add-apt-repository ppa:irie/mmdagent
sudo apt-get update
sudo apt-get install mmdagent

次に、MMDAgentのホームページ(http://www.mmdagent.jp/)からサンプルスクリプト(MMDAgent "Sample Script" version 1.1)をダウンロードしてインストールします。ダウンロードしたファイル(MMDAgent_Example-1.1.zip)が ~/Download に保存されたとします。

PPA のパッケージには独自の改造がしてあり、~/MMDAgent/MMDAgent.mdf という設定ファイルがあると起動時に自動的に読み込むようにしてあるので、以下のように、ファイルを展開した後リネームします。

cd
unzip ~/Download/MMDAgent_Example-1.1.zip
mv MMDAgent_Example-1.1 MMDAgent
cd MMDAgent
ls MMDAgent_Example* | while read i; do mv $i MMDAgent${i#MMDAgent_Example}; done

設定ファイルとスクリプトの修正

PPA のパッケージは開発版のソースコードからビルドしてあります。開発版では設定ファイルとスクリプトの仕様が Version 1.2 から少し変更されていますので、サンプルスクリプトを修正しないと正常に動作しません。

設定ファイル(.mdf)

.mdf ファイルでは pmd ファイル読み込み時のコメントの表示時間を指定するオプション名が、display_comment_frame から display_comment_time に変更されていますので、テキストエディタで MMDAgent.mdf を開いて「display_comment_frame=0.0」という行を見つけて「display_comment_time=0.0」に修正します。以下は修正前後のファイル差分をとったものです。

diff -u MMDAgent.orig.mdf MMDAgent.mdf
--- MMDAgent.orig.mdf	2011-08-03 09:11:26.000000000 +0900
+++ MMDAgent.mdf	2012-06-22 18:42:35.682149452 +0900
@@ -114,7 +114,7 @@
 
 # Comment
 
-display_comment_frame=0.0
+display_comment_time=0.0
 
 # Model
 
スクリプトファイル(.fst)

.fst ファイルでは MODEL_ADD コマンドの第5引数が、親モデルの指定からトゥーンレンダリングの ON/OFF 指定に変更されたので、MODEL_ADD コマンドで第5引数が指定されている行(3箇所)を見つけて、それぞれ「|OFF」(または「|ON」)を挿入します。以下の差分を参考にして下さい。

diff -u MMDAgent.orig.fst MMDAgent.fst | nkf
--- MMDAgent.orig.fst	2011-08-03 09:11:26.000000000 +0900
+++ MMDAgent.fst	2012-06-22 18:38:36.466150048 +0900
@@ -138,7 +138,7 @@
 
 0    11   <eps>                               MODEL_ADD|bootscreen|Accessory\bootscreen\bootscreen.pmd|0.0,12.85,17.6
 11   12   MODEL_EVENT_ADD|bootscreen          MODEL_ADD|mei|Model\mei\mei.pmd|0.0,0.0,-14.0
-12   13   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|mei
+12   13   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
 13   14   <eps>                               MOTION_ADD|menu|rotate|Motion\menu_rotation\menu_rotation.vmd|FULL|LOOP|OFF
 14   15   <eps>                               STAGE|Stage\building2\floor.bmp,Stage\building2\background.bmp
 15   16   <eps>                               MOTION_ADD|mei|base|Motion\mei_wait\mei_wait.vmd|FULL|LOOP
@@ -197,7 +197,7 @@
 # 0071-0090 Guide
 
 1    71   RECOG_EVENT_STOP|図書館             MODEL_DELETE|menu
-71   72   <eps>                               MODEL_ADD|panel|Accessory\map\map_library.pmd|0.0,2.8,2.5|0.0,0.0,0.0|mei
+71   72   <eps>                               MODEL_ADD|panel|Accessory\map\map_library.pmd|0.0,2.8,2.5|0.0,0.0,0.0|OFF|mei
 72   73   <eps>                               MOTION_ADD|mei|action|Motion\mei_panel\mei_panel_on.vmd|PART|ONCE
 73   74   <eps>                               MOTION_CHANGE|mei|base|Motion\mei_guide\mei_guide_normal.vmd
 74   75   <eps>                               SYNTH_START|mei|mei_voice_normal|図書館は、正面から見ると、右前の方向にあります。
@@ -207,7 +207,7 @@
 78   79   SYNTH_EVENT_STOP|mei                MOTION_CHANGE|mei|base|Motion\mei_guide\mei_guide_happy.vmd
 79   80   <eps>                               SYNTH_START|mei|mei_voice_normal|お解りになりますか?
 80   81   SYNTH_EVENT_STOP|mei                MODEL_DELETE|panel
-81   82   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|mei
+81   82   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
 82   83   <eps>                               MOTION_CHANGE|mei|base|Motion\mei_wait\mei_wait.vmd
 83   2    <eps>                               MOTION_ADD|menu|rotate|Motion\menu_rotation\menu_rotation.vmd|FULL|LOOP|OFF
 

これで MMDAgent 本体の設定は完了です。コマンドラインから

MMDAgent

で起動すると、メイさんが現れるはずです。

マイクの設定が正しくされていれは、話しかけると答えてくれます。起動時に表示される音声入力のメーターはキーボードで Shift+J を押すと消せます。

コンソールにはデバッグのためログが出力されるように改造してあります。ログを見る必要がなければ、Unity の Dash から「mmdagent」と入力するか、ランチャーに登録しておいて起動します。また、D キーを押すとウインドウ内でログを見ることもできます。


SubProcessプラグインとサンプルスクリプトのインストール

SubProcess プラグインは自作のプラグインで、子プロセスを起動・停止するコマンド、SUBPROC_START および SUBPROC_STOP を追加します*1。以下のようにインストールします。

sudo apt-get install mmdagent mmdagent-plugin-subprocess

/usr/share/doc/mmdagent-plugin-subprocess/examples にサンプルスクリプトの圧縮されたファイルがあるので、これらを先ほど公式サンプルをインストールしたディレクトリ(~/MMDAgent)にインストールします。

cd /usr/share/doc/mmdagent-plugin-subprocess/examples
zcat MMDAgent_Example.fst.SubProcess.fst.gz > ~/MMDAgent/MMDAgent.fst.SubProcess.fst
zcat mmdagent_dbus_service.py.gz > ~/MMDAgent/mmdagent_dbus_service.py
zcat mmdagent_time_signal.py.gz > ~/MMDAgent/mmdagent_time_signal.py

MMDAgent.fst.SubProcess.fst というファイルはサブのスクリプトです*2。後の2つの Python スクリプトはファイルはサブのスクリプト内で SUBPROC_START コマンドにより起動する子プロセスのプログラムのです。mmdagent_dbus_service.py は D-Bus によるプロセス間通信のサーバ、mmdagent_time_signal.py は時報の読み上げを開始する TIMESIGNAL_START コマンドを提供します。

時報の読み上げ時に音声ファイルを再生したい場合は ~/MMDAgent にそのファイルを保存し、MMDAgent.fst.SubProcess.fst 内の TIMESIGNAL_START コマンドの行を見つけて第4引数(デフォルトでは「chime.ogg」となっている部分)を音声ファイルのファイル名に修正します。

一旦 MMDAgent を終了して起動し直すと、SubProcess プラグインが読み込まれて子プロセスが起動します。

Emacs側の設定

SubProcess プラグインで起動した D-Bus サービスを利用して、Emacs から MMDAgent にコマンドを投げたりイベントを受け取ったりするためのプログラム mmdagent-dbus-client.el、さらにそれを利用して MMDAgent に twittering-mode の TL を読み上げをさせるプログラム twittering-mmdagent.el をインストールします。~/.emacs.d に Emacs のロードパスが通っているとします。

cd /usr/share/doc/mmdagent-plugin-subprocess/examples
zcat mmdagent-dbus-client.el.gz > ~/.emacs.d/mmdagent-dbus-client.el
zcat twittering-mmdagent.el.gz > ~/.emacs.d/twittering-mmdagent.el

試しに Emacs 上で次のコードを実行してみて下さい。

(require 'mmdagent-dbus-client)
(mmdagent-exec-command "SYNTH_START" "mei" "mei_voice_normal" "こんにちは")

正しく設定されていれば、メイさんが「こんにちは」と言ってくれるはずです。

twittering-mode の TL の読み上げを開始するには、上のコードの代わりに以下のコードを実行します。Emacs 起動時に開始するには ~/.emacs ファイルの twittering-mode の設定の後に書いておいて、MMDAgent、Emacs の順に起動します(twittering-mode の設定方法にはここでは触れません)。

(require 'twittering-mmdagent)

これで、TL が更新されるたびに読み上げてくれます。

しばらく読み上げさせていると、いつの間にか読み上げが止まってしまうことがあります。これは特殊な文字を含むツイートがあるとエラーとなって MMDAgent から読み上げ終了を知らせるイベントが来ず、Emacs 側のキューにたまった次のツイート読み上げが開始できないためだと思われます。この場合は、Emacs 上で

M-x twittering-mmdagent-setup

として強制的に読み上げを再開します*3

*1:子プロセスとの通信は、socketpair を子プロセスの標準入出力に接続して行います。

*2:サブのスクリプトは「メインのスクリプト名」+「任意の文字列」+「.fst」というファイル名にしておくと、起動時に自動的に読み込まれます。

*3:MMDAgent を Emacs より後に起動した時に読み上げ開始したい場合にも、このコマンドを使います。

Ubuntu 12.04にCUDA 4.2をインストールした時のメモ

いつの間にか Ubuntuを12.04 と CUDA 4.2 が正式リリースされていたので、インストールしました。

インストールは以下の順序で行います。

  1. Ubuntu 12.04
  2. NVIDIA製ディスプレイドライバ
  3. CUDA Toolkit 4.2
  4. GPU Computing SDK 4.2
  5. サンプルプログラムのコンパイルに必要なライブラリ等

GPU Computing SDK はインストール後に修正する必要があります。CUDA Toolkit も 4.1 では修正が必要でした(Ubuntu 12.04にCUDA 4.1をインストールした時のメモ - irieめも)が、4.2 ではそのままでOKです。

Ubuntu 12.04

インストール方法はいろいろなところに書かれているので、ここでは省略します。使用するPCが Core i7 CPU + メインメモリー 16GiB ということで、64bit版を入れました。以下の記述は 64bit 環境を想定しているので、32bit 環境にインストールする場合はファイル名などを適宜読み替える必要があります。

NVIDIA製ディスプレイドライバ

Ubuntu 12.04 の場合、Ubuntu 公式の nvidia-current パッケージが入っていれば大丈夫です。もしまだ入っていなければ、「システム設定>追加のドライバー」から「NVIDIAの高性能グラフィックスドライバー(バージョン current)」を選択するか、

sudo apt-get install nvidia-current

を実行します。または、nvidia-current-updates パッケージ(GUIによる設定では「バージョン current-updates」)の方が、より新しいバージョンなのでいいかもしれません。

sudo apt-get install nvidia-current-updates

インストールが終わったら、再起動します。

ビデオカードが新しすぎて公式のパッケージのドライバが対応していない場合、Ubuntu-X team の X Updates PPA にある nvidia-current パッケージがほぼ最新のドライバを提供しているので、そちらを試してみるといいと思います

sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install nvidia-current

CUDA Toolkit

CUDAのダウンロードのページ ([developer.nvidia.com/cuda-downloads]) から、以下のように Ubuntu 11.04 用の CUDA Toolkit のファイル (cudatoolkit_4.2.9_linux_64_ubuntu11.04.run) をダウンロードしてインストールします。

wget http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/cudatoolkit_4.2.9_linux_64_ubuntu11.04.run
chmod a+x cudatoolkit_4.2.9_linux_64_ubuntu11.04.run
sudo ./cudatoolkit_4.2.9_linux_64_ubuntu11.04.run

途中でインストール先を聞かれますが、デフォルトの /usr/local/cuda に入れます。

ライブラリ及び実行ファイルの検索パスの設定

以下の内容の /etc/ld.so.conf.d/cuda.conf というファイルを作成します。32bit 環境では1行目は要らないでしょう。

/usr/local/cuda/lib64
/usr/local/cuda/lib

この設定を有効にするために、以下のコマンドを実行します。

sudo ldconfig

以下の内容の /etc/profile.d/cuda.sh というファイルを作成します。

export PATH="/usr/local/cuda/bin:$PATH"
export LIBRARY_PATH="/usr/lib/nvidia-current:$LIBRARY_PATH"

ここで、この設定を有効にするために再ログインします。

GPU Computing SDK

GPU Computing SDK は、追加のライブラリやサンプルプログラム、ドキュメント類のセットです。これをインストールしなくてもCUDAのプログラムは作成できますが、参考になるので入れておく方がいいでしょう。
CUDA Toolkitと同じ場所から をダウンロードし、インストールします。

wget http://developer.download.nvidia.com/compute/cuda/4_2/rel/sdk/gpucomputingsdk_4.2.9_linux.run
chmod a+x gpucomputingsdk_4.2.9_linux.run
./gpucomputingsdk_4.2.9_linux.run

途中でインストール先を聞かれますが、デフォルトの $HOME/NVIDIA_GPU_Computing_SDK に入れます。

GPU Computing SDK の修正

そのままだと、サンプルプログラムのビルド時に次のようなエラーが出てしまいます。

../../lib/librendercheckgl_x86_64.a(rendercheck_gl.cpp.o): In function `CheckBackBuffer::checkStatus(char const*, int, bool)':
rendercheck_gl.cpp:(.text+0xfbb): undefined reference to `gluErrorString'
collect2: ld はステータス 1 で終了しました
make[1]: *** [../../bin/linux/release/recursiveGaussian] エラー 1
make[1]: ディレクトリ `/home/irie/NVIDIA_GPU_Computing_SDK/C/src/recursiveGaussian' から出ます
make: *** [src/recursiveGaussian/Makefile.ph_build] エラー 2

これは ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk というファイルの中でライブラリをリンクする順序が間違っているためです。
そこで、このファイルの 271, 275, 282 行目の $(RENDERCHECKGLLIB) をそれぞれ先頭の方に移動するように修正します。以下のパッチを参考にして下さい。

--- common.orig.mk      2012-06-20 23:00:44.769068969 +0900
+++ common.mk   2012-06-20 23:02:43.273068673 +0900
@@ -268,18 +268,18 @@
 
 # If dynamically linking to CUDA and CUDART, we exclude the libraries from the LIB
 ifeq ($(USECUDADYNLIB),1)
-     LIB += ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB} -ldl -rdynamic 
+     LIB += $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB} -ldl -rdynamic 
 else
 # static linking, we will statically link against CUDA and CUDART
   ifeq ($(USEDRVAPI),1)
-     LIB += -lcuda   ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB} 
+     LIB += -lcuda   $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB} 
   else
      ifeq ($(emu),1) 
          LIB += -lcudartemu
      else 
          LIB += -lcudart
      endif
-     LIB += ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB}
+     LIB += $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB}
   endif
 endif
 

(参考:http://forums.developer.nvidia.com/devforum/discussion/3486/linkingmake-error-while-compiling-sdk-on-ubuntu-11.10/p1)

サンプルプログラムのコンパイルに必要なライブラリ等

Ubuntuの公式のパッケージを利用します。

sudo apt-get install g++ freeglut3-dev libxi-dev libxmu-dev

ただしこれだけでは、MPIを利用するサンプル (simpleMPI) がビルドできません。simpleMPIもビルドしたい場合は Open MPI 関連のパッケージもインストールします。

sudo apt-get install openmpi-bin openmpi-dev
サンプルプログラムのビルド
cd ~/NVIDIA_GPU_Computing_SDK/C
make

ビルドが終わると、$HOME/NVIDIA_GPU_Computing_SDK/C/bin/linux/release にいろいろなバイナリが生成されているので、動かしてみます。例えばnbodyというのは、N体問題を解くプログラムです。

cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release
./nbody
たぶん64bit環境固有の問題

64bit環境では書籍「はじめてのCUDAプログラミング」のサンプルプログラム (http://www.kohgakusha.co.jp/support/cuda/index.html) をビルドしようとすると、「/usr/bin/ld: cannot find -lcutil」というエラーが出て止まってしまいます。以下のように、$HOME/NVIDIA_GPU_Computing_SDK/C/lib 内にシンボリックリンクを作成すると、正常にビルド及び実行が出来るようになるはずです。

cd ~/NVIDIA_GPU_Computing_SDK/C/lib
for i in *_x86_64.a; do ln -sv $i ${i%_x86_64.a}.a; done

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

Ubuntu 12.04にCUDA 4.1をインストールした時のメモ

以前にも CUDA のインストール手順を書きましたが、Ubuntuを12.04 beta 1 (64bit版) にアップグレードして CUDA も新しいバージョン (4.1) を入れ直したので、そのまとめです。

インストールは以下の順序で行います。

  1. Ubuntu 12.04
  2. NVIDIA製ディスプレイドライバ
  3. CUDA Toolkit 4.1
  4. GPU Computing SDK 4.1
  5. サンプルプログラムのコンパイルに必要なライブラリ等

CUDA Toolkit と GPU Computing SDK はインストール後に修正する必要があり、従来よりも少し面倒になっています。

最近は数値計算だけでなく Blender など一般のアプリケーションでも CUDA や OpenCL を利用するものが多くなってきたので、deb パッケージで簡単にインストールできるようになるといいのですが…。(Debian の testing と unstable には既に nvidia-cuda-toolkit というパッケージがありますが、DebianUbuntu では NVIDIAドライバー周りのパッケージングがだいぶ違うので、そのまま Ubuntu に持ってくることはできないと思います。Debian からインポートされた CUDA 4.1 のパッケージが multiverse にあるようですが、案の定ビルドに失敗していて利用できません。)

Ubuntu 12.04

インストール方法はいろいろなところに書かれているので、ここでは省略します。使用するPCが Core i7 CPU + メインメモリー 16GiB ということで、64bit版を入れました。以下の記述は 64bit 環境を想定しているので、32bit 環境にインストールする場合はファイル名などを適宜読み替える必要があります。

NVIDIA製ディスプレイドライバ

Ubuntu 12.04 の場合、Ubuntu 公式の nvidia-current パッケージが入っていれば大丈夫です。もしまだ入っていなければ、「システム設定>追加のドライバー」から「NVIDIAの高性能グラフィックスドライバー」を選択するか、

sudo apt-get install nvidia-current

を実行します。インストールが終わったら、再起動します。

Ubuntu 11.10 の場合はドライバのバージョンが古いので、Ubuntu-X team の X Updates PPA から新しいものをインストールします。

sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
sudo apt-get update
sudo apt-get dist-upgrade

CUDA Toolkit

CUDAのダウンロードのページ (http://developer.nvidia.com/cuda-toolkit-41) から、以下のように Ubuntu 11.04 用の CUDA Toolkit のファイル (cudatoolkit_4.1.28_linux_64_ubuntu11.04.run) をダウンロードしてインストールします。

wget http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/cudatoolkit_4.1.28_linux_64_ubuntu11.04.run
chmod a+x cudatoolkit_4.1.28_linux_64_ubuntu11.04.run
sudo ./cudatoolkit_4.1.28_linux_64_ubuntu11.04.run

途中でインストール先を聞かれますが、デフォルトの /usr/local/cuda に入れます。

ライブラリ及び実行ファイルの検索パスの設定

以下の内容の /etc/ld.so.conf.d/cuda.conf というファイルを作成します。32bit 環境では1行目は要らないでしょう。

/usr/local/cuda/lib64
/usr/local/cuda/lib

この設定を有効にするために、以下のコマンドを実行します。

sudo ldconfig

以下の内容の /etc/profile.d/cuda.sh というファイルを作成します。

export PATH="/usr/local/cuda/bin:$PATH"
export LIBRARY_PATH="/usr/lib/nvidia-current:$LIBRARY_PATH"

ここで、この設定を有効にするために再ログインします。

CUDA Toolkit の修正

CUDA Toolkit のサポートする gcc のバージョンは 4.5 以下であるため、Ubuntu 12.04 の gcc 4.6 で使おうとするとバージョンのチェックの所で引っかかってしまいプログラムのビルドが通りません。そこで、このバージョンのチェックを無視するようにヘッダファイルを変更します。

ファイル /usr/local/cuda/include/host_config.h をテキストエディタで開き、82行目をコメントアウトするか、このファイルに以下のパッチを適用します。

--- host_config.orig.h  2012-01-27 17:20:57.689102815 +0900
+++ host_config.h       2012-01-27 17:29:32.037101532 +0900
@@ -79,7 +79,7 @@
 
 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)
 
-#error -- unsupported GNU version! gcc 4.6 and up are not supported!
+//#error -- unsupported GNU version! gcc 4.6 and up are not supported!
 
 #endif /* __GNUC__> 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) */
 

(参考:http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/GPU_Rendering)

GPU Computing SDK

GPU Computing SDK は、追加のライブラリやサンプルプログラム、ドキュメント類のセットです。これをインストールしなくてもCUDAのプログラムは作成できますが、参考になるので入れておく方がいいでしょう。
CUDA Toolkitと同じ場所から gpucomputingsdk_4.1.28_linux.run をダウンロードし、インストールします。

wget http://developer.download.nvidia.com/compute/cuda/4_1/rel/sdk/gpucomputingsdk_4.1.28_linux.run
chmod a+x gpucomputingsdk_4.1.28_linux.run
./gpucomputingsdk_4.1.28_linux.run

途中でインストール先を聞かれますが、デフォルトの $HOME/NVIDIA_GPU_Computing_SDK に入れます。

GPU Computing SDK の修正

そのままだと、サンプルプログラムのビルド時に次のようなエラーが出てしまいます。

../../lib/librendercheckgl_x86_64.a(rendercheck_gl.cpp.o): In function `CheckBackBuffer::checkStatus(char const*, int, bool)':
rendercheck_gl.cpp:(.text+0xfbb): undefined reference to `gluErrorString'
collect2: ld はステータス 1 で終了しました
make[1]: *** [../../bin/linux/release/recursiveGaussian] エラー 1
make[1]: ディレクトリ `/home/irie/NVIDIA_GPU_Computing_SDK/C/src/recursiveGaussian' から出ます
make: *** [src/recursiveGaussian/Makefile.ph_build] エラー 2

これは ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk というファイルの中でライブラリをリンクする順序が間違っているためです。
そこで、このファイルの 270, 274, 281 行目の $(RENDERCHECKGLLIB) をそれぞれ先頭の方に移動するように修正します。以下のパッチを参考にして下さい。

--- common.orig.mk      2012-01-27 14:34:13.129127766 +0900
+++ common.mk   2012-01-27 14:24:10.433129269 +0900
@@ -267,18 +267,18 @@
 
 # If dynamically linking to CUDA and CUDART, we exclude the libraries from the LIB
 ifeq ($(USECUDADYNLIB),1)
-     LIB += ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB} -ldl -rdynamic 
+     LIB += $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB} -ldl -rdynamic 
 else
 # static linking, we will statically link against CUDA and CUDART
   ifeq ($(USEDRVAPI),1)
-     LIB += -lcuda   ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB} 
+     LIB += -lcuda   $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB} 
   else
      ifeq ($(emu),1) 
          LIB += -lcudartemu
      else 
          LIB += -lcudart
      endif
-     LIB += ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB}
+     LIB += $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB}
   endif
 endif
 

(参考:http://forums.developer.nvidia.com/devforum/discussion/3486/linkingmake-error-while-compiling-sdk-on-ubuntu-11.10/p1)

サンプルプログラムのコンパイルに必要なライブラリ等

Ubuntuの公式のパッケージを利用します。

sudo apt-get install g++ freeglut3-dev libxi-dev libxmu-dev

ただしこれだけでは、MPIを利用するサンプル (simpleMPI) がビルドできません。simpleMPIもビルドしたい場合は Open MPI 関連のパッケージもインストールします。

sudo apt-get install openmpi-bin openmpi-dev
サンプルプログラムのビルド
cd ~/NVIDIA_GPU_Computing_SDK/C
make

ビルドが終わると、$HOME/NVIDIA_GPU_Computing_SDK/C/bin/linux/release にいろいろなバイナリが生成されているので、動かしてみます。例えばnbodyというのは、N体問題を解くプログラムです。

cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release
./nbody
たぶん64bit環境固有の問題

前回も書いたように、64bit環境では書籍「はじめてのCUDAプログラミング」のサンプルプログラム (http://www.kohgakusha.co.jp/support/cuda/index.html) をビルドしようとすると、「/usr/bin/ld: cannot find -lcutil」というエラーが出て止まってしまいます。以下のように、$HOME/NVIDIA_GPU_Computing_SDK/C/lib 内にシンボリックリンクを作成すると、正常にビルド及び実行が出来るようになるはずです。

cd ~/NVIDIA_GPU_Computing_SDK/C/lib
for i in *_x86_64.a; do ln -sv $i ${i%_x86_64.a}.a; done

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

ibus.el version 0.3.2 リリース

ダウンロードはこちらでどうぞ↓
ibus.el - irie @ ウィキ - アットウィキ
または
ibus.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。
https://launchpad.net/~irie/+archive/elisp

Version 0.3.1からの変更点

  • オプション `ibus-agent-search-paths' を追加(ibus.el をロードした後に ibus-el-agnet を別のディレクトリに移動すると自動的に見つけられなくなる、という問題を修正するため)
  • 特定の環境で、Xlib のエラーメッセージ(BadWindow)が時々表示される問題を修正(LP #932517)
  • ibus-daemon自動起動する場合のコマンドラインオプションを、 XIMサーバーを一緒に起動するように変更 ("-d" → "-dx")

細かい修正のみのリリースです。Xlib のエラーメッセージが頻繁に出て鬱陶しいということがなければそのまま 0.3.1 を使っても差し支えないと思います。新しいオプション(ibus-agent-search-paths)が追加されていますが、ほとんどの場合設定を変更する必要はないはずです。

ibus-mode の動作が Fedora 16 でおかしくなっている件について

Wiki で指摘をいただいて初めて知ったのですが、Fedora 16 で ibus-mode を使おうとすると、IBus を有効にしていないのにエンジン名が「xkb:layout:default:#0」のように表示され、文字の入力は一応できるようですが想定外の動作になってしまいます(たぶん一部のコマンドが動かない)。とりあえず workaround で、以下のように .emacs で設定すると普通に動くようになると思います。

(defadvice ibus-status-changed-cb
  (before ibus-fix-status (id status) activate)
  (if (and (stringp status)
	   (string-match "^xkb:layout:default:#[0-9]$" status))
      (setq status nil)))

IBus の本来の動作は、IBus をオフにすると disable シグナルを投げてくるのですが、Fedora 16 では独自のパッチが当てられていて、enable シグナルを "Default Layout" というエンジンを引数に与えて投げるようになっているためにこのような動作になるようです。"Default Layout" というのは実際には変換エンジンではなく、AZERTY や DVORAK などのキーボードレイアウトに対応するための仕組みのようです。もうちょっとマシなやり方はなかったんでしょうか…

ibus.el を修正すべきかどうか、もう少しよく調べてみます。

繰り返しますが、ここや Wiki のコメント欄はあまり見ていないので、不具合などがある場合は Launchpad の Bug tracker か Twitter の方にご連絡ください。

追記(2012/02/28):ibus-toggle コマンドや ibus-enable コマンドは、上の設定だけではうまく動作しません。以下の設定を追加すれば一応使えるようになると思います。

(defadvice ibus-enable
  (around ibus-fix-engine-name (&optional engine-name) activate)
  ad-do-it
  (unless (or engine-name
	      ibus-imcontext-status)
    (setq engine-name (car (ibus-get-active-engine-list)))
    ad-do-it))

ibus.el version 0.3.1 リリース

ダウンロードはこちらでどうぞ↓
ibus.el - irie @ ウィキ - アットウィキ
または
ibus.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。
https://launchpad.net/~irie/+archive/elisp

Version 0.3.0からの変更点

  • surrounding text をサポートしない古いバージョンの IBus (< 1.4.0) でエラーが発生する不具合を修正 (LP #930015)
  • 新しく生成されたバッファが IBus daemon から IMContext ID を受け取る前に削除された場合に、ibus-mode が異常終了する不具合を修正 (LP #930820)
  • 同期通信において、タイムアウト前に "Couldn't receive data from agent." という不適当なエラーメッセージが表示されるのを修正
  • IBus にハンドルされないキーイベントに対して前置引数が効かない不具合を修正
  • 複数ストロークのキーシーケンスに対するエコー領域の表示を修正
  • IBus にハンドルされないキーイベントに対して Emacs のコマンドをの fallback として事項する時、キーイベントのキューに入れずに直接実行するように変更(C-x 等の前置キーイベントを除く)
  • README.Debian ファイルを削除 (Debian #648596)

今回はバグ修正のためのリリースです。

Version 0.3.0 で IBus 1.4.0 の surrounding text サポートに対応したのですが、そのために呼び出している needs_surrounding_text() が以前のバージョンに存在していないためエラーを吐いていました…orz。 Ubuntu 11.10 の IBus は 1.3.99.20110419 という微妙なバージョンで、surrounding text は使えませんが needs_surrounding_text() は使えるのでエラーにはなりませんでした。

新しく生成されたバッファが直ぐに削除された場合の ibus-mode の異常終了は、例えば gdb を many windows を有効にして起動し、C-x 4 0(kill-buffer-and-window)で終了した時などに発生します。

その他、IBus に一旦渡されたキーイベントが IBus で使われずに Emacs 側で処理される場合の扱いに不備があり、前置引数が効かない場合があるバグ等があったため、修正しました。

なお、ここのコメント欄にバグ報告等をされても見落とす可能性が大きいので、バグはLaunchpad内(Bugs : ibus.el)で報告してください(英語でお願いします)。それ以外はTwitterアカウント([twitter:@iRi_E])の方へどうぞ。

ibus.el version 0.3.0 リリース

ダウンロードはこちらでどうぞ↓
ibus.el - irie @ ウィキ - アットウィキ
または
ibus.el in Launchpad
LaunchpadのPPAにdebパッケージが置いてあります。
https://launchpad.net/~irie/+archive/elisp

Version 0.2.1からの変更点

  • surrounding text に対応
  • オプション `ibus-candidate-window-h-offset' を追加
  • オプション `ibus-prediction-window-h-offset' を追加
  • コマンド `ibus-enable-specified-engine' を追加
  • IBus のバージョン 1.3.8 以降で、ibus-prediction-window-position=0 の設定がミニバッファ内でも有効になるように変更
  • 太さ 0 のアンダーラインを表示するように変更
  • `table-insert'で作成した表が、プリエディットが異常終了した場合に壊れる可能性がある問題を修正
  • m17n 等のいくつかのエンジンでプリエディットが異常終了してしまう事がある問題を修正
  • Ubuntu の Unity desktop 上で、get_input_focus() がしばしば誤ってルートウィンドウを返すために入力フォーカスが検出できない問題を修正
  • auto-fill-mode が動作しない不具合を修正 (LP #784452)
  • StumpWM で入力フォーカスの状態が正常に取得できない不具合を修正 (LP #856358)

今回のメインは surrounding text への対応です。IBus 1.4.0 以降及び Mozc 1.3.911.102 以降で再変換機能が使えるようになります。ただし、Mozc 1.3.911.102 にはバグがあり、IBus をオンにした後の初回の再変換が開始されません(Mozc issue 107)ので、再変換をまともに使いたい場合は、Mozc のバージョンを 1.3.931.102 以降にして下さい。Mozc 以外では、ibus-m17n の surrounding text を必要とするいくつかのエンジンもたぶん正常に使えると思います。たぶん。

新しいオプション `ibus-candidate-window-h-offset' と `ibus-prediction-window-h-offset' は、候補ウインドウの表示位置を水平方向に調節するためのものです。標準の状態では、ウインドウ内の変換候補の文字列がカーソル位置よりもかなり右方向に離れて表示されて見づらいので、位置を調節するためのオプションを作ってみました。私の環境では ~/.emacs で以下のように設定しています。

;; 候補ウインドウを左へ57ピクセルずらして表示
(setq ibus-candidate-window-h-offset -57)
;; 予測ウインドウを左へ50ピクセルずらして表示
(setq ibus-prediction-window-h-offset -50)

新しいコマンド `ibus-enable-specified-engine' は、指定したエンジンで IBus をオンにするものです。ibus-mode では Emacs Lisp の制約から shift + alt でエンジンの切り替えができないため、代替の手段として用意しました。M-x ibus-enable-specified-engine とタイプすると、ミニバッファでエンジン名を聞いてきますので入力してください。エンジン名は TAB キーで補完できます。

オプション `ibus-prediction-window-position' を0にしている場合(これがデフォルトの設定)、予測ウインドウをプリエディットの先頭位置に表示しますが、以前のIBusのバージョンでは画面下方ではこのウインドウがプリエディットを隠してしまうため、ミニバッファ内ではこの設定が無効になるようにしていました。IBus 1.3.8 以降ならば、このような場合に予測ウインドウがプリエディットの上側に表示されるようになったため、ミニバッファ内でもプリエディットの先頭に候補ウインドウを表示します。ちなみに `ibus-prediction-window-position' を t にすると、他のアプリケーションと同様に予測ウインドウがカーソル位置に表示されます。

Ubuntu の Unity desktop を使っていると、ワークスペースを切り替えた時などに入力フォーカスがデタラメな挙動をするため、Emacs 上の ibus-mode だけでなく、他の色々なアプリケーションで問題が起こるようです。これは Unity 側で修正してもらいたいのですが、とりあえずまともに動くようにしました。

その他の変更は、ibus-m17n で動作テスト中に気付いた問題を修正するためのもので、日本語のエンジンの動作にはほとんど影響ないと思います。