の形で呼ぶ。
//
// anchor_idはフレームを使う場合最低限各フレームごとに設定。お互い他のフレームを書換えたときにへんな干渉をさけるため。
// その他ページの種別毎などで変えてもよいが、あまり小分けにするとcookieが増える。
// 同じanchor_idで保存されるcookieは1セットのみ。でも単独ページ表示のサイトなら概ねこれで充分。
anchor_id = "anc_main";
noanchor = false; // bodyにanchorをしかけたときなど場合によって一時無効にするためのフラグ。
// アンカーの記憶。
function anchor_save(object_id, page_id) {
if(noanchor) { anchor_erase(); return; }
get_scroll();
setcookie(anchor_id+"_pid", page_id, 0);
setcookie(anchor_id+"_st", scroll_top, 0);
setcookie(anchor_id+"_sl", scroll_left, 0);
if(object_id) {
object_top = scroll_top + get_object_top(object_id);
object_left = scroll_left + get_object_left(object_id);
setcookie(anchor_id+"_oid", object_id, 0);
setcookie(anchor_id+"_ot", object_top, 0);
setcookie(anchor_id+"_ol", object_left, 0);
} else {
setcookie(anchor_id+"_oid", "", -1);
setcookie(anchor_id+"_ot", "", -1);
setcookie(anchor_id+"_ol", "", -1);
}
}
// アンカーの適用。
function anchor_apply(page_id) {
if((saved_page_id = getcookie(anchor_id+"_pid")) && page_id != saved_page_id) { return; }
get_scroll();
if((anchor_st = getcookie(anchor_id+"_st")) != "" && (anchor_sl = getcookie(anchor_id+"_sl")) != "") {
anchor_st = parseInt(anchor_st);
anchor_sl = parseInt(anchor_sl);
} else {
anchor_st = scroll_top;
anchor_sl = scroll_left;
}
if((object_id = getcookie(anchor_id+"_oid"))
&& (anchor_ot = getcookie(anchor_id+"_ot")) != ""
&& (anchor_ol = getcookie(anchor_id+"_ol")) != "") {
offset_top = (scroll_top + get_object_top(object_id)) - parseInt(anchor_ot);
offset_left = (scroll_left + get_object_left(object_id)) - parseInt(anchor_ol);
} else {
offset_top = offset_left = 0;
}
window.scrollTo(anchor_sl + offset_left, anchor_st + offset_top);
}
// アンカー消去。あえてとっておく必要がなければanchor_apply()後すぐ消去が望ましい。
function anchor_erase() {
setcookie(anchor_id+"_pid", "", -1);
setcookie(anchor_id+"_st", "", -1);
setcookie(anchor_id+"_sl", "", -1);
setcookie(anchor_id+"_oid", "", -1);
setcookie(anchor_id+"_ot", "", -1);
setcookie(anchor_id+"_ol", "", -1);
}
//-->
倉金家ホームページ
趣味の部屋/サーバー構築メモ その2
Vine Linux 4.2 の古いサーバーをバックアップサーバーとして使い、CentOS 5.5 の新しいサーバーのサイトをバックアップします。 両者のサーバーでディフォルト言語が異なる(EUC-JPとUTF-8)ため、バックアップサーバーからホームページを読み出してもそのままちゃんと表示するようにするために少々言語設定が必要でした。 |
|
|
新しく構築したCentOS 5.5のインターネットサーバーは順調に稼動しています。 古い Vine Linux 4.2 のサーバーをそのままバックアップサーバーとして使い、新しいCentOS 5.5のサーバーのサイトをバックアップします。 ただしバックアップとはいっても単にファイルを保存しておけばいいというのではなく、いざという時にはルーターのDMZアドレスを振替えるだけでそのまま代替のインターネットサーバーとして動作するようにしておきます。
問題があるとすれば、 1)ソフトのバージョンによる動作のちがい。 2)言語エンコーディングのちがい。 が考えられます。 1)については、どちらか一方のバージョンでしか動かないような機能は使っていないはずなので、さほど大きな問題はなさそうです。 問題は2)の言語エンコーディングの違いと思われます。
Vine Linux 4.2はEUC-JP、CentOS 5.5はUTF-8を使っていますが、少なくともVine LinuxからCentOSにファイルを移し、移したファイルをUTF-8に変換してエンコーディング指示もUTF-8に変更した分には問題はありませんでした。 (けっこうな手間だったけど。) ただバックアップとなるといちいちこんな変換や変更はやってはいられません。ファイルをコピーするだけでちゃんと動くようにしておかなくてはなりません。
|
事前準備
まずは新しいサーバーとバックアップサーバーとで、関連するユーザのユーザ名とユーザ番号、グループ番号をあわせておきます。 これはサーバー構築時から意識していたので特に問題ありません。 バックアップサーバーからNFSで新サーバーのホームディレクトリが見れるようにします。書き込みはできなくてもかまいません。これも設定ずみです。 バックアップスクリプトを準備します。 httpデータの移行で使ったスクリプトと似たようなもん。
|
#!/bin/sh
LOGFILE="/var/log/backup.log" function dir_copy() { echo "copying from $1 to $2" | tee -a "$LOGFILE" if [ -d "$1" -a -d "$2" ] then cd "$1" find . -print | cpio -avdump "$2" 2>&1 \ | grep -v "newer or same age version exists" \ | sed "s/\/\.\//\//" \ | pickup_file \ | tee -a "$LOGFILE" echo | tee -a "$LOGFILE" else echo "********** Can't open $1 or $2 **********" | tee -a "$LOGFILE" echo | tee -a "$LOGFILE" fi }
function dir_update() { echo "updatecopying from $1 to $2" | tee -a "$LOGFILE" if [ -d "$1" -a -d "$2" ] then cd "$1" find . -print | cpio -avdmp "$2" 2>&1 \ | grep -v "newer or same age version exists" \ | sed "s/\/\.\//\//" \ | pickup_file \ | tee -a "$LOGFILE" echo | tee -a "$LOGFILE" else echo "********** Can't open $1 or $2 ***********" | tee -a "$LOGFILE" echo | tee -a "$LOGFILE" fi }
function sqldata_copy() { echo "copying from $1 to $2" | tee -a "$LOGFILE" if [ -d "$1" -a -d "$2" ] then cd "$1" # 注意:sortの記述はテーブル名の番号の付け方に応じて。ぬいても可。 find . -print | sort -n -t "_" -k 2 | cpio -avdump "$2" 2>&1 \ | grep -v "newer or same age version exists" \ | sed "s/\/\.\//\//" \ | pickup_file \ | tee -a "$LOGFILE" echo | tee -a "$LOGFILE" else echo "********** Can't open $1 or $2 **********" | tee -a "$LOGFILE" echo | tee -a "$LOGFILE" fi }
#ファイル名(ディレクトリ名以外)のみピックアップして出力 function pickup_file() { while read path do if [ ! -d "$path" ] ; then echo "$path" fi done }
echo "$0 start" | tee "$LOGFILE" date | tee -a "$LOGFILE" echo | tee -a "$LOGFILE"
# 以下にバックアップするサイトを羅列
#### kuragane.jp #### SRCDIR="/mnt/home.jiji/kuragane.jp" TGTDIR="/home/kuragane.jp" dir_update $SRCDIR $TGTDIR
SRCDIR="/mnt/home.jiji/mysql/SQL_kuragane" TGTDIR="/home/mysql/SQL_kuragane" sqldata_copy $SRCDIR $TGTDIR
#### ...... #### ....
|
|
やってみる
まずは新しいサーバーのサイトのデータ(http表示ディレクトリ)をそっくりバックアップサーバーにコピーします。 文字化けするだろうなと思いながらブラウザでアクセス。...文字化けどころか何も表示されません。
apacheのエラーログを見ると日本語処理関係の関数(mb string関係の関数)がエラーを起こしています。EUC-JPで動いているphpモジュールにUTF-8を処理させようとしたためのようです。
まずはこのエラーを修正、引き続いて文字化けを修正、何とか問題なく動くようになりました。 phpモジュールやMySQLサーバーなどのディフォルトの言語設定をみなUTF-8に変えてしまえば簡単かもしれませんが、もともとの別のソフトをそのまま動かすためにはそうはいきません。
以下、いろいろやったこと。 基本的には入ってくるデータをすべて必要に応じてUTF-8に変換し、内部処理をUTF-8で行い、あとはそのまま出力するというもの。
|
1.phpモジュールの言語設定
ディフォルトの言語がEUC-JPのVine4のphpは当然EUC-JPがディフォルトの言語設定になっています。 php.iniで以下を指定しています。 default_charset=EUC-JP mbstring.internal_encoding=EUC-JP ただし他との関連もあるのでこれを変えてしまうわけにもいきません。 で、ページの頭でセッティングファイルをインクルードすることにして、すべてのページの頭に以下を記載。 <?php include_once('setting.inc.php'); ?>
セッティングファイルsetting.inc.phpに以下を記載。 <?php mb_internal_encoding('UTF-8'); mb_regex_encoding('UTF-8'); ?>
|
2.MySQLの言語設定
バックアップサーバーのMySQLも当然ディフォルトのEUC-JPで動いています。(my.confで設定。) データベースをオープンしてすぐに以下のクエリーで言語を変更。 mysql_query('SET NAMES utf-8'); バージョンの関係でSET NAMESを使用したが、セキュリティー上多少問題がある方法なのでPHP-5.2.3以降なら mysql_set_charset('utf-8'); のほうがいいかと。
|
3.読み込みデータの変換
POSTやREQUESTデータがUTF-8になっていません。httpサーバーがUTF-8以外を指定してしまうのか、あるいはどこかで変換されてしまうかよくわかりません。
念のため<form .... accept-charset="utf-8">でブラウザがデータをutf-8で送信するように、すべての<form>タグにaccept-charset="utf-8"を記載。
POSTあるいはREQUESTを受けるページの頭でこれらをUTF-8に変換。 ページの頭でセッティングファイルをインクルードするようになっていますので、これに以下を記載。 <?php if(!empty($_REQUEST)){ mb_convert_variables('UTF-8', 'auto', $_REQUEST); } if(!empty($_POST)){ mb_convert_variables('UTF-8', 'auto', $_POST); } ?>
|
4.ファイルの言語変換
ファイルの言語変換はもうやりません。バックアップしたファイルはUTF-8のままにしておきます。 バックアップサーバーでファイルを開いて見るときなどはいちいちUTF-8を指定しなくてはなりませんが、めったにないのでいいことにします。(昔のShift-JISのファイルもそのままだし。)
|
以上でバックアップサーバーからホームページを読み出してもちゃんと表示されるようになりました。
|
|
|