Pukiwiki 1.4.5_1 (EUC)を Pukiwiki 1.5.0(UTF-8)に更新したときのメモ (2021/4)

研究室で使ってるpukiwikiが突如真っ白

かなり昔から使っていたのですが表示ができなくなり更新しました.文字列がEUCで作成していたのでUTF-8にする必要があります.かなり苦労したので少しメモを残しておきます.web上の記述もほとんどないですね.(3ヶ月前に行ったときの記憶で書くので少し違うかも知れません)

やること

  1. pukiwiki1.4.5_1を pukiwiki1.5.0に更新
  2. EUCで書かれている部分を全部 UTF-8にする (これがホントに大変)

(ただし attacheの部分はできていません.更新の際に捨てました)

新規pukiwiki1.5.0のインストール

これはほとんど問題なし.公式を参考にdowload先から utf8版のpukiwiki1.5.0を選択してdownload./var/wwwなど htmlを展開しているところに置くとまずすぐ動いた.

旧pukiwiki (EUCで書かれている) を文字列を変更して移行

/var/www などの下でおいている pukiwiki/ 以下のバックアップをとる

基本的にattach、backup、cache、counter、diff、wiki の以下のファイルをpukiwiki1.5.0と同じ場所に置くと良い.ただし,ファイル名がDEC9CDF8.txtなどとencodeされていて,これが全部EUCになっているものをUTF-8にしないと表示されない...

encs.phpを使って各EUCエンコードされたファイル名(中身もEUC)のものはUTF-8エンコードしたファイル名(中身はEUCのまま)に変換する

まずencls.phpというものをdownload(公式のどこかに指示がありました).しかし使い方に説明無し.これは 1) 指定したディレクトリについて 2) 指定した suffixのファイルを (.txt) を読み込んで 3)指定した文字エンコードにencodeした名前を stdoudに出力するだけです.なので実行しても基本的になにも変化がありません.

そこでencs.phpを下記のように書き換えました(一部表示).やっていることは1)指定のディレクトリのファイル.suffixを読み込んで 新規に サブディレクトリ tmp/の下に UTF-8のファイル名でファイルをコピーしたものを作るというものです.wikiのデイレクトリがだいたい本体で.txtだけですが cache (pukiwikiだと左側の更新リストで表示されるところ)が .refとかあるので,それぞれのデイレクトリで少しずつ実行して UTF-8のタイトルに変更した(かつ中身の文字列もEUCからUTF-8)ファイルを作成します.

// Do
mb_internal_encoding(SOURCE_ENCODING);
mb_detect_order('auto');
$write_dir = './tmp/'; //これ加えた
$matches = array();
foreach ($argv as $arg) {
if (preg_match('/^(.+)(\.[a-zA-Z0-9]+)$/', $arg, $matches)) {
$name = $matches[1];
$suffix = $matches[2];
} else {
$name = $arg;
$suffix = '';
}
//echo $name . $suffix . "\n"; // As-is
if ($f_decode) {
// Decord
echo decode($name) . $suffix . "\n";
} else {
// Decord -> convert -> encode
echo encode(mb_convert_encoding(decode($name),
TARGET_ENCODING, SOURCE_ENCODING)) .
$suffix . "\n";
// copy files with new names <<<< ここを書き換えている.ここから copyまで
$euc_f_name = $name . $suffix ;
$utf8_f_name = $write_dir . encode(mb_convert_encoding(decode($name),
TARGET_ENCODING, SOURCE_ENCODING)) .
$suffix;
copy($euc_f_name,$utf8_f_name);
}
//echo "\n";
}

上記の部分は単に tmpファイルに ファイル名をUTF-8に変換するだけです.

まず自分のpukiwikiの全体をコピー作業用puwkiwkiを /home/jibun/old_pukiwikiとして, wikiのディレクトリについて作業するとします.
先に,/home/jibun/old_pukiwiki/wiki/tmp を作成しておきます

mkdir /home/jibun/old_pukiwiki/wiki/tmp

それで下記のように実行します

cd /home/jibun/old_pukiwiki/wiki
php (enc.phpへのパス)/encls.php --all 

すると /home/jibun/old_pukiwiki/wiki/tmp の下に utf-8名になったファイルがコピーされます (中身の文字はEUCのまま).

次に, /home/jibun/old_pukiwiki/wiki/tmp の下のファイルの中身をEUCから UTF-8に変更します.
nkfを使いました.CentOS7上では下記のように実行しました.

cd /home/jibun/old_pukiwiki/wiki/tmp
find . -type f -print0 | xargs -0 -n 256 nkf --overwrite -w -Lu

この内容を pukiwiki1.5.0の wikiの下にコピーすると見えます.他のディレクトリも同様です.

cacheの変換

cacheディレクトリの場合は他のタイプのファイルもあるのでそれも変換します.

mkdir /home/jibun/old_pukiwiki/cache/tmp
cd /home/jibun/old_pukiwiki/cache/
php (enc.phpへのパス)/encls.php --suffix='.ref' --all
php (enc.phpへのパス)/encls.php --suffix='.rel' --all

これとファイル名がautolink.datなど英語表記で変換しないものもあるのでそれはコピーします.

cp *.dat tmp/
cp *.html tmp/

このあと中身をutf-8にします

cd /home/jibun/old_pukiwiki/cache/tmp
find . -type f -print0 | xargs -0 -n 256 nkf --overwrite -w -Lu

cache/tmpの内容を 新規  pukiwiki1.5.0の cacheの下に置くと左側に履歴がでると思います

あとのbackupなどはほとんど使って無かったので変換しましたが確認していません.
あと,attacheですが,ファイル名との関係が複雑で (attacheファイルが windowsの shift-jisのテキストなどいろいろあり,また何番目のファイルがattacheされていかなど管理されているのですが,そこを復元するのが難しいそうなのでしませんでした.

webサイトを更新 (2017/3/28)

Webサイトを更新しました.CMSそのものを入れ替えてコンテンツなどを整理しました.更新によってなにか今まで公開していた古いデータなどがもし必用な場合はご連絡下さい.

redmine1.1.2から redmine3.2に問題なく移行(2016/11/04)

CentOS7.2 に新規にredmine3.2を入れて,旧redmine1.1.2で作成してきたデータを移行できました.redmineってよくできてます.下記が方法です.

データの保存

  • データの保存(mysql)
    mysqldump -u root -p --default-character-set=utf8 db_redmine > /tmp/redmine_backup_`date +%Y%m%d-%H%M%S`.sql
  • データの保存(wikiなどでの添付ファイル)
    /var/lib/redmine/files をtarで固めて移動 (/var/lib/redmineの部分は設定による)
    cd /var/lib/redmine
    tar cvfz filesback.tgz files

インストール (CentOS7.2)

  • getenforce で確認して SELinux切る
  • firewall 空ける
    firewall-cmd --zone=public --add-service=http --permanent
    firewall-cmd --reload
  • パッケージインストール
    yum groupinstall "Development Tools"
    yum install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel libffi-devel httpd-devel 
    yum install ImageMagick ImageMagick-devel ipa-pgothic-fonts 
  • mysqlを入れる (mariaDBの削除)
    yum remove mariadb-libs
    yum install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
    yum install mysql-community-server
    yum install mysql-devel
    • /etc/my.cnf を開いて最後に下記を追加(文字はUTF-8を利用)
      character_set_server=utf8
      skip-character-set-client-handshake
    • 起動
      touch  /var/lib/mysql/mysql.sock
      chown -R mysql:mysql /var/lib/mysql
      systemctl start mysqld.service
    • mysqlのパスワードなど設定
      mysql_secure_installation (これを実行)
      この時,最初のmysqlのrootパスワードの質問は無視
      Enter current password for root (enter for none): (空でenter)
      あとはいろいろ
      systemctl restart mysqld.service
  • DBにredmine(ver1.1.2)をコピーする
    • まずDBに空の redmineデータベースを作成し,redmineユーザを作る
      mysql -u root -p で入る
      CREATE DATABASE redmine CHARACTER SET utf8;
      CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'パスワード';
      GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
      quit;
    • 先ほど保存した過去のredmineDBを入れる
      mysql -u root -p --default-character-set=utf8 redmine < redmine_backup_20161104-080707.sql 
  • Rubyを CentOS7.2にいれる
    • デフォルトでは 2.0.0 が入ってるが(/usr/bin/ruby)それは削除.2.2.3にする.
    • 特に消してもバージョンアップしても今のところ問題なかった
      curl -O https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz
      tar xvfz ruby-2.2.3.tar.gz
      cd ruby-2.2.3
      ./configure --disable-install-doc
      make
      make install で
      /usr/local/bin/ruby に入る
      (確認)
      ruby -v
  • gemのインストール
    gem install bundler --no-rdoc --no-ri
  • Redmineを入れる 参考は http://blog.redmine.jp/articles/3_2/install/centos/ http://weblabo.oscasierra.net/install-redmine32-centos7-1/など.redmine 3.2を入れる
    curl -O http://www.redmine.org/releases/redmine-3.2.0.tar.gz
    tar xvfz redmine-3.2.0.tar.gz
    mv redmine-3.2.0 /var/lib/  (ここはお好み)
    それで名前をredmineに変える
    cd /var/lib/
    mv redmine-3.2.0  redmine
    (この後,redmineディレクトリの下を全部 ユーザapache,グループapacheに変更するが,まだいろいろインストールするので最後にする)
  • Redmineまわりの設定とファイルの移動

    • データベース接続設定
      cd /var/lib/redmine/config/
      cp database.yml.example database.yml
      • database.ymlで 最初のproductionだけ書き直した
        production:
        adapter: mysql2
        database: redmine
        host: localhost
        username: redmine
        password: "パスワード"
        encoding: utf8
    • configuration.ymlの作成(メールの設定)
      • /var/lib/redmine/config/configuration.yml を新規に作る.configuration.yml.exampleというのもあるみたいだけど無視した
      • 内容は下記(メールの設定に合わせる)
        production:
         email_delivery:
           delivery_method: :smtp
           smtp_settings:
             address: "localhost" 
             port: 25
             domain: "fullのドメイン名" 
        
         rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
        
    • 必要なファイルのdownload
      cd /var/lib/redmine
      bundle install --without development test --path vendor/bundle
      ここでエラーがでた場合はメッセージを読む
      (database.ymlの中が正しいか,mysql関係のライブラリが不足しているか?など)
    • 秘密鍵の作成
      cd /var/lib/redmine
      bundle exec rake generate_secret_token
      下記のワーニングが出る
      /var/lib/redmine/vendor/bundle/ruby/2.2.0/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: duplicated key at line 466 ignored: "inodot"
    • httpd との連携にむけて (passengerなどいれる)
      cd /var/lib/redmine
      gem install passenger --no-rdoc --no-ri
      passenger-install-apache2-module --auto
    • httpdに登録すべき内容の表示
      passenger-install-apache2-module --snippet

      と打つと

      LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.30/buildout/apache2/mod_passenger.so
      
       <IfModule mod_passenger.c>
       PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.30
       PassengerDefaultRuby /usr/local/bin/ruby
       </IfModule>
      
    • 上記の内容をhttpdに設定
      touch /etc/httpd/conf.d/redmine.conf
      • としてファイルを作って内容は下記
         
         <Directory "/var/lib/redmine/public">
         Require all granted
         </Directory>
         
         LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.30/buildout/apache2/mod_passenger.so
         
         <IfModule mod_passenger.c>
          PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.30
          PassengerDefaultRuby /usr/local/bin/ruby
         </IfModule>
         
         RackBaseURI /redmine
         (この最後の1行も重要)

  • 旧redmineのfileをコピーする
    cd /var/lib/redmine
    mv files filesBak
    mv filesback.tgz  .
    tar xvfz filesback.tgz
    これで files ディレクトリが /var/lib/redmineの下にできる
  • データベースを修正する(これが重要)
    cd /var/lib/redmine
    RAILS_ENV=production bundle exec rake db:migrate
  • Redmineの下を apacheユーザ,apacheグループの権限に変える
    chown -R apache:apache /var/lib/redmine
  • /var/www/html/ がhttpdが公開するディレクトリの時,この下にシンボリックリンクを張る
    ln -s /var/lib/redmine/public /var/www/html/redmine 

起動

 systemctl restart httpd.service

起動時に自動で立ち上げるには

 systemctl enable httpd.service

アクセス

http://localhost/redmine/ のところにアクセスすると表示される. 

Scalaでhtmlをパース (DOM) (2015/6/9)

Scalaでhtmlファイルを読み込んでいろいろ処理をしたいときがあります.DOMの構造に落とすことが出来るのでやってみました(2015.6.9) Scalaのversionは 2.10.4.Eclipse4.4上で Scalaは pluginで入れました.

まず準備

nu.validator.htmlparser.dom.HtmlDocumentBuilderを使うためにインストールします.googleで検索して htmlparser-1.4.zip というファイルをdownloadします.

次に展開して htmlparser-1.4.jar ファイルをEclipseの Scalaに読み込ませます.やり方はEclipseの [プロジェクト]>[プロパティ]>[Javaのビルド・パス]の[ライブラリー]タブを開き,「外部jar追加」でさきほどの htmlparser-1.4.jarを読み込ませます.これでnu.validator.htmlparser.dom.HtmlDocumentBuilderをimport出来ます.

プログラム

import scala.io.Source

import nu.validator.htmlparser.dom.HtmlDocumentBuilder
import java.io.StringReader
import org.xml.sax.InputSource

object Domp {
 def main(args: Array[String]) {
   val builder = new HtmlDocumentBuilder()
   val source = Source.fromFile("/home/なにかhtmlのファイル")
   val sreader = new StringReader(source.mkString)
   
   // parseをします
   val dom = builder.parse(new InputSource(sreader))
   
   // 一番上の一つ下の子供はhtml.なのでその下を取ってみます
   val child = dom.getChildNodes().item(0) //この0番目は トップのhtml
   val size = child.getChildNodes().getLength //htmlの下を取る
   //どうもJavaベースらしく配列に対して数を数えてループを回さないととれない!?
   for(i <- 0 until size){
         println("i="+i) //何番目の子供か表示させてみました
        println (child.getChildNodes().item(i).getNodeName) //子のタグ名
   }
 }
}
入力のファイルはこんな感じ
test.html

<html>
<title>テストタイトル</title>
<body>
<h1> テスト </h1>
</body>
</html>

すると出力は下記のようになります

i=0
head
i=1
body

つまり htmlのタグの下には titleとbodyタグが子ノードしてあることがわかります.

childなどの型は org.w3c.dom.Nodeなのであとは調べるといろいろメソッドがありそうです.

参考: http://blog.mwsoft.jp/article/45131631.html