Ubuntu12.04上でMozcをビルド

今回はMozcをビルド。

ここを参考に。

■開発環境を準備。

$ sudo apt-get install g++ python libibus-1.0-dev libssl-dev libdbus-1-dev libglib2.0-dev subversion devscripts debhelper libqt4-dev libzinnia-dev tegaki-zinnia-japanese libgtk2.0-dev

■ソースを取得してビルド。

$ mkdir -p ~/work/mozc
$ cd ~/work/mozc
$ svn co http://mozc.googlecode.com/svn/trunk/src
$ svn co --ignore-externals http://gyp.googlecode.com/svn/trunk@1251 src/third_party/gyp
$ svn co --ignore-externals http://protobuf.googlecode.com/svn/trunk@375 src/protobuf/files
$ cd src
$ debuild -b -uc -us

■インストール。

$ sudo dpkg -i ../ibus-mozc_1.5.1090.102_i386.deb ../mozc-server_1.5.1090.102_i386.deb ../mozc-utils-gui_1.5.1090.102_i386.deb

■設定。
Mozcを反映させるためにログインし直してから

$ ibus-setup

として「IBusの設定」ダイアログを表示。
「インプットメソッド」タブを選択。
「使用するインプットメソッドをカスタマイズ」にチェックを入れ、
「インプットメソッド」リストで[日本語-Mozc]を選択し、リストの一番上に配置する。

■確認。
テキストエディタで日本語入力を行うとき、インプットメソッドのアイコンがMozcのものに変わってるのを確認。

Ubuntu12.04にAMD APPでのOpenCL開発環境を用意

Ubuntu12.04(32ビット。VMWare仮想PC環境で確認。)で、AMD APPを使ってのOpenCL開発環境をセットアップ。
まずここからAMD-APP-SDK-v2.7-lnx32.tgzをダウンロードして展開。

$ sudo ./Install-AMD-APP.sh

インストール終了。

$ clinfo

いろいろレポートされる。デバイスタイプはCPUのみ。インテルのCPUでもちゃんとリストアップされた。

$ cd /opt/AMDAPP/samples/opencl/bin/x86
$ ./Template

なんか実行された。


サンプルの"Template"を用意されたmakeを使わず直接ビルドしてみる。

$ sudo apt-get install build-essential
$ cp /opt/AMDAPP/samples/opencl/cl/app/Template/*.* .
$ g++ -I /opt/AMDAPP/include -L /opt/AMDAPP/lib/x86 -o Template Template.cpp -lOpenCL
$ ./Template

上と同じ結果が出た。

Geanyをビルド

ここのSource compilationを見て、Ubuntu12.04上でGeanyをビルドする。

http://www.geany.org/Download/Releasesからソースコードを取得。今回は~/geany-1.22に展開。

今回はビルドが目的なので--prefixをつける。

$ sudo apt-get install libgtk2.0-dev intltool
$ cd ~/geany-1.22
$ ./configure --prefix=/var/tmp/test
$ make
$ make install
$ /var/tmp/test/bin/geany &

起動時に

(geany:23810): LIBDBUSMENU-GTK-CRITICAL **: watch_submenu: assertion `GTK_IS_MENU_SHELL(menu)' failed
とコンソール出力されたものの起動はした。

emscriptenとOpenGL ES2.0でhello, world

emscriptenOpenGL ES 2.0(WebGL)+GLUTをサポートしているので、OpenGL ES2.0で"hello, world"。emscriptenのセットアップはこちら

を参考に作成。(200行くらいになってしまったので記事の最後にhello.cを貼りました。)
glutBitmapCharacterは使えるか不明だったのでテクスチャで"HELLO, WORLD"を表示する。

まずは、GLEWを使ってgccでビルド。

$ sodo apt-get install freeglut3-dev libglew1.6-dev
$ gcc hello.c -l glut -lGLEW -o hello
$ ./hello

ウインドウ上で"HELLO, WORLD"が表示された。

次にemscriptenでビルド。

$ emscripten/emcc hello.c -o hello.html

clang: warning: argument unused during compilation: '-nostdinc++'
と出るがビルドはできた。

結果はこちら。いやいやすごい。(Chrome19,Firefox13で確認。表示を確認するにはブラウザの設定が「WebGL有効」である必要があります。)

[hello.c]

#ifdef EMSCRIPTEN
#define GL_GLEXT_PROTOTYPES
#define EGL_EGLEXT_PROTOTYPES
#else // glew
#include
#endif // EMSCRIPTEN

#include
#include

#define TEX_W (128)

typedef struct
{
GLuint programObject;
GLuint vertexShader, fragmentShader;
GLuint textureId;
} glhandle;

static const char s_vShaderStr[] =
"attribute vec4 a_position; \n"
"attribute vec2 a_texCoord; \n"
"varying vec2 v_texCoord; \n"
"void main() \n"
"{ \n"
" gl_Position = a_position; \n"
" v_texCoord = a_texCoord; \n"
"} \n";


static const char s_fShaderStr[] =
"#ifdef GL_ES\n"
"precision mediump float; \n"
"#endif\n"
"varying vec2 v_texCoord; \n"
"uniform sampler2D s_texture; \n"
"void main() \n"
"{ \n"
" gl_FragColor = texture2D( s_texture, v_texCoord );\n"
"} \n";


static const unsigned char s_acDotImg[8][12] =
{
0x63,0x3f,0x30,0x30,0x3e,0x00,0x00,0x63,0x3e,0x7e,0x30,0x7c,
0x63,0x30,0x30,0x30,0x63,0x00,0x00,0x63,0x63,0x63,0x30,0x66,
0x63,0x30,0x30,0x30,0x63,0x00,0x00,0x6b,0x63,0x63,0x30,0x63,
0x7f,0x3e,0x30,0x30,0x63,0x00,0x00,0x7f,0x63,0x67,0x30,0x63,
0x63,0x30,0x30,0x30,0x63,0x30,0x00,0x7f,0x63,0x7c,0x30,0x63,
0x63,0x30,0x30,0x30,0x63,0x10,0x00,0x77,0x63,0x6e,0x30,0x66,
0x63,0x3f,0x3f,0x3f,0x3e,0x20,0x00,0x63,0x3e,0x67,0x3f,0x7c,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

static const GLfloat s_vertices[] = {
-1.0f, 1.0f, 0.0f, // Position 0
0.0f, 0.0f, // TexCoord 0
-1.0f, -1.0f, 0.0f,
0.0f, 0.0625f,
1.0f, -1.0f, 0.0f,
0.75f, 0.0625f,
1.0f, 1.0f, 0.0f,
0.75f, 0.0f,
};
static const GLushort s_indices[] = { 0, 1, 3, 2 };

static GLuint load_shader( GLenum type, const char *src )
{
GLuint shader;

shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );

return shader;
}

static GLuint setup_tex()
{
int i, j, k;
GLuint textureId;
GLubyte pixels[TEX_W*TEX_W * 3]; // ちょっと大きいけど

glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glGenTextures( 1, &textureId );
glBindTexture( GL_TEXTURE_2D, textureId );

// ドットイメージテクスチャ化
for( i = 0; i < 8; i++ )
{
for( j = 0; j < 12; j++ )
{
for( k = 0; k < 8; k++ )
{
GLubyte val = ( (s_acDotImg[i][j] & (1<<(7-k))) ? 0xff : 0 );
int index = (i*128+j*8+k)*3;
pixels[index+0] = val;
pixels[index+1] = val;
pixels[index+2] = val;
}
}
}

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, TEX_W, TEX_W, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, textureId );

return textureId;
}

static void setup_vtx( glhandle *handle, GLuint positionLoc, GLuint texCoordLoc, GLuint samplerLoc )
{
GLuint s_vertexPosObject, s_indexObject;
glGenBuffers(1, &s_vertexPosObject);
glBindBuffer(GL_ARRAY_BUFFER, s_vertexPosObject );
glBufferData(GL_ARRAY_BUFFER, sizeof(s_vertices), s_vertices, GL_STATIC_DRAW );

glGenBuffers(1, &s_indexObject);
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, s_indexObject );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(s_indices), s_indices, GL_STATIC_DRAW );

glBindBuffer(GL_ARRAY_BUFFER, s_vertexPosObject);
glVertexAttribPointer( positionLoc, 3, GL_FLOAT, GL_FALSE, 5 * 4, 0 );
glVertexAttribPointer( texCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * 4, (const GLvoid *)(3 * 4) );
glEnableVertexAttribArray( positionLoc );
glEnableVertexAttribArray( texCoordLoc );

glUniform1i( samplerLoc, 0 );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, s_indexObject );
}

static void initialize( glhandle *handle )
{
GLuint positionLoc, texCoordLoc, samplerLoc;

handle->vertexShader = load_shader( GL_VERTEX_SHADER, s_vShaderStr );
handle->fragmentShader = load_shader( GL_FRAGMENT_SHADER, s_fShaderStr );

handle->programObject = glCreateProgram();
glAttachShader( handle->programObject, handle->vertexShader );
glAttachShader( handle->programObject, handle->fragmentShader );
glLinkProgram( handle->programObject );
glUseProgram( handle->programObject );

positionLoc = glGetAttribLocation( handle->programObject, "a_position" );
texCoordLoc = glGetAttribLocation( handle->programObject, "a_texCoord" );
samplerLoc = glGetUniformLocation( handle->programObject, "s_texture" );

handle->textureId = setup_tex();
setup_vtx(handle, positionLoc, texCoordLoc, samplerLoc);
}

static void release( glhandle *handle )
{
glDeleteTextures(1, &handle->textureId);
glDeleteShader(handle->fragmentShader);
glDeleteShader(handle->vertexShader);
glDeleteProgram(handle->programObject);
}

static void display()
{
glClear(GL_COLOR_BUFFER_BIT);

glDrawElements( GL_TRIANGLE_STRIP, sizeof(s_indices)/sizeof(s_indices[0]), GL_UNSIGNED_SHORT, 0 );

glutSwapBuffers();
}

int main(int argc, char *argv[])
{
glhandle handle;

glutInit(&argc, argv);
glutInitWindowSize(96*2, 8*2);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("hello, world");

#ifndef EMSCRIPTEN
glewInit();
#endif
initialize(&handle);

glutDisplayFunc(display);
glutMainLoop();

release(&handle);

return 0;
}

Ubuntu12.04にRabbitVCS

やはりSubversionTortoiseSVNみたいなGUIもないと作業が面倒だということで
ここをみてUbuntu12.04にRabbitVCSをインストール。

$ sudo add-apt-repository ppa:rabbitvcs/ppa
$ sudo apt-get update
$ sudo apt-get install rabbitvcs-nautilus3

Nautilusの再起動が必要なのでとりあえずログアウトしてログインしなおす。
フォルダーウインドウ内で右クリックすると「RabbitVCS SVN」「RabbitVCS Git」が項目に追加されていることを確認。

問題なくインストールできた。

emscriptenでhello, world

ここらへんを参考にしながらemscriptenでhello, world。
インストール環境はUbuntu12.04。

まずgit,Node.js,jreをインストール。

$ sudo apt-get install git nodejs default-jre

次にllvmをインストール。バージョン3.1が必要なので手動で。
ここからclang+llvm-3.1-x86-linux-ubuntu_12.04.tar.gzをダウンロードし展開。
(~/.emscriptenで場所を指定できるので今回は~/llvm-3.1/に展開。)

emscriptenをgitで取得。

$ cd ~
$ git clone git://github.com/kripken/emscripten.git

emscripten/emccを実行。

$ emscripten/emcc

~/.emscriptenが生成されているので編集。
ここでは
EMSCRIPTEN_ROOT = os.path.expanduser('~/emscripten')
LLVM_ROOT = os.path.expanduser('~/llvm-3.1/bin')
と変更。

まずは動作確認。

$ emscripten/emcc emscripten/tests/hello_world_sdl.cpp -o hello_world_sdl.html

出来上がったhello_world_sdl.htmlをブラウザで開いて確認。とくに問題なさそう。



次にhello, world。
[hello.cpp]

#include 
int main()
{
puts("hello, world\n");
return 0;
}

まずはビルド。

$ emscripten/emcc hello.cpp -o hello.js

Node.jsで動作確認。

$ node hello.js

問題なく

hello, world
と表示される。手順に従えばかなり簡単。

せっかくなのでこのhello.jsとhtmlでhello, worldを表示する。

[hello.html]



<script type="text/javascript">
var printBuf = "";
var Module = {print:function(x){printBuf += x;}};

<textarea id="output">


結果。すごい世の中です。(Firefox13.0,Chrome19で確認。手元にあるIE8,Androidの標準ブラウザでは表示されてない・・・)

Blenderをビルド

Ubuntu12.04上でBlenderをビルドする。

今回はCMakeを使うことにするのでここを参考に。

まずビルド環境を準備。

$ sudo apt-get update; sudo apt-get install subversion build-essential gettext libxi-dev libsndfile1-dev libpng12-dev libfftw3-dev libopenexr-dev libopenjpeg-dev libopenal-dev libalut-dev libvorbis-dev libglu1-mesa-dev libsdl1.2-dev libfreetype6-dev libtiff4-dev libavdevice-dev libavformat-dev libavutil-dev libavcodec-dev libjack-dev libswscale-dev libx264-dev libmp3lame-dev python3.2-dev libspnav-dev cmake

リポジトリからソースファイルをチェックアウト。(32bit版のUbuntuSSL証明でエラーが出るので--config-option servers:global:ssl-trust-default-ca=noを追加)

$ cd ~
$ mkdir blender-svn
$ cd blender-svn
$ svn co --config-option servers:global:ssl-trust-default-ca=no https://svn.blender.org/svnroot/bf-blender/trunk/blender
$ svn co --config-option servers:global:ssl-trust-default-ca=no https://svn.blender.org/svnroot/bf-blender/trunk/lib/linux lib/linux

環境とソースがそろったのでビルド。

$ cd blender
$ make

ほぼwikiの通りでビルドできた。(当たり前か。)
~/blender-svn/build/linux/bin/blenderにインストールされたと表示されたので

$ ~/blender-svn/build/linux/bin/blender

として実行。

connect failed: No such file or directory
ndof: spacenavd not found
AL lib: pulseaudio.c:331: PulseAudio returned minreq > tlength/2; expect break up
と表示されるが問題なく起動した。