MediaWiki

提供: きまぐれ手記 Kimagurenote
2019年5月31日 (金) 09:56時点におけるCory (トーク | 投稿記録)による版 (+Yado)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この「きまぐれ手記」を動かしている MediaWiki に関するメモ書き。

「きまぐれ手記」を動かしているソフトウェア(抜粋)

その他(問い合わせフォーム、バナー自動表示など)は自作。

SNS/Link Icons

MediaWiki

言わずと知れたフリーの巨大百科事典 Wikipedia を運用するために開発された、Wikiシステム。最近の言い方をすればCMSの一種。PHPで書かれており、GPLで配布されているオープンソースプロジェクト。

Mosaic の頃から Webサイトを運用していた筆者にとり、慣れたHTML直書きの方が楽で、最近流行りのCMSを使うのは苦痛でしかないんだが、そうは言ってもWebサイトの共同運営や、これまた最近流行りのSNS連携を考えると、CMS利用に移行する方が楽かもしれないと思い、試行運営することにした。

(SNSが流行る前、blogが流行っていた頃は、trackbackなどを部分的に独自実装していたんだけどね…最近そんな時間も無ければ、SNSがどんどん出てきて対応しきれない面もあって。)

その際にいくつかのCMSを検討したが、WordPress は某所で運用していて面倒でしかなかったこと、以前Wikipedia編集に参加していた頃に文法を習得していたこと、またExtensionなど試してみたいこともあって、今回は MediaWiki にて試行を始めた。

以下は、このサイトでの試行錯誤の備忘録。

Skin

Tweeki

公式の解説→mw:Skin:Tweeki

1.28.x 導入後は、Tweeki を(無改造で)使わせていただいている。フロントエンドTwitter Bootstrap を利用しており、図らずも時代の流れに追いついた(笑)。

見た目がすっきりしたのは良いが、これに伴いバナーやリンクアイコンを置く場所が無くなった試行錯誤しながら少しずつ追加している。→Tweeki#How-to

Timeless

MediaWiki 1.31 で標準添付Skinが整理され、搭載されるようになった。

Tweekiは閲覧用には良いが、編集には少々使いづらいので、編集用アカウントではTimelessを使っている。

編集関連メニューが使いやすく、ダークモードも用意されている。ダークモードへ切り替えるには、MediaWiki:Timeless.css を開いて、ダークモード用のスクリプトに書き換える(MediaWiki 1.32 以降では「インターフェース管理者」権限が必要)。

GoMediaWikiSkin改

当初使わせていただいていたもの。GoMediaWikiSkin のデザインを基本に、960 grid system の除去、twitter埋め込みタイムラインやバナーの追加などを行いながら試行錯誤していた。

改造しながら騙し騙し使い続けていたが、1.28.x 導入時に全く動かなくなってしまったため手放し、#Tweeki に変更した。

Extensions

基本、標準添付のものを除く(特記事項があるもののみ掲載)

SyntaxHighlight

MediaWiki の配布ファイルに標準添付されているが、MediaWiki 1.31 以降の同梱版では Python 3 が必要になったようだ。→mw:Extension:SyntaxHighlight/ja#インストール

さくらのレンタルサーバには Python 2 が入っているため、MediaWiki 1.31 以降を普通にインストールすると SyntaxHighlight は動作せず、「構文ハイライトエラーがあるページ」になってしまうよう(;_;)。

そこで、あえて MediaWiki 1.30 対応版を選んで配布元からダウンロードして置き換えたところ、さくらのレンタルサーバ+ MediaWiki 1.32.0 環境下でも使えるようになった。

% cd /path/to/mediawiki/extensions/
% mv SyntaxHighlight_GeSHi SyntaxHighlight_GeSHi_1.32.0
% fetch https://extdist.wmflabs.org/dist/extensions/SyntaxHighlight_GeSHi-REL1_30-87392f1.tar.gz
% tar xzf SyntaxHighlight_GeSHi-REL1_30-87392f1.tar.gz

ちなみに、対応しているlang一覧はここ → Supported languages

Major Versions

MediaWiki 1.32

mw:Release_notes/1.32/ja

2019年4月11日未明にプロバイダ(さくらインターネット)がバージョンアップを実施して以降、突然動作しなくなってしまった。

PHPのバージョンアップが原因と想定し、MediaWikiを再インストールすることに。どうせならと途中を飛ばして最新版にした。

  1. MediaWikiインストールディレクトリとデータベースのバックアップ
  2. さくらインターネットのコントロールパネルでPHPのバージョンを最新に変更
  3. MediaWikiの配布ファイルをダウンロードして展開し、必要なファイルをコピー
  4. 後から追加した(標準添付されていない)SkinやExtensionなどをダウンロードして展開
  5. maintenance/update.php を実行する(でも大抵失敗するんだよね)
  6. update.php がうまく動かないときは、Webブラウザから /mw-config/ を開いてインストールする(大抵こちらの方がうまくいく)。このときにデータベースもアップデートされ、古いバージョンには戻せなくなる。
  7. まずはトップページが表示されることを確認
  8. 表示されない・エラーが発生する場合は LocalSettings.php を編集し、追加したSkinやExtensionを一旦無効にするなど、原因の切り分けを実施する
  9. 不具合の出所が判ったら、個別に対処する
  10. Special:Version を開き、MediaWikiやPHP、Extensionなどの変更が反映されていることを確認

MediaWikiインストールディレクトリとデータベースのバックアップ

% tar czf mediawiki-backup.tgz -C /path/to/www mediawiki-dir
% mysqldump --hex-blob -Q -h (database server) -u (database user) -p (database name) -c > mediawiki-database-backup.sql
Enter password: (database password)
% php /path/to/mediawiki/maintenance/dumpBackup.php --full > mediawiki-dump-mysql.xml

生成されたファイル(上記の例では mediawiki-backup.tgz, mediawiki-database-backup.sql, mediawiki-dump-mysql.xml の3つ)を保存しておく。

ただし、確実にデータが取得できたことを確認して、maintenance/dumpBackup.php が確実に動いている場合は、mysqldump はなくても良い。

MediaWikiの配布ファイルをダウンロードして展開

念のため、現在のMediaWikiインストールディレクトリの名前を変更し保存しておく。

% cd /path/to/www
% mv mediawiki mediawiki-old
% fetch https://releases.wikimedia.org/mediawiki/1.32/mediawiki-1.32.0.tar.gz
% tar xzf mediawiki-1.32.0.tar.gz
% mv mediawiki-1.32.0 mediawiki
% cd mediawiki-old
% cp -p .htaccess LocalSettings.php ../mediawiki

後から追加した(標準添付されていない)SkinやExtensionなどをダウンロードして展開

Skin(Tweeki)の展開例。他のSkinやExtensionも同様にする。

% cd /path/to/www/mediawiki/skins
% mv Tweeki Tweeki.old
% git clone https://github.com/thaider/Tweeki

Changes

Bugs

  • インストーラ (maintenance/update.php) が相変わらずおかしい。
  • Extension:TweetANew が動かなくなった(エラーは出ないがツイートも出ない)。これはまぁいつものことか…
  • InstantCommons が使えない:例外*が発生し、該当ページ全体が表示されない不具合が発生中。→ #CurlHttpRequest の不具合修正

CurlHttpRequest の不具合修正

画像の埋め込みや説明表示で、下記の例外が発生していた。

InvalidArgumentException from line 102 of /path/to/mediawiki/includes/http/CurlHttpRequest.php: Error setting curl options.

調査すると、ForeignAPIRepo.php から呼び出された CurlHttpRequest.php の中での、php curl curl_setopt_array() の呼び出し処理で起きていた。

試しに動作実績のある MediaWiki 1.29 のモジュールに入れ替えて試してみたが、結果は同様だった。さくらインターネットのアップデート絡みの不具合かもしれないが、試しに $wgUseInstantCommons = false; にしても、やはり例外発生する。

ひとまず、Commonsの画像を埋め込んでいる[[Image:…]]タグを記事中から全て外して保存し直すことで例外が起きないようにした。

後日追調査したところ、curl_setopt_array() に渡している値の中に、CURLOPT_PROXY (値は空)があった。ここは本来、使用しないなら null にする(=値を渡さない)べきもの。

試しに、下記テストスクリプトを さくらのレンタルサーバで実行してみたら、curl_setopt_array() が正常終了しなかった(TRUEが返らなかった)。

再現用:PHP Manual curl_setopt_array の例より

<?php
// 新しい cURL リソースを作成します
$ch = curl_init();

// URL その他のオプションを適切に設定します
$options = array(CURLOPT_URL => ' https://commons.wikimedia.org/w/api.php?…',
                 10018 => 'MediaWiki/1.32.1 ForeignAPIRepo/2.1',
                 10036 => 'GET',
                 10004 => ''    /* CURLOPT_PROXY */
                );

echo curl_setopt_array($ch, $options);

// URL の内容を取得し、ブラウザに渡します
curl_exec($ch);

// cURL リソースを閉じ、システムリソースを開放します
curl_close($ch);
?>

そこで、下記パッチを作成。これを当てることで例外発生を回避できた。

--- CurlHttpRequest.php.org     2019-01-11 05:21:50.000000000 +0900
+++ CurlHttpRequest.php 2019-05-20 22:47:24.000000000 +0900
@@ -50,7 +50,9 @@
                        return Status::wrap( $this->status ); // TODO B/C; move this to callers
                }

-               $this->curlOptions[CURLOPT_PROXY] = $this->proxy;
+               if( !empty( $this->proxy ) ) {
+                       $this->curlOptions[CURLOPT_PROXY] = $this->proxy;
+               }
                $this->curlOptions[CURLOPT_TIMEOUT] = $this->timeout;

                // Only supported in curl >= 7.16.2

とりあえずこのパッチは phabricator にも投げておいた: https://phabricator.wikimedia.org/T223911

MediaWiki 1.29

1.29.0 は見送り、1.29.1 Bugfix Release が出てから更新してみたが…

サーバのコマンドラインから update.php が動かない。エラーも何も出ずに終了してしまう。標準以外のextension,skinを外して試しても同様。

LocalSettings.php すら引き継がない素の状態で動かしてみたら、Webインストールは動作していたので、Webブラウザから /mw-config/ を実施すると動作した。

その後 Tweeki を設定すれば動いた。

6月に作った Extension:TweetANew の 1.29.x 対応パッチを動作確認中…

MediaWiki 1.28

1.27.x を飛ばして 1.28.x を導入。

MediaWiki 1.26

1.25.x を飛ばして 1.26.x を導入したため、1.25.x での変更点も含む。

MediaWiki 1.24

2014年12月 3日より、1.24.0 の運用開始。

  • スタイルシートが変わったのか、{{Special:ページ一覧}} の各項目の上に線が出るようになっていた。
  • 今回から iconv が必須になっている。1.23 になった時に Extensions:TweetANew が不具合を起こしたが、今回またマルチバイト関数の扱いが変わったとすると、再度確認が必要かもしれない(まだ試していない)。--2014年12月5日 (金) 23:22 (JST)
  • jQuery 1.11.1 が標準で組み込まれるようになった。これに伴い Extension:FlickrShow で jQuery を標準で組み込まないようにする。
  • Extension:NewArticleTemplate の旧バージョン (1.11.0) を使っていたら不具合を起こし、新規ページ編集ができなくなった。最新 (1.24.0) に更新して解消。
% cd /path/to/extensions/NewArticleTemplate
% fetch https://raw.githubusercontent.com/mathiasertl/NewArticleTemplates/master/NewArticleTemplate.php

MediaWiki 1.23

2014年 6月15日より、1.23.0 に切り替え、12月 3日まで運用していた。

MediaWiki 1.22

現在のMediaWiki版「きまぐれ手記」が稼働した2013年12月時点の最新版 1.22.0 より、1.22.7 まで運用。

  • 参照元skinで使われていた 960 grid system を外し、本文を常に90%幅で表示するようにした。ブラウザを最大化した時に無駄な余白が出なくなってすっきり。右端のリンク類を見たい場合は横スクロールしてくださいまし。--2014年1月15日 (水) 20:43 (JST)
  • 新着/更新情報が twitter に自動ついーとされるように、Extension:TweetANew を設定。 --2014年1月13日 (月) 04:05 (JST)

運用めも

バックアップ

詳しくは Manual:Backing up a wiki を参照。

(MySQLで運用している場合)

LocalSettings.php に定義しているデータベース関連パラメータを控えておく。

% mysqldump --hex-blob -Q -h $wgDBserver -u $wgDBuser -p $wgDBname -c > mediawiki_database_backup.sql
Enter password: $wgDBpassword
% php /path/to/mediawiki/maintenance/dumpBackup.php --full > mediawiki_database_dump.xml
% tar czf wiki_backup.tgz /path/to/mediawiki mediawiki_database_backup.sql mediawiki_database_dump.xml
% rm mediawiki_database_backup.sql mediawiki_database_dump.xml

wiki_backup.tgz(実際のファイル名にはwiki名や日付等を入れる方が良い)を保存しておく。

セキュリティアップデート

リビジョンひとつのアップデートならば、差分パッチを当てるのが簡単。

% cd /path/to/mediawiki
% mkdir patch
% cd patch
% fetch http://releases.wikimedia.org/mediawiki/1.22/mediawiki-1.22.7.patch.gz http://download.wikimedia.org/mediawiki/1.22/mediawiki-i18n-1.22.7.patch.gz
mediawiki-1.22.7.patch.gz                     100% of 3237  B   12 MBps
mediawiki-i18n-1.22.7.patch.gz                100% of  573  B 9168 kBps
% cd ..
% gunzip -ck patch/mediawiki-1.22.7.patch.gz | patch -p1 >& patch/mediawiki-1.22.7.patch.log
% gunzip -ck patch/mediawiki-i18n-1.22.7.patch.gz | patch -p1 >& patch/mediawiki-i18n-1.22.7.patch.log
% cat patch/mediawiki-1.22.7.patch.log
...
% cat patch/mediawiki-i18n-1.22.7.patch.log
...

【参考】mediawiki-announce メーリングリストを購読(無料)しておくと、セキュリティアップデートが公開される際にお知らせ(英語)が届く。

アップデート

マイナーバージョンが上がる場合は、一旦別のディレクトリに入れ直す方が良い。 詳しくは Manual:Upgrading を参照。

  • 念のためデータベースを#バックアップ
  • 最新の配布ファイルを取得
  • 配布ファイルを展開
  • .htaccess, LocalSettings.php 各ファイルと、images ディレクトリをコピー
  • 標準以外のSkinsを使っている(または作っている)場合はそれをコピー
  • 標準以外のExtensionsを使っている(または作っている)場合はそれをコピー
  • 以前のmediawikiディレクトリの名前を変更(一時的に保存するため)
  • 新しいmediawikiディレクトリの名前を変更(外から見られるようにする)
  • 新しいMediaWikiに含まれているデータベースのアップデート処理を動かす
% php /path/to/mediawiki/maintenance/update.php

※1.29あたりから update.php がまともに動かなくなっているよう。うまく動かない場合は Webブラウザから/mw-config/ を開いて動かすと良い。

  • これで更新完了のはず。試しにブラウザで表示してみる(初回表示時は時間がかかる)。
  • Special:Version ページを見てバージョンを確認。

設定めも

外部リンクにnofollowを付けない

公式の解説 → mw:Manual:nofollow, mw:Manual:$wgNoFollowLinks/ja

MediaWiki は不特定多数の編集者を想定しているため、スパム対策で、外部リンクに rel="nofollow" を付ける設定が標準になっている。

個人や企業・団体のサイトなど、特定の編集者しかいないサイトで利用する場合には不要なので、これを付けないようにするために、LocalSettings.php に下記の設定を追加する。

$wgNoFollowLinks = false;

外部リンクのアイコンを変更する

公式の解説 → w:en:Help:External link icons

スタイルシートで変更できるので、MediaWiki:Common.css に設定を追加すれば良い。 例:

#content a[href$=".xls"].external,
#content a[href$=".XLS"].external,
#content a[href$=".xlsx"].external,
#content a[href$=".XLSX"].external {
	background: url("http://upload.wikimedia.org/wikipedia/commons/b/ba/Page_white_excel.png") center right no-repeat; padding-right: 18px;
}

すなわち、全ての外部リンクのアイコンを無効にしたい場合は、MediaWiki:Common.css に下記の設定を追加すれば良い。 例:

#content a.external {
	background: none;
}

なお、全てではなく特定のリンクのみアイコンを表示したくない場合は、記事中の該当する要素個別に class="plainlinks" を適用する。

例:記事中で該当するリンクのみを下記のように記述する

<span class="plainlinks">http://example.com/test.pdf</span>

httpsの外部リンクのアイコンを変更する

httpsの外部リンクのアイコンが錠マークになっているが、近頃はhttpsの方が一般的だし、錠マークはログインが必要なページでよく用いられることから紛らわしいため、通常の外部リンクのアイコンに変更した。

例:MediaWiki:Common.css に下記を追加

#content a.external[href^="https://"],.link-https {
	background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=") center right no-repeat;
	background: url("/resources/src/mediawiki.skinning/images/external-ltr.png") center right no-repeat!ie;
	padding-right: 13px;
}

該当する画像の置き場所はSkinによって異なるので、各サイトで調整が必要。

本文の字下げ

MediaWiki:Common.css に下記設定を追加。

/* 本文の字下げ(最初の行を除く) */
DIV.mw-content-ltr P {
	text-indent: 1em;
}

DIV.mw-content-ltr P:first-of-type {
	text-indent: 0;
}

印刷用画面の書式変更

MediaWiki:Print.css に記載した内容が有効になる。

拡張めも

フッタに任意の Powered by アイコンを追加する

LocalSettings.php に下記の設定をする。 参考:mw:Manual:$wgFooterIcons

$wgFooterIcons['poweredby']['freebsd'] = array(
	"src" => "/path/to/bannerimage.gif",
	"url" => "http://www.freebsd.org/ja/",
	"alt" => "Powered by FreeBSD",
	"width" => "171", 
	"height" => "64"
);

Skinによっては、規定でアイコンが非表示にされているものがあり(Tweekiなど)、その場合は各Skinに固有の設定の追加が必要になる。

関連記事を表示する

Extension:RelatedArticles が使えるが…

本来は全てのページに自動で挿入され、関連性の高いページが表示されるようだが、フル機能を使うためには CirrusSearch が必要。 CirrusSearch を使うには cURL と Elasticsearch が必要。 Elasticsearch を使うには Java が必要だが、レンタルサーバでは別途JDKのインストールが必要。 JDKを入れられないことはないが、パッチ当てなど運用の手間がばかにならない…

…ので自動挿入は諦めた^^;。

Extension:RelatedArticles は、各ページに手動で挿入すれば、CirrusSearch が無くても動作するので、とりあえず使ってみる。

/* RelatedArticles */
wfLoadExtension( 'RelatedArticles' );
$wgRelatedArticlesUseCirrusSearch = false;
$wgRelatedArticlesFooterWhitelistedSkins = ['vector', 'monobook', 'cologneblue', 'tweeki'];

$wgRelatedArticlesFooterWhitelistedSkins で、表示するskin名を指定するが、全て小文字で書かないと認識されないようだ。

  • 各ページ(関連記事を表示したいページ)に下記タグを追加
{{#related:ページ名}}

各ページに追加するタグで、ページ名を手動で指定しないといけないので、どこまで意味があるのか… →結局使わなくなった(^^;

広告を入れる

Google Adsense

Google Adsense の「自動広告」を入れてみた。

  • 「自動広告」の設定(利用する広告タイプを選択)し、スニペット(埋め込むタグ)を取得
  • 取得したタグを<head>に入れる必要があるので、Extension:HeadScript をダウンロードして展開
  • LocalSettings.php に下記追加
/* Google AdSense (HeadScript) */
require_once "$IP/extensions/HeadScript/HeadScript.php";
$wgHeadScriptCode = <<<'START_END_MARKER'
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
	(adsbygoogle = window.adsbygoogle || []).push({
		google_ad_client: "ca-pub-0000000000000000",
		enable_page_level_ads: true
	});
</script>
START_END_MARKER;

HTMLets

mw:Extension:HTMLets を使うと、予めサーバに用意したファイルを埋め込むことができる。別途ファイルを用意する手間はかかるが、各種アフィリエイトのタグを埋め込めるようになる。

Extension を展開した後、LocalSettings.php に下記を追加。

/* HTMLets */
require_once "$IP/extensions/HTMLets/HTMLets.php";
$wgHTMLetsDirectory = "$IP/(任意のディレクトリ)";

ファイルを置く場所は任意に指定できる(もちろん読み取り権限がある場所に限られる)。後からExtensionを更新することを考えると、Extensionとは異なる場所を作る方が良さそう。ただし他の(埋め込みたくない)ファイルと混在させない方が良い。拡張子は .html のみのよう。

Tweeki

Skin(Tweeki) の余白に広告を埋め込んでみた → Tweeki#HTMLタグの埋め込み

これを使うと外部スクリプトの呼び出しもできるので、スクリプトを書ける人なら大抵何でもできる。→

YJShopping

記事中にショッピングサイトへの商品リンク(画像付)を埋め込む(Yahoo!ショッピング商品検索API利用)Extensionを自作。 詳細 → YJShopping

ランダムに記事を表示する

MediaWiki に標準添付の拡張機能、おまかせ表示カテゴリ内おまかせ表示が使える。

例→ Special:RandomInCategory/鉄道路線

使えない場合は、mw:Extension:Random In Category を確認。

Debug

詳しくは mw:Manual:How_to_debug/ja を参照

下記いずれかを設定する

  • php.ini に下記の記述を追加
error_reporting = E_ALL
display_errors = On
  • LocalSettings.php に下記の記述を追加
/* for debug */
error_reporting( -1 );
ini_set( 'display_errors', 1 );

詳しいエラー発生位置を知りたい場合は、さらに $wgShowExceptionDetails を追加する

$wgShowExceptionDetails = true;

これでエラーメッセージ(warningを含む)が表示されるようになる。 他の閲覧者にも表示されるので、デバッグは手早く済ませよう:)

(自作Extensionなどのデバッグは、独自にログを吐くなどの処理を加える方が良いかも。)

関連情報