「Help:テンプレートの制限」の版間の差分

組み換え。加筆修正。
(更新。en:Wikipedia:Template limits 16:16, 10 February 2008 (UTC) の版より部分的に翻訳。)
(組み換え。加筆修正。)
{{DEFAULTSORT:てんふれとのせいけん}}
{{HJ:h|Editor toc ja}}
ウィキペディアの使用しているソフトウェア[[MediaWiki]]には、テンプレート呼び出し([[トランスクルージョン]])やテンプレートの代入展開([[サブスティテューション]])によって'''ページに読み込まれるデータ量を制限'''するためのパラメータがいくつかあります。このページでは、なぜ、そしてどのようにこの制限が用いられているかについて解説しています。
 
== 概要 ==
[[MediaWiki]]ソフトウェアでは、ウィキテキスト(ウィキソース)をもとに[[HTML]]ページが生成されますが、読み込みデータについては[[構文解析]]の一種([[再帰下降構文解析]])を使用しています。ウィキテキストは「[[プリプロセッサ]]」を用いて「ツリー」と呼ばれるデータ構造に変換され、このツリーを用いてHTMLソースが生成されます。
 
極端に長いページや[[Help:テンプレート|テンプレート]]をたくさん呼び出しているような複雑なページは解析に時間がかかります。このことは利用者にとって不便なだけでなく、処理不可能なほど巨大なデータを MediaWiki に解析させることで[[DoS攻撃]]の手段として悪用される可能性もあります。このような攻撃を予防し、ページの読み込みが常識的なスピードで行われることを保証するために、このような制限が設定されています。読み込みデータの制限は、2006年8月より導入されました。英語版などでは、2008年1月から導入された新しいプリプロセッサを使用しており、日本語版でもURLで指定することでこのプリプロセッサを一時的に使うことができます。([[meta:Migration to the new preprocessor]]参照)。
 
構文解析の過程では、生成されるページの複雑性を把握するためにいくつかのカウンターが使用されます。カウンターは解析開始時点でゼロに設定され、解析中に該当するプロセスがあると数値が計上されていきます。カウンターには上限値が設定されており、上限値を越えると展開ができなくなります。
 
極端に長いページや[[Help:テンプレート|テンプレート]]をたくさん呼び出しているような複雑なページは解析に時間がかかります。このことは利用者にとって不便なだけでなく、処理不可能なほど巨大なデータを MediaWiki に解析させることで[[DoS攻撃]]の手段として悪用される可能性もあります。このような攻撃を予防し、ページの読み込みが常識的なスピードで行われることを保証するために、このような制限が設定されています。読み込みデータの制限は、2006年8月より導入されました。英語版どでは、2008年1月から導入された英語版などで新しいプリプロセッサを使用が導入され、制限の方法が変更されてまた。今後他のプロジェクトにも漸次拡大が予定されおり、います([[meta:Migration to the new preprocessor]]参照)。日本語版でURLで指定することでこのプリプロセッサを一時的に使うことができます([[meta:Migration to the new preprocessor#読み込み量]]参照)。
 
== 制限がおこりやすい事例 ==
読み込み制限は、同じテンプレートを何度も使用している場合によく起こります。例えば、長い表の各行に同じテンプレートを呼び出しているような場合です。テンプレート自体のデータが小さくても、トラスクルプレジョント呼び出しの際ごとにテンプレートページのソース全体量が計上されますので、思っているよりも簡単に制限値に達することになります。また、当然ながら、呼び出しているテンプレートのサイズが大きければ大きいほど、制限に達するのも早くなります。サイズが大きい理由としては、テンプレート本体が複雑であったり、[[Help:テンプレートの説明文|テンプレートの説明文]]が付随していたり、呼び出し先で必要なデータ以外の多くのデータを含んでいたりすることが考えられます。
 
== 制限値に達しているか判別するには ==
# テンプレート <code><nowiki>{{A}}</nowiki></code> の呼び出しは、呼び出し先のページの「展開前カウンター」に25バイトを計上します。25を計上すると展開前カウンターが制限値を越えてしまう場合、テンプレート <code><nowiki>{{A}}</nowiki></code> は展開されません。
# テンプレート <code><nowiki>{{A}}</nowiki></code> を呼び出す前の段階で、展開前カウンターに余裕が250バイトあったと仮定します。この時、テンプレート <code><nowiki>{{A}}</nowiki></code> が展開されると、カウンターの残りは225バイトですから、最初の2回のテンプレート <code><nowiki>{{B}}</nowiki></code> は展開されますが、残りの3回は制限値を越えるため、展開されません。
# 上記の仮定は、「展開後カウンター」のことを考慮にいれていません。ここで、テンプレート <code><nowiki>{{A}}</nowiki></code> を呼び出す前の段階で、展開後カウンターに余裕が150バイトしかなかったと仮定します。この時、テンプレート <code><nowiki>{{B}}</nowiki></code> の展開が2回行われた後のテンプレート <code><nowiki>{{A}}</nowiki></code> が生成するHTMLソースは200バイトを越えますので、結果としてテンプレート <code><nowiki>{{A}}</nowiki></code> は呼びし先のページに表示されません。
 
テンプレートの制限でもっとも問題になりやすいのが、「展開前読み込み量」の制限です。英語版で導入されている新プリプロセッサでは「展開前読み込み量」の制限はなく、「展開後読み込み量」のプロセスだけが行われます。このため、現在日本語版でテンプレートの読み込みに失敗している場合、 新しいプリプロセッサを使えば読み込める場合があります。これは <code>&timtest=newpp</code> の引数をURLに追加するか、[[特別:ParserDiffTest]]を使って確認できます(&#123;&#123;[[Template:Npp|Npp]]&#125;&#125;のテンプレートを使用すると、<code>&timtest=newpp</code> の引数を追加したURLへのリンクを簡便に表示させることができます)。
[[特別:ParserDiffTest]]は古いプリプロセッサと新しいプリプロセッサの出力結果の違いを差分表示する特別ページです。/を使って直接解析ページを指定したリンクも作れます(例:[[特別:ParserDiffTest/皇室の系図一覧]]。リンク先は非常に重いページとなっていますので、クリックする際にはご注意下さい)。
 
また、新プリプロセッサでは、条件文を用いたテンプレートの実行されない部分を展開しません。例えば、<code><nowiki>{{#if:yes|{{bar}}|{{foo}} }}</nowiki></code>というコードがあったとすると、テンプレート <nowiki>{{bar}}</nowiki> は展開され、テンプレート <nowiki>{{foo}}</nowiki> は展開されません。ただし、最終的な出力結果には表れないテンプレートの引数が展開後読み込み量に計上されることがあります。例えば <code><nowiki>{{#if:{{foo}}|yes|no}}</nowiki></code> というコードあったとすると、解析の際に条件文の決定のためにテンプレート <nowiki>{{foo}}</nowiki> の展開が必要なため、 <nowiki>{{foo}}</nowiki> の展開量が展開後カウンターに計上されます。
 
=== テンプレート引数量 ===