底なし沼のミュージックストア

好きなもの(特に音楽)について書いてあるでことでしょう。音楽は売ってません。たまに技術的な話。

さくらのレンサバ上のMediaWikiにWikipediaのNavboxテンプレートを移植する

めっちゃ苦労したので書き残しておくことにする。
清書するつもりはないので、やり方だけ知りたい人は一番上にまとめときます。

Navboxの移植方法まとめ

  1. Wikipediaのデータ書き出しページに飛ぶ
  2. テキストボックスにこいつらを入れて書き出しボタンでダウンロード
    • Template:Navbox
    • MediaWiki:Common.js
    • MediaWiki:Common.css
    • Module:Navbox
    • Module:Navbox/doc
    • Module:Navbox/former
    • Module:Navbox/former/sandbox
    • Module:Navbox/sandbox
    • Module:Arguments
    • Module:Arguments/doc
  3. 自分のWiki/Special:Importを開いて、さっきDLしたxmlをアップロード
  4. Extension:Scribunto - MediaWikiからファイルをダウンロードし、さくらのサーバー上のwiki/extensionsに展開
  5. さくらのサーバーにSSHで接続。この辺りを参考にどうぞ。公開鍵認証は設定しておくと色々楽です。
  6. ~/local/src/ディレクトリが存在しなければmkdirで作成しておく
  7. コマンドラインから次の手順でScribunto用のLuaコンパイルする
    cd ~/local/src/
    wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
    tar -zxvf lua-5.*
    cd lua-5.1.5
    make freebsd LDFLAGS+="-L/usr/local/lib" LIBS+="-lreadline -ltinfo -lm"
    make local
    cd bin
    ln -s lua lua-5.1.5
    無事にコンパイルが終わったらSSHは切断して問題ない(次の手順をコマンドラインでやりたければそれはそれで。。。)
  8. さくらのサーバーコンパネからファイルマネージャでLocalSettings.phpを開いて以下のように追記する
    $wgPFEnableStringFunctions = true;
    wfLoadExtension( 'Scribunto' );
    $wgScribuntoDefaultEngine = 'luastandalone';
    $wgScribuntoEngineConf['luastandalone']['luaPath'] = '/home/『自分のユーザ名』/local/src/lua-5.1.5/bin/lua-5.1.5';
    $wgScribuntoEngineConf['luastandalone']['errorFile'] = '/home/『自分のユーザ名』/www/『自分のWikiディレクトリ』/extensions/Scribunto/errorfile.log';
    $wgScribuntoUseGeSHi = true;
    $wgScribuntoUseCodeEditor = true;
  9. Navboxを使ってページ作成をしてみて動けば完了。

以下は非常に雑多な奮闘記。書き殴りたかっただけなので読まなくても問題ないです。

沼の始まり

  1. Navboxが欲しくて色々ググったものの、英語版Wikipediaしかそれっぽい手順がなかったので従う
    1. Wikipediaのデータ書き出しページに飛ぶ
    2. テキストボックスにこいつらを入れて書き出しボタンでダウンロード
    3. "自分のWiki/Special:Import"を開いて、さっきDLしたxmlをアップロード
    4. ParserFunctions拡張機能をインストール(最新版のMediaWikiにはファイルが同梱されてるのでLocalSetting.phpをいじるだけ)
    5. http://www.chekmate.org/wiki/index.php/MW:_ImageMap_Extensionとやらをインストール ←ココで引っかかる
  2. サイトに繋がらないので次のフェーズに移る

地獄の入り口

  1. とりあえずTemplate:Navboxインポートしたし開いてみるか→Luaのモジュールがないと怒られる→「Scribunto」とやらをいんすとーるすればよいらしい
  2. Extension:Scribunto - MediaWikiに従ってインストール→動かない
    • さくらのレンサバはFreeBSDらしいのだが、Scribuntoに同梱されているluaのバイナリはWin/Mac/Linuxしかないので自力導入が必要らしい。
    • 「……さくらのレンサバってバイナリのインストールとかできんだっけ?」
  3. MediaWikiにExtension:Scribuntoをインストール – Remove Before Flightを見つけたところ、できるらしい。やったね。
  4. とりあえずLua: download areaから最新版のソースをDLしてきてコンパイル。バイナリ生成できた。
  5. Wikipediaから以下のやつらをExportして自分のWikiにImport。
    • Module:Navbox
    • Module:Navbox/doc
    • Module:Navbox/former
    • Module:Navbox/former/sandbox
    • Module:Navbox/sandbox
  6. Module:Navboxを開いてみる→「エラー:ステータス1」とか表示されてキレる。
  7. MediaWikiにExtension:Scribuntoをインストール – Remove Before Flightに立ち返ってみたところ「2016年3月7日現在、Luaの最新バージョンは5.3.2になっているが、Lua 5.2.xやLua 5.3.xを使用すると
    ステータス1」を返してインタープリターがエラーを起こすことがある模様。
    と書いてあった。3年も経ってるんだから直ってると思うじゃないか……
  8. Lua5.1系の最終版、「Lua5.1.5」をDLしてコンパイル→次のようなエラーが発生する
    gcc -o lua  lua.o liblua.a -lm -Wl,-E -lreadline
    //usr/local/lib/libreadline.so: undefined reference to tputs'
    //usr/local/lib/libreadline.so: undefined reference totgoto'
    //usr/local/lib/libreadline.so: undefined reference to tgetflag'
    //usr/local/lib/libreadline.so: undefined reference toUP'
    //usr/local/lib/libreadline.so: undefined reference to tgetent'
    //usr/local/lib/libreadline.so: undefined reference totgetnum'
    //usr/local/lib/libreadline.so: undefined reference to PC'
    //usr/local/lib/libreadline.so: undefined reference totgetstr'
    //usr/local/lib/libreadline.so: undefined reference to `BC'
    collect2: error: ld returned 1 exit status
    *** Error code 1
    つらい……

Luaコンパイルをどうにかして通す

  1. エラー文でググっているとLua を一般ユーザでソースコードからインストールする - はちゅにっきを発見。ただしこちらの方の解決方法は既にncursesを自力で準備している環境だったため真似るだけでは解決できず。
  2. 30分くらいネットの海で溺れていたところFreeBSDのフォーラムでhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id=220796を発見。makeコマンドの末尾にLDFLAGS+=-L/usr/local/lib LIBS+="-lreadline -ltinfo"を追加してみたらエラー文が次のように変わる。
    gcc -o lua  lua.o liblua.a -lreadline -ltinfo
    liblua.a(lvm.o): In function Arith':
    lvm.c:(.text+0x411): undefined reference topow'
    liblua.a(lvm.o): In function luaV_execute':
    lvm.c:(.text+0x22f2): undefined reference topow'
    liblua.a(lcode.o): In function codearith':
    lcode.c:(.text+0x1121): undefined reference topow'
    liblua.a(lmathlib.o): In function math_tan':
    lmathlib.c:(.text+0x9f): undefined reference totan'
    liblua.a(lmathlib.o): In function math_tanh':
    lmathlib.c:(.text+0xcf): undefined reference totanh'
    liblua.a(lmathlib.o): In function math_sqrt':
    lmathlib.c:(.text+0x12e): undefined reference tosqrt'
    liblua.a(lmathlib.o): In function math_sin':
    lmathlib.c:(.text+0x14f): undefined reference tosin'
    liblua.a(lmathlib.o): In function math_sinh':
    lmathlib.c:(.text+0x17f): undefined reference tosinh'
    liblua.a(lmathlib.o): In function math_pow':
    lmathlib.c:(.text+0x5cc): undefined reference topow'
    liblua.a(lmathlib.o): In function math_log':
    lmathlib.c:(.text+0x64f): undefined reference tolog'
    liblua.a(lmathlib.o): In function math_log10':
    lmathlib.c:(.text+0x67f): undefined reference tolog10'
    liblua.a(lmathlib.o): In function math_fmod':
    lmathlib.c:(.text+0x74c): undefined reference tofmod'
    liblua.a(lmathlib.o): In function math_exp':
    lmathlib.c:(.text+0x77f): undefined reference toexp'
    liblua.a(lmathlib.o): In function math_cos':
    lmathlib.c:(.text+0x7af): undefined reference tocos'
    liblua.a(lmathlib.o): In function math_cosh':
    lmathlib.c:(.text+0x7df): undefined reference tocosh'
    liblua.a(lmathlib.o): In function math_atan':
    lmathlib.c:(.text+0x87f): undefined reference toatan'
    liblua.a(lmathlib.o): In function math_atan2':
    lmathlib.c:(.text+0x8cc): undefined reference toatan2'
    liblua.a(lmathlib.o): In function math_asin':
    lmathlib.c:(.text+0x8ff): undefined reference toasin'
    liblua.a(lmathlib.o): In function math_acos':
    lmathlib.c:(.text+0x92f): undefined reference toacos'
    collect2: error: ld returned 1 exit status
    *** Error code 1
    いいところまで来た気がする!
  3. エラー文の1行目と2行目を検索窓に突っ込んでみたらgccのコンパイルエラー(undefined reference to `pow') | IT忘備録・メモ書きと日記が見つかった!
  4. というわけでmakeの後ろにLDFLAGS+="-L/usr/local/lib" LIBS+="-lreadline -ltinfo -lm"を追加してみたらコンパイル通ったじゃないか!!!!

動くかと思ったら

  • Luaスクリプトの動作確認のつもりで「Module:Navbox」を開いてみたら「Module:ArgumentがUndefinedやで」とかおっしゃる……
  • 試しにWikipediaで「Module:Argument」を探してみたらそのものズバリがあったのでExport/Import→エラー消えた!
  • もしかしてと思ってTemplate:Navboxを使ったテンプレートを作ってみたらバッチリ動いてる!!!長い戦いだった!!!!!

Navboxの移植を決意してからこのブログを一気に書き上げるまで約3時間でした。
乱文ですが皆様のお役に立てたら嬉しいですね。