MTエンジニアブログ
onagatani
2011年07月11日
最近の土日は家族サービスに勤しんでいるonagataniです。
ちなみに土曜日は一人でバイクに乗り富良野にいってきましたが、なんとなんと会社の新人さんのお友達が北の国からの「草太兄ちゃん」の牧場としてドラマで使われていたそうでして、北の国からファンとしてはびっくりした次第です。
ということで土日でCentOS6.0をVMwareESXiにいれてみました。
導入方法ですが、ftp.riken.jpのCentOS-6.0-i386-netinstall.isoを使用しました。
ESXiの新規OSにてCentOS6.0がなかったのでRHELの6でやってみましたが、CentOSの5でも変わらんでしょうきっと(適当です)。
新規インストール時は、ESXiにてマウントしたISOイメージにて起動されないのでBIOSにてBootメディアの優先度にてCDを一番上にもってくる必要があります。
起動した後は新規にインストールを開始します。今回はnetinstallを選択しているのでNICの設定(DHCPでやりました)を行いOSイメージのURLを指定するとインストールが開始されます。URLはこちらです「http://ftp.riken.jp/Linux/centos/6.0/os/i386/images/install.img」
6.0になると色々と変わっていまして例えば、MySQLが5.1、PHPは5.3、Perlは5.10.1になっています。
MySQLがやっと5.1なのでQ4Mとかgroongaとかやっと使えるようになりました(試してないですが)。
PHPも5.3なのでMovableTypeのDPも安心ですね。
Perlは、、、もう少しバージョン上げてくれていると助かるのですが微妙です。
ちなみにインストール自体は特にはまりませんでしたが、yumがまだ使えないのでここを参考にDVDのイメージをマウントしてyumを使用しています。
まだそんなにいじっているわけではないので、もう少し使用してからレポート上げたいと思います。
谷内
2011年06月14日
谷内@帯広です。
先週の土曜日、札幌でオープンソースカンファレンスが開催されました。
私も Hokkaido.pm という perl 言語の団体の一員として参加し、セミナー講師を務めてきました。
WEB越しにガンガン実行される重たいタスクを、高速に処理し、かつリソースを食い潰されないようにするにはどのようなアーキテクチャにすればよいのかというテーマでお話してきました。
つまり、本来バッチ処理で実行されるべき重いタスクを、リアルタイム処理するには?という内容です。
今回は perl と非同期WEBサーバーを組合せた設計と実装を紹介しました。
・perl
・非同期WEBサーバー (PSGI/Plack + Twiggy)
・非同期WEBアプリケーションフレームワーク(Tatsumaki)
・ジョブキューサーバ(gearman)
・非同期IO(AnyEvent、AnyEvent::Gearman、WebService::Async、AnyEvent::FlashSocketPolicy)
・ストリーミング(Flash/XMLSocket、JavaScript/long-polling、multipart/mixed)
サーバーについてはソースレベルで内部の挙動を追い、ジョブキューに関してはプロトコルを理解して nc コマンドで直に叩いてみるなど、デモを交えて説明しました。また、単純な prefork/cgiのデモも行い、同期方式の何が問題になるのかを理解できるように努めました。
DBの非同期接続やAIOも以前は仕事で使っていたので、いずれは取り上げてみたいと思います。
最後に例として架空のWEBサービスの要件を定義し、その実装例を解説したのですが、バッチ処理がインタラクティブな操作で起動してしまうという実例が身近にありました。MovableType ですね。
MovableTypeをFastCGI起動させると、1プロセスあたり70メガ近くメモリを消費します。また、再構築ではたくさんのCPUリソースを、長時間に渡って消費し続けます。
プロセス数が増えず、バッチを分散処理できる非同期アーキテクチャをうまく利用すれば、大きな恩恵を受けることができるはずなのですが、現在のMTの設計上、非同期に対応させるのはどうやら非常に困難なようです。
しかし再構築を速くしたいという要望が強い中、メニーコアのCPUやクラウドを持っていても活かせないというのは、とてももったいない話ですので、近い将来チャレンジしてみたいと思います。
onagatani
2011年06月09日
みなさんこんにちわ。
あんまりコード書いていないながたにです(ぇ
今週末のOSCですが、弊社からも@keroyonnさんと@onagatani(おいら)の2名でHokkaido.pmの展示と@keroyonnさんの発表で参加します!
今回は@charsbarさんのご好意によりHokkaido.pm#4にて使用したMojolicious::Liteを使ってみようのテキストを配布します!なんと限定50部なのでお早めにどうぞ!内容としては#4のテキストをさらにブラッシュアップした非常に勉強になるテキストです!
http://www.ospn.jp/osc2011-do/
そして、Hokkaido.pm#5ですが記念すべき5回目は前回に引き続きJPA様の支援により@nekokakさんをゲストにお迎えします!
順調に参加者数も伸びており大体40名前後の参加と非常に好調ですが、今回も42名の部屋なのでatndできましたら速攻で参加必須ですよ!
あと、発表した人いましたら@onagataniまで連絡ください!
http://hokkaido.pm.org/
ぴろり上西
2011年06月02日
弊社で公開中の人気プラグイン PageBute を用いると、長くなりがちなリストアーカイブなどを、指定した記事数ごとに複数ページに分割することができます。一般的には、記事一覧などのリスト系ページを見やすい単位に分割する目的で使われることが多いと思いますが、使い方によっては、例えばこの例のように、
一つの長いブログ記事を複数のページに分割することにも利用できます。このエントリでは、PageBute プラグインを使って、一つのブログ記事をページングする方法を紹介します。
方法 1. mteval モディファイヤを用いる方法
ブログ記事の個別アーカイブのテンプレートにおいて、ブログ記事の本文/追記を出力する部分のテンプレートタグを以下のように記述します。
<MTPageContents count="1">
<$mt:EntryBody mteval="1"$><$MTPageSeparator$>
</MTPageContents>
次に、ブログ記事の本文/追記中で、改ページを行いたい場所に <$MTPageSeparator$> テンプレートタグを直接記述します。個別アーカイブのテンプレートにおいて mteval モディファイヤを指定しているので、ブログ記事中の <$MTPageSeparator$> タグがページの区切りとして処理され、一つのブログ記事が複数のページに分割されて生成されます。もし、<$MTPageSeparator$> を一つも記述しなければ、従来どおりに一つのブログ記事は一つのページとして生成されます。長いブログ記事では適当な長さでページ分割を行い、短いブログ記事ではページ分割を行わない、といった調整が自由に行えます。
この段落が 1 ページ目になります。
<$MTPageSeparator$>
この段落は 2 ページ目になります。
方法 2. mteval モディファイヤを用いない方法
ブログ記事中にテンプレートタグが書いてあったり、テンプレートタグが無条件に実行されるのはちょっと不安など、なんらかの理由で mteval モディファイヤを使えない場合、ブログ記事の個別アーカイブのテンプレートにおいて、ブログ記事の本文/追記を出力する部分のテンプレートタグを以下のように記述します。
<MTPageContents count="1">
<$mt:EntryBody$><$MTPageSeparator$>
</MTPageContents>
テンプレートはほぼ同じですが、ブログ記事の本文/追記中で、改ページを行いたい場所には、先ほどのテンプレートタグの替わりに<!-- Separator for PageBute --> と記述することで同じ動作が可能です。
この段落が 1 ページ目になります。
<!-- Separator for PageBute -->
この段落は 2 ページ目になります。
この方法はブログ記事以外にもウェブページなどでも応用が可能です。
ぴろり上西
2011年05月28日
Facebook 上の MT 関連コミュニティで次のような質問がありました。
<MTSetVarBlock name="folder-label">美しい日本語</MTSetVarBlock>
<MTSetVarBlock name="page-title">美しい日本語</MTSetVarBlock>
folder-label: <$MTGetVar name="folder-label"$>
page-title: <$MTGetVar name="page-title"$>
<MTIf name="folder-label" eq="$page-title">TRUE<MTElse>FALSE</MTIf>
上記のようなテンプレートで変数比較が期待した動作にならない、というものです。質問された方は、変数値に日本語文字列が含まれていることが原因であると考えていらっしゃるようでしたが、これについて調べてみました。
結論から言うと、変数値が日本語文字列であることとは関係なく、変数名が理由で期待した動作が行われていないことがその理由です。具体的には 5 行目の MTIf に渡されている like 引数が正しく変数展開されていないのです。
確認のために 3 行目と 4 行目で変数にセットされた内容を出力していますが、ここではどちらも同じ値を出力します。しかし、その次の MTIf では、文字列比較に失敗します。
理由は次の通りです。テンプレートタグのオプション値に $ から始まる文字列を指定すると、それを変数として解釈し、その変数の値が実際のオプション値として渡されます。この時、オプション値に渡された文字列をそのまま即値として解釈するか、変数として解釈するかの判定条件に原因があります。
その判定を行っている処理は /lib/MT/Builder.pm の build 関数内にあり、オプション値が次の条件を満たす場合には変数として値が展開されます。
- 1 文字目が $ で始まること
- 2 文字目は英字またはアンダーバー(_)であること
- 3 文字目以降がある場合、全て英数字またはアンダーバー(_)またはピリオドであること
上記の条件を満たさない場合、渡された文字列は変数として解釈されず、そのままの値として渡されます。先のテンプレートでは、page-title という変数に使われているハイフン(-)が理由で、変数名として解釈されず変数が展開されなかったのでした。そのため、次のテンプレートは奇妙にも TRUE を返します。
<MTSetVarBlock name="folder-label">$page-title</MTSetVarBlock>
folder-label: <MTGetVar name="folder-label">
<MTIf name="folder-label" eq="$page-title">TRUE<MTElse>FALSE</MTIf>
Facebook コミュニティであった質問の答えは「変数名にハイフンが含まれていて、期待した変数展開が行われていなかったため」ということで決着するのですが、変数名に関しては続きがあります。
引数に渡された文字列が変数展開されるか否かの条件は先述の通りですが、引数の変数展開を考えないのであれば、変数名には全くの制限がありません。これは一般的なプログラミング言語では考えられないことです。例えば、次のようなテンプレートでも正しく動作してしまいます。
# 数字の変数名
<MTSetVar name="1" value="TEST STRING">
<MTGetVar name="1"> → TEST STRING
# 記号の変数名
<MTSetVar name="!#$%&'()-=^~" value="TEST STRING">
<MTGetVar name="!#$%&'()-=^~"> → TEST STRING
# 空白の変数名
# 空白の数の違いで別の変数扱いになる!
<MTSetVar name=" " value="TEST STRING">
<MTGetVar name=" ">
<MTGetVar name=" ">
<MTGetVar name=" "> → TEST STRING
# 空白を含む変数名
# "abc" と " abc " は別変数扱いになる!
<MTSetVar name=" abc " value="TEST STRING">
<MTGetVar name="abc">
<MTGetVar name=" abc "> → TEST STRING
# でも英字の大文字小文字は区別しないという...
<MTGetVar name=" aBc "> → TEST STRING
MT 変数名は、プログラム内部でハッシュ変数のキー文字列として使われていて、実際のところMT で指定できないようなどんな値でもキー名=変数名に使うことができます。
まとめ
MT で使える変数名について
- 一般的なプログラミング言語にあるような変数の命名規則は存在しない
- 数字、記号、空白などのあらゆる文字を任意の順列で使用できる
- 空白も文字として扱われるので、"abc" と " abc " は別変数になる
- テンプレートタグなどの引数に $ から始まる文字列を指定すると変数展開されるが、その時、変数として解釈されるためには変数名に条件がある
- なので、あまり変態的な変数名を用いず、英数字から成る平凡な変数名にしておくと、変な仕様に悩まされずに済む