2008年10月19日日曜日

「スクリプト言語による効率的ゲーム開発 」を読んでみた

0 コメント


結構前に買ったんだけどやっとこさ読み終わりました。結構おすすめです、これ。




何がいいかというと内容が実践的。著者がプロと謳っているだけあって、この著者は現場をわかってる。冒頭の説明などはゲーム開発の経験ある人なら、うんうん頷きながら読めるはずw。


Luaに関してはほんと駆け足の説明なので、これ一冊でLuaを使いこなすのは厳しい。ウェブ上のリファレンスをみながら、あるいは別のLua入門で補完したほうが良いかもしれない。


スクリプトを実際に活用する部分では、リロードのタイミングや仕組みについて詳細に言及されていて、こんなん自分ひとりで作ってたら絶対思いつかないだろうなと思った。


ゲームオブジェクトの扱いとしては、モダンな言い回しであるActorクラスをつかってLuaのスケジューラで使いこなすという、結構おもしろいつくりです。


Luaは標準ではクラスをサポートしてないみたいだけど、今ある文法を活用してクラスを作る方法などが載っていて便利。ヘルパークラスなんかもあって、これを利用していくうちに自然とLuaの仕組みを覚えられんじゃないかと思う。





ただグラフィックエンジンはSDLを利用してるので注意が必要。個人的にはDirectXが良かったのでちょっと残念だけど、どうせグラフィックまわりは自作するんだしまあいいいか。


この本はより実践的な部分に重きを置いていて、ゲーム開発をする場合に、どうLuaを利用するかが詳しく書かれてるので手っ取り早くLuaをゲームに組み込みたい人にはうってつけだと思う。


スクリプトはアクションゲームに向かねーよとか、個人で開発するんだったらコンパイル十分早いしスクリプトイラネ!とか、メモリは自分で管理しないと気がスマネーズラ!って人も多いかもしれないけど、Luaを使って何かしたい人にはお勧め。自分もLuaでなんか作ろうかとやるきでてきたよw。





ちょっと絶賛しすぎかもw







2008年8月2日土曜日

「頭のいい人の短く深く眠る法」を読んでみた。

2 コメント


短眠の本です。毎日3、4時間の睡眠にして余った時間を有意義にしましょうという内容です。(昨日の夜読み始めて、今朝読み終わりました。時間にして半日ぐらい?内容は薄い感じ。)




家に帰って、筋トレしたり、飯の準備したり、風呂はいったりネットチェックしたりしてると、あっという間に寝る時間。


いつも12時に寝て6時におきるという生活してるから(朝は朝でいろいろ忙しくて時間がない)、一日のうちで自分のやりたいことやる時間がない。やっぱ睡眠時間を削るしか方法はないんだよね・・・。





この人の本、実は8年ぐらい前に読んだことがあります。そのときは1ヶ月ぐらい続けたんですが、仕事が忙しくなり、プレッシャーからか、昼間に過呼吸の症状が出てしまい、中断してしまいました。ちょっと無理しすぎたんだよね~。





しかし、どうしよう。前回の例があるからちょっとすぐに実践するのは躊躇する。もともと俺の睡眠時間は、5、6時間だからそれほど長くない。この本で解説されてる実践法は8時間以上眠る人が対象だからちょっとアレンジしないとだな。もうちょっとほかの本読んだりして調べてみるかな~。いずれにしてもマイペースであせらず取り組むことにしよう。







2008年8月1日金曜日

マスタリングDirectXを読んでみた4

0 コメント


PART8 効果音を追加する(DirectSound)(23:00)つづき


WAVファイルの読み込み

なんというか、まったくわからん。解説読んでもサンプルよんでも全然頭に入ってこない。


もともとサウンド周りのプログラムは一番苦手な分野だけど、それにしてもわかんね。


解説もサンプルプログラムの内容を淡々と説明してるだけで、退屈。


一応わからない原因をあげるとすると、プログラムがAPIの呼び出しの連続で、知らない関数の組み合わせだけで組み立てられているのと、Wavのデータ構造を理解してないからだと思う。


ほかの章はわりとすらすらよめたけど、ここは読み始めて3分で眠くなる。。。


PART9 MIDIファイルを再生する(DirectMusic)(23:30)


用語解説


ローダ(Loader)

ファイルやリソースを読み込む。1アプリにひとつ。

パフォーマンス(Performance)

アンプみたいなもの。音量の調節や音源の再生などを受け持つ。ひとつのアプリで複数もてる。

セグメント(Segment)

音源の単位。CDの中のひとつの曲やループするフレーズ、ひとつの効果音など。

オーディオパス(AudioPath)

パフォーマンスから最後のミキサ(DirectSound)へデータを転送する。



ざっと斜め読み。サンプルを動かそうと思ったが、なんとmidファイルは自分で用意しろと!なんだよそれ!


PART10 オリジナリティを際立たせる工夫(23:55)




  • 仮の目標を立てる


    • 目標とするゲームを決めそこから自分おオリジナリティを加えていく。

    • 自作ゲームの作成は学生時代のレポート提出に似ている。



  • ゲームに必要な要素をひとつずつ切り出していく


    • ゲームの特徴やルールを言葉で置き換えて「要素」にして説明していくことにより、全容が明確になっていく



  • 全体をなんとなく理解しよう


    • 一度つかえるサブルーチンやクラスを作ってしまうと、中身の見直しをしなくなるので理解が薄れていく・・・。

    • 不完全だけど全体的な理解を目指す。




以下引用(P313)。



「○ ○の作り方」という本を読んで「この本に××が足りない」と考え、
そこで今度は××に冠する解説をよみ「これには△△が抜けている」という印象をもち、
そしてなかなか自分のゲームが完成しない、というパターンに陥った人は少なくないでしょう。
さまざまな技術書や解説書、入門書を読みつくし、最先端技術に精通しているはずなのに
自作アプリケーションがほとんど作れないというのは、決して珍しくありません。

これ、俺だよ!orz。仕事以外でゲームを完成させたことほとんどなかったわ・・・。実験プログラムばかっり。プログラムの断片、いわゆるジャンクプログラムばかり書いてていっこうに完成品をつくれないんだよなぁ。反省反省。


感想とか。(12:30)

とりあえず読み終わった。疲れたぜぃ。


本書を通じてDirectXを概観したわけだけど、やっぱりDirectSoundが一番めんどくさそうだな~。全然理解できてないし。とりあえずサンプルを組んだり改造したりして遊んでみるか。


この本サンプルプログラムの出来はちょっと残念なところがあったけど、サンプルの見栄えは派手なんで、動かして楽しかったな。あと途中から操作できるようになって敵が攻撃してくるんだけど、この敵がつええよwww。こっちの玉は全然当たらないのに、やつの玉は的確に俺を撃ってきやがるw。まずは、この辺のあたり判定でも改造してみるか。・・・もしやこの調整って作者が意図したものなのかな?


振り返ってみると、この本では精神的なものというか、心構えとして忘れていたものを多く教えてもらった気がする。プログラムの内容はサンプルやヘルプを読めばいずれ理解できるけど、こういった話は長い経験からしか得ることが出来ない貴重な話だよな~。ありがとうございました。



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月31日木曜日

マスタリングDirectXを読んでみた3

0 コメント


PART7 ユーザからの操作を受け取る(DirectInput)(23:00)


これも会社と電車で読み終わってしまった。


内容を簡単にまとめてみる。




  • DirectInputは、DirectXのなかでももっとも取り扱いが簡単

  • DirectInputの入力方法


    • 直接入力。シューティングゲームなどに向いている。

    • バッファード入力。RPGなどリアルタイム性でないもに向いている。




利用手順



  • 初期化


    • DirectInputオブジェクトの生成

    • CreateDiveceメソッドに入力機器の種類を指定して、データを受け取ることができる状態にする。



  • データ読み取り


    • SetDataFormatメソッドに入力機器に合わせたデータフォーマットを指定し、データを受けとる準備をする。

    • GetDeviceStateメソッドでデバイスからのデータを受け取る。

    • Acquireメソッドでデバイスを取り戻す。



  • 開放


    • 使用していたデバイスをUnacquireメソッドで停止

    • DirectInputデバイスコネクタを開放

    • DirectInputオブジェクトを開放




キーボードとマウス



  • マウスもキーボードも処理の流れはほぼ同じ。

  • 注意点としては、マウスの座標データは絶対座標ではなく、相対座標。


ジョイパッド



  • EnumDevicesメソッドでジョイパッドの数を数える。このメソッドにコールバック関数を渡し、パッド単位でデバイスを作成していく。

  • EnumObjectsメソッドでジョイパッド上のオブジェクト(方向キー、ボタンなど)を数え、コールバック関数を呼び出す。











PART8 効果音を追加する(DirectSound)(23:30)


バッファ


プライマリバッファ

最終的な音の状態を保持するバッファ。スピーカにつながっていると考えてよい。

セカンダリバッファ

音声を収めておくバッファ。



WAVファイル

WAVファイルを読み込むためには、DirectSoundが読み出してくれるわけではなく、直接関係ない、マルチメディア入出力関数を使用しなくてはならない。


処理手順



  • 初期化


    • DirectSoundデバイスを取得する。

    • DirectSoundの協調レベルを設定する。

    • CreateSoundBufferメソッドを使ってプライマリバッファを取得する。

    • プライマリバッファのフォーマットを指定し、SetFormatメソッドでプライマリバッファに適用する。

    • QueryInterfaceメソッドでプライマリバッファから3Dリスナーインターフェースを取得する。



  • WAVファイルの読み込み


    • mmioOpen関数を使って開き、WAVファイルに収められている波形データのフォーマットを確認する。

    • セカンダリバッファを作成し、波形データのフォーマットと同じ形式にする。

    • WAVファイル内の波形データを読み込む準備をする。

    • WAVファイル内の波形データをセカンダリバッファへ読み込む。



  • 音声の再生


    • GetStatusメソッドを使って指定された音声バッファが再生可能かどうか確認する。

    • 再生可能であればPlayメソッドで再生する。



  • 開放


    • バッファに関する構造体を開放する。

    • DirectSoundオブジェクトを破棄する。





マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月29日火曜日

マスタリングDirectXを読んでみた2

0 コメント


PART6 ウィンドウとモデルの表示(Direct3D)...続き(23:30)


昨日は飲み会の次の日ということで一日ダウン。日曜日がつぶれた。。。


しかしPart6の残りの部分は電車の中と会社の休み時間でほとんど読み終えたのだった。


ビルボードの表示

ビルボードの角度を決める処理。キモの部分



// ビルボードがカメラの方向を向くようにする
D3DXVECTOR3 vecDir = gLookatPt - *camPos; // 視線
D3DXMatrixRotationYawPitchRoll( &theRotMatrix , 0.0f , -atanf( vecDir.y / vecDir.z ) , 0.0f );


ピッチ(X軸の角度)をカメラの向きから計算している。角度で出してもいいけど、カメラ行列からうまく抜き出せば計算もいらないし、お得なはず。自分が作るときはそうしよう。


レンダリングステート

レンダリングステートは描画物ごとにパターンがある程度きまってくるので、そのパターンごとに自分で設定関数を用意しておく。


そのパターン




  • モデル描画時

  • アルファつき描画、画面情報描画

  • 加算合成描画


の3パターン。


フルスクリーン

フルスクリーン時のデバイスロスト対応だが、CreateBertexBufferメソッドなどで使われているD3DPOOL_MANAGEDを使用すればすべての管理をD3Dがやってくれるので、復帰処理も超簡単になる。具体的にはDevice->Restメソッドを呼ぶだけでよい。そうか昔の俺はこの機能を使っていたんだな。


ここまでの所感。

なんかソースコードがよろしくない。構造体にtheModelsとつけてるのに関数の引数にもtheArgという具合にtheをつけてる。かと思えばaArgとaを冠したところもあり、ネーミングルールが変。単数形しか扱わないのに、複数形の名前がついてるし。初心者を相手にしてるんだからこの辺は気をつけてほしかったな~。まつもとゆきひろも「名前重要」っていってることだし。


昔やってたことだけあって、特別理解できないというところはない。簡単な表示くらいだったらすぐできそうな気がする。とりあえずいくつかサンプル組んだらochaglを移植するか。しかし問題はC++だよな。これ読み終わったらじっくり復習しよう。


ところでD3DXVECTOR3はクラスなんだっけ?NormalizeやLengthもメンバ関数ではなく、通常の関数と用意されている。これはなんだか嫌なので、コーディング段階に入ったら、D3DXVECTOR3を継承してラッピングするか自作しよう。


(ここまで23:55)



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月26日土曜日

マスタリングDirectXを読んでみた

0 コメント


PART1 はじめに(10:00)


DirecXが世間一般にどうとらわれてるか書かれている。


あとソースをプリントアウトしたほうがいいとある。うんこれは納得。仕事でもよくプリントアウトして紙に出して読むよ。書き込みながらね。そんで検索とかは画面のエディタ使いながらとか。





初めてDirecXやった2とか3のころは確かに、すぐにハングアップして再起動しまくりだったけど、DirectX7あたりから大分扱いやすくなった気がするな~。しかしそれでもやっぱり普通のプログラミングに比べたらハングすることが多いしやっぱ敷居高いんだろうな。





「SDKのアップデートは慎重に」とある。BugFixとかでも、微妙に関数の引数が入れ替わって動かなくなることもあるらしい。やっぱライブラリでラッピングする必要があるか?


PART2 DirectXとはなんなのか?(10:10)


DirectXは大変だよとう脅し?見たいな感じ。覚悟してねみたいなw


DirectXとGDIの違い


GDI

CPUメインで描画。各グラフィックボードの共通の描画機能のみを使うため、ボードごとの差異がない。

DiretX

ドライバを直接操作して描画。CPUを使わない。ある機能がない場合はエミュレーション(HEL)する。



11:00 - 11:00 部屋かたづけ


PART3 クラスを知ろう(11:20)


クラスは大変だよって話。クラスについては散々ならしてるから基本は大丈夫だな。


しかしクラスは難しい難しいって若干大袈裟な気もする。


インスタンスで確保される領域はメンバ変数のみ。メンバ関数のコード量が多くてもメモリ使用量は増えない。言われてみれば当たり前のことだが、しばらくCやってないとメモリまわりのこと気にしないからこんなことも忘れかけてる。。。


C++で記述するときのメリットデメリット。


変数初期化時はNULLを代入すること。javaでは自動的に初期化されるからこの慣習忘れてたなぁ。気をつけよう。


次章からやっとDirectXの本題だ^^





PART4 思いつきに形を与えるために(11:55)


DirectX始まると思ったらまだ始まらないw。ゲームを作るうえでの心構えでした。




  • 現在はさまざまなゲーム開発の知識が散乱している

  • これらを寄せ集めればなんとがゲームが開発するよ

  • でも自分プログラムの中でこれらを活用できるようになるまでには多大な労力が必要だよ。

  • これらの情報は「いつか必ず役に立つ情報」としてストックされる。

  • 結局、それらの情報を活用できずにプログラムに飽きることが多い。


見たいな感じ。そのとおりですね。反省します。




  • 頭の中だけで思い描いて開発始めても多くの場合失敗する

  • まずは頭の中の設計図を紙に書こう!パソコンじゃないよ。

  • ゴールをこまめに設定する。いきなり市販ゲームクオリティは無理


たしかに趣味プロでは、頭の中だけでまともに書き出すことは少なかった気がするな。これも反省だわ。


PART5 最小限のDirectXアプリケーション(12:25)


CreateDeviceメソッドの話


CreateDevice(
D3DADAPTER_DEFAULT, // シングルモニタの場合、これで決まり
D3DDEVTYPE_HAL, // HALを使うよ
hWnd, // ウィンドウハンドル
D3DCREATE_HARDWARE_VERTEXPROCESSING, // フラグ
&g_D3DPParamas, // デバイス初期化のパラメータ
&g_pD3DDevice // 生成したデヴァイスを格納するための変数
)




  • &g_D3DPParamasで指定したパラメータは後から変更できない。たとえば色深度などがそう

  • ウィンドウモード実行中のアプリでコンパネから色深度変更した場合でも、アプリの色深度はかわらない。

  • ウィンドウをリサイズしても、描画領域の画像サイズは変更されない


BeginSceneとEndSceneメソッド



  • BeginSceneメソッドを呼び出すと、DirectXアプリ以外のアプリ(スレッド)がいったん動きを止めるらしい

  • その動きが止まってる間に描画処理を実行する

  • ちなみにその描画処理はバックバッファに対して実施される

  • で、終わったらEndSceneを呼び出す。これでほかのアプリ(スレッド)が再開される


これは知らなかった。


フルスクリーンモードの話



  • フルスクリーンにするにはいったんデバイスを開放しなくてはならない。

  • その後、もう一度モデルやテクスチャを再確保する必要があり、かなり面倒

  • できれば、ソースコード上のフラグ定数などで静的に切り替えるのが、バグを抑えるという意味でお勧め

  • もしくはプログラム起動後に、タイトル画面などでモードをユーザに選択させるなど。


ALT+Enterでの切り替えはやめたほうがいいかな。でも昔作ったプログラムはALT+Enterで動的に切り替えてた気がする。。。


PART6 ウィンドウとモデルの表示(Direct3D)(13:30)


カメラの設定


D3DXMatrixPerspectiveFovLH( &matProj,
D3DX_PI/4, // 視野角
tmpAspect,// アスペクト比
1.0f, // 最近接距離
800.0f ); // 最遠方距離



アスペクト比

よこ/たて。忘れてたな。

視野角

2PI=360度。PI=180度。だからD3DX_PI/4は45度。復習復習。

最短距離、最長距離

Zバッファの0は最短。1は最長。



メッシュの表示


D3DXLoadMeshFromX(filename // ファイル名
D3DXMESH_SYSTEMMEM, // メッシュを作成するときのオプションフラグ
theDevice, // デバイス
NULL, // 隣接製データをうんたらかんたら。よくわからん
&pMaterials, // マテリアル配列を受け取るためのポインタ
NULL, // エフェクト配列のためのポインタ
&(aModels->objNumOfMaterials), // マテリアル配列の数
&(aModels->objMesh)) // 受け取るメッシュオブジェクトへのポインタ


この関数を使って、マテリアル情報を取得し、マテリアルとテクスチャ情報をコピーして使いまわす。


モデルの表示部分。マテリアルごとにDrawSubsetを呼び出す。



VOID drawMesh( LPDIRECT3DDEVICE9 theDevice, int objNum )
{
SetupObjMatrixMulti( theDevice , objNum ); //オブジェクトの表示用行列を設定
int theType = g_Object[objNum].MdlType; //オブジェクトのモデルの種類

// マテリアルの数だけループ
for(DWORD j0=0; j0 < g_ObjModels[theType].objNumOfMaterials ; j0++ )
{
// サブセットにマテリアルとテクスチャを設定。
theDevice->SetMaterial( &(g_ObjModels[theType].objMeshMaterials[j0]));
theDevice->SetTexture( 0, g_ObjModels[theType].objMeshTextures[j0] );

// メッシュ・サブセットの描画。
g_ObjModels[theType].objMesh ->DrawSubset( j0 );
}
}





今日はここまで。いまから飲み会だわ。あんま進まなかったな~。(15:30)



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月25日金曜日

JoglをやめてDirectXやろうかなw

0 コメント


やっぱJoglはやってる人いなくて寂しいですよw


今までJoglでいろいろ組んできたけれども、どうもモチベーションがあがらない。


その理由としては




  • Javaは起動が遅い

  • ライトワンスというけれども、結局プラットフォームにより挙動が変わる

  • ほとんどの人がWindowsユーザなのにJavaを使う意味って・・・

  • コントローラが使えない。無理やりつかうこともできるが、そしたらJava使う意味なくね?

  • 仕事でJavaやってるんだらか趣味プロではC++のほうがよくね?


てな感じです。


そんな中、ひっさし振りにCのコードを見る機会があった。



++*arg


やばい!忘れてる!間接参照が先だっけ?ポインタ演算が先だっけ?


いくら5年以上もCプログラム組んでないからって、新人でもわかるんじゃないか?やばいでしょさすがに


プログラマとして基礎教養であるCが読めないなんて恥ずかしすぎて外も歩けませんw





そんな風に感じてるころにちょうどOKIさんの記事読んだ。


ここ数年Windowsの開発シーンはさっぱり追ってなかったけどいつの間にかVisiualStudioが無償になっているとは!


世の中はオープンソースでソフト無料という流れになってるから、天下のMicrosfotも無料にせざるを得ないのかな。しかも今日TrueSpaceという3Dソフトが無償になったし!これなんかモーション生成もサポートしてるみたいだから今後はDirectXで開発する上で欠かせないツールになるかも。


というわけで急にC++というかDirectXがやりたくなりました(たぶんOKIさんの記事読まなかったらあと3年はVCやる気にならなかったでしょう。感謝!)。


まずは、C++の復習しなくちゃなんだけど今はとにかくDirectXをやりたい!このやる気の火をともしたらもったいない!


そこでとりあえず入門書を買ってきて読むことにした!


これです。



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング







本屋でざっと読んでみたところ、最低限のDirectXの機能に解説を絞り込んでるようなので、ひっさし振りのリハビリにちょうどよさそう。それにこの本の作者、以前読んだことのある「ゲームのアルゴリズム 思考ルーチンと物理シミュレーション」の「ねおだ 如」さんの本である。この本は、内容も面白かったけど、イラストもすごく好きで良かった。なんかタッチが暖かいのです。


ということで、この週末に一気に読み進めます。


ルールとしては、


1.とにかく手を動かす。


2.わからないことは些細なことでもメモする。


3.途中で脱線しない。オリジナルのコードは書かない。サンプルの改造はOK


3については今までよくこれやって、結局本を最後まで読まなくなる、というパターンがあったので。


さあ読むぞ~w





しかし明日飲み会だorz





2008年7月18日金曜日

タスクシステムって駄目なの?

0 コメント


以下の2chスレッドの話題。



【タスクシステム総合スレ part2】
tp://pc11.2ch.net/test/read.cgi/gamedev/1196711513/

なんだかこのスレを読んでると




  • タスクシステム信者 → 素人ダサ!

  • タスクシステムを否定するもの → タスク以外のやり方選ぶ俺様すげーw


って感じで相変わらず2chらしいw


昔から2chのゲ製技版は俺様気質のやつが多くてなぜか気分が悪くなるのですよ。


だからあんまり読まないんだけど久しぶりに読み漁ってしまった。面白かったーw。


とりあえずPACというアーキテクチャ知らなかったorz。勉強になったよw。





で、このスレだけ読んでるともうタスクシステムは使われてないという向きが多いけどどうなんだろ?


俺が働き始めた頃の10年前から普通にタスクってシステムはあったけどそのころはCがメインだったからな。


C++がメイン(と思われる)今の現場ではやっぱり古いのか。





Cで組む場合、リストのなかに関数ポインタおいてワーク領域に構造体あてはめて状態もってという仕組みなわけだけど、C++でこの仕組みをそのまま持ってくるのはどうかと思う。Taskクラスを基底クラスとした場合にnewをオーバーロードして固定で領域確保して派生クラスにキャストして…。さすがにこれはオブジェクト指向に反した、なんだか気持ち悪い実装なのでもっといい方法が欲しいよね。ただどうすればいいのかわからんがw





Gemsとか読んだり海外のサイト漁ったりしてると、C++とかで組む場合、Taskという言葉を使わずにGameObjectとかGameEnttiyとかActorとかが多い(海外だからあたりまえか。本来Taskはスレッドみたいにコンテキスト切り替える仕組みなわけだし)。それに習ってか最近のゲームシステムではタスクではなくて別名が多いとか?(2ch情報)。実際どんなシステムなんだろう?最近はスクリプトで実装部を組むことが多いみたいだから、この辺にGameObjectの実装を組み込んでいくのかな?Luaとか流行ってるみたいだけど、コルーチンとかがあって並列っぽい処理ができるとのこと。面白ろそうだ!





俺も一応ochaglという自前フレームワークつくってるけどオブジェクト指向でまじめにゲームのフレームワーク組むのはこれが初めてだからなんかいまいちなんだよなw。一応Taskクラスも実装してるけど、ゲームをひとつも完成させてないから使い勝手がいいのか悪いのか全然わからねーw。ライブリが完成しないからゲームができないという、まさに目的と手段が入れ替わった状態w。とりあえず簡単なヘボシューでも作るか…。まずはTaskクラスの名前をEntityにしようwww。


それにしても、最近のモダンなタスクシステムがどうなってるのか知りたくなってきた!なんかいいソースないかな~。ゲーム業界もオープンソース化しようよw





2008年7月3日木曜日

Windowsに入れる最低限のツール

0 コメント


自宅ではVAIOのノートPCを使っていて、UbuntuとVistaを入れてある。んでメインはUbuntu。Vistaはほとんど使ってない。それでもたまーにWindowsを使うことがある。そんなときやっぱり素のVistaではあまりにも使いにくいということで会社のマシンで使っているWindowsのツールたちをメモ。








xyzzy

http://www.jsdlab.co.jp/~kamei/


これがないとは始まらない。








caldix

http://www.kmonos.net/lib/caldix.ja.html


xyzzyのファイラと組み合わせれれば、もう圧縮解凍ツールいらね。








changekey

http://www.forest.impress.co.jp/lib/sys/hardcust/keyboard/changekey.html


CtrlとCapsを入れ替える。これながいとキーボード使えません。


追記


ChangekeyはVistaに対応していないので使えない。仕方がないので下記サイトの.regファイルを拝借した。


http://www.center-left.com/blog/archives/2007/02/windows_vistacaps_lockctrl.html








putty

http://yebisuya.dip.jp/Software/PuTTY/


linuxに接続するのに使う。ごった煮版を使ってます。








firefox

http://mozilla.jp/firefox/


基本。IEは使いづらくて話になんね。








WinDeskWide

http://bluecard.no-ip.com/freeware/WinDeskWide/


Linuxの仮想デスクトップを実現。この便利さ一度味わうと戻れません。








CraftLaunch

http://sites.google.com/site/craftware/


キーボードランチャ。これがあればスタートボタンを押すことはほとんどありません。


さらにデスクトップのショートカットアイコンの散乱ともおさらばです。








tsxbin

http://www.net3-tv.net/~m-tsuchy/tsuchy/dlpage.htm


バイナリエディタの中ではこれが一番使いやすい。


表示幅を8bit - 32bitまで自在に代えられる!








AdjustClock

http://wiki.cuvie.net/index.php?AdjustClock


時刻を自動的に合わせてくれる。Httpで合わせるので会社のLanでも使用できて便利。








TClock Light

http://homepage1.nifty.com/kazubon/


タスクバーの時計の表示が見やすくなる!





2008年5月30日金曜日

String#offsetByCodePointsでハマリ

0 コメント


文字列の補助文字対応をしていてハマッタのでメモ。


症状


下記のようにUnicodeのコードポイント単位で処理をしたいが、


offsetByCodePointsの値に期待値がこないで、妙にでかい値がくる。なぜ?!



for (int i = 0; i < s.length(); i = s.offsetByCodePoints(i, 1)) {
...
}


調査



下記のようなテストプログラムでoffsetByCodePointsの出力を調べる。


期待値は1.



class Test {
public static void main(String[] args) throws Exception {
String org = "*****ハロー";
String word = org.substring(5, org.length());
p("offsetByCodePoints:%s\n", word.offsetByCodePoints(0, 1));
p("%s\n", word);
}

public static void p(String format, Object... args)
{
System.out.printf(format, args);
}
}



しかし、出力は以下となる。



$ java Test
offsetByCodePoints: 6
ハロー


この6という数字はなにか。


JavaDocによると、String#substringは新しいStringのインスタンスを返すと記述されている。


しかし実はsubustringで生成されたインスタンスは、完全に新しく生成されるわけではないのだ。


Stringのインスタンスは内部に文字列を保持しているが、メモリ効率をよくするために、


同じ文字列をnew Stringした場合は、同じ文字列をメモリ上指し示すような作りになっている。


subustringメソッドを実効した場合も同様で、subustringを実効したStringインスタンスと


同じ文字列を指すのだ(内部にオフセット値をもっていて、この値を変えているだけ。Stringクラスのソースを読むと分かる)



このことから以下のようなループ処理をするときは、substringを使用してはいけない。



for (int i = 0; i < s.length(); i = s.offsetByCodePoints(i, 1)) {
...
}


使用する場合は、



String word = new String(org.substring(5, org.length()));


としなくてはならい。



結論


substringで生成された文字列に対して、offsetByCodePointsを使用してはならない。


じゃあ、どうやって文字ループを実現するかだが、以下のようにした方がいいかもしれない。



for (int i = 0; i < s.length(); ) {
int c = s.codePointAt(i);
p("%x\n", c);
i += Character.charCount(c);
}


offsetByCodePointsはループに使用するなってことだね。



今回使用したテストプログラム



import java.io.*;

class Test {
public static void main(String[] args) throws Exception {
String org = "*****ハロー";
String word = org.substring(5, org.length());
p("offsetByCodePoints:%s\n", word.offsetByCodePoints(0, 1));
p("%s\n", word);
testLoop1(word);
testLoop2(word);
}

public static void p(String format, Object... args)
{
System.out.printf(format, args);
}

public static void testLoop1(String s) {
p("===================\n");
p("offsetByCodePoints\n");
for (int i = 0; i < s.length(); i = s.offsetByCodePoints(i, 1)) {
int c = s.codePointAt(i);
p("%x\n", c);
}
}

public static void testLoop2(String s) {
p("===================\n");
p("charCount\n");
for (int i = 0; i < s.length(); ) {
int c = s.codePointAt(i);
p("%x\n", c);
i += Character.charCount(c);
}
}
}


追記


この症状はバグとして報告されていて、Java6で実行したら問題なかったよ。。。


http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6242664





2008年4月13日日曜日

MOTION EYEをUbuntu(hardy)で動かす

0 コメント


VAIOノート(VGN-SZ85S)でMOTION EYEを動かせたのでそのメモ。


まずVistaを起動してドライバなどを調べる。








名前Sony Visual Communication Camera VGP-VCC7
DeviceID05ca:183a
製造元Ricoh R5U870

で検索したら以下のサイトを発見。


http://wiki.mediati.org/R5u870


これがドライバを配ってるサイトっぽい。でインストールしようと思ったがコンパイル方法がいまいち分からなかったので、もうちょっと調査。で次のサイトを発見。


http://wiki.ubuntu-forum.de/index.php/Sony_Vaio_Webcam


どこの国のコミュニティか分からないが、断片的にコマンドが乗っていたのでその通りに作業した。



cd ~
mkdir src
cd src
wget http://bernhardp.be.funpic.de/skripte/webcam.kernel.2.6.24
chmod 755 webcam.kernel.2.6.24
./webcam.kernel.2.6.24
sudo ./webcam.kernel.2.6.24

sudo vi /etc/modules
# 以下を追加
r5u870



動作確認用のアプリをインストール



sudo apt-get install cheese


インストールが終わったら



アプリケーションーグラフィックスーCheese



おおお!自分の顔が写った!感動w





2008年4月7日月曜日

ubuntuのemacsで日本語入力

0 コメント


ubuntuでは、C-Spaceが日本語入力に割り当てられており、Emacsのマークとキーバインドがかぶってしまうため、以下の設定を実施する必要がある。


~/.bashrc:



alias emacs='export XMODIFIERS=@im=none emacs -nw'


export をいれないとうまくいかない。たぶん環境変数のセットが終った時点でスコープが切れるのかな?。XMODIFIERSとは、Xクライアント (UNIX アプリケーション) が、どのインプットメソッドと通信をするのかを指定する環境変数。右辺の内容は以下。



@im=インプットメソッド名


参考


http://forum.ubuntulinux.jp/viewtopic.php?pid=4150


↑あとで確認したらダメだった。どうもaliasで設定するのはダメっぽいな。





sourceforgeのCVS設定

0 コメント




export CVS_RSH=ssh
export CVSROOT=:ext:ocha@cvs.sourceforge.jp:/cvsroot/ochagl





2008年3月30日日曜日

Pythonをやってみた

0 コメント

C++でDirectXやるといっておきながら浮気性の俺。。。GAE(GoogleAppEngine)への興味と、モデリングで使っているBlenderがPythonで拡張可能という理由からちょっとかじってみた。


教科書は、「みんなのPython」と「Pythonチュートリアル」。

「みんなのPython」はネットで評判がいいから購入。しかしどうも自分には内容が合わないのでつづけて「Pythonチュートリアル」も購入してしまった。「Pythonチュートリアル」はWeb上でも見られるが自分はアナログ派なのでこっちのほうがしっくり来る。値段も1200円と安いし。ということでさらっと勉強してみたものの、なんかしっくり来ない。

理由は以下


  • エディタによる自動インデントがうまくいかない(ことがある)
  • デバッグ文を書くとき、わかりやすいようにインデントをずらす癖があるが、それが使えない。
  • Emacsのshellから起動してみたが、リアルタイムでpygameからprint文が出力されない。
  • クラス仕様が緩すぎる
  • 日本語処理がイマイチらしい
  • 正規表現がイマイチ使いづらい(Javaっぽい)
  • importとかめんどい

てな感じでイマイチ。エディタはEmacsを使ってるけどなんか回避策あるのかな?長所が短所になってる感がw。ほかにも使い込めばそれなりにいいところあるんだろうけど、そこまでして使う気にならないな。ま、メインで使うことはないだろう。BlenderなりGAEなり使いたくなった時にやればいいや、という感じだ。

とはいえ、pygameはLLでゲームプログラミングやる楽しさに気づいたという点では収穫だった。

とくにココの解説動画がいい!実際に動画にあわせてプログラムしてると、昔MSXでBASICやってたころのあの感じ「ちょっとコーディングして、ちょっと動かして、またちょっと動かして」っていうのを思い出してすごくわくわくした。やっぱこの手軽さっていいよなー。こういう処理系というか仕組みは将来的に自分でも実装してみたい。

しかし、やっぱりLLはrubyのほうが俺にはなじむ。Rubyは会社でも使っていてきちんと身につけたいと思ってるし、なんか好きなんだよね。とりあえずちょっとだけRuby/SDLをやってみよう。

結局Pythonは、必要なったときにチュートリアル読み返してやればいいやという結論。

Pythonチュートリアル

Pythonチュートリアル


2008年3月13日木曜日

モニタが低解像度になったときの復帰方法

0 コメント


モニタが低解像度になってしまい、どう復旧していいか分からなかったが、以下のURLにあるとおりにしたら


復活することができた。


http://forum.ubuntulinux.jp/viewtopic.php?pid=406


下記コマンドを入力



sudo dpkg-reconfigure xserver-xorg


テキストベースの対話モードになるので、適当にエンターエンター。


対話モードが終了したら、再起動する。





2008年2月27日水曜日

FreeStyleWikiをsourceforgeにインストール

0 コメント


最初sourcefouregeにはhikiを入れていたが、カテゴリの扱いなどFsWikiの方が機能に引かれるものがあったので乗り換え。


パーミッションの設定などはダウンロードしたzipをドキュメントルートに展開し、setup.shを実行するだけでOK。


ただし、hikiのインストールのときと同じように少々小細工が必要。


以下、インストール手順。


sourceforge.jpのプロジェクトルートに移動



wget http://osdn.dl.sourceforge.jp/fswiki/20797/wiki3_6_2.zip


unzip wiki3_6_2.zip


rm -rf cgi-bin/


mv wiki3_6_2 cgi-bin


cd cgi-bin/


./setup.sh



テーマをhtdocs下に移動



mv theme ../htdocs



cgi-bin/setup.datを編集



theme_dir = ../htdocs/theme


theme_uri = /theme



htdocs下に下記の.htaccessを作成



RewriteEngine on


RewriteRule ^$ /cgi-bin/wiki.cgi


RewriteRule ^wiki.cgi.*$ /cgi-bin/wiki.cgi [QSA]


RewriteRule ^index.html /cgi-bin/wiki.cgi


AddType application/x-java-jnlp-file jnlp


DirectoryIndex wiki.cgi index.php index.html






インストール方法は以下にある。


メニュー->ドキュメント->readme


http://fswiki.org/wiki.pl/docs?page=readme


管理画面へのログイン


id:admin


ps:admin


子ウィキ(WikiFarm)の作り方


ひとつのWiki内に別のWikiを作ることができる。


ログイン画面→WikiFarmの設定


でWikiFarmを設定すると右上のメニューにFarmができるのでそこから作成することができる。





2008年1月21日月曜日

NetBeans6.0.1開発日本語版を試す。

0 コメント


Mac版のEclipseを使ってるんだけど、なんだか不安定。クラスのインポートをするとすぐにこけてしまう。


Eclipseを使っている理由のひとつにクラスインポートが簡単にできるというのがあるので、これは痛い。


そこでNetBeansを試してみることにした。




  • ここからJavaSE26MBをダウンロード。


NetBeansでEclipseプロジェクトをつかう


Eclipseをインポートするプラグインをインストールする。



  1. メインメニューから「ツール」>「プラグイン」を選択。

  2. 「使用可能なプラグイン」タブをクリックし、「JBuilder プロジェクトインポート機能」または「Eclipse プロジェクトインポート機能」を選択。

  3. 「インストール」をクリック。


プロジェクトをインポートする。



  1. 「ファイル」>「プロジェクトをインポート」メニューからプロジェクトの種類を選択。


ソースディレクトリの見直し



  1. プロジェクトのプロパティをみるとテスト用のソースフォルダが通常のソースフォルダとして認識されているので登録し直す。


cvsを使う方法




  • 外部シェルを使うでsshを指定。

  • チェックアウト

  • 「チェックアウトしたソースでプロジェクトを作成しますか?」でプロジェクトを作成する。


    • 「既存のantを使用するjavaプロジェクト」を選択。

    • チェックアウトしたディレクトリを選択すると自動的にbuild.xmlを調べて、項目を埋めてくれる。

    • プロジェクト名を変更する




生成物


NetBeansで作ったjarが実際につかえるかは未検証。


デバッガ


mainメソッドのあるファイルの右クリックで「ファイルをデバッグ」を選択。


問題点


ochaglのサンプルが動かない。

ochaglのサンプルはテストディレクトリに入っているが、これがテストディレクトリにあるためか、JUNITテストと勘違いされてしまい動かない。


ソースのインポートが使えない!Eclipseでは落ちていたファイルインポート。

NetBeansでは落ちることがないが、インポートされないことが多々ある。これじゃnetbenasに切り替えた意味がない。。


CVSの別名チェックアウトができない。

えええ~~?なんでこれができないの?なんで?


ソースを修正してもキャッシュが効いているため、反映されない。

ファイル単位で実行している場合、そのソースを修正しないと、別ファイルの修正が反映されない。


print文が出力されない、画面スプライトの位置が変更されないなど、ファイル修正が反映されない!これは痛すぎる!こんなんじゃコーディングできねぇ!!


結論


結局使えないと断定。ポテンシャルは感じるが、乗り換えるにはまだまだだな。いずれはNetBeansに切り替えるかもしんないけど、まだ当分Eclipseでがんばってこ。





2008年1月16日水曜日

flexの環境整備(ant)

0 コメント


ここからflex-ant-taskを落とす。解凍したらantのlib下にコピーする。



sudo cp ~/Downloads/flex_ant_tasks_022607/lib/flexTasks.jar /usr/share/ant/lib


環境変数の設定


環境変数は以下のように設定しておく。



~/.bash_profile
export FLEX_HOME=/Applications/flex2_sdk
export ANT_HOME=/usr/share/ant
export PATH=$PATH:$FLEX_HOME/bin


ディレクトリ構成


適当に作業ディレクトリをつくそこに下記のbuild.xmlとbuild.propertiesを配置する。


ソースファイルはsrcディレクトリを作ってそこに配置。



work
build.properties
build.xml
src


buildx.ml



<?xml version="1.0" encoding="UTF-8" ?>
<project name="javapress" default="build" basedir="." >
<property file="build.properties"/>
<property environment="env"/>
<property name="FLEX_HOME" value="${env.FLEX_HOME}"/>
<property name="project.swf" value="${project.name}.swf"/>

<taskdef resource="flexTasks.tasks" classpath="${env.ANT_HOME}/lib/flexTasks.jar" />

<path id = "project.class.path">
<pathelement path="${classpath}" />
<fileset dir="libs" >
<include name="**/*.swc" />
</fileset>

</path>

<target name="all" depends="clean, build" />
<target name="build" depends="dist" />

<target name="clean">
<delete dir="src/generated"/>
<delete>
<fileset dir="src">
<include name="**/*.cache"/>
</fileset>
</delete>
<delete file="dist/${project.swf}"/>
<delete>
<fileset dir="${deploy.dir}" includes="${project.swf}"/>
</delete>
</target>

<target name="init">
<mkdir dir="dist" />
</target>

<target name="compile" depends="init">
<mxmlc
file="${main.file}"
output="dist/${project.swf}"
actionscript-file-encoding="${encoding}"
keep-generated-actionscript="true"
incremental="true"
default-background-color="${project.color}"
>
<default-size width="${project.width}" height="${project.height}"/>
<load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
<source-path path-element="${FLEX_HOME}/frameworks"/>
<compiler.source-path path-element="src"/>
</mxmlc>
</target>


<target name="dist" depends="compile">
<copy todir="${deploy.dir}">
<fileset dir="dist"/>
</copy>
</target>

<target name="run" depends="dist">
</target>

<target name="html">
<html-wrapper
title="${project.name}"
height="${project.height}"
width="${project.width}"
bgcolor="red"
application="app"
swf="${project.name}"
version-major="9"
version-minor="0"
version-revision="0"
history="true"
template="express-installation"
output="dist"/>
</target>

</project>


build.properties



project.name=Particle
project.width=640
project.height=400
project.color=0x000000
deploy.dir=/Library/WebServer/Documents/downloads/flex/test
encoding=UTF-8
main.file=src/Particle.as


同期に使っているrsync


sourceforgeはsshログインできるので、rsyncで同期をとれる。便利!



rsync -acnpvz -e ssh -C --delete --include-from=includes.txt
--exclude-from=excludes.txt src_dir host:dst_dir

include.txt
.htaccess

exclude.txt
.* #ドットで始まるファイル
GPATH
GRTAGS
GSYMS
GTAGS
README





2008年1月11日金曜日

Macで画面キャプチャする方法

1 コメント










画面全体コマンド+シフト+3
範囲指定コマンド+シフト+4
選択範囲を移動スペース
縦方向ないしは横方法を固定して選択シフト
開始点を中心に拡大して選択オプション




2008年1月10日木曜日

サイドバーにリンクつきのロゴを表示

0 コメント


サイドバーに画像を添付し、SideMenuのページ名を忘れずに記述する。



[{{attach_view(logo.png, SideMenu)}}|FrontPage]]
!!!サイト内検索
{{search_form}





サイト内検索するとエラーが発生するのを修正

0 コメント


サイト内検索をすると例外が発生したけど、プラグインを必要最小限のものにしたら発生しなくなった。


どっかのプラグインと干渉していたようだ。





2008年1月9日水曜日

ruby-mode設定

0 コメント


参考


まずはソースをダウンロード


http://www.ruby-lang.org/ja/


解凍して以下のelをコピーする



cd ruby-1.8.6-p111/misc


cp *el /usr/share/emacs/site-lisp/



.emacsに以下を追加



(autoload 'ruby-mode "ruby-mode"
"Mode for editing ruby source files" t)
(setq auto-mode-alist
(append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby"
"Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
"Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
'(lambda ()
(inf-ruby-keys)))





2008年1月7日月曜日

作業めも

0 コメント

  • ローカルからshellサーバへのrsyncテスト中
    • . htdocs でパーミッションエラーが発生
  • ローカルでもテストできるようにする
    • apache内の環境変数でドメインを切り替えるようにする
    • なぜかHikiにログインするとパーミッションエラーが発生する
  • Hikiでソースコードの色分けしたい
    • googleにそんな機能があった気がする
  • Hikiにフラッシュを埋め込みたい
  • リンク先の画像がでるスニペットをいれたい。
  • 今日のひとことブログパーツを入れたい。
  • 旧サイトにrobot.txtと転送用のindex.htmlを配置
  • 新サイトをgoogleに登録
  • hikiで画像にリンクをつけたときの青枠を消す。
  • もしかして両面描画してたかも?!