Hatena::ブログ(Diary)

Yet Another Hackadelic

2007-07-02 どう書く?

Data::ClearSilver::HDFにcspageコマンドつけた

といってもまだCPANには反映されてないと思いますが、一応cspageってコマンドを付けてみました。0.02から使えます。

機能としては、

  • HDFファイルの生成
  • HDFファイル化する際の文字列ダンプ
  • HDFファイルとCSファイルからレンダリング
  • 指定した変数群からCSファイルをレンダリング

と言う機能を付けました。これで気軽にClearSilverが楽しめるはず。

分かる人はピンと来ただろうけどTTにあるtpageコマンドの廉価版みたいな感じです。(ぉぃ

HDFファイルの生成

$ cspage --define name=zigorou --define url=http://d.hatena.ne.jp/ --output-hdf=test.hdf
$ cat test.hdf
url = http://d.hatena.ne.jp/
name = zigorou

HDFファイル化する際の文字列ダンプ

--output-hdfオプションを付けない場合は、ダンプになります。

$ cspage --define name=zigorou --define url=http://d.hatena.ne.jp/ 
url = http://d.hatena.ne.jp/
name = zigorou

HDFファイルとCSファイルからレンダリング

$ cspage --input-hdf test.hdf test.cs 
ZIGOROu

  bar is true

指定した変数群からCSファイルをレンダリング

$ cspage --define foo=amachang --define bar=0 test.cs 
amachang

まとめ

ここまで作っといてなんだけど、実際にClearSilver使うかどうかはまだ決めてないです。

用途によりけりかなーと。

試しにってのは全然ありかなとは思ってますし、

何より色んな言語で使えるテンプレートってのはいいかなーと思ってたりします。

あと、可能な限りフレームワークとの結合を排す事が出来たら、

すなわち渡す変数に依存性を出来る限り設けないようにしたら、

異なる言語間でも同様のテンプレートファイルが使えるかもなとか思ってたりします。

これはやはり記法もシンプルで出来る事が限られていると言う所がこの場合はメリットにもなるんだと思います。

2007-06-29

Data::ClearSilver::HDFをリリース

昨日の夜にリリースしました。

ちと手抜きしちゃったのでPODが適当*1なんですが、とりあえず使い方としては、

use strict;
use warnings;

use ClearSilver;
use Data::ClearSilver::HDF;

my ClearSilver::HDF $hdf = Data::ClearSilver::HDF->hdf({
  foo => 1,
  bar => ["a".."g"],
  baz => {
    "x" => "aaa",
    "y" => "bbb",
    "z" => "ccc"
  }
});

my ClearSilver::CS $cs = ClearSilver::CS->new($hdf);

のように使います。

またどこか高速化を計りたい準staticなページがあるとして、ベタな記述してて外部HDFを作りたい際なども、

Perlのデータ形式でそのままドーンと行けるので、まぁそれなりに使い道あるかなと。

hdf_dump()メソッドに関しては内部で一時ファイルを作ると言う手抜き*2っぷりなので、

まぁまずClearSilverのAPIを考えるとテスト以外に使う事は無いと思うんですが、

実運用するような際にはお気をつけ下さい。

*1:毎度ですけどw

*2:ClearSilver::HDFはオブジェクトからHDFの文字表現を直接取り出せない。

2007-06-27 今日食べた餃子が激しく不味かった件

ClearSilverのPerlバインディングのインストール

ClearSilverは超高速なテンプレートエンジンです。

どのくらい速いかと言えば、id:spritlooseさんがベンチマーク(d:id:spiritloose:20060812)を取ってますので、参考にして下さい。

今日そのPerlバインディングをインストールする際にハマったのでメモ。

configure

--prefixオプションが結構曲者です。

# ./configure --prefix=/usr --disable-apache --disable-java --disable-csharp --enable-gettext

のように、

  • apache, java, csharpは除外
  • gettextによる国際化対応は有効

と言う感じでconfigureすると、Makefileのinstallターゲットは、

install: all
        ./mkinstalldirs $(DESTDIR)$(cs_includedir)
        ./mkinstalldirs $(DESTDIR)$(bindir)
        ./mkinstalldirs $(DESTDIR)$(libdir)
        ./mkinstalldirs $(DESTDIR)$(mandir)/man3
        $(INSTALL) -m 644 ClearSilver.h $(DESTDIR)$(cs_includedir)/
        $(INSTALL) -m 644 cs_config.h $(DESTDIR)$(cs_includedir)/
        $(INSTALL) -m 644 man/man3/*.3 $(DESTDIR)$(mandir)/man3/
        @for mdir in $(SUBDIRS); do \
          if test -d $$mdir; then \
            if test -f $$mdir/Makefile.PL -a ! -f $$mdir/Makefile; then \
              cd $$mdir; $(PERL) Makefile.PL PREFIX=$(prefix); cd ..; \
            fi; \
            $(MAKE) -C $$mdir PREFIX=$(prefix) install; \
          fi; \
        done

となります。

良く見てみるとSUBDIRSのループ内でMakefile.PLを叩くんですが、PREFIXをconfigureで指定した値を使います。

ExtUtils::MakeMaker - PREFIX and LIB attributeを見るとPREFIXはそこをベースディレクトリとして、モジュールのインストールを行ってしまいますので、@INCで読める場所に行かない可能性があります。

少なくとも何も --prefix を指定しないと /usr/local がPREFIXになるので、/usr/local/lib/perl5 みたいなディレクトリ下にモジュールがインストールされると言う悲しいオチが待ってます。

prefixを指定するかconfigureの後にMakefileを直接編集するなりしないと駄目っす。

追記:マカ−の場合

Makefile中のPREFIXを消すのが吉だと思います。