CVS

リモートデスクトップもいいが、むしろCVSなんじゃなかろうか。
オープンソース開発にも興味あるし。

CVSを使って

http://www.radiofly.to/nishi/cvs/cvs.html

すんません、まだ良く分かってないし、書きかけ…。

CVSサーバーの立て方、誰か教えて…。
(ちうか、研究室の自分の領域にプロジェクトおきたいのだけど…)
Research | - | trackbacks (0)

Cygwin

最終的にOSの内部にまで絡むことになった場合
そこまで手を出せるのはオープンソースなOSしかない

だとか

各種ライブラリがオープンソースでそろっている

といった理由で研究がらみの開発はLinuxでやっていこうとしていたのだけど
やっぱり慣れないものは色々もどかしい。

当初、エディタだけどうにかすればと思っていたが
やはり、ブラウザ、メーラー、ファイラ等全てがあって環境なのだ。
手に馴染んだそれらのいくつもが欠けると、結構ストレスになる。
特に急ぎの時は。

ということで
ソケットの軽い実験的なコードとかはCygwinで書いてテストして
Linuxに持って行こうということに。

エディタもブラウザもファイラもしっくり。 あぁ、快適。

実はgccはすごいやつだと少し前から思っていた。
フリーのC++コンパイラがあってかなり標準に準拠してるそうだし。

しかしここ数日、Cygwinもなかなかやるなぁと思い始めた。

ソケットだけじゃない。
UNIXにメモリマップドファイルがあるということを知り、便利と思いコードを書く。
Cygwinでそれが動く。
画像表示出来ないかな? X使うしかないのかな? あの重くてしょぼいやつ?
SDLが使える。
もしかして…と思い、libmpeg2をインストールしたらできた。

あれよあれよと、結局MPEG2再生までこぎ着ける。

もう開発のためにLinuxいらねー。
(今のレベルでは)

Cygwinやばい、超やばい。

こんなこと言い出した今の自分に対して
一年前の自分だったら「頭おかしいんじゃないの?」と言うに違いない。
つか、今だって、Cygwin気に入ったとか言ってる自分は
なにかおかしくなってしまったんじゃないのかと思わずにはいられない。

あー、あとはデバッガ、いいの無いかなぁ…。


追記:

デバッガはGDBやDDDを使うといいっぽい。
以下参考ページ
Cプログラマへの初めの一歩
Visual Debugging with ddd LG #73
Research | - | trackbacks (0)

LinuxでMPEG2再生(2)

mpeg2decのソースを読んでMPEG2再生プログラムを作った。

音も出なければ、表示タイミングの同期もとれてないけど…
って、それって、mpeg2decのまんまやん。
実際表示部分を先日のSDLにすげ替えただけなんだけど
解読したことに意味があると思う。

自分がいじくったプログラムで
動画がデコードされて再生されるってのに
ちょっと感動した。

とりあえずMPEG2再生まわりはMPEG2の構造をもっと学んで
具体的な処理が決まるまで休止。

プログラムで次かかれるのはソケットプログラミングか。
Research | - | trackbacks (0)

LinuxでMPEG2再生

つまりは、プレイヤーを作るってことなのかな。

デコードはライブラリに任せることにする。
libmpeg2というのが有名っぽい。

これを使ったプレイヤーも多く、ただ再生したいのならそれらをどうぞ。

libmpeg2を使うにあたっての注意。

まずC++から使う場合はヘッダファイルのインクルードの際に

extern "C"{
#include
#include
}

のように「extern "C"」が必要。

それから、docフォルダ内のサンプルを試す場合はおそらく無音のmpeg2でないとちゃんとした画像が出力されません。

同様の理由で mpeg2dec をテストする場合
指定するファイルに音がついてるなら -s オプションで音を切り捨てないと綺麗に映像が出ません。

どれも当たり前といえばそうなんですが…。

ということで、mpeg2decのソース読んで
とりあえず映像の表示だけでもしちゃいたいです。

その際先回のSDLを使う予定。


…先回のソース、間違いだらけだったのでこっそり修正。

画面を16ビットカラーにしてぶん回してみたら
研究室のマシンで70FPS出たのでまぁよしとする。

SDL_CreateYUVOverlay()

等を使って YUV ビデオオーバレイ に描画すると
さらに表示速度を上げられるかも知れない。
Research | - | trackbacks (0)

Linuxで高速な2D描画(SDL)(2)

SDLの速度を試すと言うことでFPSを測る簡単なコードを書く。

開発には Eclipse + CDT を使った。

EclipseでSDLを使ったプログラムをコンパイルをする場合は
GCCに対して幾らかオプション指定の必要がある。

Project > Properties
から「C/C++ Build」を選び
「Configuration settings」内の

「GCC C++ Compiler」下にある
「Miscellaneous」を選び
「Other flags」のエディットボックスに
「`sdl-config --cflags`」と追記

「GCC C++ Linker」下にある
「Miscellaneous」を選び
「Linker flags」のエディットボックスに
「`sdl-config --libs`」と追記

…で動いたのだけど
何を意味しているのか良く分かっていない。
調べる必要があるなぁ。

で、簡単なソース。
ImageFunc の辺りはお遊び。

main.cpp

#include <stdlib.h>
#include "SDL.h"
#include "ImageFunc.h"

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

if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
exit(1);
}

atexit(SDL_Quit);

SDL_Surface *screen;

screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);

if ( screen == NULL ) {
exit(1);
}

// オフスクリーン作成
SDL_Surface* offscreen;

if (screen->format->BitsPerPixel == 16) {
offscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, 640, 480,
screen->format->BitsPerPixel,
screen->format->Rmask,
screen->format->Gmask,
screen->format->Bmask,
screen->format->Amask);
/*
printf("%d, %d, %d",
screen->format->Rmask,
screen->format->Gmask,
screen->format->Bmask);
*/
} else {
offscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, 640, 480,
32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0);
}

int frames = 0;

Uint32 beginTime = SDL_GetTicks();

int hue = 0;

for (;;) {
// イベント処理
SDL_Event event;

while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
SDL_FreeSurface(offscreen);
exit(0);
}
}

// 描画部分
// SDL_MUSTLOCK(offscreen) の結果によってはロック不要らしい
SDL_LockSurface(offscreen);

double r, g, b;

HSVToRGB(&r, &g, &b, hue, 1.0, 1.0);

// offscreen->format に従ったフォーマットで書き込むこと
if (screen->format->BitsPerPixel == 16) {
Uint16 p = ((int)(31 * r) << 11)
| ((int)(63 * g) << 5)
| ((int)(31 * b) << 0);

for (int i=0; i<640*480; i++) {
((Uint16*)(offscreen->pixels))[i] = p;
}
} else {
Uint32 p = ((int)(255 * r) << 16)
| ((int)(255 * g) << 8)
| ((int)(255 * b) << 0);

for (int i=0; i<640*480; i++) {
((Uint32*)(offscreen->pixels))[i] = p;
}
}

hue++;
hue%=360;

SDL_UnlockSurface(offscreen);

// screenにbitmapを描画
SDL_BlitSurface(offscreen, NULL, screen, NULL);

// screenの全領域を更新
SDL_UpdateRect(screen,0,0,0,0);

frames++;

Uint32 t = SDL_GetTicks();
Uint32 d = t - beginTime;

if (d >= 1000) {
int fps = frames * 1000 / d;

char title[16];
sprintf(title, "%d", fps);

SDL_WM_SetCaption(title, NULL);

beginTime = t;
frames = 0;
}
}
SDL_FreeSurface(offscreen);
return 0;
}


ImageFunc.cpp

#include "ImageFunc.h"
#include <math.h>
#include <algorithm>

void RGBToHSV(double r, double g, double b, double* h, double *s, double *v)
{
// r, g, b それぞれ [0, 1]
// h は [0,360)
// s と v が [0, 1]
// ただし s = 0 の場合 h = UNDEF
const double UNDEF = 360.0;

double max = std::max( std::max(r, g), b);
double min = std::min( std::min(r, g), b);

*v = max; // バリュー

// 彩度の計算 r, g, b すべて 0 なら彩度は 0
*s = (max != 0.0) ? ((max - min) / max) : 0.0;
if(*s == 0.0){
*h = UNDEF;
}else{
double delta = max - min;
if(r == max){
*h = (g-b) / delta;
}else if(g == max){
*h = 2.0 + (b - r) / delta;
}else if(b == max){
*h = 4.0 + (r - g) / delta;
}
*h *= 60.0;
if(*h < 0.0) *h += 360.0;
}
}


bool HSVToRGB(double *r, double *g, double *b, double h, double s, double v)
{
// h は [0, 360] または UNDEF
// s と v は [0, 1]
// r, g, b それぞれ [0, 1]

//const double UNDEF = 360.0;

if(s == 0.0){
//if(h == UNDEF){
*r = v;
*g = v;
*b = v;
//}else{
// return false;
//}
}else{
double f, p, q, t;
int i;
if(h == 360.0) h = 0.0;
h /= 60.0; // h を [0, 6) とする
i = (int)floor(h); // floor() は最大整数 <= h を返す
f = h - i; // f は h の小数部分
p = v * (1.0 - s);
q = v * (1.0 - (s * f));
t = v * (1.0 - (s * (1.0 - f)));
switch(i){
case 0: *r = v; *g = t; *b = p; break;
case 1: *r = q; *g = v; *b = p; break;
case 2: *r = p; *g = v; *b = t; break;
case 3: *r = p; *g = q; *b = v; break;
case 4: *r = t; *g = p; *b = v; break;
case 5: *r = v; *g = p; *b = q; break;
}
}
return true;
}


ImageFunc.h

void RGBToHSV(double r, double g, double b, double* h, double *s, double *v);
bool HSVToRGB(double *r, double *g, double *b, double h, double s, double v);


実行するとウィンドウが出てキャプションにFPSが出ます。

僕の環境では11FPSでした。
…というのもVirtual PC上での実行だったので。
Research | - | trackbacks (0)

Linuxで高速な2D描画(SDL)

Linuxで高速な2D描画を行う必要があるのだが
何を使えばいいのやら見当がつかない。
そもそも、単なる描画でさえどうやるのか知らないのだから。

Windowsならば
やれDirectXだ、アクセラレーションがきくならGDIも悪くないだ
と浮かぶのだけど。

でも、まぁ、つまるところ
ハードウェアアクセラレーションがきくということが重要に思う。

いくらか調べたのだけど、あまり情報も得られず
結局SDL(Simple DirectMedia Layer)に落ち着いた。

Simple DirectMedia Layer

よくわからないが

ビデオの表示に X11 を使い、全画面表示の場合は Xfree86 DGA(Direct Graphics Access) 拡張と 新しい MTRR(Memory Type Range Registers) アクセラレーションが 利点が生かせます。

とのこと。

ゲーム作成に使われてるということだから
おそらくこだわってチューニングしてあるだろう。

軽く使ってFPSでもはかってみよう。
Research | - | trackbacks (0)

Red Hat Linux 9 で OpenGL

初歩的なことなのだが少しずつLinuxを使っていこうということでOpenGL。

不慣れなため時間がかかったが結局

Mesaをインストールし
(インストーラ付きで簡単。 Webサイトのインストールの項を参照。)

それからGLUTをインストールしただけだった。
(アーカイブを解凍するとLinuxというフォルダがありそこにインストール方法等がある。)

OpenGLを使ったプログラムのソースを書いた場合は
コンパイルの際に上のところでできたライブラリ、それとヘッダへのリンクを指定すればOK。

GLUTの初歩に関しては物理のかぎしっぽとかGLUTによる「手抜き」OpenGL入門とかが参考になるとおもう。

あまり本筋とは関係ないと思うのでここら辺で。
Research | - | trackbacks (0)

gcc 3.4.2 for Linux 導入

要カテゴリー整理…。

Red HatでEclipse+CDTでQtを使って
先輩の組んだコンソールプログラムにGUIをつけてやろうということで
何回か書いてきてるのだが、外観はおおよそできたっぽい。
あとは、インターフェースつける元のプログラムを若干解析しないとな…。

なのだが、GUIを組んでいて思ったのは、コンパイルが異常に遅いということ。

なぜ遅いのか。
それぁ、Qtのヘッダをインクルードしてるからに違いない。

どうにかならないものか。
てか、プリコンパイル済みヘッダじゃないの?
そー言うときに使うのは。

ちょっと調べたら、gcc 3.4からサポートされたそうで。
いや、今までは無しで耐えてたの?
みんな我慢してたの…?

(つか、GUIのwidgetの位置を
 コンパイルしてみては座標調整とかんなこと普通しないか…。
 それこそ、IDEで配置しろってか…。)

とにかく導入。
コンパイラのソースをコンパイラでコンパイルとはこれまた何とも。

で、プリコンパイル済みヘッダ作成。
あっさりできてびっくり。
コンパイルもアホみたいに早くなったよ!
ナニコレ!

オススメっす。

てか、進み方遅いな…。
こういうことやってると時間がすぐたってしまうのは問題だ。
全然直接研究に結びつかないしなぁ。

Windowsでいうところの、Windowsアップデートしただけで
何か仕事したような気になってしまうのと同じ。
(そんな気にならないですか。)
Research | - | trackbacks (0)

Linux GUI プログラミング(3)

本屋でLinuxプログラミングに関する本を立ち読みした。
Linuxのデスクトップ環境の概要と大まかな歴史を知る。
それによるとGTK+やらQtやらは「ツールキット」と呼ぶべきなようだ。

さて、つい何日か前にGTK+ではなくQtを使っていくことにしたのだが
GTK+もCで組まれているとはいえ実は設計思想はオブジェクト指向に則っている。
また、gtkmmというC++インターフェースも用意されており
それを使った場合、簡単なサンプルにおいてはgtkmmもQtも殆ど変わらない印象を受けた。
さらに、見てみれば、GTK+の方がライセンスの制限が緩いようなのだ。
長いものには巻かれる考えで行くとGTK+を選ぶべきかもしれない。

どうしたものかと、さらに調べてみれば
wxWidgetsというものもなかなかいいという話もあったりで混乱するばかり。
(wxWidgetsはツールキットではなく、UIフレームワークらしいが)

こうした、ユーザーを惑わせる混沌とした状態は
ツールキットに限ったことではなく
言ってみればLinuxというOSのあちこちに当てはまるのではないだろうか。
ディストリビューションしかり。
Windowsというぬるま湯にどっぷりつかっている僕としては
Linuxの統一計画とやらが進むことを祈るばかり。

さて、話を戻して、ツールキットを何にするかだが
結局、作ろうとしているものは大規模でもないし
そこまで作り込もうというつもりもないのだから
(どうせ何か作るのであれば
 多くの人に使ってもらえそうなWindows用ソフトを作る。)
まぁ、割と普及していて
すぐ習得できるものならば何でもいいということになり
少しいじったQtを続けることにする。

なんだ、その結論。

いや、だって、研究室で仕方なくLinuxという感じなんだもの…。

EclipseでQtを使った簡単なサンプルをコンパイル・実行しておしまい。

さっさと仕上げちまって本題に入ろう。
Research | - | trackbacks (0)

Linux GUI プログラミング(2)

研究とかけ離れそうな気もしていますが…。

僕は専らWindowsでIDEを使ってプログラムを組むので
Linuxでのプログラミングとなると環境の構築から始めなくてはならない。

小さなプログラムであればエディタでちょろっとソースを書いて
gcc -o test.o test.c
などとすればいいのだが
それにしたって、そもそもしっくりくるエディタがない。
geditというエディタがあって、それはなかなかWindows風キーバインドなのだが
微妙に違うところなんかがあるので
Tcl/TkでWindowsのメモ帳のようなエディタを自作した(KNote)。
不満があったらその場その場で拡張していくつもり。

つづいて、やはりプログラムの規模が大きくなってくるとIDEが使いたくなる。
ざっと調べたところKDevelopあたりが肌に合いそうだが
後々JAVAもいじるかも知れないし、なにより流行っているし
ということでeclipse+CDTで行くことにする。


早速環境構築に入る。

Tclで組んだ自作エディタを実行するためActiveTclをインストール。

eclipseとCDTをインストール。
(参考サイト:eclipse/Linux - discypus)

Linuxになれていないので細々としたところでしばしば
その他多くのサイトにお世話になっているがそれはここでは省略。

いわゆる「Hello World」をコンパイル・実行。

さて、次は、いよいよQt使ってGUIプログラミング。
Research | - | trackbacks (0)