lua5.2で困ったこと

lua使うときのメモ書き
luaのテーブルにC関数を登録するとき、lua5.1では

const luaL_Reg aiStatus[] = {
	{"getHand", AIStatus::getHand},
	{NULL, NULL}
};
luaL_register(l, "AIStatus", aiStatus);

で済んでいたのが、luaL_registerが廃止されたらしく、コンパイルできなくなっていた。
いろいろいじった結果

const luaL_Reg aiStatus[] = {
	{"getHand", AIStatus::getHand},
	{NULL, NULL}
};
luaL_newlib(l, aiStatus);
lua_setglobal(l, "AIStatus");

これで動くみたい。

PixivRSSとニコニコ静画RSSのブックマークレットを作った

PixivRSSの登録にいちいち登録フォーム開くのが不便だと思ったんで、RSS作成ブックマークレットを作った。
昨日作ったときにはサーバー不調でデバッグすらあまり出来なかったけど、今朝サーバーが安定してからデバッグしてリリース。
URLはhttp://mattyan.net/Pixivrss/の便利ツールから
ついでで、ニコニコ静画RSSのブックマークレットも作成。こっちはあっさりデバッグも通ってリリース。
URLはhttp://mattyan.net/NSRSS/の便利ツールから
そのあと、PixivRSSをプログラムページに登録。代わりにベースOSの古くなった東方OSを公開停止処理。
東方OSは出向が終わってある程度余裕ができたら書きなおす予定。
ただ、UbuntuデフォルトテーマがEclipseと相性悪いので、先にテーマだけ移植するかも。
ツールチップが黒背景に黒文字で全然見えないとか…

Wacomドライバを入れてみた

Ubuntu11.10でWacom BAMBOO PEN CTL-470のドライバを入れるメモ書き。
まずドライバのソースを取得。本当はフォーラムから取得するべきだけど、面倒だからミラーリング。wacom-bamboo.tar.gz
続いてインストール用スクリプト


sudo apt-get update
sudo apt-get -y install build-essential libx11-dev libxi-dev x11proto-input-dev xserver-xorg-dev libxrandr-dev libncurses5-dev autoconf libtool
sudo apt-get upgrade
gzip -dc wacom-bamboo.tar.gz | tar xvof -
cd wacom
make -C /lib/modules/$(uname -r)/build SUBDIRS=$(pwd) modules
sudo cp ./wacom.ko /lib/modules/`uname -r`/kernel/drivers/input/tablet/wacom.ko
sudo depmod -a

これでインストールされるはず。

気がつけば誕生日

気がつけば24歳になってた。
で、現在友達とゲーム開発中。
こっちはこっちでやりたい放題やってるからあまり進展はないんだけどね…
とりあえず、xmlにBase64エンコードしたpng画像放り込んでおいて、それをデコードしてSDL_Surfaceに投げ込むコードを開発中。
オンメモリのデータのデコードは配列変数で PNGデータを libpng に渡す方法
spacer
を参考に。libpngで読み込んだデータの扱いはSDL_imageのコードをほぼコピペで作成中。動くのかなこれ。
で、こっちはUbuntuで書いてるから、Windowsでどうなってるかの確認用に友人にMinGWと各種ライブラリをほぼ無理やりインストールさせた。
でコンパイルさせたところ、不可解なエラー連発。
まず最初
libgcc_s_dw2-1.dllが見つかりません
libgcc_s_dw2-1.dllが見つかりませんという物。
原因はMinGWの例外処理でDwarf2を使おうとしてリンクしたはいいものの、肝心のDLLが見つからないからっぽい。なんで?
次は似たようなものでlibstdc++-6.dllが見つからないとのこと。
これの原因はMinGWがiostreamとかをDLLに置いといたはいいもの、やっぱりそれが見つからないからっぽい。そんな馬鹿な。
MinGWTDMだとこのへん出ないんだけどなぁ…

YoutubePlaylistPlayer3公開中

本当にアップしたのは一昨日なんだけど。
表向きの変更点は、マニュアルペインをタブで隠してスペース確保。あとプレイリストのインポート/エクスポートボタンも、普段使わないから隠す。
動画追加も、エディットボックス入力からconfirmでの入力ダイアログ出現に変更。余計な計算をやめるくらいにしか効果ないけど。
ついでにシャッフルチェックをクリックしたタイミングでシャッフルするように変更。
システム面の変更点は、HTML5にしたこと、mysql_系関数からPDOを使用するように変更。あとはほとんど変化なし。
html5にしたから、youtube外部プレーヤーがvideoタグでも使えるようになったら移動する予定。
そうしないと、Android firefoxで使えないし…
あと、プレイリストの預かり機能を検討中。Android firefoxはxmlをアップできないからなぁ…なんでだろう…
URLはhttp://mattyan.net/ypp/

ypp3開発中

YoutubePlaykistPlayer3を開発中。
今回はインターフェースをJquery-uiのタブを使って説明ペインを隠して2ペイン構造にして、幅の制限をなくすつもり。
あとYoutubeFireがなんか面倒なことになってそうだから、ダウンロードリンクを完全に排除。YoutubeRepeatに転送するだけにした。
DBアクセスをmysql_系関数からPDOに変更。今のところだからどうした状態。ついでにhtmlも4.01 strictから5に変更。将来的にYoutubeのhtml5プレーヤーが外部でも使えるようになったら使ってみようかな。
プレイリストの仕様に変更はなし。今のyppでエクスポートしたのをインポートすればそのまま利用可能。
現在ベータテスト中。
主開発環境のEclipseが超便利。
リモートクライアントと内部ブラウザとターミナルとSVNクライアント統合で、編集もアップロードもデバッグも全部Eclipse上からできるwww

クラスのメンバ関数をマルチスレッドで動かすためのメモ書き

クラスのメンバ関数をSDLのSDL_CreateThread関数で扱うためのメモ書き。ちょっと流用すれば他のライブラリでも使えるかも?
staticメンバ渡せば一発なんだろうけど。派生することを考えるとなんか色々面倒くさそうなんで、普通のメンバ関数を呼び出すようにした。

基底クラスの用意

マルチスレッドで動かすクラスの基底クラスでは、至るところで派生クラスの型がわからないと使えないので、テンプレートクラスで作成。


template <typename T> class Thread{
		private:
			struct ThreadParameter{
				T    *instance;
				void *parameter;
			};
			SDL_Thread *thread;
			/**
			 * スレッド関数呼び出し
			 * @param[in] param スレッド情報
			 * @return function()の戻り値
			 */
			static int callThread(void *param){
				ThreadParameter *tp = pointer_cast<ThreadParameter *>(param);
				return pointer_cast<T *>(tp->instance)->function(tp->parameter);
			}
		public:
			/**
			 * スレッド実行関数
			 * @param[in] param 引数
			 * @return 不明
			 */
			virtual int function(void *param) = 0;
			/**
			 * スレッド実行関数
			 * @param[in] p     派生クラスのポインタ
			 * @param[in] param スレッドに渡す引数
			 */
			void run(T *p,void *param){
				ThreadParameter tp = {p,param};
				this->thread = SDL_CreateThread(&Thread<T>::callThread,&tp);
			}
	};

1.privateにSDL_CreateThreadから呼んでもらうメンバ関数をstaticで宣言。その関数への引数として、派生クラスのポインタとスレッドへの引数をまとめた構造体を渡す。
2.callThread関数では、渡されたポインタから派生クラスのインスタンスのポインタを取り出して、マルチスレッドで実行したいメンバ関数を呼び出す。
派生クラス


class Add:public Thread<Add>{
	public:
		virtual int function(void *p);
};
int Add::function(void *p){
	FILE *file = fopen(pointer_cast<char *>(p),"w");
	fprintf(file,"start = %d\n",SDL_GetTicks());
	for(int i=0;i<2000;i++){
		fprintf(file,"i = %d\n",i);
	}
	fprintf(file,"end = %d\n",SDL_GetTicks());
	fclose(file);
	return 0;
}

マルチスレッドで使用する関数をオーバーライドするだけ。
これが呼び出されると、プログラムが起動してからのミリ秒を記録したあと、2000回ほどループして、終了時間を記録してスレッド終了する仕組み。
実行結果は

スレッドID 開始時刻 終了時刻
1 515 536
2 515 536

だから、マルチスレッドで動いてる。はず…
ちなみにpointer_castはこんな関数


/**
 * ポインターキャスト
 * @param[in] p キャストするポインター
 * @return キャスト結果
 */
template <typename T> inline T pointer_cast(void *p){return reinterpret_cast<T>(p);}

WallChangeLight実装中

スクリプトより、cronどうしようか実験中。

試したこと 結果
EDITORに設定データを吐き出すだけのスクリプトのパスを設定して投げる 設定するユーザーアカウントが存在しないため失敗
設定ファイルを直接コピーする 実験中。パーミッション設定に不安あり
local.rcに設定するスクリプトを組み込む 未実験

これができたらrev 100だ。

東方スカイアリーナテンションエディタRC2公開

東方スカイアリーナテンションエディタのRC2をサーバーに置いた。
ダウンロードはこちらからどうぞ
今のところ分かっている不具合
・たまに終了しない。(ウインドウが消えてもプロセスが生き続ける。)
・一部のWaveファイルを取り扱えない。(ザ・マッチメーカーズの効果音の一部とか)
他、使ってみて何かあったら連絡ください。