How to become a MediaWiki hacker/ja

このページでは、MediaWikiの開発プロセスにまつわる情報を集め、新参の開発者の諸疑問に答えるよう努めます. もしあなたが、私たちのコーディングを手伝おうと案じながらも、まだ必要な技能を修めていないなら、ここはそのよい出発点です.

まずいくつか、決定的に重要なリンクを：


 * MediaWiki開発のウェブサイトには開発にまつわる全般的な情報があります.
 * SourceForge（ソースフォージ）にあるMediaWikiプロジェクトのページでは、コードを調べたり、バグを報告することができます. 但し、私たちはSourceForgeのパッチトラッカーは使っていないので気をつけてください. （パッチが何かご存じない方は、下の説明を参照して下さい. ）
 * メーリングリスト（英語）: 開発には wikitech-l、サポートには mediawiki-l、CVSのコミット通知には mediawiki-cvs
 * meta:Help:MediaWiki architectureにはさらに詳しいドキュメンテーションがあります！

各種のオペレーティングシステム
MediaWikiソフトウェアはPHPで書かれており、MySQLデータベースを使用します. この2つは色々なオペレーティングシステムに移植されており、そこには、これらに限りませんが、UnixのほとんどのバージョンとMicrosoft Windowsが含まれす. したがって、どちらのシステムの下でもウィキペディアをインストールして使うことができます.

ただしWindowsを使う場合では、外部ユーティリティーに依存する一定の機能がまったく使えないか、もしくは特殊なパッケージの追加や再構成によってしか使えません. 時おりOS依存のバグが見られますが、これはあなたが開発に使うOSに関係のない多様なプラットフォームがもつ違いについて知識を得る最良の方法です.

PHPプログラミング言語
もし、PHP（PHPは「PHP: Hypertext Preprocessor」の略）の知識がないまでも、別のオブジェクト指向プログラミング言語でプログラミングする方法を知っているなら、恐るるなかれ、PHPの習得はあなたにとって簡単です.

もし、PHPに限らずオブジェクト指向プログラミング言語の知識がない場合は、クラス、オブジェクト、メソッド、イベント、継承のような諸概念には馴染んでおくべきです.

もし、いかなるプログラミング言語の知識もない場合、PHPは、その特殊な実行のされ方にも関わらず、現行の他の言語にそれなりに似ているので、プログラミングの入門に適した言語のひとつです.

ほとんどのプログラムとは異なり、コマンドラインやウィンドウマネージャからPHPスクリプトが実行されることは通常ありません. そのかわりPHPスクリプトは、ウェブサーバに対して（主に）拡張子「.php」をもつファイルが要求されたときに実行されます. そのときウェブサーバ（ここではApache）はPHPインタプリタ（ウェブサーバに組み込んでもよい）を呼び出し、そのPHPファイルを解釈し、結果をブラウザに返します. PHPファイルは正規のHTMLとPHPコードを一緒に含むことができるので、静的なウェブページに動的な機能性を加えるのが比較的単純になります.

関連リンク：


 * PHPの簡易チュートリアル（多言語）
 * PHPマニュアル（多言語）
 * PHP wiki（ドイツ語）
 * PHP（英語）

SQLとMySQL
現在ウィキペディアはデータベースバックエンドとしてMySQLを使っています. PHPに必ずMySQLサポートが組み込まれるようにすること！

私たちはパフォーマンスとポータビリティへの関心から、このウィキを別のデータベースバックエンド、特にPostgreSQLとも動作させようと努めています.

MediaWikiのインストール
CVSからソースを取る方法についてはMediaWiki from CVS（ja:Wikipedia:PHPスクリプト）を参照して下さい.

ソースの中のINSTALLファイルに取扱いの説明が見つかりますので、それに従ってみてください. また、MediaWiki User's Guide: Installationを調べてみてもよいでしょう.

MediaWikiへの追加機能を開発するだけなら、そのためにウィキペディアのデータベースをダウンロードする必要はありません. 実際多くの場合には、わずかな手作りのテストページだけしかないほぼ空のデータベースを使った方が簡単です.

データベースのダンプ
それでも何らかの理由でウィキペディアのコピーを手元に置きたいなら、SQLダンプ（ja:Wikipedia:データベースダウンロード）を入手して、以下のようにインポートすることもできます： しておくこと！）. メンテナンススクリプト群はメインソースディレクトリの諸ファイルから include されることに気をつけて、PHPのインクルードディレクトリとして設定するか、または単にその中にコピーしてしまいましょう.

そしてSQLダンプを、自分が求める言語の分だけ手に入れておき、こんなふうにインポートします: -->

gzip -dc cur_table.sql.gz | mysql -u wikiadmin -padminpass wikidb gzip -dc old_table.sql.gz | mysql -u wikiadmin -padminpass wikidb cd maintenance ; php rebuildlinks.php
 * Linux

ファイルをunzipした後、 mysql < cur_table.sql mysql < old_table.sql cd maintenance ; php rebuildlinks.php
 * Windows（上のように「-u wikiadmin -padminpass wikidb」が必要かもしれない）

リンク表の再構築にかかる時間は、極めて大きな英語のデータベースをインストールした場合などに特に長くなることがあります. （表「old」を割愛したいと思えばできることにも注意）rebuilding.phpの趣意についてはデータベースレイアウトを参照してください.

このやり方は、ウィキペディアの公開ミラーを作成したい場合にはたぶん最良ではないことに注意して下さい. もしこのやり方でミラーを設置するなら、コードを微調整して、ミラーを見ていることを明示し、またメインサイトに戻るリンクを組み込むように下さい.

MediaWikiコードベース
MediaWikiのコードベースは巨大で不格好です. そのことに圧倒されないでください. 最初に取り掛かるときには、まず追加機能を書くか、コードのごく狭い範囲に含まれるバグを直そうとしてみて下さい.

MediaWikiについて学ぶ一番の方法は、そのコードを読むことです. 出発点をいくつか挙げておきます：


 * index.php は要のエントリーポイントですが、そこから物事がどこへ向かうのかはあまり明白ではありません.


 * Article.php には、ページの表示（view）、削除（delete）、巻き戻し（rollback）、ウォッチリストへの追加（watch）と削除（unwatch）のためのコードが含まれます. また、ページを処理するための雑多なユーティリティー、例えば特定の版の内容を取ってきたり、ページを保存したりといった機能も含まれます.


 * EditPage.php には編集に関するコードのうち、ユーザーインターフェイスに密着した部分、分量としてはその半分ほどがあります. 残りの部分は Article.php や各種の *Update.php ファイル群にあります.


 * Parser.php には、ウィキテキストからHTMLに変換するコードの大部分があります. Skin.php の中にもわずかに散らばっています.


 * Skin.php は基本的に、RCやパーサーを含む他の様々なコンポーネントのためにHTMLコードを生成する関数の集まりです.


 * ほとんどの特別ページに対応するコードは Special*.php ファイル群にあります.


 * Database.php にはデータベースにアクセスするための関数が山積みとなっています.


 * OutputPage.php はクラス OutputPage の本拠で、これは出力バッファです. ここに送られたテキストは、スクリプトから制御が出て行く直前に stdout に転送されます.


 * Title.php にはページのタイトルに関する処理の全てがあります -- 加えて、インターウィキのタイトルや、「#」に始まるURI素片識別子（fragment identifier）も扱います. ページに関する情報をデータベースから取ってくる関数もいくつかここにあります.


 * User.php にはクラス User があり、これは利用者の個人設定（preferences）と与えられた許可（permissions）を表現します.


 * Setup.php はあらゆる種類の初期化を行っており、それがどうやら実行時間（Profiling）に大きな割合を占めているようです. 他のものと比べると、ここでは多くのグローバル変数と、含まれるほとんどのオブジェクトが初期化されます.


 * DefaultSettings.php には多くのグローバル変数の既定値があり、これらには LocalSettings.php において覆されるものも覆されないものもあります. 新たにグローバル変数を導入する場合には、isset による判定に基づいて事後的に既定値を代入するのではなく、対応する既定値を常にここに加えておいて下さい.

How to debug/ja・Manual:Code/jaもご覧下さい.

はじめての独自機能
いくつかアイディアがあります：
 * 何か興味をそそることをコードする.
 * 大衆受けする単純な機能をコードする. 美的な改善.
 * 便利な情報をいくらか提供する特別ページを書く. あるいはモジュール的な特別ページを作ることもでき、その例が the extensions directory ?や the extensions module ?にあります.
 * パーサーのフックを書く. 詳しい情報は Manual:Extending wiki markup/ja を参照して下さい.
 * 他の誰も苦にしないかもしれない、けど気に触る小さなバグを直す.

より具体的なアイディアについては、#mediawiki に来て開発者たちに話しかけて下さい. アイディアの貧困にめげないで下さい. 私たちには半ダースのプログラマーが1年間働き続けるに足りるだけのアイディアがあります.

始める前に自分より経験の長い開発者（Brion や Tim など）に相談してみるのはよい考えです. 自分の追加機能がコードの他の部分にどう影響するかはっきり分からない場合には特にそうです.

使える機能ができていれば、CVSの書込みアクセスをせがんで、それを MediaWikiに commit することができます. パッチを投稿するのはいらいらする場合もあるでしょうが、1度か2度はそうして誠実なところを実演しなければならないでしょう. 追加機能を commit する前に、それを容易に無効にできるようになっていることを確認してください.

ウィキメディアのサーバ群へのシェルアクセスを求めないでください. シェルアクセスをある種の砂場にだけ制限する手段はないので、シェルアクセスは私たちが本当に信頼する人々だけに与えられます. 申し出を断るのは悩ましいことですが、私たちはたいていそうしなければなりません. こちらから差し上げるまで待って下さい. それに長い時間がかかるなら、支持される程度を控えめにうかがってみて下さい?.

関連項目：開発方針（Development policy）