Hiki 1.0.0へアップグレード

前置き

当サイトのWikiエンジン(Hiki)を、0.8.8から1.0.0へアップグレードしました。これがブチ面倒だったという話しです。

EUC-JPからUTF-8へ

文字コードがEUC-JPからUTF-8へ変わりました。ははは…。

当然、既存データのマイグレーションは完璧にサポートされて……ない。マジ? なんか変換用のスクリプトっぽいものが同梱されてるけど、私の環境では、うまく動きませんでした。ググってみると、いくつか情報が見つかりますが、どれも合いません。

結局、自分で変換スクリプトを書きました。やることは、以下の通り。

  • hiki.confの、EUC8進数表記部分(サイト名など)をUnicodeコードポイントに変換
  • info.dbの、もろもろ(記事タイトルとかファイル名とか参照ページとか)を変換
  • 記事ファイル(text/*)の、内容とファイル名を変換
  • 添付ファイル置き場(cache/attach/*)の、ディレクトリ名を変換
使い方
ruby mighiki.rb hiki.conf >c
ruby mighiki.rb info.db >i
ruby mighiki.rb text
ruby mighiki.rb attach
cp c hiki.conf
cp i info.db

※textとattachは破壊的なので、一発勝負です。

遅い

妙に遅いです。もう、アップグレードを断念しようかと思うくらい遅いんです。1つの記事を開くのに5~10秒くらい(体感)。ruby自体のバージョンも1.8.7から1.9.3に上げたので、それが影響してるかもしれません。

泥臭い方法で調べて、どうやら、オートリンク生成時に呼ばれるPStore#transactionが原因だと分かりました。記事数に比例して遅くなる感じです。しかたないので、Hikiを改ざんしました。

HikiDB_flatfile#get_attribute(hiki/db/flatfile.rb)
    def get_attribute(page, attribute)
      f = escape(page)

# it seems to be painfully slow to lookup attribute.
# and it costs so much for get_auto_links in cmd_view.
return '' if attribute == :title

      @info.transaction(true) do
        if @info.root?(f)
          @info[f][attribute] || default[attribute]
        else
          default[attribute]
        end
      end
    end

当然、弊害もあると思いますが…。

記事のURLが変わる

Hikiでは、基本的に記事タイトルがそのままURLになります。EUC-JPからUTF-8に変わったので、パーセントエンコードされたURLも変わってしまいます。結局、ブックマークとか検索サイトから飛んでくる人は、昔の記事にアクセスできません(「stringに変な文字が混ざっとる」と怒られて500エラー)。ここでも、Hikiを改ざんします。

Command#initialize(hiki/command.rb)の、@pを正規表現と比較する手前
      @p = case @request.params.keys.size
           ...
           ...

# rescue old url(percent encoded in euc-jp)
begin
  /hogehoge/ =~ @p
rescue
  @p = @p.encode('utf-8', 'euc-jp')
end

      if /\A\.{1,2}\z/ =~ @p
        redirect(@request, @conf.index_url)
        return
      end

ファイルが添付できない

標準プラグインのattach.cgiは動かないようです(9行目のsymlink?のところで、Insecure operationとなり500エラー)。

諦めて、ハンドでアップロードしましょう。text/attach/の下に、(パーセントエンコードした)記事名でディレクトリを作って、その下に置きます。

Last modified:2014/10/24 19:01:09
Keyword(s):
References:[サーバ管理・Linux関連]
This page is frozen.