January 2008 Archives
January 28, 2008
hack-a-thonに行って来ました。
SixApartさんにお邪魔して、MTハッカソンに参加させていただきました。
前回も参加したので、なんとなくわかっていたのですが、まあ、本当にひたすらハックする集まり。
誰もが(普段以上に)黙々とハックしておりました。
勿論、名だたるMTハッカーが集まっているのでちょっとした質問議論から大いに盛り上がることもあり。(o)さんがホワイトボードにメモしながら説明している風景などは、見ていて胸に来るものがありました!
January 24, 2008
MT4.1リリース
RC2が公開されたと思うまもなく、MT4.1の正式版が公開されました。早速アップグレードして記事を書いています。
このタイミングでリリースしたという事は、あさってのhackathonで新機能祭りをやろうということですね。僕も参加します。楽しみです。
全体的な印象として、がっつり変化したMT4.0の時よりも、ちょっとした管理画面のレイアウトの変化など、細部までこだわった観が感じられます。すばらしい。
夏のMT4公開時の技術者カンファレンスでBrad Choateは、MT4.1or2で「カスタムフィールド」「テンプレートセット」「リビジョンログ機能」を追加したいと語っていましたが、このうちの二つが早くも実現したことになります。すばらしい。
これからもすばらしいソフトを作り続けてください。開発チームのみなさま、お疲れ様でした!
January 21, 2008
映画「アース」を見てきました。
アースを見てきました。
北極から南極まで、動物の生き様を最新の撮影技術で追った、動物ドキュメンタリー映画です。
出だしは冬の北極圏。闇の世界を雄のホッキョクグマがえさを求めてさまようシーンから、これまで見たことのない映像で圧倒されます。
最新の技術による空撮、高速、高感度撮影は見ごたえ十分。bullet-timeに匹敵するような映像体験でした。サメのハンティングの瞬間などは、本当にすばらしかったです。(全体的には、「決定的瞬間」はあえて避けていた編集でしたが。)
また、印象に残ったのはホッキョクグマやオシドリの子供のありえないかわいさ。頬が緩みっぱなしでした。
だって飛べないのに初飛行とか。落ちてるだけ。なのに兄弟みんな続いていく。全員落下。落ち葉がなければ死ぬって。現代の日本人が失ってしまった真の家族愛を感じました。
ストーリーはほとんど無いのでうっかり眠りかけましたが、いい映画でした。映画館でみてよかったと思いました。
January 20, 2008
MTのテンプレートタグで素数判定をやってみた。
MT4.1ではopモディファイアが導入されて、かなりプログラムチックなことが出来るようになっています。
そこで、なにかMTでやる意味のまったくない作業をテンプレートで作ってみたくなり、とりあえず素数判定を行うテンプレートを書いてみました。
現在のMTのテンプレートエンジンでは、MTForなどのループから任意のタイミングで抜け出すことが出来ないため、MTSetVarTemplateを再帰的に呼び出すことでループの代用をしています。
そのため、大きな数の判定を行うと馬鹿みたいにメモリを喰いまくります・・・
速度を度外視してアルゴリズムを簡潔にした事もあいまって、実用には耐えられない出来になってしまいました。
家のローカル環境では、大体1000くらいの数までなら耐えられますが、それ以上の素数を判定しようとすると戻ってこなくなります。
まあ、こんなことも出来る、というサンプルになればと思い公開してみます。
<mt:ignore> #setvartemplateを使って関数定義 </mt:ignore>
<mt:setvartemplate name="is_prime">
<mt:if name="num" op="%" value="$check">
<mt:ignore> #試し割りで余りが出た場合</mt:ignore>
<mt:setvar name="check" op="++">
<mt:if name="num" eq="$check">
<mt:getvar name="num"> は素数だった!
<mt:else>
<mt:ignore> #再帰!!</mt:ignore>
<mt:getvar name="is_prime">
</mt:if>
<mt:else>
<mt:ignore> #試し割りで割り切れた場合</mt:ignore>
<mt:getvar name="num"> は <mt:getvar name="check"> で割り切れたので素数じゃなかった!
</mt:if>
</mt:setvartemplate>
<mt:ignore> #ここに判定したい数字を指定 </mt:ignore>
<mt:setvar name="num" value="71">
<mt:ignore> #チェック用変数の初期化。変更不可!</mt:ignore>
<mt:setvar name="check" value="2">
<mt:ignore>
#setvartemplateで設定したテンプレートを呼び出す。
#ついでに余分な空白を削除。
</mt:ignore>
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
<mt:ignore> #続けていくつか試してみる。 </mt:ignore>
<mt:setvar name="num" value="109">
<mt:setvar name="check" value="2">
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
<mt:setvar name="num" value="111">
<mt:setvar name="check" value="2">
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
<mt:setvar name="num" value="113">
<mt:setvar name="check" value="2">
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
実行結果は以下のようになりました。
71 は素数だった!
109 は素数だった!
111 は 3 で割り切れたので素数じゃなかった!
113 は素数だった!
January 12, 2008
MTのテンプレートタグでFizzBuzz、SetVarTemplateを使ってやってみた。
junnamaさんが面白いことやってたので脊髄反射で反応。MT4.01が前提で。
カウントをインクリメントするルーチンをSetVarTemplateを使って外に出してみました。
まっすぐにやると出来ないのでちょっとかっこ悪い書き方になってしまいました・・・
この辺はMT4.1 で追加される op モディファイアを使えばよりスマートに書けるようになるでしょう。
<mt:setvartemplate name="count_up">
<mt:setvar name="count_3_original" value="$count_3">
<mt:setvar name="count_5_original" value="$count_5">
<mt:if name="count_3" eq="2"><mt:setvar name="count_3" value="0"></mt:if>
<mt:if name="count_3" eq="1"><mt:setvar name="count_3" value="2"></mt:if>
<mt:if name="count_3_original" eq="0"><mt:setvar name="count_3" value="1"></mt:if>
<mt:if name="count_5" eq="4"><mt:setvar name="count_5" value="0"></mt:if>
<mt:if name="count_5" eq="3"><mt:setvar name="count_5" value="4"></mt:if>
<mt:if name="count_5" eq="2"><mt:setvar name="count_5" value="3"></mt:if>
<mt:if name="count_5" eq="1"><mt:setvar name="count_5" value="2"></mt:if>
<mt:if name="count_5_original" eq="0"><mt:setvar name="count_5" value="1"></mt:if>
</mt:setvartemplate>
<mt:setvar name="count_3" value="1">
<mt:setvar name="count_5" value="1">
<mt:entries lastn="100">
<mt:setvar name="output_line" value="$__counter__">
<mt:if name="count_3" eq="0"><mt:setvar name="output_line" value="fizz"></mt:if>
<mt:if name="count_5" eq="0"><mt:setvar name="output_line" value="buzz"></mt:if>
<mt:if name="count_3" eq="0">
<mt:if name="count_5" eq="0">
<mt:setvar name="output_line" value="fizzbuzz">
</mt:if>
</mt:if>
<mt:getvar name="output_line">
<mt:getvar name="count_up">
</mt:entries>
January 10, 2008
詳説MTEntries
MTがなぜ大規模なテンプレートエンジンとアーカイブエンジンを持つに至ったかというと、全てはMTEntriesを動かすためといっても過言ではありません。
MTEntriesを制するものはテンプレートを制す、と言っても良いでしょう。
というわけで、MTEntriesのMT4.01での実装を、細かく調べてみました。
以下、MTEntriesの内部動作について気をつけたい点を一通り確認した後、実際のコードの流れを追う形で具体的な処理の詳細を見てみます。
January 8, 2008
MTSetHashVarとMTSetVarsを組み合わせて使いたい。
MTSetHashVarというブロックタグが追加されるらしい。
ブロックタグ内でのMTSetVarタグの振る舞いが、特定のハッシュのキーに対する代入に相当する動作になる、という便利そうなタグだ。詳しくは上のリンク先のドキュメント参照してください。
しかし、現在のリポジトリ上の最新のコードで、MTSetVarsと組み合わせて使うことが出来ない。
これは今のところダメ↓
<mt:SetHashVar name="zep">
<mt:SetVars>
vocal=plant
guitar=page
bass=jones
drums=bonzo
</mt:SetVars>
</mt:SetHashVar>
...
<mt:var name="zep{drums}"> #うまく代入できておらず、出力が空文字列になってしまう
こういった書き方が出来る事を期待して、後輩の前でかっこよさげに月の表示を陰暦で書き出すというカスタマイズを「かんなづきいー」とか叫びながらやってみたところ出来なかったので色々となっかりした。
そういえば、各種日付フォーマットも外から弄れないので、何とかしたいですなあ。