SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
テンプレートタグでBrainf*ckを
     作ってみた


     MTDDC Hokkaido

       2010/12/18

     えんどうかつひろ
自己紹介
●
    えんどうかつひろ
    ●
        @ka2hiro
●
    フリーランスのプログラマ
●
    MT歴
    ●
        4年ほど(2006年頃から)
    ●
        プラグイン書いたり、MTベースのWeb App書いた
        り
●
    好きなテンプレートタグ
    ●
        mt:setVarTemplate と mt:date
今日お話すること
●
    Brainf*ckを書いていて、はまったこと
きっかけ?
●
    単なる思いつき
●
    テンプレートタグって、プログラミング言語だ
    よね。
    ●
      変数あるし
    ●
      四則演算できるし
    ●
      条件分岐できるし
    ●
      ループもできるし
    ●
      配列もハッシュもあるし
それに...
●
    MT、テンプレートタグ、Brainfuckで、軽くぐ
    ぐってみたけど、全然ヒットしない。
●
    ってことは、これは...
ということで

Brainf*ckのインタープリタを

    書いてみた。
ところでBrainf*ckって何?
“Brainfuck(ブレインファック)は
難解プログラミング言語のひとつ。
   なお名称に卑語が含まれるた
 め、Brainf*ckなどと表記されるこ
          とがある。”
                wikipediaより
使える命令はこの↓8文字


 ><+-.,[]
    だけ。
例
+++++++++[>++++++++>++++
+++++++>+++++<<<-]>.>++.
       +++++++..++
+.>-.------------.<+++++
     +++.--------.++
  +.------.--------.>+.
これを実行すると
Hello World!
と表示するプログラミング言語。
で、書いてみたら、書けた。

でも、けっこうはまった。
ここからが今日の本題。
はまったその1

文字列中の任意の場所から1文字
    だけ読み込む。
<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モディファイア
        なんてなかった。
仕方がないので、困った時の

   「正規表現」

  にお願いしてみた。
正規表現
    /(?:.{<mt:var name="pos" />})(.)(?:.*)/

●
    posは、取得したい文字の位置(最初の文字は0番目)
●
    1つ目のかっこは読み飛ばす部分
●
    2つ目のかっこが取得したい文字
●
    3つ目のかっこは残りの文字(必要ないかも)
●   posが3の場合、/(?:.{3})(.)(?:.*)/ となる
●
    $1で1文字取得できる
まとめるとこうなる。
<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>
これで1文字ずつ
読み込めるようになった。
はまったその2

無限ループを作れない。
<mt:loop>は、配列の要素をたど
    ることしかできないし、

<mt:for>はto=”N”で指定した回
   数しかループできないし、

      どうしよう...
ちょっとかっこ悪いけど、
<mt:for var=”i” from=”0” to=”1000”>

大きめの数値を終了条件にして、
    ごまかした。
はまったその3

ループから脱出できない!
<mt:for var=”i” from=”0” to=”1000”>
  <mt:if name=”i” eq=”5”>
  <mt:setvar name=”i” value=”1000” />
    ループ変数に終了条件を満たす値を
    設定しても脱出できない!
  </mt:if>
</mt:for>
どうやらループ内では、
ループ変数の参照はできるが、
変更は反映されないようだ。
仕方がないので、
<mt:for var=”i” from=”0” to=”1000”>
    <mt:if name=”done” ne=”1”>
     必要な処理を実施し、
     終了条件を満たしたらdoneに1をセット
    </mt:if>
</mt:for>

      とした。でもこれだと...
10回目で終了条件を満たすと、

   残り990回は、

 無駄に空回り。┐(´-`)┌
はまったその4

 完成したテンプレートを
  編集画面に貼付け、
プレビューしても真っ白け。
テンプレートのコンパイル結果を
   dumpして見ると、
<mt:elseif name=”c” eq=”>”>

  どうもこのあたりから変。

意図しない所でタグが閉じたり、
     開いたり...
あっ、
> と < は使えないのか。
ということで、8つの命令のうち、

     >を#に
     <を*に

    に置換えた。
もっと早く気付けよ>自分
まとめ
●
    いろいろあったけど、なんとかなったし、けっ
    こう楽しめた。
●
    みなさんもぜひ挑戦してみてください。
●
    今回書いたテンプレートは、githubにありま
    す。
    ●
        http://github.com/ka2hiro/brainfuck
●
    次回はマンデルブロー集合の予定です(笑)
おまけ
●
    無限ループ/ループ脱出不可が悔しかったの
    で、WhileTagというプラグインを書いてみた。
    ●
        http://github.com/ka2hiro/WhileTag
●
    <mt:if>と同じ構文のブロックタグ
    ●   <mt:while name=”done” ne=”1”>
        </mt:while>
●
    ループ内からループ変数を操作可能
ご清聴ありがとうございました。

Weitere ähnliche Inhalte

Was ist angesagt?

マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージマスター・オブ・Reflectパッケージ
マスター・オブ・ReflectパッケージTakuya Ueda
 
インタフェースの実装パターン
インタフェースの実装パターンインタフェースの実装パターン
インタフェースの実装パターンTakuya Ueda
 
MarkdownをBacklogのwikiに変換するPWA
MarkdownをBacklogのwikiに変換するPWAMarkdownをBacklogのwikiに変換するPWA
MarkdownをBacklogのwikiに変換するPWAYuhei FUJITA
 
今日からはじめるHTML5 ver.2012
今日からはじめるHTML5 ver.2012今日からはじめるHTML5 ver.2012
今日からはじめるHTML5 ver.2012Yasuhito Yabe
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章Tomonobu_Hirano
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Takuya Ueda
 
ユニットテスト 1日目
ユニットテスト 1日目ユニットテスト 1日目
ユニットテスト 1日目Yoshiki Shibukawa
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
C++でぼくが忘れがちなこと
C++でぼくが忘れがちなことC++でぼくが忘れがちなこと
C++でぼくが忘れがちなことToshihiko Ando
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGoTakuya Ueda
 
ふるたに流プログラミング学習法
ふるたに流プログラミング学習法ふるたに流プログラミング学習法
ふるたに流プログラミング学習法Kazuma Furutani
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうEsehara Shigeo
 
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語Takuya Ueda
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章Haruki Eguchi
 

Was ist angesagt? (16)

マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージマスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
 
インタフェースの実装パターン
インタフェースの実装パターンインタフェースの実装パターン
インタフェースの実装パターン
 
MarkdownをBacklogのwikiに変換するPWA
MarkdownをBacklogのwikiに変換するPWAMarkdownをBacklogのwikiに変換するPWA
MarkdownをBacklogのwikiに変換するPWA
 
今日からはじめるHTML5 ver.2012
今日からはじめるHTML5 ver.2012今日からはじめるHTML5 ver.2012
今日からはじめるHTML5 ver.2012
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
 
ユニットテスト 1日目
ユニットテスト 1日目ユニットテスト 1日目
ユニットテスト 1日目
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
C++でぼくが忘れがちなこと
C++でぼくが忘れがちなことC++でぼくが忘れがちなこと
C++でぼくが忘れがちなこと
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGo
 
ふるたに流プログラミング学習法
ふるたに流プログラミング学習法ふるたに流プログラミング学習法
ふるたに流プログラミング学習法
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろう
 
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章
 

Andere mochten auch

Learn you a Brainfuck for great good!
Learn you a Brainfuck for great good!Learn you a Brainfuck for great good!
Learn you a Brainfuck for great good!Antoine Leblanc
 
Functional Pearl + Brainfuck
Functional Pearl + BrainfuckFunctional Pearl + Brainfuck
Functional Pearl + BrainfuckEita Sugimoto
 
brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料Michihito Shigemura
 
Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307Xatierlike Lee
 
Rubyで作る奇妙なプログラミング言語
Rubyで作る奇妙なプログラミング言語Rubyで作る奇妙なプログラミング言語
Rubyで作る奇妙なプログラミング言語toyoshi
 
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川kirin_nico
 
ライフゲームでプログラミング
ライフゲームでプログラミングライフゲームでプログラミング
ライフゲームでプログラミングShinya Miyazaki
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料SECCON Beginners
 

Andere mochten auch (11)

Learn you a Brainfuck for great good!
Learn you a Brainfuck for great good!Learn you a Brainfuck for great good!
Learn you a Brainfuck for great good!
 
Functional Pearl + Brainfuck
Functional Pearl + BrainfuckFunctional Pearl + Brainfuck
Functional Pearl + Brainfuck
 
brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料
 
Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307
 
Rubyで作る奇妙なプログラミング言語
Rubyで作る奇妙なプログラミング言語Rubyで作る奇妙なプログラミング言語
Rubyで作る奇妙なプログラミング言語
 
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
 
実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング入門編実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング入門編
 
BFmeta
BFmetaBFmeta
BFmeta
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
ライフゲームでプログラミング
ライフゲームでプログラミングライフゲームでプログラミング
ライフゲームでプログラミング
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 

Ähnlich wie MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた

20190920 hannaripython20
20190920 hannaripython2020190920 hannaripython20
20190920 hannaripython20Otazo Man
 
Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01Ken SASAKI
 
TDD を自分の道具にしよう
TDD を自分の道具にしようTDD を自分の道具にしよう
TDD を自分の道具にしようYuji Okazawa
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門Yoshitaka Seo
 
connpass特徴と開発の流れ
connpass特徴と開発の流れconnpass特徴と開発の流れ
connpass特徴と開発の流れIkeda Yosuke
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについてMasahito Zembutsu
 
20120706-readablecode
20120706-readablecode20120706-readablecode
20120706-readablecodeMasanori Kado
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
MTプラグイン入門以前
MTプラグイン入門以前MTプラグイン入門以前
MTプラグイン入門以前Hiroshi Yamato
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Models【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Modelscvpaper. challenge
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
死闘!Og mailinglist
死闘!Og mailinglist死闘!Og mailinglist
死闘!Og mailinglistKuniyoshi Tone
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
ng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターンng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターンHayashi Yuichi
 
GrowthForecastことはじめ
GrowthForecastことはじめGrowthForecastことはじめ
GrowthForecastことはじめMakoto Taniwaki
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部Kiyoshi Ogawa
 

Ähnlich wie MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた (20)

20190920 hannaripython20
20190920 hannaripython2020190920 hannaripython20
20190920 hannaripython20
 
Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01
 
TDD を自分の道具にしよう
TDD を自分の道具にしようTDD を自分の道具にしよう
TDD を自分の道具にしよう
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
connpass特徴と開発の流れ
connpass特徴と開発の流れconnpass特徴と開発の流れ
connpass特徴と開発の流れ
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
20120706-readablecode
20120706-readablecode20120706-readablecode
20120706-readablecode
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
MTプラグイン入門以前
MTプラグイン入門以前MTプラグイン入門以前
MTプラグイン入門以前
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
TripleO Deep Dive
TripleO Deep DiveTripleO Deep Dive
TripleO Deep Dive
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Models【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Models
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
死闘!Og mailinglist
死闘!Og mailinglist死闘!Og mailinglist
死闘!Og mailinglist
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
ng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターンng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターン
 
GrowthForecastことはじめ
GrowthForecastことはじめGrowthForecastことはじめ
GrowthForecastことはじめ
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 

MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた