Hatena::ブログ(Diary)

shouhの日記

2015-07-24

CentOS7.1 に Mediawiki をインストール

何とかインストールできたので、メモしておいた作業ログをちょちょいとまとめてみた。

環境は以下を想定。

以下、早速インストール手順に入る。

Mediawikiを入手

公式サイトより。
https://www.mediawiki.org/wiki/Download

今回は 1.24.2 を使用。

何故かダウンロードに10分くらいかかった。サーバが重いから?

ダウンロードした tar.gz は以下コマンドで解凍しておく。

$ tar zxvf mediawiki-1.24.2.tar.gz

Mediawikiを動かすのに必要なツールを入れる

まずは PHPMySQL

$ sudo yum install php
$ sudo yum install php-mysql
$ sudo yum install mysql mysql-devel

ただし mysql-server については、yum install ではダメで、CentOS7では「手動でyumリポジトリを追加」する手順が必要。

$ yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
$ yum -y install mysql-community-server

最後に、mysqld がちゃんと入っているか確認する。

$ mysqld --version
mysqld  Ver 5.6.25 for Linux on x86_64 (MySQL Community Server (GPL))

参考

データベースの設定

とりあえずログインしてみる。

$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

上記のエラーが出たら、mysqld が動いてないということなので、以下のコマンドで動かす。enableで「起動時に自動的に起動する」設定を有効にしており、startで実際にサービスを立ち上げている。

$ sudo systemctl enable mysqld.service
$ sudo systemctl start mysqld.service
$ mysql -u root

管理者ユーザ rootデフォルトパスワードは「無い」なので、何かしら設定しておく。

$ mysqladmin -u root password password
                              ~~~~~~~~これがパスワード
$ mysql -u root -ppassword
mysql> 

MySQLログインできたので、データベースを作る。

mysql> create database wikidb;
mysql> grant index, create, select, insert, update, delete, drop, alter, lock tables on wikidb.* to 'wikiuser'@'localhost' identified by 'password';

データベースができていることを確認しておく。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wikidb             | <-- ok.
+--------------------+

完了。

参考

Apacheを配置

ApacheMediawiki を配置する。なお、mediawiki-1.24.2 はダウンロードした tar.gz ファイルを解凍して出来たディレクトリ。要するに /var/www 配下にわかりやすい名前で配置している。

$ cd /var/www
$ sudo mkdir mediawiki
$ mv mediawiki-1.24.2 /var/www/mediawiki
$ vim /etc/httpd/conf.d/mediawiki.conf
Alias /mediawiki "/var/www/mediawiki"

<Directory "/var/www/mediawiki">
    Order allow,deny
    Allow from all
</Directory>
$ chmod a+w mw-config

んで再読込(reload)…と行きたいところだが、そもそも httpd が起動してなかったので、普通に起動してやる

$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service
起動してます、みたいな表示が出るはず。

アクセスできるか確認する。ブラウザで以下を開く

…開けない。

原因はファイアウォールが働いているせいなので、無効にする。

まずは SELinux を無効に。

$ sudo getenforce 0

続いて firewalld を(CentOS6以前でいうlokkitやiptablesに相当するサービスらしい)。

$ systemctl stop firewalld.service
$ systemctl disable firewalld.service

これで開けるようになった。

MediawikiインストールをWebコンソールから行う

以下 URL にアクセスしてインストールを行う

しかし何も表示されない。詳細は省くが、Firebugで調べたり、index.php に ini_set( 'display_errors', 1 ); とか書いたりして調べた結果、ツールが足りないせいだとわかった。

具体的には php-xmlインストールすればよい。あとは設定が反映されないかもしれないので、httpd も再読み込みしておく。

$ sudo yum install php-xml
$ systemctl reload httpd.services

うん、インストール画面が開いた。
ここからは画面に従って続行する

言語画面

  • あなたの言語もwikiの言語も ja (規定値)

MediaWiki へようこそ!画面

データベースに接続画面

データベースの設定画面

名前画面

次画面では特に設定はいじらず、そのままインストール開始まで進む。(結局もっと質問してください no でも良かったかも)。

インストールが無事終わるはず。すると LocalSettings.phpダウンロードが促されるので、ダウンロードして、index.php と同じディレクトリに配置する。

これで mediawiki のトップページが開かれるはず。セキュリティ甘々だけど一応インストール完了。

2015-05-14

Mediawikiで情報収集に役に立つ特別ページ(Special Page)

Mediawiki には「最近の更新内容を表示するページ」や「どこからもリンクされていないページの一覧を表示するページ」など、特殊な働きをするページが存在する。特別ページ(Special Page)と呼ぶみたいだが、これが結構便利。

まず、特別ページの一覧は以下にある。
Help:Special page/ja - Meta
http://meta.wikimedia.org/wiki/Help:Special_page/ja

続いて、個人的に情報収集に役に立つと思った特別ページを紹介。

Special:Log
wikiの運用に関する最近のログが見れる。ここに表示されるのは管理者の操作。管理者が特定ページを削除したとか、復旧させたとか、そういう情報。

Special:Recentchanges
wiki全体に対して、最近の更新履歴が見れる。更新履歴自体は左ペインの「Recent Changes」からも参照できるが、ここから開いた場合の履歴はたまに全部表示してくれないことがある。Special:Log ならそんなことはなく、常に wiki 全体に対する最近の更新履歴を表示してくれる。

Special:ListUsers
wikiに登録されているユーザの一覧が表示される。「この人、いたんだ」とか、そういうのもわかる。管理者が作った実験用アカウントも表示されるので、変な名前だったら恥ずかしい。

Special:Lonelypages
どこからもリンクされていないページの一覧が表示される。不要なページの選別に重宝する。

Special:Allpages
全てのページへのリンクを一覧表示する。

Special:Newpages
最近新しく作られたページの一覧を表示する。

Special:Statistics
wiki統計情報を表示する。ページ数, アップロード済ファイル数, 登録ユーザ数, 管理者ユーザ数, 最も閲覧されているページベスト10など。ベストテンに自分の作ったページが入っていたりするとテンションが上がる。

最後に、mediawikiに貼付けるようのテキスト。

2015-01-18

Mediawikiでページ編集(特定セクションへのprepend)を行うAPIを試してみた

前提

  • API操作には python 2.7 + Requests ライブラリを使用
  • 使用する Mediawiki のバージョンは失念
    • 気が向いたら追記するよ
  • サンプルスクリプトの稚拙さ(特に英語?)や解説の少なさは許してちょ

本記事の内容について
以下の二つのパターンについて、ページ編集を行うサンプルスクリプトを載せる。

  • Mediawikiに認証がかかっている(ログインしないとページを見れない)場合
  • ついでにAPI経由での認証ステップも
  • 認証がかかっていない(ログインせずとも誰でもどのページを見れる)場合

認証がかかっている場合のサンプル

サンプルスクリプトの考え方

サンプルスクリプトでやりたいことは「指定したセクション(見出し)に、指定したテキストを prepend すること」です。

どう prepend されるかの仕組み

たとえば以下のようなページがあったとします。

	= section1 =
	= section2 =
	= section3 =

この時、セクション番号の対応は以下になります。

	= section1 = ← 番号1
	= section2 = ← 番号2 ここにテキストを prepend したいなら、section="3" を指定
	= section3 = ← 番号3

上記にも書きましたが、n番目のセクションに prepend したいなら、セクション番号には n+1 を指定しなければなりません。

サンプルスクリプト
#  MUST Parameters
url = 'http://HOGEHOGE/mediawiki/api.php'
username = ''
password = ''
target_pagename = ''
target_section_no = ''

# login
# 1. ログインしてトークンを取得する.
data = {
  "action" : "login",
  "lgname" : username,
  "lgpassword" : password,
  "format" : "json"
}
r = requests.post(url, data=data)
token = r.json()['login']['token']

# relogin with got token
# 2. 取得したトークンを lgtoken に与えて再ログイン.
#    その際, 前回ログイン時に入手した cookie を維持すること.
data["lgtoken"] = token.encode() # token is unicode string!
r = requests.post(url, data=data, cookies=r.cookies)
if r.json()['login']['result'] != 'Success':
  print "Login Failed..."
  sys.exit(0)

# get token for editting.
# 3. 認証完了したので, ようやく編集に入れる.
#    編集には編集トークンが必要なので、まずは取ってくる.
data = {
  'action' : 'tokens',
  'type' : 'edit',
  'format' : 'json'
}
r = requests.get(url, params=data, cookies = r.cookies)
edittoken = r.json()["tokens"]["edittoken"]

# edit
# 4. 編集トークンを与えて編集実行.
tweet_body = 'testTESTテスト'
prependtext = '==%s: %s==\n\n' % (update_datetime, tweet_body)
data = {
  'action' : 'edit',
  'title' : target_pagename,
  'section' : target_section_no,
  'prependtext' : prependtext,
  'token' : edittoken
}
r = requests.post(url, data=data, cookies=r.cookies)

print "=== result header of editting request === "
print r.headers

認証がかかっていない場合のサンプル

はじめに

編集トークンは "+\" なので、わざわざ取得せずとも、ハードコーディングでもいいかも。

サンプルスクリプト

Twitterみたいなつぶやきの投稿を実現するような関数を書いてみた。

def prepend_to_mediawiki(update_datetime, tweet_body):
    #  MUST Parameters
    url = 'http://HOGEHOGE/mediawiki/api.php'
    target_pagename = ''
    target_section_no = ''

    # edit
    prependtext = '==%s: %s==\n\n' % (update_datetime, tweet_body)
    data = {
        'action' : 'edit',
        'title' : target_pagename,
        'section' : target_section_no,
        'prependtext' : prependtext,
        'token' : '+\\'
    }
    r = requests.post(url, data=data)

    print "=== result header of editting request === "
    print r.headers

なお、これを実現するためには、以下の様なページ(以下の例だとセクション番号は "2" を指定すれば、つぶやき一覧部分に prepend できる)をあらかじめ作っておく必要がある。

= ここは? =
Twitterのようにつぶやきをストックしてみるページです。

= つぶやき一覧 =

= dummy section =
この見出しはダミーです。上記の見出しに prepend するために必要なものなので削除しないでください。