PHP拡張勉強会 - events.php.gr.jp行ってきましたよ

最近イベントレポばっかのような気がする。まあいいや、行ってきたんですよ。


まず行く前に2008-01-19 - おぎろぐExtended - PHP拡張勉強会で予習。CodeGen_PECLhoge.soを作って組み込めるところまでやってから行きました。この準備は割と手間取ったので先にやっておいてよかったです。PHP処理系をソースコードからコンパイルして準備してたりしたからですけど。


で当日会場のサイボウズラボに着いてちょっとびっくりした。id:amachangやらid:nishiohirokazuが普通に仕事してるスペースの一角を占拠して勉強会。なんつーか、サイボウズラボっておもしろい会社だ。


でまあ勉強会でやったことはPHP拡張勉強会 - events.php.gr.jpPHP拡張勉強会とかから辿っていけば見つかるまともな方々の手によるレポートを読めばわかるんですけど、CodeGen_PECLことはじめ、みたいな感じ。
なんかしばらくは予習した範囲の解説をやってる雰囲気だったので、俺はGauchePHP拡張に組み込もうと遊んだりしてました。


Gaucheは公式のトップページに

リスト処理ライブラリとして他のC/C++プログラムから簡単にリンク可能であること

に書いてある通り、C言語との連携がやりやすい処理系です。そういった用途のため、libgaucheというインターフェースが整えられています。
でも実際に使ったことは無かったんで、まずはGet Healthy. Stay Healthy. Fitness for Life!を参考にテスト。

#include <gauche.h>
int main(int argc, char **argv)
{
  ScmObj *env;
  Scm_Init(GAUCHE_SIGNATURE);

  env = Scm_MakeModule(NULL, FALSE);
  Scm_EvalCString("(print (+ 1 2 3))", env);
  return 0;
}

で、コンパイル実行。

% gcc -I/usr/lib/gauche/0.8.12/include libgauchetest.c -lgauche
libgauchetest.c: In function ‘main’:
libgauchetest.c:7: warning: assignment from incompatible pointer type
% ./a.out
6

なんかできてますね! -I/usr/ほにゃららはDebianのパッケージから入れるとそんなとこに入ってました。


準備できましたね。じゃあPHP拡張からSchemeプログラムをevalできるようにしましょう。では以下のように適当にCodeGen_PECL使って雛形づくり。

<?xml version="1.0" ?>
<extension name="scm">
  <function name="scm_eval">
    <proto>void scm_eval(string code)</proto>
    <code>
      Scm_Init(GAUCHE_SIGNATURE);
      Scm_EvalCString(code, Scm_MakeModule(NULL, FALSE));
    </code>
  </function>
</extension>

上が雛形つくるにあたっての設定用のXMLファイル。今回はコードもこっちに書いちゃいます。なんとなくわかると思いますが、PHPにscm_evalなるSchemeをevalする関数を追加します。毎回Scm_Init呼んでるじゃんとかはまあとりあえず気にしない方向性で。普通に駄目だと思うけど。で

% pecl-gen scm.xml
% cd scm
% phpize
% ./configure

これでだいたいmake環境できあがる。それでscm.cに

#include <gauche.h>

の一文を。MakefileのCFLAGSに-lgauche、INCLUDESに-I/usr/lib/gauche/0.8.12/includeを追加。

% make
% sudo make install

これでおっけー。実行結果は以下。

% cat >test.php
<?php
scm_eval("(print (+ 1 2 3))");
?>
% php -dextension=scm.so test.php
6
zsh: segmentation fault  php -dextension=scm.so test.php

なんか"6\n"は出力してるけどSEGFAULT!

継続調査ひつよう。

*

懇親会

超楽しかった。

  • 財布見たらお金無かったので帰ろうと思ったけど、最近やたら高い頻度で会ってる@suztomoがお金貸してくれるというので参加。
  • お仕事でPHPとよろしくやってたりする話を聞いたり話したり。「Smartyってなんつーか、分をわきまえてないような気がするんですよ。言ってみれば『それなんてPHP?』みたいな」みたいな言葉を吐いた気がする。
  • id:amachang的「モナドってなんぞ?」話を聞いてid:tasukuchan、suztomo、とかがつっこんだりつっこまれたり俺もなんかグデングデンになりながら茶々を入れたり。あとLL(1)やらLR(1)、LALR(1)とかそういう単語が飛び交う会話とかをしていた。
  • たのっしそうだなあああ! Haskell Hackathon
  • amachangに超感謝なことあった。なんか俺「この礼はコードで返します」とか口ばしってた気がする。身体で返しますとか言わんでよかったね。
  • 鶏肉メインの鍋だったんだけど、最後に御飯入れてできた雑炊が超うまかった。
  • 久しぶりに全く気持ち悪くならずうまいこと気持ち良く酔えたし楽しかったので、終電という概念を完全に忘れていた。新宿のbagusで夜を過ごす。なんかあとまあずっと漫画読んでた。

test