MovableTypeのインポートに注意

MovableTypeに他のブログからのバックアップデータを復元しようとしたところ、ファイルが大きすぎるというエラーが発生しました・・・。
確かに20MB近くあるのでけっこうデカイです。

mt-config.cgiを下記のように変更してみました。

## とりあえず50MBくらいにした
CGIMaxUpload 50000000

しかしまだインポートできません。今度はちゃんとアップロードは出来ているようで、完了しましたも出るのになぜだろう。
どうやら改行コードの問題でした。改行コードはLFじゃないとだめらしい。ファイルを調べてみるとCRLFになってました。

vimでファイルを開き、改行コードを変更してアップロードしたところ、成功しました。めでたしめでたし。

## Unix改行コード(LF)に変更
:set fileformat=unix
:wq

lsyncdで簡単サーバー間ミラーリング

サーバ間のデータミラーリングについて調べてみました。
僕がやりたかったのは「別のサーバにデータをコピーしたい」ということでした。
もう一つ条件があります。「簡単」にやりたい。

データのバックアップのためとか、冗長化という意味合いもあると思うのですが、画像などの静的ファイルのみ別のサーバから配信することにします。
ちょっとやっかいなことが、静的ファイルを生成するタイミングがバラバラということです。そして、すぐに別のサーバから配信されるようにしたいというのもありました。

NFSrsync、Unisonなどを使おうと考えていましたが、リアルタイムとなるとけっこう難しいものがあると思います。NFSだとちょっと設定や安定性が不安というのも・・・。あと遠隔地など物理的に距離があると難しそうです。

rsyncやUnisonでリアルタイムに出来るのかな?と思いましたが、調べてみるとlsyncdというものを見つけました。
これはrsyncを使ったものなのですが、Linuxのinotify機能というものを使い、ファイル更新時にリアルタイムでrsyncを実行する事が出来るそうです。なんとスバラシイのでしょうか。

inotify機能について
404 – エラー: 404

今回はこのlsyncdを使ってみようと思います。
使い方はいたって簡単です。まず二つのサーバ(ミラー元とミラー先)にrsyncをインストールします。CentOSを使っていたのでyumを使いました。

# yum install rsync 

まずはミラー先のサーバを設定します。

# /usr/local/etc/rsyncd.conf を作成。設定内容は下記。
# /etc/rsyncd.conf がある場合はそちらのほうがいいかも。
# chrootしない。/etc/localtime が参照できないため、ログの時間がズレる
# chroot先に/etc/localtime を作ってもOK
use chroot = no
# ログの保存先
log file = /var/log/rsyncd.log
# モジュール名
[www]
# rsyncを動かすときのユーザとグループ
uid = nobody
gid = nobody
# ミラー先のパス
path = /home/rsync
# ローカルのみ許可
hosts allow = 192.168.1.0/24
# 書き込み許可
read only = no

パスワードの設定などもできますが使用する場合は、読み込みの権限など気をつけた方がいいかもしれません。
あとは、rsyncdに設定ファイルを読み込ませて起動します。起動ファイルがない場合は下記参照。

#!/bin/sh
# Rsyncd This shell script takes care of starting and stopping the rsync daemon
# description: Rsync is an awesome replication tool.
#
# chkconfig: 345 87 87
# description: Rsync is an awesome replication tool.
# Source function library.
. /etc/rc.d/init.d/functions
[ -f /usr/bin/rsync ] || exit 0
start() {
action "Starting rsyncd: " /usr/bin/rsync --daemon --config=/usr/local/etc/rsyncd.conf
}
stop() {
action "Stopping rsyncd: " killall rsync
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo "Usage: rsyncd {start|stop|restart}"
exit 1
esac
exit 0

次にミラー元サーバの設定をします。下記からlsyncdをダウンロードします。

lsyncd –

Lsyncd (Live Syncing Daemon) synchronizes local directories with a remote targets – Google Project Hosting

$ tar zxvf lsyncd-1.26.tar.gz
$ cd lsyncd-1.26
$ ./configure && make
# make install
# 展開したディレクトリの中にlsyncd.conf.xmlというサンプルがあるので、
# その設定ファイルを/usr/local/etc/lsyncd.conf.xml に保存
# cp lsyncd.conf.xml /usr/local/etc/

lsyncdの設定をします。設定ファイルはXMLで記述するみたいです。

# オプションが下記のようになっていたので、コメントアウトして次のように変更してみました
#<option text="-lt%r"/>
# rsyncのオプションが使えるらしい
<option text="-avz"/>
<option text="--delete"/>
# <directory>から</directory>のセットで、同期ディレクトリを設定
# いくつでも増やせるみたい
<directory>
# 同期元ディレクトリ
<source path="/home/rsync"/>
# 同期先のサーバとモジュール名を指定
# 192.168.0.2::www/hoge/dir こんな感じにモジュール名の後にもパスが書けます
<target path="192.168.0.2::www"/>
</directory>

あとは起動するとすぐに同期(ミラーリング)が始まる模様。起動ファイルは下記のページを参考にちょっといじってみました。
リアルタイムミラーリングツール導入(lsyncd+rsyncd) – Fedoraで自宅サーバー構築

#!/bin/bash
#
# lsyncd
#
# chkconfig: - 99 20
# description: lsyncd auto start script
start() {
/usr/local/bin/lsyncd --conf=/usr/local/etc/lsyncd.conf.xml
}
stop() {
/bin/kill -9 `/sbin/pidof lsyncd`
until [ -z $(/sbin/pidof lsyncd) ]; do :; done
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "lsyncd (pid $pid) is running..."
else
echo "lsyncd is not running"
fi
;;
*)
echo "Usage: lsyncd {start|stop|restart|status}"
exit 1
esac
exit $?

見事にリアルタイムで同期されていました。安定性などはまだ分かりませんがしばらく使ってみようと思います。
今回はローカル環境でしたので、認証や暗号などは一切しませんでしたが気になる方は、sshなどと併用してみるのもアリだと思います。

SQLiteの日付にハマる

この前初めてSQLiteを使ってみたのですが思わぬところでハマってしまいました。

SQLiteではよくある話のようで日付処理に関する問題です。
型の概念がほとんどないらしく、数値と文字列の二つで管理されている?ようです。テーブルを見てみるとDATE型とか表示されるので一見、型があるように思うのですが・・・。

当然日付に関しても数値か文字列でしか管理されないというわけです。
なので、挿入する際に数値か文字列のどちからで統一しておかないと、めんどうなことになりそうです。
日付文字列に関してのフォーマットもあまり柔軟ではないようです。

例えば関数に渡すとき

# YYYY-MM-DD HH:MM:SS これならOK
1999-02-01 23:01:01
# YYYY-M-D H:M:S これだとだめ
1999-2-1 23:1:1

julianday関数で数値化して格納するか、文字列のフォーマットを統一して格納するという感じでしょうか・・・?
文字列のフォーマットを統一する際は、アブリ側でやることになるのでしょうか?PHPならば、mktime、sprintf、strftime、strtotime関数などが使えそうです。RubyならDateクラスなどに同様のメソッドがあるみたい?です。

参考
shiromaru しろまる: SQliteで日付の演算ができるみたいだ
rakuto.net – rakuto Resources and Information. This website is for sale!

ひかりoneギガ得プランの性能とかメールサーバ

前回の記事で無事?に接続出来たわけなので、さっそく回線速度を測ってみました。画像は・・・キャプするの忘れました;;

上りが300Mbps
下りが500Mbps

計測したサイトの限界が500Mbpsと書いてあったので、500Mbps以上出るのかもしれません。予想以上の速度におどろきを隠せません!かなり地域差がでるのでしょうか?
付属のCat5eUTPケーブルを使うと速度が出ないと書いてありましたが、僕の場合は関係なかったみたいです。粗悪品が多いのかな?
そういえば100円ショップでもUTPケーブル売ってました。1m〜3mくらいがあったかな・・・。

実質固定IPアドレスなのでサーバを立てようと思う人もいると思いますが、ちょっと注意が必要かもしれません。
最近は当たり前かもしれないですが、メールを送信する際にSMTPサーバにつながりません。OP25Bというやつです。

そこでプロバイダのメールサーバにリレーしようかと思いました。僕はauone-netなので、まずサイトに接続してメールアドレスを発行しました。
それでSMTPサーバのアドレスを確認したわけですが、こいつを指定してもつながらないわけです・・・。SMTPAuthというやつか?!とか色々考えたのですが、そもそもtelnetで叩いてみても反応がないです。(もちろん、KDDIの回線から)

こんなの
SMTP: msa.ac.auone-net.jp

調べたら中継用のサーバがちゃんと用意されているらしい。サポート対象外らしいです。下のページの一番下のところにありました。
Outbound Port25 Blocking: 迷惑メール対策 | au one net 会員向けサービス | au one net

Sendmailのリレーサーバの指定方法です。

# Sendmail.mc
# 編集後にsendmailをリスタートするだけでOK
define(`SMART_HOST',`smtp:ここに中継用サーバのアドレスを入れる')
# 送信テスト
echo hogehoge | mail -s test [email protected]

参考猫ぐらし: sendmailのデフォルトリレー先の設定

ひかりoneギガ得プランでRTX1200

ひかりoneギガ得プランというのが登場していました。
すごいです・・・家庭でギガですよ!

ということで、さっそく契約してみました。
ひかりoneホームで、プロバイダはauoneというのにしました。旧dionらしい。
それで色々調べてみたわけですが、ルータを指定のものから替えたいという方がけっこう多いらしくて、ちょっと試してみます。
ついでに気になっていたYamaha RTX1200も購入してみました。

f:id:happytar0:20090726120400j:image
これが指定ルータの「NEC Aterm BL190HW」通称HGW
f:id:happytar0:20090726134201p:image
ギガ対応ルータの「Yamaha RTX1200」

調べてみるとMACアドレスを見ているらしい。まず最初にONUからHGWに繋いでみました。何も設定せずに繋がりました。ブラウザからルータの設定画面を見てみると確かにDHCPになってます。

次にDHCPでRTX1200に繋いでみました。やっぱり無理でした・・・。show status dhcpcとかで見てみると取得中みたいな感じで止まっていました。DHCP以外にも見ているという書き込みがあったので、パケットキャプチャで見てみる事にしました。

最初どうやればいいのかな?と思ったのですが、ONUとHGWの間にハブをはさめればいいだけみたい。Wiresharkで見てみると、確かにDHCPで通信してました。パッとみた感じ他に気になる所はなかったような気がしました。

RTシリーズで使える「dhcp client client-identifier」これを使えばごまかせるかもしれないという書き込みがあったのでやってみました。結果はだめでした・・・。本当のMACアドレス?を見ているらしい。

参考FAQ for YAMAHA RT Series / ADSL Internet

あとは、マニュアルを見ていたら「dhcp client option」というのがありました。これはDHCPサーバに送るメッセージを指定することができるらしい。パケットキャプチャした内容を参考に、色々いじってみたのですがこれもだめでした。

RTシリーズはMACアドレスは変更できないらしいので打つ手なし?とりあえず、HGWにあったDMZを使い、ブリッジのようにして使う事にしました。

さて、終わりにするかと思ったのですが、よく考えてみるとMACアドレスを書き換えれば本当に繋がるのか試していませんでした・・・。それで今調べてみたのですが・・・衝撃の事実が!!

ちょうどMacBookを使っていたのでこんな感じにHGWのMACアドレスに書き換えてみました。

ifconfig en0 lladdr ff:ff:ff:ff:ff:ff

ちゃんとDHCPで取ってきました・・・でも前のIPアドレスと違う?!どういうこと?MACアドレスは間違ってないはず・・・。

f:id:happytar0:20090726133652p:image
こんなのに変わってた。
f:id:happytar0:20090726133637p:image
急いで前のIPアドレスを直接入れてみた。ちゃんと繋がった。

どっちも使えました・・・。実質固定IPアドレスと聞いていたのですが、実はIPアドレスを自分で選択できちゃうような太っ腹な感じなのでしょうか?!
ちなみにHGWに繋ぎ替えたら前のIPアドレスとってきましたw

それとDHCPのリース時間で繋がらなくなるらしいのですが、それは分からないです・・・めんどうで調べていませんが、一日一回ひかりone側からHGWの更新チェックが入るようなので、そこで引っかかるのかな?ちなみに更新チェックの時間はKDDIのサポートページから変更できるみたいです。
初期設定では10時〜11時になっていましたが、チェック無効はなかったようです。

はじめてのSQLite

はじめてSQLiteさわってみました。

さくらのワンコイン共有サーバ使っているのですがMySQLのDBは一つしか作れないのですね・・・。
不安定で遅い!というイメージだったので敬遠していたところがあったのですがMySQLより速い?らしい。よく考えたら軽い実装なのだから当たり前なのかな?

サーバの設定ではデフォで使えるようになっていた(PHP)ので、さっそくDBを作ってみよう!と思ったのだけど、よく考えたら安いプランでシェルが使えなかった。WebベースのSQLiteManagerというのを入れてみました。phpmyadminみたいなものみたいです。

無事にDBを作ってテーブルを流し込みました。型とか大丈夫なのかな?と心配でしたが、すんなりいって一安心。SQLiteは型の概念がほとんどないらしい。

ここまではよかったのですが、ここからちょっと引っかかりました。
PHPで昔作ったものでADODBというライブラリを使っていたのですが、DSNをSQLiteに書き換えても上手く動きません。

sqlite:///home/hogehoge/sqlite/hoge.db
SQL logic error or missing database

こんなエラーが出ました。パーミッション?SQL?と色々いじってみたのですが解決せず・・・。でもよく考えるとSQLiteManagerでは動いていた気がしました。ADODBのソースを見てみる事に・・・。

どうも独自に内部でDSNを処理しているらしく、parse_url関数の部分でエラーになってるっぽいです。ホスト名の指定がないせいで、正しいURLと解釈されないのが原因でした。絶対パスで指定するのが間違ってるのかな・・・?

sqlite://localhost/home/hogehoge/sqlite/hoge.db

こんな感じに直してみたらまだエラー。さらにソースを覗いてみると

if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename;

どうもホスト名が空じゃないとだめらしい・・・。これは無理かなと思い、別の方法を考えることに。

$con =& NewADOConnection('sqlite');
$con->Connect('/home/hogehoge/sqlite/hoge.db');

これで動きました!これが一番簡単みたい。でもどうしてもDSNで指定したいと思い、ソースを眺めてたらこんな記述がありました。

if (($at2 = strpos($origdsn,'@/')) !== FALSE) {
// special handling of oracle, which might not have host
$fakedsn = str_replace('@/','@adodb-fakehost/',$fakedsn);
}

どうやら@を使えばホスト名を指定しなくてもOKらしいです。結局これで解決しました。

# ちなみに@の後に/を二つ書かないと一つ目は消されるみたい
sqlite://@//home/hogehoge/sqlite/hoge.db

そんなこんなで小一時間かかりました。
そういえば、NOW()なんてのも動かないんですね・・・。