onagatani
2010年07月15日
来月8/6 に札幌市産業振興センターにてWebテクノロジーセミナー in Hokkaidoを開催します。
モバゲータウンや Movable Type で使用されているPerl言語についての講演や、オープンプラットフォームなどのWebテクノロジーについての講演を予定しております。
株式会社ディー・エヌ・エーより山口 徹氏、シックス・アパート株式会社より金子 順氏、JPAより牧 大輔氏が講演を行ないます。
また弊社代表 小林からのご挨拶、永谷から「北海道とPerl」というお題で発表させて頂きます。
シックス・アパート株式会社の北海道初講演というイベントにもなり、数少ない機会なので北海道でMTやPerlを使用している方やオープンプラットフォームに興味のある方は是非ご参加ください。
申し込みイベント詳細についてはシックス・アパート株式会社サイト内告知イベントページをご確認下さい。
(参加無料・懇親会別途)
https://www.sixapart.jp/seminar/sa/2010/06/23-1846.html
また翌日にはHokkaido.pm#1を行ないます。
このイベントにもJPA牧大輔氏が1セッション講演を行ないます。
他にもHokkaido.pmのメンバーによるテックトークを企画していますのでこちらも是非ご参加ください。
こちらの詳細についてはHokkaido.pmのサイトをご確認下さい。
Webテクノロジーセミナー in Hokkaido
- 開催日時: 2010年8月6日(金)14:00~16:30 (13:30 受付開始)
- 場所: 札幌市産業振興センター セミナールームA
- 住所: 札幌市白石区東札幌5条1丁目1-1
- 参加費: 無料
- 懇親会費:3,000円
- 定員: 150名
- 主催: シックス・アパート株式会社、株式会社スカイアークシステム
- 協賛: 社団法人Japan Perl Association
Hokkaido.pm#1
- 日時:2010年8月7日(土) 13:30~16:30
- 場所:札幌市産業振興センター セミナールーム5
- 住所: 札幌市白石区東札幌5条1丁目1-1
- 定員:20名
- 参加費:数百円
- 定員: 20名
皆様のご参加をお待ちしております。
ぴろり上西
2010年06月11日
「推測するな、計測せよ」とは名著「サーバ/インフラを支える技術」の中のプログラマの言葉です。MTIgnore タグが構築パフォーマンスに影響を与えるのかという話題ですが、この点を簡単なプログラムを書いて計測してみました。
計測に使用したプログラムの簡単な説明をします。指定された回数分、ループで回して<MTIgnore><MTIgnore><MTIgnore>〜</MTIgnore></MTIgnore></MTIgnore>と入れ子にした場合(1.)と、<MTIgnore></MTIgnore><MTIgnore></MTIgnore><MTIgnore></MTIgnore>〜と指定回数分だけ並べた場合(2.)を計測します。時間の計測には Time::HiRes モジュールを利用します。そして、上記のテンプレートについて、コンパイルとビルドに要する時間をそれぞれ計測しました。
| 回数 | コンパイル(1.) | コンパイル(2.) | ビルド(1.) | ビルド(2.) |
| 1 | 26ms | 25ms | <0ms | <0ms |
| 10 | 26ms | 26ms | <0ms | 1ms |
| 100 | 28ms | 33ms | <0ms | 6ms |
| 1,000 | 43ms | 86ms | <0ms | 51ms |
| 10,000 | 211ms | 628ms | <0ms | 510ms |
| 100,000 | 1,915ms | 6,056ms | <0ms | 5,082ms |
| 1,000,000 | 10,299ms | 60,331ms | 14ms | 50,615ms |
結論から言うと、タグ数が1,000未満のような通常の運用の範囲で書かれるテンプレートでは、MTIgnoreテンプレートタグがそのパフォーマンスに与える影響はほとんどありませんよ、ということです。むしろ、積極的に使って読みやすいテンプレートを書くことを心がけた方が良いでしょう。
上記の計測結果で重要なことは、ビルド処理と同等、またはそれ以上にコンパイルに要する時間が無視できない、という点です。ビルドに関する処理部分だけを見て、パフォーマンスを論ずる方がいらっしゃいますが、むしろ MovableType テンプレートのようなインタプリタ言語では、コンパイラ部分の性能が大きく影響してきます。この辺りは情報理論、インタプリタやコンパイラの勉強をされた方なら常識ですね。MovableTypeのテンプレートは典型的な再起下降構文解析器が使われていて、ちょっと面白いのは、MTIgnoreの処理が特別に書かれていることです。これはC言語のようなプリプロセッサを持たないためと考えられます。具体的には、MTIgnoreタグについては、そのコンテンツを全く無視するような動作になっており再帰下降しません。そのため、非常に巨大なネスト(1.のケース)でも、処理時間が爆発せずに済んでいるわけです。
興味のある方は、MT::Build::compileを読んでみると面白いと思います。
ぴろり上西
2010年06月10日
事業拡大に向けて、最近、社長とその仲間たち(上司)が面談のために頻繁に外出していたりします(事務所が狭いので、面談は隣のルノアールなのですよ) ディレクター職の募集なので、残念ながら上西のセクションが賑やかになることはないのですが、もし技術職を採用するなら、スキルを測るためにどんな入社試験を出すかなーとか妄想してました。
問1. 数学的興味とプログラミングの基礎能力
フィボナッチ数列;F(x)のF(10)を求めるプログラムを書け。F(0)=0、F(1)=1とする。
- 再帰を用いて書け
- 再帰を用いずに書け
問2. 思考をロジックに落とす能力
横3マス、縦3マスの魔方陣の解のうち任意の一つを求めるプログラムを書け。
問3. MVCの理解と俺フレームワークの設計能力
以下のお題を Perl または PHP または JavaScript を用いて書け。足りない仕様は自由に設定してもよい。
- 500ccのビールを注ぐことができるビアジョッキのモデルクラスを作れ
- ビア樽のモデルクラスを作成し、10リットルのビールが入っている状態を作れ
- 現在のビア樽とビアジョッキの状態を出力するビュークラスを作れ
- ビア樽から 3 杯のビアジョッキにビールを注ぐコントローラークラスを作れ
- 現在のビア樽とビアジョッキの状態を出力せよ
MovableType 関係ないじゃん!って話ですが、まぁ、基礎ができていないと、MTの開発どころじゃありませんよ、ということで。あ、ちなみに妄想なので、正解できても即入社とかありませんので!
いたはし
2010年06月08日
なんか思ったより反響があってこわいので、もそもそ調整しました。
デザイナーサイド(html、MT構築側ね)で出来る再構築高速化について、サーバーのスペックがどうのとか、君そのアレはPerlのモジュールをアレすることでアレな感じにアレできるんだよCPANペラペーラ云々とかそういうハイソサエティなお話が鬼門な私がしてみることにします。
(いや大体わかるようになってきたけど)
※めんどくさい話は全部省きました。その辺はえらい人たちが説明してるだろうと思うので、ぐぐるか訊いてみてください。とりあえずまず使ってみたい人推奨です。
※本格的な高速化については、もっと色々手段があります。これはあくまでテンプレートベースで出来る話の一部です。
※どちらかというと、これをこうすることでタグの処理が速くなる…!とかというよりは、シンプルな記述を心がけましょうねという話です。
※はじめに言っておきますが体調悪いので話が冗長です。暇な人以外は基本読み飛ばして下さい。
※別に劇的に速くはならないです そんなに期待しないで!
で、高速化。
確かにサーバーのスペックあげれば再構築が500はじきだしたり止まったまま動かなくなったりという事はしなくなりますが、結局は底上げしているだけで、根本を解決してないので、記事数に応じてやがては同じ状況になります。
まあまたサーバーのスペック上げればいいんだけど、全員が全員リッチじゃないという話ですね。メリットの無いコストはかけたくないものです。
で、前置きが長いのは私の病気なのでそっとしておくことにして、
表題に戻りますと、再構築という処理を出来る限り速く安全に終わらせるために、あとデバッグ速度を上げるために、あとプラグインとか作る人に「テンプレートが悪いんじゃないの?w」と言われないために(…)、心がけておきたいことがいくつかあります。
1. Includeタグはそのままでは基本使わない
「MTInclude、MTInclude、なおかつ中でMTInclude!どうだ俺の入れ子構造…そんじょそこらのバカには思いつかない手だぜ!俺しびれるほどかっこいい!OK!Yes!」みたいなモジュール大好き人間がよくいるものですが、MTIncludeというタグを一つ使う毎に、再構築さん24歳独身の背中に大きな石が乗るようなものです。
なぜかというといちいちテンプレートを参照しにいかないといけないので、まあ、その辺の深い話はどっかに書いてあると思うんで省きます。
ただ、MTIncludeタグっていうのはMTのうまみみたいなものでもあるので、使わないで構築、とまでは思ってません。
共通化したほうが効率的なことも多いです。
というところで、MTIncludeタグを使うに当たっては、SSIやキャッシュを有効活用しましょう。
<MTInclude module="hogehoge" ssi="1">
ブログの設定らへんで「サーバサイドインクルードを使う」みたいな設定があったかと思いますが、
そこで選択した形式に基づいて、SSIしてくれます(要設定)。
例えばPHP選んでたら、<?php include(hogehoge);?>みたいなやつに置き換えてくれます。
「なるほど、わからん」という人は、わからんままでも大丈夫、私もよくわからんです。本当はちゃんと勉強して覚えるべきですが、その辺のモラル的な部分についてはこの記事では触れません。
注意事項があるとしたら、この内部でページのタイトルによっては…みたいな分岐が使えなくなることぐらいです。
ページ単位ではなく、サイト単位やアーカイブ単位で共通なところに使いましょう。フッターとかね。
<MTInclude module="hogehoge" cache="1" ttl="秒数">
cacheはそのものずばり、テンプレートの内容をキャッシュしてくれます。
わかりやすくいうと、一旦テンプレートの形を吐き出して、それを皆で使うみたいな感じです。
なので、Includeの処理自体はキャッシュの保持秒数内、或いは後述するキーが云々するまではたった1回のみになります。わあ、聞いてるだけで速くなりそうな気がしますね。
注意事項があるとすれば、一旦キャッシュした内容は秒数やキーで指定しない限り、デフォルトの秒数が経過しきるまではテンプレートの内容が変わらないということです。ページやアーカイブによって違う場合は、ttlで秒数を指定するか、キーを設けておきましょう。
keyの使い方
「いやキャッシュとかキーとか言われてもよくわからん」という人です(私が)。
というわけで、keyの使い方を記載しておきます。
<MTEntryCategory setvar="cache_key">
<MTInclude module="hogehoge" cache="1" key="$cache_key">
$ってなんぞ?という人、前にsetvarした値は「$hogehoge」ってやると取り出せますって説明しましたので省きます。過去記事みてね。
要するに、カテゴリ名が同じ場合は一回作ったキャッシュを使って、カテゴリ名が違う場合は、新たにキャッシュを作ってくれます。
これにより、カテゴリやら月別やらの単位で表示内容を統一させつつも・・・みたいなことができますね。
2. 無駄なMTタグは使わない
そのIf要らないだろ…っていうIfは省きましょう。
<MTIf tag="BlogName"><MTBlogName></MTIf>とか書いちゃってる人たまに見ますが、
運用上絶対に入力するもの、または未来永劫何かのアクシデントでもない限りかわらないものは、MTタグで出力せず、直書きでいいと思います。
今は置換機能もちゃんと動くので、表記ゆれのミスさえなければ問題ないはずです。
あとMTIgnoreタグで囲めば処理しないという幻想がまことしやかにささやかれていた時期がありましたが、
あいつ一旦タグの内容なめてからコメントアウトしてますから、処理時間はその分もかかりますよ。
↑ちょっと怪しいので検証しまっす!!
まあでも使わなかった記述をコメントアウトしまくったりしていると、結局読みにくかったりなんだりなので、
テンプレート上から削除するのはおすすめしておきます。この辺は俺ルールですな。
3. 無駄なプラグインは入れない
プラグインパック売ってる会社の人間が言うことじゃないですが。
プラグインは、ひとつ読み込むだけで管理画面がちょっと重くなります。
管理画面重たいっていう人は、使わないプラグインをサーバーから削除 or 権限を落としてMTが読み込めないようにしてみましょう。あ、これ再構築関係なかったですね。
でも、たくさんプラグインを入れておくと便利なような幻想を抱いてしまいますが、サイトによって取捨選択は必要です。
便利でも、自分のサイトには必要ない、特につかわない、という場合は、削除することをおすすめします。
(使う時にまた入れられるように保存はしておこうね!)
4. スタティックなインデックステンプレートを増やさない
これ先に言えば良かったかも。
Movable Typeで記事を公開保存する際、自動で再構築されるのは、MultiBlogプラグインの設定を除けば、
自記事+前後記事+所属するカテゴリアーカイブ(スタティックな場合)+所属する年月日アーカイブ(スタティックな場合)+インデックステンプレート(スタティックなもの全部)です。
スタティックなインデックステンプレートが山ほどあると、いやでも記事公開保存時に全部を再構築しようとしてしまいます。
記事保存がおわらない…!っていう人はこの手の罠にはまってるんじゃないかなと思わなくもないですよ!
スタイルシートとかJavascriptとか、毎回記事投稿する毎に再構築する必要はないですよね。
ファイルに直接ファイルリンクして、後はいじる時だけ再構築すればいいとおもいます。
あとは、MTタグで置き換えが必要でないテンプレート(利用規約一枚のみとか、ロゴだけとか)も。
というわけで、都度記事更新時に更新が必要でないものはスタティック以外の設定にしておきましょう。
リニューアルの時には手間がかかりますが、頻繁にリニューアルするわけでない場合は、日常の運用に支障がでないことにフォーカスする方が使い手的にいいんじゃないかなぁと思ってます。というか、どっちも支障がでないように設計することが大事ですね。
5. PageButeを乱用しない
再構築ページ数が分割数分物理的に増えるからです。静的なのでしかたないのですけれど。
テンプレートの構造次第で気にならなくなりますが(600記事20件毎2アーカイブ+αで3分前後とか)、乱用は気をつけましょう。
ちなみに前述した記事保存時の再構築にも含まれるので、インデックステンプレートに「すべての記事一覧」とか作って、記事全件呼び出すタグを埋め込んでスタティックにしてたりすると、毎回全ページ再構築しちゃうので気をつけましょう。
こんなところかな。
SetVarタグとかは使ってもそんなに痛くないので、ある程度同じ内容を出力する場合はSetVarしてGetしまくるという手もあります。
というか、ここまで書きましたけど、要はサイト設計とテンプレートの設計をきちんとしていれば再構築終わらない/(^o^)\みたいなことはほとんどなくなります。
必要のないタグはかかない、必要のないプラグインはいれない、必要のないテンプレートは使わない。
「サーバーのスペック最低なんです!底上げ!底上げ!」なんていう前に、自分がわかる範囲でテンプレートを見直してみましょう。結構改善の余地はあるんじゃないかなと思いますよ。
まあサーバースペックはものすごく大事ですけどね!底上げ!底上げ! と、言い逃げしておく。
いたはし
2010年05月07日
いたはしです。タイトルだと何を言ってるかよくわからないと思いますが、私もわかりません。
簡単にいうと、二段組にするやつです。記事が100件だった場合、1-50、51-100と、2つの列で表示し......えー、
| 1件目 | 51件目 |
| 2件目 | 52件目 |
| 3件目 | 54件目 |
| ... | ... |
| 50件目 | 100件目 |
というような表を作りたいがためのソースです。
MT4、5で拡張されたSetVarを使用していますが、いろんなプラグインを組み合わせればMT3でもできます。
表示に限っていえば、リストでやるなり何なりと方法はありますが、何かしらの理由でテーブルでやらなくてはならない場合(表形式である場合など)、下記のソースを参考にしてみてください。
<MTEntries lastn="0">
<MTEntriesHeader>
<MTEntriesCount setvar="maxcount">//エントリー一覧の総件数を取得します。
<MTSetVarBlock name="max"><MTVar name="maxcount" op="++"></MTSetVarBlock>//総件数に+1
<MTSetVarBlock name="div"><MTVar name="max" op="/" value="2" sprintf="%d"></MTSetVarBlock>//総件数を2で割って小数点切り捨てます。
<MTSetVar name="count" value="1">//添え字用にカウントします。
</MTEntriesHeader>
<MTSetVarBlock name="title" index="$count"><MTGetVar name="count">//<a href="<MTEntryLink>"><MTEntryTitle remove_html="1"></a></MTSetVarBlock>//記事タイトルとURLを取得し、title[カウント数]に入れます。
<MTSetVar name="count" op="++">//カウントに+1します。
</MTEntries>
<MTSetVar name="count" value="1">//カウントを初期化します。
<table>
<MTFor from="1" to="$div">//__counter__が1~総件数の半分になるまで以下の処理を繰り返します。
<tr>
<td><MTGetVar name="title" index="$count"></td>//先ほどセットした記事タイトルのうち、title[カウント]を取得します。
<MTSetVarBlock name="mix"><MTVar name="count" op="+" value="$div"></MTSetVarBlock>//カウントに総件数の半分を足した数を別にセットしておきます。
<td><MTGetVar name="title" index="$mix"></td>//先ほどセットした記事タイトルのうち、title[カウント+総件数の半分]を取得します。
</tr>
<MTSetVar name="count" op="++">//カウントに+1します。
</MTFor>
</table>
RandomEntriesとかと組み合わせて、ランダムなトーナメント表とか作るとおもしろいかもですね。
あみだくじ引いたほうが早いですが