luabindのメモ書き2とQtインストール

luabindでluaスクリプトからテーブルを関数の引数として受け取る方法
C++側の関数の引数には luabind::object 型の変数を設定して、


SDL_Rect drawRect = {0, 0, 0, 0};
if(luabind::type(rect) != LUA_TTABLE)return;
if(luabind::type(rect["x"]) == LUA_TNUMBER){drawRect.x = luabind::object_cast<Sint16>(rect["x"]);}
if(luabind::type(rect["y"]) == LUA_TNUMBER){drawRect.y = luabind::object_cast<Sint16>(rect["y"]);}
if(luabind::type(rect["w"]) == LUA_TNUMBER){drawRect.w = luabind::object_cast<Uint16>(rect["w"]);}
if(luabind::type(rect["h"]) == LUA_TNUMBER){drawRect.h = luabind::object_cast<Uint16>(rect["h"]);}

こんなかんじでテーブルのメンバを取得する。
型チェックが要らないなら、drawRect.x = luabind::object_cast(rect[“x”]);だけでもOK。

QTのインストール
Building Qt on Windows (MinGW)を見てインストール中。
makeではなく、mingw32-makeを使うらしい。

luabindのメモ

C++のクラスをLuaに公開するのにluabindが便利とのことで投入検討。
Ubuntuのパッケージは要求するboostが古すぎるのかインストール拒否。
しょうがないので、自前で.aファイル作成。
ただその際に、公式ページからリンクされてるluabindはlua5.2に対応してないっぽいので
https://bitbucket.org/jlsandell/luabind/downloadsにある別のバージョンを使用。(Branchesのdefaultってほう)
以下、適当なMakefile.am


noinst_LIBARIES = libluabind.a
lib_LIBRARIES = libluabind.a
libluabind_a_SOURCES = 							\
	lua/luabind/src/class.cpp					\
	lua/luabind/src/exception_handler.cpp		\
	lua/luabind/src/pcall.cpp					\
	lua/luabind/src/class_info.cpp				\
	lua/luabind/src/function.cpp				\
	lua/luabind/src/scope.cpp					\
	lua/luabind/src/class_registry.cpp			\
	lua/luabind/src/inheritance.cpp				\
	lua/luabind/src/stack_content_by_name.cpp	\
	lua/luabind/src/class_rep.cpp				\
	lua/luabind/src/link_compatibility.cpp		\
	lua/luabind/src/weak_ref.cpp				\
	lua/luabind/src/create_class.cpp			\
	lua/luabind/src/object_rep.cpp				\
	lua/luabind/src/wrapper_base.cpp			\
	lua/luabind/src/error.cpp					\
	lua/luabind/src/open.cpp

ゲームに組み込むだけだからnoinstでインストールしないように指定。
あとはlsでリストアップしたcppファイル列挙して終わり。
明日以降組み込んでみるか。

PixivRSS2になった

先週土曜日にPixivRSS2.0に入れ替えた。
PixivRSS2は殆どの部分をフレームワークにしてるから、ニコニコ静画RSSも簡単に移植できるはず。
ついでに、パラメーターの書式も整理。互換性は無くさないようにしたけど、短縮形もサポート。
表から見るとわからない(遅くなったくらい?)だけど保守に便利になるように、ログの出力もサポート。
ほぼ定期的にアクセスされるものだから、ログファイル数がヤバいけど…エラー発生時に大体どの辺かがわかるから便利。
あと、今まではエラー発生時に不正な文字列(エラーテキスト…orz)を返していたのを、500を返すように修正。
今のところ順調に稼働中。そのうち、ニコニコ静画RSSもこっちに移植しようかな。

MinGW-TDMでcrypto++をビルドした

MinGW TDMcrypto++をビルドするのに、いくつか変更点がいるからパッチにしてみた。
support_mingw_tdm.patch


*** original/GNUmakefile	Mon Aug  9 14:22:42 2010
--- GNUmakefile	Sun Jun 10 15:55:35 2012
***************
*** 32,37 ****
--- 32,38 ----
  GAS217_OR_LATER = $(shell echo "" | $(AS) -v 2>&1 | $(EGREP) -c "GNU assembler version (2\.1[7-9]|2\.[2-9]|[3-9])")
  GAS219_OR_LATER = $(shell echo "" | $(AS) -v 2>&1 | $(EGREP) -c "GNU assembler version (2\.19|2\.[2-9]|[3-9])")
  ISMINGW = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "mingw")
+ ISTDM = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "tdm")
  ifneq ($(GCC42_OR_LATER),0)
  ifeq ($(UNAME),Darwin)
***************
*** 69,74 ****
--- 70,79 ----
  LDLIBS += -lws2_32
  endif
+ ifeq ($(ISTDM),1)
+ LDLIBS += -lws2_32
+ endif
+
  endif	# ISX86
  ifeq ($(UNAME),)	# for DJGPP, where uname doesn't exist

TDMサポートパッチ。
TDMのgccはバージョン情報に”mingw”ではなく”tdm-1″と出力するため、そっちもMinGWと同じ扱いになるように修正。
ついでに、Ubuntuのパッケージのファイル名と公式GNUmakefileの出力ファイル名が違っているから、Ubutnu側に合わせるパッチ
change_file_name.patch


*** original/GNUmakefile	Mon Aug  9 14:22:42 2010
--- GNUmakefile	Sun Jun 10 15:53:16 2012
***************
*** 137,178 ****
  	./cryptest.exe v
  clean:
! 	$(RM) cryptest.exe libcryptopp.a $(LIBOBJS) $(TESTOBJS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTIMPORTOBJS) $(DLLTESTOBJS)
  install:
! 	$(MKDIR) -p $(PREFIX)/include/cryptopp $(PREFIX)/lib $(PREFIX)/bin
! 	$(CP) *.h $(PREFIX)/include/cryptopp
  	$(CP) *.a $(PREFIX)/lib
  	$(CP) *.so $(PREFIX)/lib
  	$(CP) *.exe $(PREFIX)/bin
! libcryptopp.a: $(LIBOBJS)
  	$(AR) $(ARFLAGS) $@ $(LIBOBJS)
  	$(RANLIB) $@
! libcryptopp.so: $(LIBOBJS)
  	$(CXX) -shared -o $@ $(LIBOBJS)
! cryptest.exe: libcryptopp.a $(TESTOBJS)
! 	$(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) -L. -lcryptopp $(LDFLAGS) $(LDLIBS)
  nolib: $(OBJS)		# makes it faster to test changes
  	$(CXX) -o ct $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)
  dll: cryptest.import.exe dlltest.exe
! cryptopp.dll: $(DLLOBJS)
  	$(CXX) -shared -o $@ $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a
! libcryptopp.import.a: $(LIBIMPORTOBJS)
  	$(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS)
  	$(RANLIB) $@
! cryptest.import.exe: cryptopp.dll libcryptopp.import.a $(TESTIMPORTOBJS)
! 	$(CXX) -o $@ $(CXXFLAGS) $(TESTIMPORTOBJS) -L. -lcryptopp.dll -lcryptopp.import $(LDFLAGS) $(LDLIBS)
! dlltest.exe: cryptopp.dll $(DLLTESTOBJS)
! 	$(CXX) -o $@ $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS)
  adhoc.cpp: adhoc.cpp.proto
  ifeq ($(wildcard adhoc.cpp),)
--- 137,178 ----
  	./cryptest.exe v
  clean:
! 	$(RM) cryptest.exe libcrypto++.a $(LIBOBJS) $(TESTOBJS) crypto++.dll libcrypto++.dll.a libcrypto++.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTIMPORTOBJS) $(DLLTESTOBJS)
  install:
! 	$(MKDIR) -p $(PREFIX)/include/crypto++ $(PREFIX)/lib $(PREFIX)/bin
! 	$(CP) *.h $(PREFIX)/include/crypto++
  	$(CP) *.a $(PREFIX)/lib
  	$(CP) *.so $(PREFIX)/lib
  	$(CP) *.exe $(PREFIX)/bin
! libcrypto++.a: $(LIBOBJS)
  	$(AR) $(ARFLAGS) $@ $(LIBOBJS)
  	$(RANLIB) $@
! libcrypto++.so: $(LIBOBJS)
  	$(CXX) -shared -o $@ $(LIBOBJS)
! cryptest.exe: libcrypto++.a $(TESTOBJS)
! 	$(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) -L. -lcrypto++ $(LDFLAGS) $(LDLIBS)
  nolib: $(OBJS)		# makes it faster to test changes
  	$(CXX) -o ct $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)
  dll: cryptest.import.exe dlltest.exe
! crypto++.dll: $(DLLOBJS)
  	$(CXX) -shared -o $@ $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a
! libcrypto++.import.a: $(LIBIMPORTOBJS)
  	$(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS)
  	$(RANLIB) $@
! cryptest.import.exe: crypto++.dll libcrypto++.import.a $(TESTIMPORTOBJS)
! 	$(CXX) -o $@ $(CXXFLAGS) $(TESTIMPORTOBJS) -L. -lcrypto++.dll -lcrypto++.import $(LDFLAGS) $(LDLIBS)
! dlltest.exe: crypto++.dll $(DLLTESTOBJS)
! 	$(CXX) -o $@ $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcrypto++.dll $(LDFLAGS) $(LDLIBS)
  adhoc.cpp: adhoc.cpp.proto
  ifeq ($(wildcard adhoc.cpp),)

まぁこっちは好みの問題か。

CMakeでtexのビルド

CMakeでtexをビルドする方法が大体わかったからメモ書き。これを応用すれば、texに限らず好きにビルドできるかな。
CMakeLists.txt


SET(Document_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
SET(Document_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
ADD_CUSTOM_TARGET(DOCUMENT ALL echo DEPENDS ${Document_BINARY_DIR}/network.pdf)
ADD_CUSTOM_COMMAND(OUTPUT ${Document_BINARY_DIR}/network.pdf DEPENDS ${Document_SOURCE_DIR}/network.tex
	COMMAND platex ARGS ${Document_SOURCE_DIR}/network.tex
	COMMAND dvipdfmx ARGS ${Document_BINARY_DIR}/network.dvi
)

Document_BINARY_DIRとDocument_SOURCE_DIRは気分で変えてるだけだから割りとどうでもよくて。
ADD_CUSTOM_STAGETでビルドターゲットに「DOCUMENT」を追加し、Document_BINARY_DIR/network.pdfを完成バイナリに指定。
ADD_CUSTOM_COMMANDで出力をDocument_BINARY_DIR/network.pdfに、入力をDocument_SOURCE_DIR/network.texに指定。COMMANDでnetwork.texをビルドし、dviに続いてのCOMMANDでそれをpdfに変換。dviの出力先はDocument_BINARY_DIRになるので、そこだけ注意。
あとは、cmakeでMakefileを作って、make DOCUMENTでビルド。Document_BINARY_DIR/network.pdfができてた。

CMake導入中

Autotoolsのスクリプトを書くのが大変なので、CMakeを導入してみた。
とりあえず、boost::asioの練習ついでにhttpクライアントとTCPサーバーをCMakeでビルド。
単純にビルドするだけなら、
/CMakeLists.txt


CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(AsioTest)
#Boostディレクトリの設定
IF(WIN32 AND NOT UNIX)
	SET(BOOST_INCLUDEDIR C:/MinGW32/msys/1.0/local/include)
	SET(BOOST_LIBRARYDIR C:/MinGW32/msys/1.0/local/lib)
ELSE(WIN32 AND NOT UNIX)
ENDIF(WIN32 AND NOT UNIX)
#boost::systemの捜索
FIND_PACKAGE(Boost COMPONENTS system REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
#サブディレクトリの設定
ADD_SUBDIRECTORY(httpClient)
ADD_SUBDIRECTORY(server)

/httpClient/CMakeLists.txt


ADD_EXECUTABLE(http src/main.cpp)
TARGET_LINK_LIBRARIES(http ${Boost_LIBRARIES})
IF(WIN32 AND NOT UNIX)
#Windowsの場合は、winsock2とmswsockが必要
find_library(WS2_32_LIBRARY ws2_32)
TARGET_LINK_LIBRARIES(http ${WS2_32_LIBRARY})
find_library(MSWSOCK_LIBRARY mswsock)
TARGET_LINK_LIBRARIES(http ${MSWSOCK_LIBRARY})
ELSE(WIN32 AND NOT UNIX)
#Linux系はpthreadが必要
	find_library(PTHREAD_LIBRARY pthread)
	TARGET_LINK_LIBRARIES(http ${PTHREAD_LIBRARY})
endif(WIN32 AND NOT UNIX)

/server/CMakeLists.txt


ADD_EXECUTABLE(server src/main.cpp src/server.cpp src/user.cpp)
TARGET_LINK_LIBRARIES(server ${Boost_LIBRARIES})
IF(WIN32 AND NOT UNIX)
#Windowsの場合は、winsock2とmswsockが必要
	FIND_LIBRARY(WS2_32_LIBRARY ws2_32)
	TARGET_LINK_LIBRARIES(server ${WS2_32_LIBRARY})
	FIND_LIBRARY(MSWSOCK_LIBRARY mswsock)
	TARGET_LINK_LIBRARIES(server ${MSWSOCK_LIBRARY})
ELSE(WIN32 AND NOT UNIX)
#Linux系はpthreadが必要
	FIND_LIBRARY(PTHREAD_LIBRARY pthread)
	TARGET_LINK_LIBRARIES(server ${PTHREAD_LIBRARY})
ENDIF(WIN32 AND NOT UNIX)

これだけ。
boost::asioを要求するため、FIND_PACKAGEでパッケージ探したり、boost::asioが要求するライブラリがOSごとに違っているけど、そこはIFで分岐してFIND_LIBRARYで探してやればOK。
cygwinだけ何かしたい場合は、「IF (CYGWIN)~ENDIF(CYGWIN)」でいいっぽい。
設定次第ではインストーラーも作れるみたい。
こっちはちょっとややこしいけど、WindowsならNSISが、Linux系ならDEBが作れるらしい。
ビルドするときに、/buildを作って、cd。cmake ..ってやると、オブジェクトファイルもリンク済みバイナリも/build以下にできるから、

SET(CPACK_SOURCE_IGNORE_FILES  "/build/" "/.svn/" "/.deps/" "/.settings/" ".cproject" ".project")

でパック指定から外してやれば、make package-sourceでソースパッケージを作っても、余計なものが入らなくて便利。
公式のWin32バイナリは-Gで指定しないとVisual Studioのslnを出力しようとするから、MSYSでビルドしたければ、-G”MSYS Makefiles”がいるのに注意。
CMakeLists.txtを書くのなら、vimかEclipse + CMakeEdが便利。

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だとこのへん出ないんだけどなぁ…