2025/4/25 述語項構造シソーラスサーバは復旧しています。
「作業」カテゴリーアーカイブ
Pukiwiki 1.4.5_1 (EUC)を Pukiwiki 1.5.0(UTF-8)に更新したときのメモ (2021/4)
研究室で使ってるpukiwikiが突如真っ白
かなり昔から使っていたのですが表示ができなくなり更新しました.文字列がEUCで作成していたのでUTF-8にする必要があります.かなり苦労したので少しメモを残しておきます.web上の記述もほとんどないですね.(3ヶ月前に行ったときの記憶で書くので少し違うかも知れません)
やること
- pukiwiki1.4.5_1を pukiwiki1.5.0に更新
- 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
- /etc/my.cnf を開いて最後に下記を追加(文字はUTF-8を利用)
- 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
- まずDBに空の redmineデータベースを作成し,redmineユーザを作る
- 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に変更するが,まだいろいろインストールするので最後にする)
- データベース接続設定
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
- database.ymlで 最初のproductionだけ書き直した
- 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まわりの設定とファイルの移動
- 旧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なのであとは調べるといろいろメソッドがありそうです.