狠狠撸
Submit Search
MTDDC Hokkaido : テンプレートタグで叠谤补颈苍蹿*肠办を作ってみた
?
2 likes
?
1,466 views
Katsuhiro Endo
Follow
MTDDC Hokkaido(2010/12/18)でライトニングトークした時のスライドです。
Read less
Read more
1 of 39
Download now
Download to read offline
More Related Content
MTDDC Hokkaido : テンプレートタグで叠谤补颈苍蹿*肠办を作ってみた
1.
テンプレートタグで叠谤补颈苍蹿*肠办を
作ってみた MTDDC Hokkaido 2010/12/18 えんどうかつひろ
2.
自己紹介 ●
えんどうかつひろ ● @ka2hiro ● フリーランスのプログラマ ● MT歴 ● 4年ほど(2006年頃から) ● プラグイン書いたり、MTベースのWeb App書いた り ● 好きなテンプレートタグ ● mt:setVarTemplate と mt:date
3.
今日お話すること ●
叠谤补颈苍蹿*肠办を书いていて、はまったこと
4.
きっかけ? ●
単なる思いつき ● テンプレートタグって、プログラミング言語だ よね。 ● 変数あるし ● 四則演算できるし ● 条件分岐できるし ● ループもできるし ● 配列もハッシュもあるし
5.
それに... ●
MT、テンプレートタグ、Brainfuckで、軽くぐ ぐってみたけど、全然ヒットしない。 ● ってことは、これは...
7.
ということで Brainf*ckのインタープリタを
书いてみた。
8.
ところで叠谤补颈苍蹿*肠办って何?
9.
“Brainfuck(ブレインファック)は 難解プログラミング言語のひとつ。
なお名称に卑語が含まれるた め、Brainf*ckなどと表記されるこ とがある。” wikipediaより
10.
使える命令はこの↓8文字 ><+-.,[]
だけ。
11.
例
12.
+++++++++[>++++++++>++++ +++++++>+++++<<<-]>.>++.
+++++++..++ +.>-.------------.<+++++ +++.--------.++ +.------.--------.>+.
13.
これを実行すると
14.
Hello World!
15.
と表示するプログラミング言语。
16.
で、書いてみたら、書けた。 でも、けっこうはまった。
17.
ここからが今日の本题。
18.
はまったその1 文字列中の任意の場所から1文字
だけ読み込む。
19.
<mt:setvarblock name=”hoge”> The quick
brown fox jumps over the lazy... </mt:setvarblock> ”Q”を表示するのに、 <mt:var name=”hoge” substr=”4,1” setvar=”c”/> と書けると思っていたら、 substrモディファイア なんてなかった。
20.
仕方がないので、困った时の
「正规表现」 にお願いしてみた。
21.
正规表现
/(?:.{<mt:var name="pos" />})(.)(?:.*)/ ● posは、取得したい文字の位置(最初の文字は0番目) ● 1つ目のかっこは読み飛ばす部分 ● 2つ目のかっこが取得したい文字 ● 3つ目のかっこは残りの文字(必要ないかも) ● posが3の場合、/(?:.{3})(.)(?:.*)/ となる ● $1で1文字取得できる
22.
まとめるとこうなる。 <mt:setvartemplate name="getchar"> <mt:setvarblock name="pattern"> /(?:.{<mt:var
name="pos" />})(.)(?:.*)/ </mt:setvarblock> <mt:var name="code" regex_replace="$pattern","1" setvar="c"/> </mt:setvartemplate>
23.
これで1文字ずつ 読み込めるようになった。
24.
はまったその2 無限ループを作れない。
25.
&濒迟;尘迟:濒辞辞辫&驳迟;は、配列の要素をたど
ることしかできないし、 <mt:for>はto=”N”で指定した回 数しかループできないし、 どうしよう...
26.
ちょっとかっこ悪いけど、 <mt:for var=”i” from=”0”
to=”1000”> 大きめの数値を終了条件にして、 ごまかした。
27.
はまったその3 ループから脱出できない!
28.
<mt:for var=”i” from=”0”
to=”1000”> <mt:if name=”i” eq=”5”> <mt:setvar name=”i” value=”1000” /> ループ変数に終了条件を満たす値を 設定しても脱出できない! </mt:if> </mt:for>
29.
どうやらループ内では、 ループ変数の参照はできるが、 変更は反映されないようだ。
30.
仕方がないので、 <mt:for var=”i” from=”0”
to=”1000”> <mt:if name=”done” ne=”1”> 必要な処理を実施し、 終了条件を満たしたらdoneに1をセット </mt:if> </mt:for> とした。でもこれだと...
31.
10回目で终了条件を満たすと、
残り990回は、 無駄に空回り。┐(?-`)┌
32.
はまったその4 完成したテンプレートを
編集画面に貼付け、 プレビューしても真っ白け。
33.
テンプレートのコンパイル结果を
dumpして見ると、 <mt:elseif name=”c” eq=”>”> どうもこのあたりから変。 意図しない所でタグが閉じたり、 開いたり...
34.
あっ、 > と <
は使えないのか。
35.
ということで、8つの命令のうち、
>を#に <を*に に置換えた。
36.
もっと早く気付けよ>自分
37.
まとめ ●
いろいろあったけど、なんとかなったし、けっ こう楽しめた。 ● みなさんもぜひ挑戦してみてください。 ● 今回書いたテンプレートは、githubにありま す。 ● http://github.com/ka2hiro/brainfuck ● 次回はマンデルブロー集合の予定です(笑)
38.
おまけ ●
無限ループ/ループ脱出不可が悔しかったの で、WhileTagというプラグインを书いてみた。 ● http://github.com/ka2hiro/WhileTag ● <mt:if>と同じ構文のブロックタグ ● <mt:while name=”done” ne=”1”> </mt:while> ● ループ内からループ変数を操作可能
39.
ご清聴ありがとうございました。
Download