PureBuilder Simply 1.4 リリース
有用なユーティリティコード
- TOP
- Old Archives
- PureBuilder Simply 1.4 リリース
PureBuilder Simplyの1.4をリリースした。
特に大きな変更点は以下の通りだ。
- HTML生成前に処理できるPre Pluginsに対応した
- Pre Plugins/Post Pluginsで環境変数から文書メタデータにアクセスできるようになった
Pre PluginsはPandocにかける前のドキュメントを加工するものである。
Markdownと比べReSTは自由度が低いこと、それぞれのドキュメントフォーマットに基づいて処理しなければならないことから、新たに_docformat
というメタ値が追加された。
今回のポイントはPre Pluginsであり、メタデータを渡す仕様は反映していなかっただけで、実は1.2時代からあった。
Pre Pluginsはおもしろいこと書いていないので、どちらかといえばメタデータ渡しの話をしよう。
IO.popen({"pbsimply_doc_frontmatter" => YAML.dump(frontmatter)}, ["perl", [".pre_generate", script_file].join("/"), procdoc]) do |io|
= io.read
pre_script_result end
これはPre Plugionsの一部である。
IO.popen
はコマンド群の前に環境変数を置くことができる。
シェル的にいうと
(
export LC_ALL=C
exec date
)
みたいなことだ。
もちろん、同じような手法はRubyでも使えるけれど、ちょっとめんどくさい。IO.popen
の利便性は簡便に損なわれてしまう。
かゆいところに手の続くRubyは、ちゃんとそのプロセス用に環境変数を渡す方法を用意してくれているわけだ。
IO.popen({"LC_ALL" => "C"}, ["date"]) {|io| ... }
予め環境変数にセットするのと何が違うのか。
まず、自身の環境変数としてセットすると、メモリーを2個分使う。
また、環境変数がそのプログラム自身の制御に影響するケースでは問題が生じる。
さらに、何度もプロセスを起動するたびにセットしてしまうと、ガベージコレクションの問題が出る可能性がある。
結局、子プロセスに対して伝播したいだけの環境変数はこのプロセスに対してのみセットするのが適切、ということになる。 シェルにおいても
export LC_ALL=C
date
ではなく、
(
export LC_ALL=C
exec date
)
あるいは
LC_ALL=C date
とすべきである。