2010-03-08

namespaceつきのPHP extensionをつくる

仕様についてはともかく、php 5.3 からnamespaceが使えるようになりました。
今のところPHPのソースに標準でついてるエクステンションでnamespaceを使っているものは無いようだったのでちょっと試してみました。


通常のnamespaceなしの場合との違いは一カ所だけです
zend_function_entry msgpack_functions[] = {
//    PHP_FE(hoge, NULL)  /* 通常の場合 */
    ZEND_NS_FE("myspace", hoge, NULL)
    {NULL, NULL, NULL}  /* Must be the last line in msgpack_functions[] */
};

PHP_FEの代わりにZEND_NS_FEを使うだけです。
他はそのままでOKです。

ソースファイル
PHP_FUNCTION(hoge)
{
    RETVAL_STRINGL("hoge", 5, 1);
}

ヘッダファイル
PHP_FUNCTION(hoge);


サンプル
<?php
print myspace\hoge();PHP_FUNCTION(hoge);

実行結果
$ php sample.php
hoge

ざっと見たところ、今のところエクステンションでクラスをnamespaceに入れるインターフェースは用意されてないようです。(自分でマクロを書けばできなくはなさそう)
また、一つのエクステンション内でnamespaceは複数つかえますが、namespaceが別でも同名の関数を定義するのは普通の方法では難しそうです。

2010-02-22

Protocol Buffersをビルド~リンクするメモ

Cの構造体のようなものをそのままシリアライズしたくなったのでProtocol Buffersを試してみようと思います。
http://code.google.com/intl/ja/apis/protocolbuffers/docs/overview.html

Protocol BuffersはまだDebianパッケージにはなってないようなのでソースからビルドします。
ソースは以下から
http://code.google.com/p/protobuf/downloads/list

とりあえず現在最新バージョンの2.3.0を落として普通にビルドしてみます。
wget http://protobuf.googlecode.com/files/protobuf-2.3.0.tar.gz
tar xzf protobuf-2.3.0.tar.gz
cd protobuf-2.3.0
./configure
make
make check
sudo make install

以上がうまくいっていれば、
protoc --version
でバージョンが表示されるはずですが、どうやらライブラリのリンクがうまくいかないようです。
% protoc --version
protoc: error while loading shared libraries: libprotobuf.so.6: cannot open shared object file: No such file or directory

ちなみに使用環境は、
% uname -a
Linux chameleon 2.6.26-2-amd64 #1 SMP Thu Feb 11 00:59:32 UTC 2010 x86_64 GNU/Linux

こんな時は、make install した時に表示される以下のようなメッセージ従ってリンク先のパスを設定します。
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

上の方法の他に/libにシンボリックリンクを張ったりでもたぶん大丈夫ですが、バイナリファイルにリンク情報を埋め込んでやる方が安全です。
(本来は/etc/ld.so.conf で設定されているはず。当環境では/usr/local/lib をみるようにすで設定されてたけど、なぜかリンクエラーになる。原因不明。)

リンク情報を埋め込むには、MakefileのLDFLAGSの行に以下のようにしてリンカオプションを渡してやります。
LDFLAGS = -Wl,-rpath,/usr/local/lib

ちなみに、Makefileは複数ありますが、編集するのは protobuf-2.3.0/src/Makefile だけでOKです。

LDFLAGSを設定したらsrc以下だけ再度ビルド、protobuf-2.3.0/src/.libs/ 以下に生成されているバイナリをobjdumpして正しいRPATHが入っていればOKです。
$ objdump -p .libs/protoc | grep RPATH
  RPATH       /usr/local/lib

再度インストールして、きちんとバージョンがでればOKです。
$ protoc --version
libprotoc 2.3.0

2010-02-21

Bloggerでfaviconとかを設定するメモ

なんとなくアイコンとかマスコットとか、見た目のイメージは重要だと思ったのでいろいろ変えてみました。

faviconの設定方法は旧Bloggerと現Bloggerによってテンプレートが違うのでやり方も異なるようです。
現Bloggerのテンプレートは単にheadタグの間においただけではデフォルトのアイコンに書き換えられてしまいます。

そこで、</b:skin> と </head> の間に

<link href="faviconのURL" rel="shortcut icon"></link>
<link href="faviconのURL" rel="icon"></link>

を書く必要があります。

faviconは下で探しました。
http://www.favicon.cc/?action=icon_list

ぴったりのアイコンとかマスコットを探すのはなかなか難しいですね。
とくにfaviconはあんまり凝ったのにするとなんか安っぽい感じになるし、根拠もなく文字ベースのアイコンを使っても結局なにをアピールしたいのかよく分からなくなってしまいます。


テンプレートはいろいろ試してみましたが、結局なるべくミニマルなのを探して自分でカスタマイズするのがベターという結論に達しました。
最初から完成しているテンプレートはカスタマイズがしにくいにので、いまいち愛着がわきづらいです。
ちなみにベースにしたテンプレートは以下から拾ってきました。
http://www.blogcrowds.com/resources/blogger-templates/

2010-02-20

Solarisで自動起動するプログラムを制御するメモ

KVMでSolarisが使えるようになったのはいいものの、X Windowが立ち上がっているとメモリの消費が激しくてもっさりした動作になってしまいます。
わざわざ仮想マシンでブラウザ使ったりすることもないので、X Windowはデフォルトで立ち上がってほしくありません。

Debianでは/etc/init.d/で制御できますが、SolarisではSMFという仕組みがあるようです。
http://sy2920.s151.xrea.com/solaris/smf.html

とりあえずsvcsコマンドでサービスの情報を見てみます。
$ svcs | head
STATE          STIME    FMRI
legacy_run      6:57:56 lrc:/etc/rc2_d/S20sysetup
legacy_run      6:57:57 lrc:/etc/rc2_d/S47pppd
legacy_run      6:57:57 lrc:/etc/rc2_d/S72autoinstall
legacy_run      6:57:57 lrc:/etc/rc2_d/S73cachefs_daemon
legacy_run      6:57:57 lrc:/etc/rc2_d/S81dodatadm_udaplt
legacy_run      6:57:57 lrc:/etc/rc2_d/S89PRESERVE
legacy_run      6:57:57 lrc:/etc/rc2_d/S98deallocate
disabled        6:55:22 svc:/system/xvm/ipagent:default
online          6:54:44 svc:/system/svc/restarter:default
 今回無効にしたいのはX Windowですが、親プロセスの名前が分からないのでpstreeをしてみます。
 |-+- 01059 root /usr/sbin/gdm-binary
 | \-+- 01060 root /usr/sbin/gdm-binary
 |   |--- 01081 root /usr/openwin/bin/fbconsole -n -d :0
 |   |--- 01061 root /usr/X11/bin/Xorg :0 -depth 24 -nolisten tcp -audit 0 -br
 |   \--- 01084 gdm /usr/lib/gdmgreeter
どうやらgdmなんとか、というサービスを殺せば良いようです。
$ svcs -l gdm
fmri         svc:/application/graphical-login/gdm:default
name         GNOME Display Manager
enabled      true
state        online
next_state   none
state_time   2010年02月20日 07時55分03秒
logfile      /var/svc/log/application-graphical-login-gdm:default.log
restarter    svc:/system/svc/restarter:default
contract_id  100
dependency   require_all/none svc:/system/filesystem/local (online)
dependency   require_all/error svc:/milestone/multi-user:default (online)
dependency   require_all/none svc:/milestone/sysconfig (online)
dependency   optional_all/none svc:/system/xvm/vnc-config (online)
dependency   require_all/none svc:/application/font/fc-cache (online)
dependency   require_all/none svc:/system/utmp (online)
dependency   require_all/none svc:/system/hal (online)
dependency   optional_all/none svc:/application/opengl/ogl-select (online)
dependency   optional_all/none svc:/application/desktop-cache/mime-types-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/desktop-mime-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/pixbuf-loaders-installer (online)
dependency   optional_all/none svc:/application/desktop-cache/icon-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/gconf-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/input-method-cache (online)


svcadmでgdmをdisableします。
$ sudo svcadm disable gdm

きれいにX Windowが死にました。
ちなみに使っているSolarisのバージョンではデフォルトでプロセス監視デーモンが起動しているみたいで、単にgdmをkillしただけでは、自動的に再起動がかかってしまいます。

ZenBackWidget