MediaWiki
この「きまぐれ手記」を動かしている MediaWiki に関するメモ書き。
「きまぐれ手記」を動かしているソフトウェア(抜粋)
- FreeBSD
- Perl関連 - 自作スクリプト用
- Ruby関連 - 自作スクリプト用
- MediaWiki関連(PHP、MySQLを含む)
- Let's Encrypt によるWebの常時TLS(SSL)対応(さくらインターネット提供の自動更新機能を使用)[1][2][3] --2017年10月20日 (金) 17:21 (JST)
その他(問い合わせフォーム、バナー自動表示など)は自作。
SNS/Link Icons
- 標準案内用図記号(交通エコロジー・モビリティ財団)
- Super Tiny Social Icons (SVG)[4] - Thanks for Ms Terence Eden!
- Font Awesome
MediaWiki
言わずと知れたフリーの巨大百科事典 Wikipedia を運用するために開発された、Wikiシステム。最近の言い方をすればCMSの一種。PHPで書かれており、GPLで配布されているオープンソースプロジェクト。
Mosaic の頃から Webサイトを運用していた筆者にとり、慣れたHTML直書きの方が楽で、最近流行りのCMSを使うのは苦痛でしかないんだが、そうは言ってもWebサイトの共同運営や、これまた最近流行りのSNS連携を考えると、CMS利用に移行する方が楽かもしれないと思い、試行運営することにした。
(SNSが流行る前、blogが流行っていた頃は、trackbackなどを部分的に独自実装していたんだけどね…最近そんな時間も無ければ、SNSがどんどん出てきて対応しきれない面もあって。)
その際にいくつかのCMSを検討したが、WordPress は某所で運用していて面倒でしかなかったこと、以前Wikipedia編集に参加していた頃に文法を習得していたこと、またExtensionなど試してみたいこともあって、今回は MediaWiki にて試行を始めた。
以下は、このサイトでの試行錯誤の備忘録。
Skin
- Tweeki
- Timeless
- Minerva Neue
GoMediaWikiSkin改
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 以降では「インターフェース管理者」権限が必要)。
Minerva Neue
Wikipediaなどでも使われている、モバイル端末向けの外装。シンプル軽快で、章ごとに折り畳めるといった特徴がある。
基本、mw:Extension:MobileFrontend と併用する。 モバイル端末では標準のスタイルシート MediaWiki:Common.css が有効にならず、MediaWiki:Mobile.css に指定する必要がある。
ちなみに mw:Extension:MobileFrontend と #Tweeki を併用して、Tweekiを使いながら章の折り畳みもできる。
基本的な機能を使うだけなら、設定は簡単。
LocalSettings.php |
wfLoadExtension( 'MobileFrontend' );
$wgMFDefaultSkinClass = 'SkinMinerva';
Tweeki と併用すると、{{#tweekihide:}} などの本文中に埋め込んだタグが表示(出力)されてしまう、class="img-responsive" の指定がうまく働かないといった問題が起きるので、互いにうまく調整する必要がある。
GoMediaWikiSkin改
当初使わせていただいていたもの。GoMediaWikiSkin のデザインを基本に、960 grid system の除去、twitter埋め込みタイムラインやバナーの追加などを行いながら試行錯誤していた。
改造しながら騙し騙し使い続けていたが、1.28.x 導入時に全く動かなくなってしまったため手放し、#Tweeki に変更した。
Extensions
基本、標準添付のものを除く(特記事項があるもののみ掲載)
AddThis- AmazonSearch - 記事中にAmazonの商品リンク(画像付)を埋め込む自作Extension
- BlueskyPost - 記事の編集概要をBlueskyへ自動ポストするために作った自作Extension。
CategoryTree- MediaWiki 1.31 より標準搭載されたが、使うと 500 Internal Server Error になる(;_;)- ClipBox - キャンペーンコード、紹介コード等を貼るために作った自作Extension。
- CloudImage - クラウドストレージ等に置いた画像を記事中に直接貼るために作った自作Extension。MediaWiki 1.35 まで使えた「$wgAllowImageTag」の代替機能。不特定の編集者がいるWikiでは非推奨。
- Collection - PDF出力(あまり使っていない)
- CSS - ページ内にCSSを埋め込む(Template:Discontinuedを表示したときにTemplate:olderを非表示にするために使っている)
- Description2 - Description(ページの説明)のMetaタグを添付する
- FlickrAPI - Flickrに置いた画像を本文中に埋め込む → PHP8で動作しなくなった(;_;) → CloudImage に互換機能を持たせて対処したNew!
- FlickrEmbed - 自作(中途半端)
- FlickrShow - 自作
- Google Analytics Integration - その名の通り Google Analytics のタグを埋め込む。GA4でも使える。
- HeadScript → #広告を入れる、さくらのレンタルサーバのWebフォントを使うなど。#HeadScript を参照
- HTMLets → #広告を入れる、Flickrのスライドショーを埋め込む
- Interwiki - 他の特定サイトへのリンクを簡略化する。設定変更は面倒で、データベースを直接書き換える必要がある(→mw:Manual:interwiki table、または Special:Interwiki で書き換えできる)。MediaWiki 1.17 以降、iw_url がバイナリ値に変更されている(中身はUTF-8のテキスト)。さくらインターネットのphpMyAdminを使って書き換える場合は、予めUTF-8のテキストファイルにURL(例:https://kimagurenote.net/kn/$1)を記載して保存し、そいつを読ませると登録できる(面倒!)。旧版の mw:Extension:InterWiki(Wが大文字)が存在するが別物(紛らわしい!)
- LinkAttributes - リンクにtitleなどの属性を付けることができる…がバグっていたので要修正
- Loops - パーサー関数で繰り返しを使えるようにする
- MediaFunctions - 写真のExif表示など
MobileFrontend- #Minerva Neue と併用し、モバイル端末用の画面生成機能を提供する- MsUpload
- MultiMaps - 記事中に地図を埋め込む
NewArticleTemplateNewestPages- OpenGraphMeta - Metaタグにog:情報を付加
- ParserFunctions - パーサー関数を使えるようにする
- PageImages - 記事中で使われている主要画像を抽出、Metaタグにog:image情報を付加、PopupsとBlueskyPostで使用
- PageNotice - NS_MAIN の全てのページの冒頭にWikitextを追加して、最終更新日より一定期間経過した記事にメッセージを自動的に表示するために使っている
- Popups - リンクをポイントすると要約を表示
- Postscript - 全ての記事の末尾に自動的に文字列やスクリプトを追加するために自作したExtension。
- PreToClip -
<pre>
にコピーボタンを付ける。<syntaxhighlight>
で生成された<pre>
も対象になる。 - QRLite - ページ中にQRコードを表示する
- Random In Category → #ランダムに記事を表示する
RecentPagesRelatedArticles→ #関連記事を表示する- Replace Text - MediaWiki 1.31 より標準搭載
ShoogleTweet- 500 Internal Server Error(;_;)- SubTranslate - DeepL API を呼び出して記事を機械翻訳するために作った自作Extension。
- SuppleRedirect - 存在しないページへのリンク(赤リンク)を姉妹サイトに自動転送するために作った自作Extension。MediaWiki 1.35 以降で提供されている REST API を使っている。
- SyntaxHighlight - MediaWiki 1.21 より標準搭載、#SyntaxHighlight を参照
- TextExtracts -
mw:Extension:TwitterCards で使う…つもりだった、Popupsで使用 - TweetANew - 記事の新設や更新をTwitterに投稿するものだが、よく動作しなくなり、度々修正しながら使っている…2023年 6月、Twitterの旧API停止により動作しなくなった(;_;)
TwitterCards- Twitterカードに対応させるものだが、うまく動作しない- TwitterTag - Twitter(指定したアカウントのツイート)を埋め込む
- Variables - パーサー関数で変数を使えるようにする。内部で InternalParseBeforeSanitize フックを使っているため、MediaWiki 1.35 以降では「Deprecated: Use of InternalParseBeforeSanitize hook (used in VariablesHooks::onInternalParseBeforeSanitize) was deprecated in MediaWiki 1.35.」というメッセージが表示される。また、今後予定されている次期パーサーでは使えなくなることが想定される。
Widgets- Yado - 記事中に宿泊施設へのリンク(画像付、楽天トラベルのキーワード検索API利用)を埋め込む自作Extension
- YJShopping - 記事中にショッピングサイトへの商品リンク(画像付、Yahoo!ショッピングの商品検索API利用)を埋め込む自作Extension
- YouTube - YouTube等の動画を埋め込む → #Extension:YouTube を lazy loading にする
HeadScript
MediaWiki 1.34.1 にアップグレードしたら、HeadScriptが原因でMediaWiki全体が動作しなくなってしまったので、パッチを作って対処した。
このExtensionは作者と連絡が取れないようで「unmaintained」になってしまっていたが、これが無いと地味に不便になるので、メンテナンスされるようになるといいね…
→2020年9月頃から、再びメンテナンスされるようになった。今は普通に新しい版をインストールすれば使える。
SyntaxHighlight
MediaWiki の配布ファイルに標準添付されているが、MediaWiki 1.31 以降の同梱版では Python 3 が必要になったようだ。→mw:Extension:SyntaxHighlight/ja#インストール
さくらのレンタルサーバには Python 2 しか入っていないため、MediaWiki 1.31 以降を普通にインストールすると SyntaxHighlight は動作せず、<syntaxhighlight>タグが含まれるページを編集すると「構文ハイライトエラーがあるページ」になってしまう(;_;)。
試しに、あえて MediaWiki 1.30 対応版を選んで配布元からダウンロードしてまるごと置き換えたら、さくらのレンタルサーバ+ MediaWiki 1.32.x 環境下でも使えたので、しばらくはそれでしのいでいたが、この方法は MediaWiki 1.34.1 では使えなくなってしまった(ページ編集時に「致命的例外」発生)。
そこで、MediaWiki 1.30 対応版パッケージに含まれる pygments ディレクトリの中身を最新版にコピーしてやる(pygments だけを旧版に差し替えてやる)と、めでたく(?)さくらインターネット (Python 2) でも使えるようになった。
% cd /path/to/mediawiki/extensions/ % mv SyntaxHighlight_GeSHi/pygments SyntaxHighlight_GeSHi/pygments.org % fetch https://extdist.wmflabs.org/dist/extensions/SyntaxHighlight_GeSHi-REL1_30-87392f1.tar.gz % tar xzf SyntaxHighlight_GeSHi-REL1_30-87392f1.tar.gz SyntaxHighlight_GeSHi/pygments/
ただし、この方法で不具合が出ないとも限らないので、自己責任でどうぞ。
ちなみに、対応しているlang一覧はここ → Supported languages
LinkAttributes
これを使うと、リンクにtitleなどの属性を付加できる。
ただし配布されていた最新版 (LinkAttributes.body.php on Jun 30, 2022) がバグ持ちだったので、修正して使っている。
--- LinkAttributes.body.php.head 2023-07-05 10:28:21.713753000 +0900 +++ LinkAttributes.body.php 2023-07-05 10:44:13.000000000 +0900 @@ -42,10 +42,10 @@ /* Extract attributes, separated by | or |. /u is for unicode, to recognize the |.*/ $arr = preg_split( '/[||]/u', $_text); $_text = array_shift( $arr ); - if ($text instanceof HtmlArmor) { - $_text = new HtmlArmor($_text); + if ($_text instanceof HtmlArmor) { + $text = new HtmlArmor($_text); } else { - $text = $text; + $text = $_text; } foreach ( $arr as $a ) {
とりあえずPhabricatorとtalkに報告しておいたが、直るかどうか…
また、このExtensionを有効にした状態では、リンク内で装飾を加えることができない(バグか仕様かは不明…バグっぽいけど)。 例:
[[きまぐれ手記|'''内部リンク'''の例]]
このように不具合があったりバグっぽい挙動があったりするので、必要性が低ければあえて使わない方がいいかも(^^;。
Major Versions
- 公式のアップグレード案内は⇒ mw:Manual:Upgrading/ja
MediaWiki 1.39
本サイトでは2023年 7月 1日 (1.39.4) より利用開始。 LTS版なので長く運用する予定※。
同時に PHP 8 に更新したため、YJShoppingなどでPHP絡みの修正をした。
「CloudImage」を自作した:)。
Tweekiの更新に伴い、Bootstrap 3→4 に変わり、レイアウト修正に追われた。特にフッタは全面的に書き換えが必要になった。
PHP8絡みと思われるが、FlickrAPIを使っているページが例外を吐いて止まるようになった(;_;)。ソースを覗いたら組み込まれている他者のライブラリで9年前に更新が止まっており、これを使い続ける場合は全面的な書き換えが必要になりそう。いっそFlickrの利用をやめる機会かもしれない…
MediaWiki 1.35
本サイトでは2020年12月22日 (1.35.1) より利用開始。
1.34.4 から移行し、従来と同様の問題はあったが(従来と同様の対策でOK)、新しい問題は起きていない。
これからはLTS版を長く運用する予定。
1.35.10まで更新しながら運用。2023年 9月のサポート終了に備えて、2023年 7月 1日に #MediaWiki 1.39 に移行。
2023年 6月頃に TweetANew が動作しなくなった。Twitter運営会社が旧APIを停止したためと思われる。TwitterがEV成金に乗っ取られて以降改悪が続いており、2023年 7月初旬には既存ツイートが非ログイン状態で見られなくなってしまい、Facebookより酷いことになった。このExtensionのサポートは続いているようだが、最新版を組み込むとMediaWikiが起動しなくなるので実質稼働していない。もっともTwitter自体の情報収集や広報のツールとしての意義が失われている状況で、ユーザー離れが続きそう。
MediaWiki 1.34
本サイトでは2020年6月4日 (1.34.1) より利用開始。
相変わらずコマンドラインの update.php がうまく動作しない(起動しても無反応ですぐに終了)。 Webブラウザから /mw-config/ を開いてインストールすることで、データベースのアップデートまで無事完了した。
Extension:HeadScript を有効にしていると MediaWiki 自体が動作しないため、一旦 HeadScript を無効にしてからアップグレードを完了させ、その後に対処した。
SyntaxHighlight の古いバージョンが動かなくなってしまったので、さくらのレンタルサーバでは素直に使えなくなってしまった。(⇒素直じゃない使い方)
同時にPHPをバージョンアップした(7.3.x → 7.4.6)せいで、YJShoppingやAmazonSearchでnoticeやwarningが出るようになってしまったため、急遽対処に追われる羽目になった…
MediaWiki 1.33
(snip)
MediaWiki 1.32
2019年4月11日未明にプロバイダ(さくらインターネット)がバージョンアップを実施して以降、突然動作しなくなってしまった。
PHPのバージョンアップが原因と想定し、MediaWikiを再インストールすることに。どうせならと途中を飛ばして最新版にした。
- MediaWikiインストールディレクトリとデータベースのバックアップ
- さくらインターネットのコントロールパネルでPHPのバージョンを最新に変更
- MediaWikiの配布ファイルをダウンロードして展開し、必要なファイルをコピー
- 後から追加した(標準添付されていない)SkinやExtensionなどをダウンロードして展開
- maintenance/update.php を実行する(でも大抵失敗するんだよね)
- update.php がうまく動かないときは、Webブラウザから /mw-config/ を開いてインストールする(大抵こちらの方がうまくいく)。このときにデータベースもアップデートされ、古いバージョンには戻せなくなる。
- まずはトップページが表示されることを確認
- 表示されない・エラーが発生する場合は LocalSettings.php を編集し、追加したSkinやExtensionを一旦無効にするなど、原因の切り分けを実施する
- 不具合の出所が判ったら、個別に対処する
- 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
- MediaWiki 1.31 で同梱のSkinが整理され、CologneBlue と Modern が外れ、Timeless が追加された。
- CSS, JavaScript(.js), JSON の編集権限が新たに追加され、MediaWiki:common.css をはじめ、SkinのCSSなども、従来の管理者権限では編集できなくなった。編集する際は、最初に Special:UserRights から権限の追加が必要。→mw:MediaWiki_1.32/interface-admin/ja
- MediaWiki 1.31 以降に同梱されている SyntaxHighlight が Python 3 を必要とするようになった。さくらのレンタルサーバには Python 2 が入っているため、動作せず、全て「構文ハイライトエラーがあるページ」になってしまうよう(;_;)。 → #SyntaxHighlight を参照
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-1.32.1.patch |
--- 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
- 従来使っていた外装 (Skin)(GoMediaWikiSkin を改造したもの)がついに動かなくなってしまったので、とりあえず標準の CologneBlue を有効にしてしばらく放置。その後 Tweeki を導入。
- Extension:Newest Pages を無効化
- Extension:TweetANew がまた動かなくなっているので何とかしないと…
MediaWiki 1.26
1.25.x を飛ばして 1.26.x を導入したため、1.25.x での変更点も含む。
- 以前は規定のディレクトリに置くだけで有効になった外装 (Skin) が、規定で読み込まれず、 LocalSettings.php の書き換えが必要になった。
【関連】mw:Manual:Skin_autodiscovery#Migration_guide, mw:Manual:Skin_configuration/ja - 1.25.0 より Special:PopularPages が廃止された。さらに 1.26.x に更新するとアクセスカウンタがデータベースからも削除される。
アクセスカウンタを残したい場合は update.php を実行する前に Extension:HitCounters を参照。また、Special:PopularPages の替わりの機能に Extension:TopTenPages がある。
【関連】mw:Manual:$wgDisableCounters/ja
MediaWiki 1.24
- MediaWiki 1.24.1 に更新。--2014年12月21日 (日) 07:00 (JST)
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.23.6 に更新。--2014年10月30日
- MediaWiki 1.23.5 に更新。--2014年10月2日
- MediaWiki 1.23.4 に更新。--2014年9月25日
- MediaWiki 1.23.3 に更新。--2014年8月28日
- MediaWiki 1.23.2 に更新。--2014年7月31日
- MediaWiki 1.23.1 に更新。--2014年6月26日
- MediaWiki 1.23.0 に更新。--2014年6月15日 (日) 05:40 (JST)
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 mediawiki-1.22.7.patch.gz 100% of 3237 B 12 MBps % fetch http://download.wikimedia.org/mediawiki/1.22/mediawiki-i18n-1.22.7.patch.gz 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 ...
※ -i18n ファイルは、現在は使われていない。
【参考】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を付けない
MediaWiki は不特定多数の編集者を想定しているため、スパム対策で、外部リンクに rel="nofollow" を付ける設定が標準になっている。
個人や企業・団体のサイトなど、特定の編集者しかいないサイトで利用する場合には不要なので、これを付けないようにするために、LocalSettings.php に下記の設定を追加する。
LocalSettings.php |
$wgNoFollowLinks = false;
外部リンクのアイコンを変更する
- 公式の解説 → w:en:Help:External link icons
スタイルシートで変更できるので、MediaWiki:Common.css に設定を追加すれば良い。 例:
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 に下記の設定を追加すれば良い。 例:
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 に下記を追加
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 に下記設定を追加。
MediaWiki:Common.css |
/* 本文の字下げ(最初の行を除く) */
DIV.mw-content-ltr P {
text-indent: 1em;
}
DIV.mw-content-ltr P:first-of-type {
text-indent: 0;
}
なお、この設定と Font Awesome を併用すると、Font Awesome の手前に余計な空白が入ってしまうことがあるので、Font Awesome を使っている場合は、下記のような設定を追加しておく。
MediaWiki:Common.css |
/* Font Awesome への干渉を防ぐ */
I.fa, I.fab, I.fad, I.fal, I.far, I.fas {
text-indent: 0;
}
印刷用画面の書式変更
MediaWiki:Print.css に記載した内容が有効になる。
拡張めも
フッタに任意の Powered by アイコンを追加する
LocalSettings.php に下記の設定をする。 参考:mw:Manual:$wgFooterIcons
LocalSettings.php |
$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 が無くても動作するので、とりあえず使ってみる。
- Extension:RelatedArticles をダウンロードして展開
- LocalSettings.php に下記追加
LocalSettings.php |
/* RelatedArticles */
wfLoadExtension( 'RelatedArticles' );
$wgRelatedArticlesUseCirrusSearch = false;
$wgRelatedArticlesFooterWhitelistedSkins = ['vector', 'monobook', 'cologneblue', 'tweeki'];
$wgRelatedArticlesFooterWhitelistedSkins で、表示するskin名を指定するが、全て小文字で書かないと認識されないようだ。
- 各ページ(関連記事を表示したいページ)に下記タグを追加
{{#related:ページ名}}
各ページに追加するタグで、ページ名を手動で指定しないといけないので、どこまで意味があるのか… →結局使わなくなった(^^;
サイトマップを自動生成する
検索エンジンに読ませるためのXMLサイトマップは、MediaWikiに付属のメンテナンスコマンド generateSitemap.php で生成できる。
例:
% php /path/to/mediawiki/maintenance/generateSitemap.php --fspath /path/to/mediawiki/sitemap --identifier=wiki --urlpath /sitemap --server https://wiki.example.com --compress=no --skip-redirects
上記のコマンドを実行すると、こんな感じで生成される。
--skip-redirects は、リダイレクトを含めない指示。Googlebot向けにはリダイレクトを含めないよう推奨されている。
うまく生成されることを確認したら、自動更新されるように、crontab に書いて定期的に動かすと良い。crontab の設定方法はサーバによって異なるが、例えば FreeBSD ではこんな感じ、さくらのレンタルサーバではこんな感じ。
サイトマップは名前空間ごとに生成されるが、通常は名前空間Mainだけを検索対象にすれば良いだろうから、sitemap-wiki-NS_0-0.xml というファイルを検索エンジンに読ませれば良いだろう。
検索エンジンに読ませるには、robots.txt に記述するか、Google Search Console を使って登録する。
robots.txt 記述例:
Sitemap: https://wiki.example.com/sitemap/sitemap-wiki-NS_0-0.xml
Extension:YouTube を lazy loading にする
Google PageSpeed Insightsを見ていると、埋め込んでいるYouTube(とAdSense)が遅いと言われる。Googleが自分で何とかしろよと思わなくもないが、YouTubeは <iframe>
タグに loading="lazy" を付加することで比較的簡単に対処できる。
Extension:YouTube を使って埋め込んでいるが、このExtensionは独自に $wgYouTubeEnableLazyLoad = true; にすることで lazy loading に対応しているものの、ソースを覗くと標準的な手法ではなく、標準の処理を抑制する(1クリックしないと標準の処理が動かない)もので、しかも代替の画像が lazy loading になっておらず、あまり使い勝手が良くないので、<iframe>
に loading="lazy" を付ける現代的な手法(?)に、ソースを弄って対応した:)。
YouTube-1.9.3_lazyloading.patch |
--- YouTube/YouTube.php.org 2023-06-02 16:07:39.000000000 +0900 +++ YouTube/YouTube.php 2023-07-31 17:09:28.000000000 +0900 @@ -74,7 +74,7 @@ * @return string */ public static function embedYouTube( $input, $argv, $parser ) { - global $wgYouTubeEnableLazyLoad; + global $wgYouTubeEnableLazyLoad, $wgNativeImageLazyLoading; // Loads necessary modules for lazy loading: // Video poster image will be loaded first and replaced by the actual video once clicked @@ -190,7 +190,7 @@ if ( !empty( $ytid ) ) { $url = $urlBase . $ytid . '?' . $argsStr; - $content = $iframe = "<iframe width=\"{$width}\" height=\"{$height}\" src=\"{$url}\" frameborder=\"0\" allowfullscreen></iframe>"; + $content = $iframe = "<iframe width=\"{$width}\" height=\"{$height}\"" . ( $wgNativeImageLazyLoading ? ' loading="lazy"' : '' ) . " src=\"{$url}\" frameborder=\"0\" allowfullscreen></iframe>"; if ( $wgYouTubeEnableLazyLoad ) { $img = '<img width="' . $width . '" height="' . $height . '" src="' @@ -252,6 +252,8 @@ } public static function url2aoaid( $url ) { + global $wgNativeImageLazyLoading; + $id = $url; if ( preg_match( '/http:\/\/www\.archive\.org\/details\/(.+)$/', $url, $preg ) ) { @@ -294,7 +296,7 @@ if ( !empty( $argv['playlist'] ) ) { $uri .= "&playlist=" . (bool)$argv['playlist']; } - return "<iframe src=\"$uri\" width=\"$width\" height=\"$height\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen></iframe>"; + return "<iframe src=\"$uri\" width=\"$width\" height=\"$height\"" . ( $wgNativeImageLazyLoading ? ' loading="lazy"' : '' ) . " frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen></iframe>"; } } @@ -430,6 +432,8 @@ } public static function embedNicovideo( $input, $argv, $parser ) { + global $wgNativeImageLazyLoading; + $nvid = ''; $width = 400; $height = 326; @@ -454,7 +458,7 @@ if ( !empty( $nvid ) ) { $url = "https://embed.nicovideo.jp/watch/{$nvid}"; - return "<iframe width=\"{$width}\" height=\"{$height}\" src=\"{$url}\"></iframe>"; + return "<iframe width=\"{$width}\" height=\"{$height}\"" . ( $wgNativeImageLazyLoading ? ' loading="lazy"' : '' ) . " src=\"{$url}\"></iframe>"; } }
↓上記のパッチを、こんな感じで適用する↓
% cd /path/to/mediawiki/extensions % wget -O - https://github.com/wikimedia/mediawiki-extensions-YouTube/archive/master.tar.gz | tar xzf - % mv mediawiki-extensions-YouTube-master YouTube % wget -O - https://kimagurenote.net/file/YouTube-1.9.3_lazyloading.patch | patch -p -
また、この追加機能を利用するには、LocalSettings.php に $wgNativeImageLazyLoading の設定が必要:
LocalSettings.php |
$wgNativeImageLazyLoading = true;
なお、$wgYouTubeEnableLazyLoad は指定しない(または false にする)こと。
(Extension:YouTube のノートにも書いておいた。)
Extension:HeadScript でスクリプトを読み込む
Google PageSpeed Insightsを見ているとYouTubeと並んで遅いと言われるのが Google Adsense。
最悪YouTubeは無くてもいいが、Adsenseを外すのは…という場面もあると思う。
この対策としては、Extension:HeadScript を使って <head>...</head>
内に Adsense のスクリプトを埋め込むこと。
そして、個別の広告ユニット(タグ)に含まれるスクリプトを削除すること。
筆者も無意識に貼っていたが(もとい、広告ユニット毎にファイルを分割して管理していたので、貼る時にいちいち中身を見ないから気づかなかった)、よく見ると Google Adsense の広告タグには同じスクリプト(下記の例の1行目色付き部分)が含まれている。
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script>
<ins class="adsbygoogle"
style="display: block; min-height: 160px;"
data-ad-format="fluid"
data-ad-layout-key="-f9+5v+4m-d8+7b"
data-ad-client="ca-pub-1234567890123456"
data-ad-slot="9876543210"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
この1行目のスクリプトが、全ての広告ユニットに含まれているものだから、これを繰り返し読むことでオーバーヘッドが生じているようだ。
そこで、この1行目のスクリプトを Extension:HeadScript を使って <head>...</head>
内に貼り付け、各広告ユニットでは1行目を省いて貼ると、Adsenseの負荷が劇的に改善した。
LocalSettings.php |
/* HeadScript */
wfLoadExtension( 'HeadScript' );
$wgHeadScriptCode = <<<'START_END_MARKER'
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script><!-- Google AdSense -->
START_END_MARKER;
広告ユニット(タグ)※ |
<!-- script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script -->
<ins class="adsbygoogle"
style="display: block; min-height: 160px;"
data-ad-format="fluid"
data-ad-layout-key="-f9+5v+4m-d8+7b"
data-ad-client="ca-pub-1234567890123456"
data-ad-slot="9876543210"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
広告を入れる
Google Adsense
Google Adsense の「自動広告」を入れてみた。
- 「自動広告」の設定(利用する広告タイプを選択)し、スニペット(埋め込むタグ)を取得
- 取得したタグを<head>に入れる必要があるので、Extension:HeadScript をダウンロードして展開
- LocalSettings.php に下記追加
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 に下記を追加。
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
AmazonSearch
通常は YJShopping を使うにしても、Amazonにしかない商品が少なからず存在するので、Amazonにしかない商品のリンクを埋め込むために作成。 詳細 → AmazonSearch
Yado
記事中に宿泊施設へのリンク(画像付)を埋め込む自作Extension。楽天トラベルのキーワード検索APIを利用。 詳細 → Yado
ランダムに記事を表示する
MediaWiki に標準添付の拡張機能、おまかせ表示 や カテゴリ内おまかせ表示が使える。
使えない場合は、mw:Extension:Random In Category を確認。
Debug
- 詳しくは mw:Manual:How_to_debug/ja を参照
下記いずれかを設定する
- php.ini に下記の記述を追加
php.ini |
error_reporting = E_ALL
display_errors = On
- LocalSettings.php に下記の記述を追加
LocalSettings.php |
/* for debug */
error_reporting( -1 );
ini_set( 'display_errors', 1 );
詳しいエラー発生位置を知りたい場合は、さらに $wgShowExceptionDetails を追加する
LocalSettings.php |
$wgShowExceptionDetails = true;
これでエラーメッセージ(warningを含む)が表示されるようになる。 他の閲覧者にも表示されるので、デバッグは手早く済ませよう:)
(自作Extensionなどのデバッグは、独自にログを吐くなどの処理を加える方が良いかも。)
参考リンク
- MediaWiki
- mw:Version_lifecycle/ja(バージョン ライフサイクル)
- mw:Release_notes
- さくらのレンタルサーバ