Windows7でSelenium RCを動かしてみる。

Windows7でSeleniumRCを動かしてみました。結構7ならではのハマりどころがあったので同じようにハマった人はどうぞ。

構成

テストサーバ:テスト実行するPC
Webサーバ:テスト対象のサービスが動いているサーバ

Windows7Selenium RCを入れる

まずはSelenium RCをインストールします。Selenium RCはテストサーバにインストールします。テストケースが増えていくと結構パワー使うので注意です。
実行コマンド

C:\Windows\System32>java -jar "C:\Program Files\Java\jdk1.6.0_24\bin\Selenium\selenium-server-standalone-2.0b3.jar" -interactive

PHPUnitを使えるようにする

Windows用のPHPインストーラーでインストールします。
Webサーバは入れずに後はデフォルト構成でインストール。
PHP For Windows: Binaries and sources Releases

次にpearをインストールするために、PHPのZIPファイルから「go-pear.bat」とPEARディレクトリだけコピーしてPHPをインストールしたディレクトリに配置する。go-pear.batをコンソール上から実行すればインストールできるが、この時go-pear.batのあるディレクトリに移動して作業しないとインストールに失敗するので注意。さらに、Window7の場合cmdを管理者権限で実行していないと途中でこけるので注意。

Could not open input file: PEAR\go-pear.phar
PHPUnitのインストール
#PEARのアップグレード
>pear upgrade PEAR
#チャンネルを追加、インストール
>pear channel-discover pear.phpunit.de
>pear channel-discover pear.symfony-project.com
>pear install symfony/YAML
>pear channel-discover components.ez.no
>pear install components.ez.no/ConsoleTools
#PHPUnitのインストール
>pear install -a phpunit/PHPUnit
could not extract the package.xml file from "C:\Program Files (x86)\PHP\tmp\PHPUnit-3.5.13.tgz" Unable to create directory 'C:/Program/Fil763B.tmp' Unable to create path for C:/Program/Fil763B.tmp/package.xml

入らないですね。ここを読むとpearの使う作業ディレクトリにスペースが入っているのがまずいそうです。
C:\Windows直下にあったpear.iniを編集します。

s:8:"temp_dir";s:6:"C:\tmp";s:12:"download_dir";s:6:"C:\tmp"

C直下にtmpディレクトリを作って再度インストールをしたら動きました。

Testing_SeleniumWindowsにいれる
>pear install -a Testing_Selenium-beta
試してみる

テストサーバを起動し、Googleへアクセスするテストを実行してみます。
このテストはfirefoxを起動して、googleでhellow worldを検索し、検索結果のページタイトルに"Google Search"という文字列が含まれるかをチェックするものです。日本語の場合は"Google 検索"というページタイトルになるのでその辺を少しいじってやると成功します。

>C:\Windows\System32>java -jar "C:\Program Files\Java\jdk1.6.0_24\bin\Selenium\selenium-server-standalone-2.0b3.jar" -interactive
>C:\Program Files (x86)\PHP>phpunit tests\Testing_Selenium\tests\GoogleTest.php

CentOS5.5で時間のズレを修正する

現在のntpの状況を確認します。ntpqで確認するとローカルクロックしか動いていないことがわかります。

% ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*LOCAL(0)        .LOCL.          10 l   44   64  377    0.000    0.000   0.001

/etc/ntp.confの設定で接続先のサーバを記述しますが、事前にサーバのIPを調べておきます。

% nslookup ntp.nict.jp
Non-authoritative answer:
Name:   ntp.nict.jp
Address: 133.243.238.243
Name:   ntp.nict.jp
Address: 133.243.238.244
Name:   ntp.nict.jp
Address: 210.171.226.40
Name:   ntp.nict.jp
Address: 133.243.238.163
Name:   ntp.nict.jp
Address: 133.243.238.164


% nslookup ntp.jst.mfeed.ad.jp
Non-authoritative answer:
Name:   ntp.jst.mfeed.ad.jp
Address: 210.173.160.57
Name:   ntp.jst.mfeed.ad.jp
Address: 210.173.160.87
Name:   ntp.jst.mfeed.ad.jp
Address: 210.173.160.27

/etc/ntp.confの設定ではrestrictに先ほど調べたIPを, serverにホストを追加します。設定完了後ntpdを再起動します。

%vi /etc/ntp.conf

restrict 133.243.238.243 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.244 mask 255.255.255.255 nomodify notrap noquery
restrict 210.171.226.40 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.163 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.164 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery

server -4 ntp.nict.jp minpoll 6 maxpoll 10 # (stratum 1)
server -4 ntp.jst.mfeed.ad.jp              # (stratum 2)


% service ntpd restart

MySQLいらないユーザをキレイに削除

MySQLでユーザを削除する方法です。
MySQLでは権限の管理と、ユーザ管理は別なので、2つの操作が必要です。
さらに、権限に関する情報はメモリ上に保存されるので、FLASH PRIVILEGESによりキャッシュを更新する必要があります。

権限管理用のREVOKE文

REVOKE ALL ON *.* FROM 'root'@'192.168.1.%';

ユーザ管理テーブルからの削除

delete from mysql.user where User='root' AND host='192.168.1.%'\G

キャシュの更新

FLUSH PRIVILEGES;


CentOS5.5にImageMagickを入れてPHP5.3で動かす

サービスの中で画像合成が必要になったので、ImageMagickを入れてみます。

ImageMagickのインストール

今回はソースコードからインストールします。インストールの手順は本家ページに書かれています。

Installfrom Unix Source

% wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.6.6-2.tar.bz2
% tar lxvf  ImageMagick-6.6.6-2.tar.bz2
% cd ImageMagick-6.6.6-2
% ./configure
% make
% sudo 

PHP用のライブラリをインストール

PECLからPHP用ライブラリをインストールします。
インストール後php.iniにモジュールのインストール先を指定しますが、デフォルトの設定でインストールしたら保存先が違ったのでシンボリックリンクを張ってインストール完了。

% pecl install imagick
% vi /etc/php.ini
extension_dir = "/usr/lib64/php/modules"
extension=imagick.so


% ln -s /usr/lib64/20090626/imagick.so /usr/lib64/php/modules/
% service httpd restart

画像合成をしてみる

//オブジェクトを生成
$hair = new Imagick($hair_url);
$face = new Imagick($face_url);

//画像合成
$face->compositeImage($hair, Imagick::COMPOSITE_OVER, 0, 0);

//gifを指定
$face->setImageFormat("gif");

//ファイル書き出し
$wing->writeImage($saveFilePath);

max_allowed_packetの影響でスレーブサーバのエラー

バイナリログのサイズが大きくなり、マスターおよびスレーブのmax_allowed_packetの値をファイルサイズがこえるとエラーが発生することがあります。

101122 10:37:51 [ERROR] Error reading packet from server: log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master ( server_errno=1236)
101122 10:37:51 [ERROR] Got fatal error 1236: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master' from master when reading data from binary log

マスター、スレーブのmy.confの設定で回避します。

% vi /etc/my.conf 
# マスタの設定
max-binlog-size                 = 256M # バイナリログは256Mまで
max_allowed_packet              = 256M # 読み込むファイルサイズは256まで

% vi /etc/my.conf 
# スレーブの設定
max_allowed_packet              = 256M # 読み込むファイルサイズは256まで

syslogで複数のapacheサーバのログを集積する

CentOS5.5でsyslogとapacheの設定を弄って、ログサーバにログを集めます。

設定

設定は、「ログを受け取るサーバ」と「ログを送信するサーバ」の双方に行います。
syslogはudpを使ってログを送信するので、どうしてもログの取りこぼしが発生します。
今回のゴールは「ログを受け取るサーバ」と「ログを送信するサーバ」の双方にログを残し、送信失敗したログもローカルで確認できるようにします。

ログを受け取るサーバの設定

まずは、ログを受け取るサーバの設定をします。具体的には/etc/sysconfig/syslogのSYSLOGD_OPTIONS変数に、-rを追加し、514/udpを待機状態にします。

% vi /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r"

% service syslog restart

% netstat -an |grep -i udp | grep 514 #ポートが待機中になっているか確認

次にログを受け取るサーバのログの出力先を指定します。/etc/syslog.confではログのタイプ(facility)やログレベルと出力先を紐づける設定を行います。syslog.confの設定を終えたら設定を反映させます。

% vi /etc/syslog.conf
#以下を追記
# apache access_log
local6.*  /var/log/httpd/access_log
# apache error log
local5.*  /var/log/httpd/error_log

# syslog.confの変更をsyslogdへ反映させる
% kill -HUP `cat /var/run/syslogd.pid`

以上でログを受け取る設定は完了です。
次にログを送信するサーバの設定を行います。

ログを送信するサーバの設定

まずhttpd.confの設定でaccess_logとエラーログをsyslogに出力するように設定します。

% vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80> 
     ServerName oratta.com
     DocumentRoot "/var/httpdocs"
     ErrorLog syslog:local5  # エラーログの出力設定
     CustomLog logs/access_log combined 
     CustomLog "|/usr/bin/logger -p local6.info --" combined # アクセスログの出力設定
     AddType application/x-httpd-php .html .php
     php_flag display_errors on
</VirtualHost>


# サーバ再起動
% service httpd restart

次にsyslog.confを設定し、ログを先ほど設定した受取先サーバに転送する設定をします。
この時に、apacheエラーログのローカル出力先も指定します。CustomLogはローカルとリモートと双方指定できますが、ErrorLogは2つの出力先を選べないので、双方syslogに出力するようにします。

% vi /etc/syslog.conf
# apache error log
local5.*        /var/log/httpd/error_log

# to log server
*.*     @192.168.1.5 #転送先サーバのIP


# syslog.confの変更をsyslogdへ反映させる
% kill -HUP `cat /var/run/syslogd.pid`


以上で設定完了。apacheのエラーログとアクセスログが「ログを受け取るサーバ」と「ログを送信するサーバ」の双方に保存されるようになりました。